From efa3a367885c9510bb6280788241dae6f48a42bb Mon Sep 17 00:00:00 2001 From: Rusty Wagner Date: Mon, 24 Feb 2020 19:42:56 -0500 Subject: Adding SSA support for HLIL --- binaryninjaapi.h | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) (limited to 'binaryninjaapi.h') diff --git a/binaryninjaapi.h b/binaryninjaapi.h index 4339ad6f..91fe0d63 100644 --- a/binaryninjaapi.h +++ b/binaryninjaapi.h @@ -4052,9 +4052,15 @@ __attribute__ ((format (printf, 1, 2))) ExprId If(ExprId condition, ExprId trueExpr, ExprId falseExpr, const ILSourceLocation& loc = ILSourceLocation()); ExprId While(ExprId condition, ExprId loopExpr, const ILSourceLocation& loc = ILSourceLocation()); + ExprId WhileSSA(ExprId conditionPhi, ExprId condition, ExprId loopExpr, + const ILSourceLocation& loc = ILSourceLocation()); ExprId DoWhile(ExprId loopExpr, ExprId condition, const ILSourceLocation& loc = ILSourceLocation()); + ExprId DoWhileSSA(ExprId loopExpr, ExprId conditionPhi, ExprId condition, + const ILSourceLocation& loc = ILSourceLocation()); ExprId For(ExprId initExpr, ExprId condition, ExprId updateExpr, ExprId loopExpr, const ILSourceLocation& loc = ILSourceLocation()); + ExprId ForSSA(ExprId initExpr, ExprId conditionPhi, ExprId condition, ExprId updateExpr, + ExprId loopExpr, const ILSourceLocation& loc = ILSourceLocation()); ExprId Switch(ExprId condition, ExprId defaultExpr, const std::vector& cases, const ILSourceLocation& loc = ILSourceLocation()); ExprId Case(const std::vector& condition, ExprId expr, @@ -4227,9 +4233,10 @@ __attribute__ ((format (printf, 1, 2))) ExprId AddSSAVariableList(const std::vector& vars); BNHighLevelILInstruction GetRawExpr(size_t i) const; + BNHighLevelILInstruction GetRawNonASTExpr(size_t i) const; HighLevelILInstruction operator[](size_t i); HighLevelILInstruction GetInstruction(size_t i); - HighLevelILInstruction GetExpr(size_t i); + HighLevelILInstruction GetExpr(size_t i, bool asFullAst = true); size_t GetIndexForInstruction(size_t i) const; size_t GetInstructionForExpr(size_t expr) const; size_t GetInstructionCount() const; @@ -4238,6 +4245,24 @@ __attribute__ ((format (printf, 1, 2))) std::vector> GetBasicBlocks() const; Ref GetBasicBlockForInstruction(size_t i) const; + Ref GetSSAForm() const; + Ref GetNonSSAForm() const; + size_t GetSSAInstructionIndex(size_t instr) const; + size_t GetNonSSAInstructionIndex(size_t instr) const; + size_t GetSSAExprIndex(size_t instr) const; + size_t GetNonSSAExprIndex(size_t instr) const; + + size_t GetSSAVarDefinition(const SSAVariable& var) const; + size_t GetSSAMemoryDefinition(size_t version) const; + std::set GetSSAVarUses(const SSAVariable& var) const; + std::set GetSSAMemoryUses(size_t version) const; + bool IsSSAVarLive(const SSAVariable& var) const; + + std::set GetVariableDefinitions(const Variable& var) const; + std::set GetVariableUses(const Variable& var) const; + size_t GetSSAVarVersionAtInstruction(const Variable& var, size_t instr) const; + size_t GetSSAMemoryVersionAtInstruction(size_t instr) const; + Ref GetMediumLevelIL() const; size_t GetMediumLevelILExprIndex(size_t expr) const; @@ -5249,6 +5274,7 @@ __attribute__ ((format (printf, 1, 2))) static Ref CreateMappedMediumLevelIL(BinaryView* view, DisassemblySettings* settings); static Ref CreateMappedMediumLevelILSSAForm(BinaryView* view, DisassemblySettings* settings); static Ref CreateHighLevelIL(BinaryView* view, DisassemblySettings* settings); + static Ref CreateHighLevelILSSAForm(BinaryView* view, DisassemblySettings* settings); }; class LinearViewCursor: public CoreRefCountObject