summaryrefslogtreecommitdiff
path: root/binaryninjacore.h
diff options
context:
space:
mode:
Diffstat (limited to 'binaryninjacore.h')
-rw-r--r--binaryninjacore.h240
1 files changed, 207 insertions, 33 deletions
diff --git a/binaryninjacore.h b/binaryninjacore.h
index 8a970276..fd356b41 100644
--- a/binaryninjacore.h
+++ b/binaryninjacore.h
@@ -37,14 +37,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 168
+#define BN_CURRENT_CORE_ABI_VERSION 169
// 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 168
+#define BN_MINIMUM_CORE_ABI_VERSION 169
#ifdef __GNUC__
#ifdef BINARYNINJACORE_LIBRARY
@@ -506,6 +506,7 @@ extern "C"
BaseStructureNameToken = 37,
BaseStructureSeparatorToken = 38,
BraceToken = 39,
+ ValueLocationToken = 40,
// The following are output by the analysis system automatically, these should
// not be used directly by the architecture plugins
CodeSymbolToken = 64,
@@ -1154,6 +1155,9 @@ extern "C"
// Cue for use-def heuristics to follow through simple copies (e.g., register windowing for Xtensa)
ILTransparentCopy = 0x1000,
+
+ // Instruction is defining an implicit trait of the calling convention
+ MLILCallingConventionImplicit = 0x2000
};
BN_ENUM(uint8_t, BNIntrinsicClass)
@@ -1239,6 +1243,8 @@ extern "C"
StackFrameOffset,
ReturnAddressValue,
ImportedAddressValue,
+ ResultPointerValue,
+ ParameterPointerValue,
// The following are only valid in BNPossibleValueSet
SignedRangeValue,
@@ -1383,6 +1389,8 @@ extern "C"
MLIL_VAR_SPLIT, // Not valid in SSA form (see MLIL_VAR_SPLIT_SSA)
MLIL_ADDRESS_OF,
MLIL_ADDRESS_OF_FIELD,
+ MLIL_PASS_BY_REF,
+ MLIL_RETURN_BY_REF,
MLIL_CONST,
MLIL_CONST_DATA,
MLIL_CONST_PTR,
@@ -1430,6 +1438,8 @@ extern "C"
MLIL_SHARED_PARAM_SLOT, // Only valid within the MLIL_CALL_PARAM, MLIL_CALL_PARAM_SSA, or
// MLIL_SEPARATE_PARAM_LIST instructions inside untyped call variants
MLIL_VAR_OUTPUT, // Only valid within MLIL_CALL, MLIL_SYSCALL, MLIL_TAILCALL family instructions
+ MLIL_VAR_OUTPUT_FIELD, // Only valid within MLIL_CALL, MLIL_SYSCALL, MLIL_TAILCALL family instructions
+ MLIL_STORE_OUTPUT, // Only valid within MLIL_CALL, MLIL_SYSCALL, MLIL_TAILCALL family instructions
MLIL_RET,
MLIL_NORET,
MLIL_IF,
@@ -1507,6 +1517,9 @@ extern "C"
MLIL_CALL_OUTPUT_SSA, // Only valid within the MLIL_CALL_SSA or MLIL_SYSCALL_SSA, MLIL_TAILCALL_SSA family
// instructions
MLIL_VAR_OUTPUT_SSA, // Only valid within the MLIL_CALL_OUTPUT_SSA instruction
+ MLIL_VAR_OUTPUT_SSA_FIELD, // Only valid within the MLIL_CALL_OUTPUT_SSA instruction
+ MLIL_VAR_OUTPUT_ALIASED, // Only valid within the MLIL_CALL_OUTPUT_SSA instruction
+ MLIL_VAR_OUTPUT_ALIASED_FIELD, // Only valid within the MLIL_CALL_OUTPUT_SSA instruction
MLIL_MEMORY_INTRINSIC_OUTPUT_SSA, // Only valid within the MLIL_MEMORY_INTRINSIC_SSA instruction
MLIL_LOAD_SSA,
MLIL_LOAD_STRUCT_SSA,
@@ -1516,7 +1529,9 @@ extern "C"
MLIL_MEMORY_INTRINSIC_SSA,
MLIL_FREE_VAR_SLOT_SSA,
MLIL_VAR_PHI,
- MLIL_MEM_PHI
+ MLIL_MEM_PHI,
+
+ MLIL_BLOCK_TO_EXPAND // Must be expanded by a future workflow step, used temporarily to insert instructions
};
typedef struct BNMediumLevelILInstruction
@@ -1540,7 +1555,9 @@ extern "C"
{
StackVariableSourceType,
RegisterVariableSourceType,
- FlagVariableSourceType
+ FlagVariableSourceType,
+ CompositeReturnValueSourceType,
+ CompositeParameterSourceType
};
typedef struct BNVariable
@@ -1582,6 +1599,8 @@ extern "C"
HLIL_DEREF,
HLIL_DEREF_FIELD,
HLIL_ADDRESS_OF,
+ HLIL_PASS_BY_REF,
+ HLIL_RETURN_BY_REF,
HLIL_CONST,
HLIL_CONST_DATA,
HLIL_CONST_PTR,
@@ -2626,15 +2645,74 @@ extern "C"
uint8_t confidence;
} BNRegisterSetWithConfidence;
+ typedef struct BNValueLocationComponent
+ {
+ BNVariable variable;
+ int64_t offset;
+ bool sizeValid;
+ uint64_t size;
+ } BNValueLocationComponent;
+
+ typedef struct BNValueLocation
+ {
+ size_t count;
+ BNValueLocationComponent* components;
+ bool indirect;
+ bool returnedPointerValid;
+ BNVariable returnedPointer;
+ } BNValueLocation;
+
+ typedef struct BNValueLocationWithConfidence
+ {
+ BNValueLocation location;
+ uint8_t confidence;
+ } BNValueLocationWithConfidence;
+
+ typedef struct BNValueLocationListWithConfidence
+ {
+ BNValueLocation* locations;
+ size_t count;
+ uint8_t confidence;
+ } BNValueLocationListWithConfidence;
+
+ BN_ENUM(uint8_t, BNValueLocationSource)
+ {
+ DefaultLocationSource,
+ PassByValueLocationSource,
+ PassByReferenceLocationSource,
+ CustomLocationSource
+ };
+
typedef struct BNFunctionParameter
{
char* name;
BNType* type;
uint8_t typeConfidence;
- bool defaultLocation;
- BNVariable location;
+ BNValueLocationSource locationSource;
+ BNValueLocation location;
} BNFunctionParameter;
+ typedef struct BNReturnValue
+ {
+ BNType* type;
+ uint8_t typeConfidence;
+ bool defaultLocation;
+ BNValueLocation location;
+ uint8_t locationConfidence;
+ } BNReturnValue;
+
+ typedef struct BNCallLayout
+ {
+ BNValueLocation* parameters;
+ size_t parameterCount;
+ bool returnValueValid;
+ BNValueLocation returnValue;
+ int64_t stackAdjustment;
+ uint32_t* registerStackAdjustmentRegisters;
+ int32_t* registerStackAdjustmentAmounts;
+ size_t registerStackAdjustmentCount;
+ } BNCallLayout;
+
typedef struct BNQualifiedNameAndType
{
BNQualifiedName name;
@@ -2881,12 +2959,37 @@ extern "C"
void (*getIncomingRegisterValue)(void* ctxt, uint32_t reg, BNFunction* func, BNRegisterValue* result);
void (*getIncomingFlagValue)(void* ctxt, uint32_t flag, BNFunction* func, BNRegisterValue* result);
+ bool (*isReturnTypeRegisterCompatible)(void* ctxt, BNBinaryView* view, BNType* type);
+ void (*getIndirectReturnValueLocation)(void* ctxt, BNVariable* outVar);
+ bool (*getReturnedIndirectReturnValuePointer)(void* ctxt, BNVariable* outVar);
+
+ bool (*isArgumentTypeRegisterCompatible)(void* ctxt, BNBinaryView* view, BNType* type);
+ bool (*isNonRegisterArgumentIndirect)(void* ctxt, BNBinaryView* view, BNType* type);
+ bool (*areStackArgumentsNaturallyAligned)(void* ctxt);
+
void (*getIncomingVariableForParameterVariable)(
void* ctxt, const BNVariable* var, BNFunction* func, BNVariable* result);
void (*getParameterVariableForIncomingVariable)(
void* ctxt, const BNVariable* var, BNFunction* func, BNVariable* result);
bool (*areArgumentRegistersUsedForVarArgs)(void* ctxt);
+
+ void (*getCallLayout)(void* ctxt, BNBinaryView* view, BNReturnValue* returnValue, BNFunctionParameter* params,
+ size_t paramCount, bool hasPermittedRegs, uint32_t* permittedRegs, size_t permittedRegCount,
+ BNCallLayout* result);
+ void (*freeCallLayout)(void* ctxt, BNCallLayout* layout);
+ void (*getReturnValueLocation)(
+ void* ctxt, BNBinaryView* view, BNReturnValue* returnValue, BNValueLocation* outLocation);
+ void (*freeValueLocation)(void* ctxt, BNValueLocation* location);
+ BNValueLocation* (*getParameterLocations)(void* ctxt, BNBinaryView* view, BNValueLocation* returnValue,
+ BNFunctionParameter* params, size_t paramCount, bool hasPermittedRegs, uint32_t* permittedRegs,
+ size_t permittedRegCount, size_t* outLocationCount);
+ void (*freeParameterLocations)(void* ctxt, BNValueLocation* locations, size_t count);
+ int64_t (*getStackAdjustmentForLocations)(void* ctxt, BNBinaryView* view, BNValueLocation* returnValue,
+ BNValueLocation* locations, BNType** types, size_t paramCount);
+ size_t (*getRegisterStackAdjustments)(void* ctxt, BNBinaryView* view, BNValueLocation* returnValue,
+ BNValueLocation* params, size_t paramCount, uint32_t** outRegs, int32_t** outAdjust);
+ void (*freeRegisterStackAdjustments)(void* ctxt, uint32_t* regs, int32_t* adjust, size_t count);
} BNCustomCallingConvention;
typedef struct BNVariableNameAndType
@@ -5273,10 +5376,19 @@ extern "C"
BINARYNINJACOREAPI BNType* BNGetFunctionType(BNFunction* func);
BINARYNINJACOREAPI BNTypeWithConfidence BNGetFunctionReturnType(BNFunction* func);
+ BINARYNINJACOREAPI BNReturnValue BNGetFunctionReturnValue(BNFunction* func);
+ BINARYNINJACOREAPI void BNFreeReturnValue(BNReturnValue* ret);
+ BINARYNINJACOREAPI bool BNIsFunctionReturnValueDefaultLocation(BNFunction* func);
+ BINARYNINJACOREAPI BNValueLocationWithConfidence BNGetFunctionReturnValueLocation(BNFunction* func);
BINARYNINJACOREAPI BNRegisterSetWithConfidence BNGetFunctionReturnRegisters(BNFunction* func);
BINARYNINJACOREAPI BNCallingConventionWithConfidence BNGetFunctionCallingConvention(BNFunction* func);
BINARYNINJACOREAPI BNParameterVariablesWithConfidence BNGetFunctionParameterVariables(BNFunction* func);
BINARYNINJACOREAPI void BNFreeParameterVariables(BNParameterVariablesWithConfidence* vars);
+ BINARYNINJACOREAPI BNValueLocationListWithConfidence BNGetFunctionParameterLocations(BNFunction* func);
+ BINARYNINJACOREAPI void BNFreeParameterLocations(BNValueLocationListWithConfidence* locations);
+ BINARYNINJACOREAPI bool BNGetValueLocationVariableForReturnValue(const BNValueLocation* location, BNVariable* var);
+ BINARYNINJACOREAPI bool BNGetValueLocationVariableForParameter(
+ const BNValueLocation* location, BNVariable* var, size_t idx);
BINARYNINJACOREAPI BNBoolWithConfidence BNFunctionHasVariableArguments(BNFunction* func);
BINARYNINJACOREAPI BNOffsetWithConfidence BNGetFunctionStackAdjustment(BNFunction* func);
BINARYNINJACOREAPI BNRegisterStackAdjustment* BNGetFunctionRegisterStackAdjustments(
@@ -5286,11 +5398,14 @@ extern "C"
BINARYNINJACOREAPI void BNFreeRegisterSet(BNRegisterSetWithConfidence* regs);
BINARYNINJACOREAPI void BNSetAutoFunctionReturnType(BNFunction* func, BNTypeWithConfidence* type);
- BINARYNINJACOREAPI void BNSetAutoFunctionReturnRegisters(BNFunction* func, BNRegisterSetWithConfidence* regs);
+ BINARYNINJACOREAPI void BNSetAutoIsFunctionReturnValueDefaultLocation(BNFunction* func, bool defaultLocation);
+ BINARYNINJACOREAPI void BNSetAutoFunctionReturnValueLocation(
+ BNFunction* func, BNValueLocationWithConfidence* location);
+ BINARYNINJACOREAPI void BNSetAutoFunctionReturnValue(BNFunction* func, BNReturnValue* returnValue);
BINARYNINJACOREAPI void BNSetAutoFunctionCallingConvention(
BNFunction* func, BNCallingConventionWithConfidence* convention);
- BINARYNINJACOREAPI void BNSetAutoFunctionParameterVariables(
- BNFunction* func, BNParameterVariablesWithConfidence* vars);
+ BINARYNINJACOREAPI void BNSetAutoFunctionParameterLocations(
+ BNFunction* func, BNValueLocationListWithConfidence* locations);
BINARYNINJACOREAPI void BNSetAutoFunctionHasVariableArguments(BNFunction* func, BNBoolWithConfidence* varArgs);
BINARYNINJACOREAPI void BNSetAutoFunctionCanReturn(BNFunction* func, BNBoolWithConfidence* returns);
BINARYNINJACOREAPI void BNSetAutoFunctionPure(BNFunction* func, BNBoolWithConfidence* pure);
@@ -5300,11 +5415,14 @@ extern "C"
BINARYNINJACOREAPI void BNSetAutoFunctionClobberedRegisters(BNFunction* func, BNRegisterSetWithConfidence* regs);
BINARYNINJACOREAPI void BNSetUserFunctionReturnType(BNFunction* func, BNTypeWithConfidence* type);
- BINARYNINJACOREAPI void BNSetUserFunctionReturnRegisters(BNFunction* func, BNRegisterSetWithConfidence* regs);
+ BINARYNINJACOREAPI void BNSetUserIsFunctionReturnValueDefaultLocation(BNFunction* func, bool defaultLocation);
+ BINARYNINJACOREAPI void BNSetUserFunctionReturnValueLocation(
+ BNFunction* func, BNValueLocationWithConfidence* location);
+ BINARYNINJACOREAPI void BNSetUserFunctionReturnValue(BNFunction* func, BNReturnValue* returnValue);
BINARYNINJACOREAPI void BNSetUserFunctionCallingConvention(
BNFunction* func, BNCallingConventionWithConfidence* convention);
- BINARYNINJACOREAPI void BNSetUserFunctionParameterVariables(
- BNFunction* func, BNParameterVariablesWithConfidence* vars);
+ BINARYNINJACOREAPI void BNSetUserFunctionParameterLocations(
+ BNFunction* func, BNValueLocationListWithConfidence* locations);
BINARYNINJACOREAPI void BNSetUserFunctionHasVariableArguments(BNFunction* func, BNBoolWithConfidence* varArgs);
BINARYNINJACOREAPI void BNSetUserFunctionCanReturn(BNFunction* func, BNBoolWithConfidence* returns);
BINARYNINJACOREAPI void BNSetUserFunctionPure(BNFunction* func, BNBoolWithConfidence* pure);
@@ -7047,11 +7165,11 @@ extern "C"
uint64_t originalFragmentOffsetBytes, size_t originalFragmentWidthBytes, BNEndianness endianness,
size_t fragmentStartBit, size_t fragmentWidthBits, size_t fragmentTruncatedStartBits, size_t wrapBit);
BINARYNINJACOREAPI BNType* BNCreateArrayType(const BNTypeWithConfidence* const type, uint64_t elem);
- 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, BNBoolWithConfidence* pure);
+ BINARYNINJACOREAPI BNType* BNCreateFunctionType(BNReturnValue* returnValue,
+ BNCallingConventionWithConfidence* callingConvention, BNFunctionParameter* params, size_t paramCount,
+ BNBoolWithConfidence* varArg, BNBoolWithConfidence* canReturn, BNOffsetWithConfidence* stackAdjust,
+ uint32_t* regStackAdjustRegs, BNOffsetWithConfidence* regStackAdjustValues, size_t regStackAdjustCount,
+ BNNameType ft, BNBoolWithConfidence* pure);
BINARYNINJACOREAPI BNType* BNCreateVarArgsType();
BINARYNINJACOREAPI BNType* BNCreateValueType(const char* value);
BINARYNINJACOREAPI char* BNGetNameTypeString(BNNameType classFunctionType);
@@ -7087,11 +7205,11 @@ extern "C"
uint64_t originalFragmentOffsetBytes, size_t originalFragmentWidthBytes, BNEndianness endianness,
size_t fragmentStartBit, size_t fragmentWidthBits, size_t fragmentTruncatedStartBits, size_t wrapBit);
BINARYNINJACOREAPI BNTypeBuilder* BNCreateArrayTypeBuilder(const BNTypeWithConfidence* const type, uint64_t elem);
- BINARYNINJACOREAPI BNTypeBuilder* BNCreateFunctionTypeBuilder(BNTypeWithConfidence* returnValue, BNCallingConventionWithConfidence* callingConvention,
- BNFunctionParameter* params, size_t paramCount, BNBoolWithConfidence* varArg,
- BNBoolWithConfidence* canReturn, BNOffsetWithConfidence* stackAdjust,
+ BINARYNINJACOREAPI BNTypeBuilder* BNCreateFunctionTypeBuilder(BNReturnValue* 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, BNBoolWithConfidence* pure);
+ BNNameType ft, BNBoolWithConfidence* pure);
BINARYNINJACOREAPI BNTypeBuilder* BNCreateVarArgsTypeBuilder();
BINARYNINJACOREAPI BNTypeBuilder* BNCreateValueTypeBuilder(const char* value);
BINARYNINJACOREAPI BNType* BNFinalizeTypeBuilder(BNTypeBuilder* type);
@@ -7110,6 +7228,14 @@ extern "C"
BINARYNINJACOREAPI BNBoolWithConfidence BNIsTypeVolatile(BNType* type);
BINARYNINJACOREAPI bool BNIsTypeFloatingPoint(BNType* type);
BINARYNINJACOREAPI BNTypeWithConfidence BNGetChildType(BNType* type);
+ BINARYNINJACOREAPI BNReturnValue BNGetTypeReturnValue(BNType* type);
+ BINARYNINJACOREAPI bool BNIsTypeReturnValueDefaultLocation(BNType* type);
+ BINARYNINJACOREAPI BNValueLocationWithConfidence BNGetTypeReturnValueLocation(BNType* type);
+ BINARYNINJACOREAPI bool BNParseValueLocation(
+ const char* str, BNArchitecture* arch, BNValueLocation* location, char** error);
+ BINARYNINJACOREAPI char* BNValueLocationToString(BNValueLocation* location, BNArchitecture* arch);
+ BINARYNINJACOREAPI char* BNValueLocationComponentToString(BNValueLocationComponent* component, BNArchitecture* arch);
+ BINARYNINJACOREAPI void BNFreeValueLocation(BNValueLocation* location);
BINARYNINJACOREAPI BNCallingConventionWithConfidence BNGetTypeCallingConvention(BNType* type);
BINARYNINJACOREAPI BNCallingConventionName BNGetTypeCallingConventionName(BNType* type);
BINARYNINJACOREAPI BNFunctionParameter* BNGetTypeParameters(BNType* type, size_t* count);
@@ -7185,6 +7311,9 @@ extern "C"
BINARYNINJACOREAPI BNBoolWithConfidence BNIsTypeBuilderVolatile(BNTypeBuilder* type);
BINARYNINJACOREAPI bool BNIsTypeBuilderFloatingPoint(BNTypeBuilder* type);
BINARYNINJACOREAPI BNTypeWithConfidence BNGetTypeBuilderChildType(BNTypeBuilder* type);
+ BINARYNINJACOREAPI BNReturnValue BNGetTypeBuilderReturnValue(BNTypeBuilder* type);
+ BINARYNINJACOREAPI bool BNIsTypeBuilderReturnValueDefaultLocation(BNTypeBuilder* type);
+ BINARYNINJACOREAPI BNValueLocationWithConfidence BNGetTypeBuilderReturnValueLocation(BNTypeBuilder* type);
BINARYNINJACOREAPI BNCallingConventionWithConfidence BNGetTypeBuilderCallingConvention(BNTypeBuilder* type);
BINARYNINJACOREAPI BNCallingConventionName BNGetTypeBuilderCallingConventionName(BNTypeBuilder* type);
BINARYNINJACOREAPI BNFunctionParameter* BNGetTypeBuilderParameters(BNTypeBuilder* type, size_t* count);
@@ -7223,6 +7352,10 @@ extern "C"
BINARYNINJACOREAPI void BNTypeBuilderSetVolatile(BNTypeBuilder* type, BNBoolWithConfidence* vltl);
BINARYNINJACOREAPI void BNTypeBuilderSetSigned(BNTypeBuilder* type, BNBoolWithConfidence* sign);
BINARYNINJACOREAPI void BNTypeBuilderSetChildType(BNTypeBuilder* type, BNTypeWithConfidence* child);
+ BINARYNINJACOREAPI void BNTypeBuilderSetReturnValue(BNTypeBuilder* type, BNReturnValue* rv);
+ BINARYNINJACOREAPI void BNTypeBuilderSetIsReturnValueDefaultLocation(BNTypeBuilder* type, bool defaultLocation);
+ BINARYNINJACOREAPI void BNTypeBuilderSetReturnValueLocation(
+ BNTypeBuilder* type, BNValueLocationWithConfidence* location);
BINARYNINJACOREAPI void BNTypeBuilderSetCallingConvention(BNTypeBuilder* type, BNCallingConventionWithConfidence* cc);
BINARYNINJACOREAPI void BNTypeBuilderSetCallingConventionName(BNTypeBuilder* type, BNCallingConventionName cc);
BINARYNINJACOREAPI BNOffsetWithConfidence BNGetTypeBuilderStackAdjustment(BNTypeBuilder* type);
@@ -7630,21 +7763,51 @@ extern "C"
BNCallingConvention* cc, uint32_t reg, BNFunction* func);
BINARYNINJACOREAPI BNRegisterValue BNGetIncomingFlagValue(BNCallingConvention* cc, uint32_t reg, BNFunction* func);
- BINARYNINJACOREAPI BNVariable* BNGetVariablesForParametersDefaultPermittedArgs(
- BNCallingConvention* cc, const BNFunctionParameter* params, size_t paramCount, size_t* count);
- BINARYNINJACOREAPI BNVariable* BNGetVariablesForParameters(BNCallingConvention* cc,
- const BNFunctionParameter* params, size_t paramCount, const uint32_t* permittedArgs, size_t permittedArgCount,
- size_t* count);
+ BINARYNINJACOREAPI BNCallLayout BNGetCallLayout(BNCallingConvention* cc, BNBinaryView* view,
+ const BNReturnValue* returnValue, const BNFunctionParameter* params, size_t paramCount,
+ const uint32_t* permittedRegs, size_t permittedRegCount);
+ BINARYNINJACOREAPI BNCallLayout BNGetCallLayoutDefaultPermittedArgs(BNCallingConvention* cc, BNBinaryView* view,
+ const BNReturnValue* returnValue, const BNFunctionParameter* params, size_t paramCount);
+ BINARYNINJACOREAPI BNCallLayout BNGetDefaultCallLayout(BNCallingConvention* cc, BNBinaryView* view,
+ const BNReturnValue* returnValue, const BNFunctionParameter* params, size_t paramCount,
+ const uint32_t* permittedRegs, size_t permittedRegCount);
+ BINARYNINJACOREAPI BNCallLayout BNGetDefaultCallLayoutDefaultPermittedArgs(BNCallingConvention* cc,
+ BNBinaryView* view, const BNReturnValue* returnValue, const BNFunctionParameter* params, size_t paramCount);
+ BINARYNINJACOREAPI void BNFreeCallLayout(BNCallLayout* layout);
+ BINARYNINJACOREAPI BNValueLocation BNGetReturnValueLocation(
+ BNCallingConvention* cc, BNBinaryView* view, BNReturnValue* returnValue);
+ BINARYNINJACOREAPI BNValueLocation BNGetDefaultReturnValueLocation(
+ BNCallingConvention* cc, BNBinaryView* view, BNReturnValue* returnValue);
+ BINARYNINJACOREAPI BNValueLocation* BNGetParameterLocations(BNCallingConvention* cc, BNBinaryView* view,
+ BNValueLocation* returnValue, BNFunctionParameter* params, size_t paramCount, const uint32_t* permittedRegs,
+ size_t permittedRegCount, size_t* outCount);
+ BINARYNINJACOREAPI BNValueLocation* BNGetParameterLocationsDefaultPermittedArgs(BNCallingConvention* cc,
+ BNBinaryView* view, BNValueLocation* returnValue, BNFunctionParameter* params, size_t paramCount,
+ size_t* outCount);
+ BINARYNINJACOREAPI BNValueLocation* BNGetDefaultParameterLocations(BNCallingConvention* cc, BNBinaryView* view,
+ BNValueLocation* returnValue, BNFunctionParameter* params, size_t paramCount, const uint32_t* permittedRegs,
+ size_t permittedRegCount, size_t* outCount);
+ BINARYNINJACOREAPI BNValueLocation* BNGetDefaultParameterLocationsDefaultPermittedArgs(BNCallingConvention* cc,
+ BNBinaryView* view, BNValueLocation* returnValue, BNFunctionParameter* params, size_t paramCount,
+ size_t* outCount);
+ BINARYNINJACOREAPI void BNFreeValueLocationList(BNValueLocation* locations, size_t count);
+
BINARYNINJACOREAPI BNVariable* BNGetParameterOrderingForVariables(
BNCallingConvention* cc, const BNVariable* paramVars, const BNType** paramTypes,
size_t paramCount, size_t* count);
- BINARYNINJACOREAPI int64_t BNGetStackAdjustmentForVariables(
- BNCallingConvention* cc, const BNVariable* paramVars, const BNType** paramTypes,
- size_t paramCount);
- BINARYNINJACOREAPI size_t BNGetRegisterStackAdjustments(
- BNCallingConvention* cc, const uint32_t* returnRegs, size_t returnRegCount, BNType* returnType,
- const BNVariable* params, size_t paramCount, const BNType** types, size_t typeCount,
- uint32_t** resultRegisters, uint32_t** resultAdjustments);
+ BINARYNINJACOREAPI int64_t BNGetStackAdjustmentForLocations(BNCallingConvention* cc, BNBinaryView* view,
+ BNValueLocation* returnValue, const BNValueLocation* paramLocations, const BNType** paramTypes,
+ size_t paramCount);
+ BINARYNINJACOREAPI int64_t BNGetDefaultStackAdjustmentForLocations(BNCallingConvention* cc,
+ BNValueLocation* returnValue, const BNValueLocation* paramLocations, const BNType** paramTypes,
+ size_t paramCount);
+ BINARYNINJACOREAPI size_t BNGetCallingConventionRegisterStackAdjustments(BNCallingConvention* cc,
+ BNBinaryView* view, BNValueLocation* returnValue, BNValueLocation* params, size_t paramCount,
+ uint32_t** outRegs, int32_t** outAdjust);
+ BINARYNINJACOREAPI size_t BNGetCallingConventionDefaultRegisterStackAdjustments(BNCallingConvention* cc,
+ BNValueLocation* returnValue, BNValueLocation* params, size_t paramCount, uint32_t** outRegs,
+ int32_t** outAdjust);
+ BINARYNINJACOREAPI void BNFreeCallingConventionRegisterStackAdjustments(uint32_t* regs, int32_t* adjust);
BINARYNINJACOREAPI BNVariable BNGetIncomingVariableForParameterVariable(
BNCallingConvention* cc, const BNVariable* var, BNFunction* func);
@@ -7655,6 +7818,17 @@ extern "C"
BINARYNINJACOREAPI BNVariable BNGetDefaultParameterVariableForIncomingVariable(
BNCallingConvention* cc, const BNVariable* var);
+ BINARYNINJACOREAPI bool BNIsReturnTypeRegisterCompatible(BNCallingConvention* cc, BNBinaryView* view, BNType* type);
+ BINARYNINJACOREAPI bool BNDefaultIsReturnTypeRegisterCompatible(BNCallingConvention* cc, BNType* type);
+ BINARYNINJACOREAPI BNVariable BNGetIndirectReturnValueLocation(BNCallingConvention* cc);
+ BINARYNINJACOREAPI BNVariable BNGetDefaultIndirectReturnValueLocation(BNCallingConvention* cc);
+ BINARYNINJACOREAPI bool BNGetReturnedIndirectReturnValuePointer(BNCallingConvention* cc, BNVariable* outVar);
+ BINARYNINJACOREAPI bool BNIsArgumentTypeRegisterCompatible(
+ BNCallingConvention* cc, BNBinaryView* view, BNType* type);
+ BINARYNINJACOREAPI bool BNDefaultIsArgumentTypeRegisterCompatible(BNCallingConvention* cc, BNType* type);
+ BINARYNINJACOREAPI bool BNIsNonRegisterArgumentIndirect(BNCallingConvention* cc, BNBinaryView* view, BNType* type);
+ BINARYNINJACOREAPI bool BNAreStackArgumentsNaturallyAligned(BNCallingConvention* cc);
+
BINARYNINJACOREAPI BNCallingConvention* BNGetArchitectureDefaultCallingConvention(BNArchitecture* arch);
BINARYNINJACOREAPI BNCallingConvention* BNGetArchitectureCdeclCallingConvention(BNArchitecture* arch);
BINARYNINJACOREAPI BNCallingConvention* BNGetArchitectureStdcallCallingConvention(BNArchitecture* arch);