summaryrefslogtreecommitdiff
path: root/binaryninjacore.h
diff options
context:
space:
mode:
authorGlenn Smith <glenn@vector35.com>2022-02-16 17:54:15 -0500
committerGlenn Smith <glenn@vector35.com>2022-05-11 17:04:32 -0400
commit09c85a868bad7e6e1b1b117eefc2c2aa9aaef4be (patch)
treee2b298049cc02f7b41f182a8f52a9e678c84dbeb /binaryninjacore.h
parent545fef9216559d08f58f7e20082b36352203a8cf (diff)
Clang+TypeParser APIs
Diffstat (limited to 'binaryninjacore.h')
-rw-r--r--binaryninjacore.h186
1 files changed, 174 insertions, 12 deletions
diff --git a/binaryninjacore.h b/binaryninjacore.h
index 3eaeb628..4fb254e7 100644
--- a/binaryninjacore.h
+++ b/binaryninjacore.h
@@ -34,14 +34,14 @@
// Current ABI version for linking to the core. This is incremented any time
// there are changes to the API that affect linking, including new functions,
// new types, or modifications to existing functions or types.
-#define BN_CURRENT_CORE_ABI_VERSION 19
+#define BN_CURRENT_CORE_ABI_VERSION 20
// Minimum ABI version that is supported for loading of plugins. Plugins that
// are linked to an ABI version less than this will not be able to load and
// will require rebuilding. The minimum version is increased when there are
// incompatible changes that break binary compatibility, such as changes to
// existing types or functions.
-#define BN_MINIMUM_CORE_ABI_VERSION 19
+#define BN_MINIMUM_CORE_ABI_VERSION 20
#ifdef __GNUC__
#ifdef BINARYNINJACORE_LIBRARY
@@ -178,6 +178,8 @@ extern "C"
struct BNDownloadInstance;
struct BNWebsocketProvider;
struct BNWebsocketClient;
+ struct BNTypeParser;
+ struct BNTypePrinter;
struct BNFlowGraph;
struct BNFlowGraphNode;
struct BNFlowGraphLayoutRequest;
@@ -1991,6 +1993,13 @@ extern "C"
BNType* type;
};
+ struct BNQualifiedNameTypeAndId
+ {
+ BNQualifiedName name;
+ char* id;
+ BNType* type;
+ };
+
struct BNStructureMember
{
BNType* type;
@@ -2028,14 +2037,40 @@ extern "C"
BNLowLevelILFunction* il, BNRelocation* relocation);
};
+ struct BNParsedType
+ {
+ BNQualifiedName name;
+ BNType* type;
+ bool isUser;
+ };
+
struct BNTypeParserResult
{
- BNQualifiedNameAndType* types;
- BNQualifiedNameAndType* variables;
- BNQualifiedNameAndType* functions;
+ BNParsedType* types;
+ BNParsedType* variables;
+ BNParsedType* functions;
size_t typeCount, variableCount, functionCount;
};
+ enum BNTypeParserErrorSeverity
+ {
+ IgnoredSeverity = 0,
+ NoteSeverity = 1,
+ RemarkSeverity = 2,
+ WarningSeverity = 3,
+ ErrorSeverity = 4,
+ FatalSeverity = 5,
+ };
+
+ struct BNTypeParserError
+ {
+ BNTypeParserErrorSeverity severity;
+ char* message;
+ char* fileName;
+ uint64_t line;
+ uint64_t column;
+ };
+
struct BNQualifiedNameList
{
BNQualifiedName* names;
@@ -2409,6 +2444,63 @@ extern "C"
void (*addAction)(void* ctxt, BNMainThreadAction* action);
};
+ struct BNTypeParserCallbacks
+ {
+ void* context;
+ bool (*preprocessSource)(void* ctxt,
+ const char* source, const char* fileName, BNPlatform* platform,
+ const BNQualifiedNameTypeAndId* existingTypes, size_t existingTypeCount,
+ const char* const* options, size_t optionCount,
+ const char* const* includeDirs, size_t includeDirCount,
+ char** output, BNTypeParserError** errors, size_t* errorCount
+ );
+ bool (*parseTypesFromSource)(void* ctxt,
+ const char* source, const char* fileName, BNPlatform* platform,
+ const BNQualifiedNameTypeAndId* existingTypes, size_t existingTypeCount,
+ const char* const* options, size_t optionCount,
+ const char* const* includeDirs, size_t includeDirCount,
+ const char* autoTypeSource, BNTypeParserResult* result,
+ BNTypeParserError** errors, size_t* errorCount
+ );
+ bool (*parseTypeString)(void* ctxt,
+ const char* source, BNPlatform* platform,
+ const BNQualifiedNameTypeAndId* existingTypes, size_t existingTypeCount,
+ BNQualifiedNameAndType* result,
+ BNTypeParserError** errors, size_t* errorCount
+ );
+ void (*freeString)(void* ctxt, char* string);
+ void (*freeResult)(void* ctxt, BNTypeParserResult* result);
+ void (*freeErrorList)(void* ctxt, BNTypeParserError* errors, size_t errorCount);
+ };
+
+ struct BNTypePrinterCallbacks
+ {
+ void* context;
+ bool (*getTypeTokens)(void* ctxt, BNType* type, BNPlatform* platform,
+ BNQualifiedName* name, uint8_t baseConfidence, BNTokenEscapingType escaping,
+ BNInstructionTextToken** result, size_t* resultCount);
+ bool (*getTypeTokensBeforeName)(void* ctxt, BNType* type,
+ BNPlatform* platform, uint8_t baseConfidence, BNType* parentType,
+ BNTokenEscapingType escaping, BNInstructionTextToken** result,
+ size_t* resultCount);
+ bool (*getTypeTokensAfterName)(void* ctxt, BNType* type,
+ BNPlatform* platform, uint8_t baseConfidence, BNType* parentType,
+ BNTokenEscapingType escaping, BNInstructionTextToken** result,
+ size_t* resultCount);
+ bool (*getTypeString)(void* ctxt, BNType* type, BNPlatform* platform,
+ BNQualifiedName* name, BNTokenEscapingType escaping, char** result);
+ bool (*getTypeStringBeforeName)(void* ctxt, BNType* type,
+ BNPlatform* platform, BNTokenEscapingType escaping, char** result);
+ bool (*getTypeStringAfterName)(void* ctxt, BNType* type,
+ BNPlatform* platform, BNTokenEscapingType escaping, char** result);
+ bool (*getTypeLines)(void* ctxt, BNType* type, BNBinaryView* data,
+ BNQualifiedName* name, int lineWidth, bool collapsed,
+ BNTokenEscapingType escaping, BNTypeDefinitionLine** result, size_t* resultCount);
+ void (*freeTokens)(void* ctxt, BNInstructionTextToken* tokens, size_t count);
+ void (*freeString)(void* ctxt, char* string);
+ void (*freeLines)(void* ctxt, BNTypeDefinitionLine* lines, size_t count);
+ };
+
struct BNConstantReference
{
int64_t value;
@@ -4086,6 +4178,7 @@ extern "C"
BINARYNINJACOREAPI BNQualifiedNameAndType* BNGetAnalysisTypeList(BNBinaryView* view, size_t* count);
BINARYNINJACOREAPI void BNFreeTypeList(BNQualifiedNameAndType* types, size_t count);
+ BINARYNINJACOREAPI void BNFreeTypeIdList(BNQualifiedNameTypeAndId* types, size_t count);
BINARYNINJACOREAPI BNQualifiedName* BNGetAnalysisTypeNames(BNBinaryView* view, size_t* count, const char* matching);
BINARYNINJACOREAPI void BNFreeTypeNameList(BNQualifiedName* names, size_t count);
BINARYNINJACOREAPI BNType* BNGetAnalysisTypeByName(BNBinaryView* view, BNQualifiedName* name);
@@ -4096,6 +4189,8 @@ extern "C"
BINARYNINJACOREAPI BNQualifiedName BNDefineAnalysisType(
BNBinaryView* view, const char* id, BNQualifiedName* defaultName, BNType* type);
BINARYNINJACOREAPI void BNDefineUserAnalysisType(BNBinaryView* view, BNQualifiedName* name, BNType* type);
+ BINARYNINJACOREAPI void BNDefineAnalysisTypes(BNBinaryView* view, BNQualifiedNameAndType* types, size_t count, bool (*progress)(void*, size_t, size_t), void* progressContext);
+ BINARYNINJACOREAPI void BNDefineUserAnalysisTypes(BNBinaryView* view, BNQualifiedNameAndType* types, size_t count, bool (*progress)(void*, size_t, size_t), void* progressContext);
BINARYNINJACOREAPI void BNUndefineAnalysisType(BNBinaryView* view, const char* id);
BINARYNINJACOREAPI void BNUndefineUserAnalysisType(BNBinaryView* view, BNQualifiedName* name);
BINARYNINJACOREAPI void BNRenameAnalysisType(
@@ -5009,9 +5104,11 @@ extern "C"
BINARYNINJACOREAPI BNType* BNCreatePointerTypeOfWidth(size_t width, const BNTypeWithConfidence* const type,
BNBoolWithConfidence* cnst, BNBoolWithConfidence* vltl, BNReferenceType refType);
BINARYNINJACOREAPI BNType* BNCreateArrayType(const BNTypeWithConfidence* const type, uint64_t elem);
- BINARYNINJACOREAPI BNType* BNCreateFunctionType(BNTypeWithConfidence* returnValue,
- BNCallingConventionWithConfidence* callingConvention, BNFunctionParameter* params, size_t paramCount,
- BNBoolWithConfidence* varArg, BNOffsetWithConfidence* stackAdjust);
+ BINARYNINJACOREAPI BNType* BNCreateFunctionType(BNTypeWithConfidence* returnValue, BNCallingConventionWithConfidence* callingConvention,
+ BNFunctionParameter* params, size_t paramCount, BNBoolWithConfidence* varArg,
+ BNBoolWithConfidence* canReturn, BNOffsetWithConfidence* stackAdjust,
+ uint32_t* regStackAdjustRegs, BNOffsetWithConfidence* regStackAdjustValues, size_t regStackAdjustCount,
+ BNRegisterSetWithConfidence* returnRegs, BNNameType ft);
BINARYNINJACOREAPI BNType* BNNewTypeReference(BNType* type);
BINARYNINJACOREAPI BNType* BNDuplicateType(BNType* type);
BINARYNINJACOREAPI char* BNGetTypeAndName(BNType* type, BNQualifiedName* name, BNTokenEscapingType escaping);
@@ -5037,9 +5134,11 @@ extern "C"
const BNTypeWithConfidence* const type, BNBoolWithConfidence* cnst, BNBoolWithConfidence* vltl,
BNReferenceType refType);
BINARYNINJACOREAPI BNTypeBuilder* BNCreateArrayTypeBuilder(const BNTypeWithConfidence* const type, uint64_t elem);
- BINARYNINJACOREAPI BNTypeBuilder* BNCreateFunctionTypeBuilder(BNTypeWithConfidence* returnValue,
- BNCallingConventionWithConfidence* callingConvention, BNFunctionParameter* params, size_t paramCount,
- BNBoolWithConfidence* varArg, BNOffsetWithConfidence* stackAdjust);
+ BINARYNINJACOREAPI BNTypeBuilder* BNCreateFunctionTypeBuilder(BNTypeWithConfidence* returnValue, BNCallingConventionWithConfidence* callingConvention,
+ BNFunctionParameter* params, size_t paramCount, BNBoolWithConfidence* varArg,
+ BNBoolWithConfidence* canReturn, BNOffsetWithConfidence* stackAdjust,
+ uint32_t* regStackAdjustRegs, BNOffsetWithConfidence* regStackAdjustValues, size_t regStackAdjustCount,
+ BNRegisterSetWithConfidence* returnRegs, BNNameType ft);
BINARYNINJACOREAPI BNType* BNFinalizeTypeBuilder(BNTypeBuilder* type);
BINARYNINJACOREAPI BNTypeBuilder* BNDuplicateTypeBuilder(BNTypeBuilder* type);
BINARYNINJACOREAPI char* BNGetTypeBuilderTypeAndName(BNTypeBuilder* type, BNQualifiedName* name);
@@ -5258,8 +5357,71 @@ extern "C"
BINARYNINJACOREAPI bool BNParseTypesFromSourceFile(BNPlatform* platform, const char* fileName,
BNTypeParserResult* result, char** errors, const char** includeDirs, size_t includeDirCount,
const char* autoTypeSource);
- BINARYNINJACOREAPI void BNFreeTypeParserResult(BNTypeParserResult* result);
+ BINARYNINJACOREAPI BNTypeParser* BNRegisterTypeParser(
+ const char* name, BNTypeParserCallbacks* callbacks);
+ BINARYNINJACOREAPI BNTypeParser** BNGetTypeParserList(size_t* count);
+ BINARYNINJACOREAPI void BNFreeTypeParserList(BNTypeParser** parsers);
+ BINARYNINJACOREAPI BNTypeParser* BNGetTypeParserByName(const char* name);
+
+ BINARYNINJACOREAPI char* BNGetTypeParserName(BNTypeParser* parser);
+
+ BINARYNINJACOREAPI bool BNTypeParserPreprocessSource(BNTypeParser* parser,
+ const char* source, const char* fileName, BNPlatform* platform,
+ const BNQualifiedNameTypeAndId* existingTypes, size_t existingTypeCount,
+ const char* const* options, size_t optionCount,
+ const char* const* includeDirs, size_t includeDirCount,
+ char** output, BNTypeParserError** errors, size_t* errorCount
+ );
+ BINARYNINJACOREAPI bool BNTypeParserParseTypesFromSource(BNTypeParser* parser,
+ const char* source, const char* fileName, BNPlatform* platform,
+ const BNQualifiedNameTypeAndId* existingTypes, size_t existingTypeCount,
+ const char* const* options, size_t optionCount,
+ const char* const* includeDirs, size_t includeDirCount,
+ const char* autoTypeSource, BNTypeParserResult* result,
+ BNTypeParserError** errors, size_t* errorCount
+ );
+ BINARYNINJACOREAPI bool BNTypeParserParseTypeString(BNTypeParser* parser,
+ const char* source, BNPlatform* platform,
+ const BNQualifiedNameTypeAndId* existingTypes, size_t existingTypeCount,
+ BNQualifiedNameAndType* result,
+ BNTypeParserError** errors, size_t* errorCount
+ );
+
+ BINARYNINJACOREAPI BNTypePrinter* BNRegisterTypePrinter(
+ const char* name, BNTypePrinterCallbacks* callbacks);
+ BINARYNINJACOREAPI BNTypePrinter** BNGetTypePrinterList(size_t* count);
+ BINARYNINJACOREAPI void BNFreeTypePrinterList(BNTypePrinter** printers);
+ BINARYNINJACOREAPI BNTypePrinter* BNGetTypePrinterByName(const char* name);
+
+ BINARYNINJACOREAPI char* BNGetTypePrinterName(BNTypePrinter* printer);
+
+ BINARYNINJACOREAPI bool BNGetTypePrinterTypeTokens(BNTypePrinter* printer,
+ BNType* type, BNPlatform* platform, BNQualifiedName* name,
+ uint8_t baseConfidence, BNTokenEscapingType escaping,
+ BNInstructionTextToken** result, size_t* resultCount);
+ BINARYNINJACOREAPI bool BNGetTypePrinterTypeTokensBeforeName(BNTypePrinter* printer,
+ BNType* type, BNPlatform* platform, uint8_t baseConfidence, BNType* parentType,
+ BNTokenEscapingType escaping, BNInstructionTextToken** result,
+ size_t* resultCount);
+ BINARYNINJACOREAPI bool BNGetTypePrinterTypeTokensAfterName(BNTypePrinter* printer,
+ BNType* type, BNPlatform* platform, uint8_t baseConfidence, BNType* parentType,
+ BNTokenEscapingType escaping, BNInstructionTextToken** result,
+ size_t* resultCount);
+ BINARYNINJACOREAPI bool BNGetTypePrinterTypeString(BNTypePrinter* printer,
+ BNType* type, BNPlatform* platform, BNQualifiedName* name,
+ BNTokenEscapingType escaping, char** result);
+ BINARYNINJACOREAPI bool BNGetTypePrinterTypeStringBeforeName(BNTypePrinter* printer,
+ BNType* type, BNPlatform* platform, BNTokenEscapingType escaping, char** result);
+ BINARYNINJACOREAPI bool BNGetTypePrinterTypeStringAfterName(BNTypePrinter* printer,
+ BNType* type, BNPlatform* platform, BNTokenEscapingType escaping, char** result);
+ BINARYNINJACOREAPI bool BNGetTypePrinterTypeLines(BNTypePrinter* printer,
+ BNType* type, BNBinaryView* data,
+ BNQualifiedName* name, int lineWidth, bool collapsed,
+ BNTokenEscapingType escaping, BNTypeDefinitionLine** result, size_t* resultCount);
+
+ BINARYNINJACOREAPI void BNFreeTypeParserResult(BNTypeParserResult* result);
+ BINARYNINJACOREAPI void BNFreeTypeParserErrors(BNTypeParserError* errors, size_t count);
// Updates
BINARYNINJACOREAPI BNUpdateChannel* BNGetUpdateChannels(size_t* count, char** errors);
BINARYNINJACOREAPI void BNFreeUpdateChannelList(BNUpdateChannel* list, size_t count);