summaryrefslogtreecommitdiff
path: root/highlevelilinstruction.cpp
diff options
context:
space:
mode:
authorGlenn Smith <glenn@vector35.com>2022-06-07 21:51:27 -0400
committerGlenn Smith <glenn@vector35.com>2022-06-14 21:05:38 -0400
commitb15607dc351bd7787b85751bce9bbddc0a705461 (patch)
tree47558d7c26d1b8acb2fe4788e252634b1c139fd1 /highlevelilinstruction.cpp
parent55cb3e76f536bc8d4a6533bd7ea5202d464c5f81 (diff)
Add Dump() to *LILInstruction
Diffstat (limited to 'highlevelilinstruction.cpp')
-rw-r--r--highlevelilinstruction.cpp42
1 files changed, 42 insertions, 0 deletions
diff --git a/highlevelilinstruction.cpp b/highlevelilinstruction.cpp
index 5f8777e1..ecec3869 100644
--- a/highlevelilinstruction.cpp
+++ b/highlevelilinstruction.cpp
@@ -18,6 +18,7 @@
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
// IN THE SOFTWARE.
+#include <string.h>
#ifdef BINARYNINJACORE_LIBRARY
#include "highlevelilfunction.h"
#include "highlevelilssafunction.h"
@@ -883,6 +884,47 @@ MediumLevelILInstruction HighLevelILInstructionBase::GetMediumLevelILSSAForm() c
}
+char* HighLevelILInstructionBase::Dump() const
+{
+ if (!function)
+ return strdup("<uninit>");
+
+ vector<InstructionTextToken> tokens;
+ vector<DisassemblyTextLine> lines = function->GetExprText(*this, new DisassemblySettings());
+ if (!lines.empty())
+ {
+ string text;
+ if (exprIndex != BN_INVALID_EXPR && (exprIndex & 0xffff000000000000) == 0)
+ {
+ text += "[expr " + to_string(exprIndex) + "] ";
+ }
+ if (instructionIndex != BN_INVALID_EXPR && (instructionIndex & 0xffff000000000000) == 0)
+ {
+ text += "[instr " + to_string(instructionIndex) + "] ";
+ }
+ Ref<Type> type = GetType();
+ if (type)
+ {
+ text += "[type: " + type->GetString() + "] ";
+ }
+
+ for (auto& line: lines)
+ {
+ for (auto& token: line.tokens)
+ {
+ text += token.text;
+ }
+ text += " ; ";
+ }
+ return strdup(text.c_str());
+ }
+ else
+ {
+ return strdup("???");
+ }
+}
+
+
void HighLevelILInstructionBase::Replace(ExprId expr)
{
function->ReplaceExpr(exprIndex, expr);