diff options
| author | Glenn Smith <glenn@vector35.com> | 2022-02-16 17:54:15 -0500 |
|---|---|---|
| committer | Glenn Smith <glenn@vector35.com> | 2022-05-11 17:04:32 -0400 |
| commit | 09c85a868bad7e6e1b1b117eefc2c2aa9aaef4be (patch) | |
| tree | e2b298049cc02f7b41f182a8f52a9e678c84dbeb /binaryninjacore.h | |
| parent | 545fef9216559d08f58f7e20082b36352203a8cf (diff) | |
Clang+TypeParser APIs
Diffstat (limited to 'binaryninjacore.h')
| -rw-r--r-- | binaryninjacore.h | 186 |
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); |
