@@ -9383,6 +9383,9 @@ namespace BinaryNinja {
93839383 std::set<ArchAndAddr>& GetHaltedDisassemblyAddresses();
93849384 std::map<ArchAndAddr, ArchAndAddr>& GetInlinedUnresolvedIndirectBranches();
93859385
9386+ void* GetFunctionArchContext() { return m_context->functionArchContext; }
9387+ void SetFunctionArchContext(void* context) { m_context->functionArchContext = context; }
9388+
93869389 void AddTempOutgoingReference(Function* targetFunc);
93879390
93889391 Ref<BasicBlock> CreateBasicBlock(Architecture* arch, uint64_t start);
@@ -9405,6 +9408,7 @@ namespace BinaryNinja {
94059408 std::map<ArchAndAddr, std::set<ArchAndAddr>> m_autoIndirectBranches;
94069409 std::set<uint64_t> m_inlinedCalls;
94079410 bool* m_containsInlinedFunctions;
9411+ void* m_functionArchContext;
94089412
94099413 public:
94109414 BNFunctionLifterContext* m_context;
@@ -9420,6 +9424,7 @@ namespace BinaryNinja {
94209424 std::map<ArchAndAddr, std::set<ArchAndAddr>>& GetAutoIndirectBranches();
94219425 std::set<uint64_t>& GetInlinedCalls();
94229426 void SetContainsInlinedFunctions(bool value);
9427+ void* GetFunctionArchContext();
94239428
94249429 void CheckForInlinedCall(BasicBlock* block, size_t instrCountBefore, size_t instrCountAfter, uint64_t prevAddr,
94259430 uint64_t addr, const uint8_t* opcode, size_t len,
@@ -9453,11 +9458,14 @@ namespace BinaryNinja {
94539458 void* ctxt, const uint8_t* data, uint64_t addr, size_t maxLen, BNInstructionInfo* result);
94549459 static bool GetInstructionTextCallback(void* ctxt, const uint8_t* data, uint64_t addr, size_t* len,
94559460 BNInstructionTextToken** result, size_t* count);
9461+ static bool GetInstructionTextWithContextCallback(void* ctxt, const uint8_t* data, uint64_t addr, void* context,
9462+ size_t* len, BNInstructionTextToken** result, size_t* count);
94569463 static void FreeInstructionTextCallback(BNInstructionTextToken* tokens, size_t count);
94579464 static bool GetInstructionLowLevelILCallback(
94589465 void* ctxt, const uint8_t* data, uint64_t addr, size_t* len, BNLowLevelILFunction* il);
94599466 static void AnalyzeBasicBlocksCallback(void *ctxt, BNFunction* function, BNBasicBlockAnalysisContext* context);
94609467 static bool LiftFunctionCallback(void* ctxt, BNLowLevelILFunction* function, BNFunctionLifterContext* context);
9468+ static void FreeFunctionArchContextCallback(void* ctxt, void* context);
94619469 static char* GetRegisterNameCallback(void* ctxt, uint32_t reg);
94629470 static char* GetFlagNameCallback(void* ctxt, uint32_t flag);
94639471 static char* GetFlagWriteTypeNameCallback(void* ctxt, uint32_t flags);
@@ -9635,6 +9643,20 @@ namespace BinaryNinja {
96359643 virtual bool GetInstructionText(
96369644 const uint8_t* data, uint64_t addr, size_t& len, std::vector<InstructionTextToken>& result) = 0;
96379645
9646+ /*! Retrieves a list of InstructionTextTokens while supplying contextual information
9647+
9648+ \note Architecture subclasses can implement this method to provide contextual information from AnalyzeBasicBlocks
9649+
9650+ \param[in] data pointer to the instruction data to retrieve text for
9651+ \param[in] addr address of the instruction data to retrieve text for
9652+ \param[in] context context to use when retrieving instruction text
9653+ \param[out] len will be written to with the length of the instruction data which was translated
9654+ \param[out] result
9655+ \return Whether instruction info was successfully retrieved.
9656+ */
9657+ virtual bool GetInstructionTextWithContext(const uint8_t* data, uint64_t addr, void* context, size_t& len,
9658+ std::vector<InstructionTextToken>& result);
9659+
96389660 /*! Translates an instruction at addr and appends it onto the LowLevelILFunction& il.
96399661
96409662 \note Architecture subclasses should implement this method.
@@ -9661,6 +9683,12 @@ namespace BinaryNinja {
96619683 */
96629684 virtual bool LiftFunction(LowLevelILFunction* function, FunctionLifterContext& context);
96639685
9686+ /*! Free the function architecture context
9687+
9688+ \param context Function architecture context
9689+ */
9690+ virtual void FreeFunctionArchContext(void* context);
9691+
96649692 /*! Gets a register name from a register index.
96659693
96669694 \param reg Register index
@@ -10052,10 +10080,13 @@ namespace BinaryNinja {
1005210080 const uint8_t* data, uint64_t addr, size_t maxLen, InstructionInfo& result) override;
1005310081 virtual bool GetInstructionText(
1005410082 const uint8_t* data, uint64_t addr, size_t& len, std::vector<InstructionTextToken>& result) override;
10083+ virtual bool GetInstructionTextWithContext(const uint8_t* data, uint64_t addr, void* context, size_t& len,
10084+ std::vector<InstructionTextToken>& result) override;
1005510085 virtual bool GetInstructionLowLevelIL(
1005610086 const uint8_t* data, uint64_t addr, size_t& len, LowLevelILFunction& il) override;
1005710087 virtual void AnalyzeBasicBlocks(Function* function, BasicBlockAnalysisContext& context) override;
1005810088 virtual bool LiftFunction(LowLevelILFunction* function, FunctionLifterContext& context) override;
10089+ virtual void FreeFunctionArchContext(void* context) override;
1005910090 virtual std::string GetRegisterName(uint32_t reg) override;
1006010091 virtual std::string GetFlagName(uint32_t flag) override;
1006110092 virtual std::string GetFlagWriteTypeName(uint32_t flags) override;
@@ -10139,6 +10170,8 @@ namespace BinaryNinja {
1013910170 const uint8_t* data, uint64_t addr, size_t maxLen, InstructionInfo& result) override;
1014010171 virtual bool GetInstructionText(
1014110172 const uint8_t* data, uint64_t addr, size_t& len, std::vector<InstructionTextToken>& result) override;
10173+ virtual bool GetInstructionTextWithContext(const uint8_t* data, uint64_t addr, void* context, size_t& len,
10174+ std::vector<InstructionTextToken>& result) override;
1014210175 virtual bool GetInstructionLowLevelIL(
1014310176 const uint8_t* data, uint64_t addr, size_t& len, LowLevelILFunction& il) override;
1014410177 virtual std::string GetRegisterName(uint32_t reg) override;
0 commit comments