diff --git a/meson.build b/meson.build index 75df6a59..4215e2b3 100644 --- a/meson.build +++ b/meson.build @@ -87,7 +87,7 @@ add_global_arguments('-DNDEBUG', language: ['c', 'cpp']) r2ghidra_incdirs = include_directories(incdirs) -ghidra = subproject('ghidra-native', version: '>=0.7.2', default_options: ['default_library=static', 'werror=false', 'warning_level=0']) +ghidra = subproject('ghidra-native', version: '>=0.7.3', default_options: ['default_library=static', 'werror=false', 'warning_level=0']) r2ghidra_deps = [r_core, ghidra.get_variable('ghidra_dep').as_system()] r2ghidra_cpp_args = [] diff --git a/src/CodeXMLParse.cpp b/src/CodeXMLParse.cpp index e1c0dc61..8cd627f6 100644 --- a/src/CodeXMLParse.cpp +++ b/src/CodeXMLParse.cpp @@ -26,7 +26,7 @@ struct ParseCodeXMLContext { std::map symbols; explicit ParseCodeXMLContext(ghidra::Funcdata *func) : func (func) { - for (auto it=func->beginOpAll (); it != func->endOpAll (); it++) { + for (auto it=func->beginOpMain (); it != func->endOpMain (); it++) { ops[it->first.getTime ()] = it->second; } for (auto it = func->beginLoc (); it != func->endLoc (); it++) { diff --git a/src/R2PrintC.cpp b/src/R2PrintC.cpp index e488a221..84249ac6 100644 --- a/src/R2PrintC.cpp +++ b/src/R2PrintC.cpp @@ -69,7 +69,7 @@ fprintf (stderr, "opCast%c", 10); } #endif -void R2PrintC::pushUnnamedLocation(const Address &addr, const Varnode *vn, const PcodeOp *op) { +void R2PrintC::pushUnnamedLocation(const Address &addr, int4 size, const Varnode *vn, const PcodeOp *op) { // option_nocasts = true; // print (*(type *)0x0000...) instead of ram00000... AddrSpace *space = addr.getSpace (); @@ -78,7 +78,7 @@ void R2PrintC::pushUnnamedLocation(const Address &addr, const Varnode *vn, const auto type = glb->types->getTypePointer (space->getAddrSize (), vn->getType (), space->getWordSize ()); pushConstant (addr.getOffset (), type, vartoken, vn, op, type->getDisplayFormat ()); } else { - PrintC::pushUnnamedLocation (addr,vn, op); + PrintC::pushUnnamedLocation (addr, size, vn, op); } } diff --git a/src/R2PrintC.h b/src/R2PrintC.h index 3dfca384..1e2b1731 100644 --- a/src/R2PrintC.h +++ b/src/R2PrintC.h @@ -10,7 +10,7 @@ using namespace ghidra; class R2PrintC : public PrintC { protected: - void pushUnnamedLocation(const Address &addr, const Varnode *vn,const PcodeOp *op) override; + void pushUnnamedLocation(const Address &addr, int4 size, const Varnode *vn, const PcodeOp *op) override; // void opCast(const PcodeOp *op) override; public: diff --git a/src/R2Scope.cpp b/src/R2Scope.cpp index 4442184c..92bda23a 100644 --- a/src/R2Scope.cpp +++ b/src/R2Scope.cpp @@ -108,7 +108,7 @@ static Element *childAddr(Element *el, const std::string &name, const Address &a } // Join addresses must be marshaled with their physical pieces. - JoinRecord *record = space->getManager ()->findJoin (addr.getOffset ()); + JoinRecord *record = space->findJoin (addr.getOffset ()); const int4 numPieces = record->numPieces (); constexpr int4 maxMarshaledJoinPieces = 64; // JoinSpace::MAX_PIECES is private. if (numPieces > maxMarshaledJoinPieces) { diff --git a/src/R2Scope.h b/src/R2Scope.h index 68671873..7cfba1fc 100644 --- a/src/R2Scope.h +++ b/src/R2Scope.h @@ -67,6 +67,8 @@ public: Funcdata *resolveExternalRefFunction(ExternRefSymbol *sym) const override; MapEntry *findOverlap(const Address &addr,int4 size) const override { throw LowlevelError("findOverlap unimplemented"); } + MapEntry *findSymbolBefore(const Address &addr,const Address &usepoint) const override { return cache->findSymbolBefore(addr,usepoint); } + MapEntry *findSymbolAfter(const Address &addr,const Address &usepoint) const override { return cache->findSymbolAfter(addr,usepoint); } SymbolEntry *findBefore(const Address &addr) const { throw LowlevelError("findBefore unimplemented"); } SymbolEntry *findAfter(const Address &addr) const { throw LowlevelError("findAfter unimplemented"); } void findByName(const string &name,vector &res) const override { throw LowlevelError("findByName unimplemented"); } diff --git a/src/core_ghidra.cpp b/src/core_ghidra.cpp index 5e7eb22a..caf8e655 100644 --- a/src/core_ghidra.cpp +++ b/src/core_ghidra.cpp @@ -229,11 +229,9 @@ struct PcodeSnapshot { void capture(const Funcdata &func) { operations.clear (); - for (auto it = func.beginOpAll (); it != func.endOpAll (); ++it) { - const PcodeOp *op = it->second; - if (!op->isDead ()) { - operations.emplace (it->first, Operation { op, op->code () }); - } + for (auto it = func.beginOpAlive (); it != func.endOpAlive (); ++it) { + const PcodeOp *op = *it; + operations.emplace (op->getSeqNum (), Operation { op, op->code () }); } } diff --git a/subprojects/ghidra-native.wrap b/subprojects/ghidra-native.wrap index ac34f482..cae67aac 100644 --- a/subprojects/ghidra-native.wrap +++ b/subprojects/ghidra-native.wrap @@ -1,5 +1,5 @@ [wrap-git] url = https://github.com/radareorg/ghidra-native -revision = 0.7.2 +revision = 0.7.3 directory = ghidra-native depth = 1 diff --git a/test/db/extras/ghidra_output b/test/db/extras/ghidra_output index 19490fa7..d33779ee 100644 --- a/test/db/extras/ghidra_output +++ b/test/db/extras/ghidra_output @@ -44,7 +44,7 @@ CCu base64:Jg== @ 0x804858a - + @@ -699,25 +699,29 @@ shr eax, 4 (unique,0x49a00,1) = INT_AND (unique,0x49900,1), 0x1 PF = INT_EQUAL (unique,0x49a00,1), 0x0 0x08048557: SHR EAX,0x4 - (unique,0xac000,4) = INT_AND 0x4, 0x1f - (unique,0xac100,4) = COPY EAX - EAX = INT_RIGHT EAX, (unique,0xac000,4) - (unique,0x50200,1) = INT_NOTEQUAL (unique,0xac000,4), 0x0 - (unique,0x50300,4) = INT_SUB (unique,0xac000,4), 0x1 - (unique,0x50400,4) = INT_RIGHT (unique,0xac100,4), (unique,0x50300,4) - (unique,0x50500,4) = INT_AND (unique,0x50400,4), 0x1 - (unique,0x50700,1) = INT_NOTEQUAL (unique,0x50500,4), 0x0 - (unique,0x50800,1) = BOOL_NEGATE (unique,0x50200,1) - (unique,0x50900,1) = INT_AND (unique,0x50800,1), CF - (unique,0x50a00,1) = INT_AND (unique,0x50200,1), (unique,0x50700,1) - CF = INT_OR (unique,0x50900,1), (unique,0x50a00,1) - (unique,0x50d00,1) = INT_EQUAL (unique,0xac000,4), 0x1 - (unique,0x50f00,1) = INT_SLESS (unique,0xac100,4), 0x0 - (unique,0x51000,1) = BOOL_NEGATE (unique,0x50d00,1) - (unique,0x51100,1) = INT_AND (unique,0x51000,1), OF - (unique,0x51200,1) = INT_AND (unique,0x50d00,1), (unique,0x50f00,1) - OF = INT_OR (unique,0x51100,1), (unique,0x51200,1) - (unique,0x49d00,1) = INT_NOTEQUAL (unique,0xac000,4), 0x0 + (unique,0xa1f00,4) = INT_AND 0x4, 0x1f + (unique,0xa2000,4) = COPY EAX + EAX = INT_RIGHT EAX, (unique,0xa1f00,4) + (unique,0x4d300,1) = INT_EQUAL (unique,0xa1f00,4), 0x0 + (unique,0x4d400,4) = INT_SUB (unique,0xa1f00,4), 0x1 + (unique,0x4d500,4) = INT_RIGHT (unique,0xa2000,4), (unique,0x4d400,4) + (unique,0x4d600,4) = INT_AND (unique,0x4d500,4), 0x1 + (unique,0x4d700,1) = INT_NOTEQUAL (unique,0x4d600,4), 0x0 + (unique,0x0,1) = COPY (unique,0x4d300,1) + (unique,0x100,1) = INT_MULT (unique,0x0,1), CF + (unique,0x200,1) = BOOL_NEGATE (unique,0x4d300,1) + (unique,0x300,1) = COPY (unique,0x200,1) + (unique,0x400,1) = INT_MULT (unique,0x300,1), (unique,0x4d700,1) + CF = INT_OR (unique,0x100,1), (unique,0x400,1) + (unique,0x4d800,1) = INT_EQUAL (unique,0xa1f00,4), 0x1 + (unique,0x4d900,1) = INT_SLESS (unique,0xa2000,4), 0x0 + (unique,0x0,1) = COPY (unique,0x4d800,1) + (unique,0x100,1) = INT_MULT (unique,0x0,1), 0x0 + (unique,0x200,1) = BOOL_NEGATE (unique,0x4d800,1) + (unique,0x300,1) = COPY (unique,0x200,1) + (unique,0x400,1) = INT_MULT (unique,0x300,1), (unique,0x4d900,1) + OF = INT_OR (unique,0x100,1), (unique,0x400,1) + (unique,0x49d00,1) = INT_NOTEQUAL (unique,0xa1f00,4), 0x0 (unique,0x49f00,1) = INT_SLESS EAX, 0x0 (unique,0x4a000,1) = BOOL_NEGATE (unique,0x49d00,1) (unique,0x4a100,1) = INT_AND (unique,0x4a000,1), SF diff --git a/test/db/extras/ghidra_types b/test/db/extras/ghidra_types index f1aa7e90..3afc6002 100644 --- a/test/db/extras/ghidra_types +++ b/test/db/extras/ghidra_types @@ -1262,7 +1262,7 @@ EXPECT=< - + @@ -697,25 +697,29 @@ shr eax, 4 (unique,0x49a00,1) = INT_AND (unique,0x49900,1), 0x1 PF = INT_EQUAL (unique,0x49a00,1), 0x0 0x08048557: SHR EAX,0x4 - (unique,0xac000,4) = INT_AND 0x4, 0x1f - (unique,0xac100,4) = COPY EAX - EAX = INT_RIGHT EAX, (unique,0xac000,4) - (unique,0x50200,1) = INT_NOTEQUAL (unique,0xac000,4), 0x0 - (unique,0x50300,4) = INT_SUB (unique,0xac000,4), 0x1 - (unique,0x50400,4) = INT_RIGHT (unique,0xac100,4), (unique,0x50300,4) - (unique,0x50500,4) = INT_AND (unique,0x50400,4), 0x1 - (unique,0x50700,1) = INT_NOTEQUAL (unique,0x50500,4), 0x0 - (unique,0x50800,1) = BOOL_NEGATE (unique,0x50200,1) - (unique,0x50900,1) = INT_AND (unique,0x50800,1), CF - (unique,0x50a00,1) = INT_AND (unique,0x50200,1), (unique,0x50700,1) - CF = INT_OR (unique,0x50900,1), (unique,0x50a00,1) - (unique,0x50d00,1) = INT_EQUAL (unique,0xac000,4), 0x1 - (unique,0x50f00,1) = INT_SLESS (unique,0xac100,4), 0x0 - (unique,0x51000,1) = BOOL_NEGATE (unique,0x50d00,1) - (unique,0x51100,1) = INT_AND (unique,0x51000,1), OF - (unique,0x51200,1) = INT_AND (unique,0x50d00,1), (unique,0x50f00,1) - OF = INT_OR (unique,0x51100,1), (unique,0x51200,1) - (unique,0x49d00,1) = INT_NOTEQUAL (unique,0xac000,4), 0x0 + (unique,0xa1f00,4) = INT_AND 0x4, 0x1f + (unique,0xa2000,4) = COPY EAX + EAX = INT_RIGHT EAX, (unique,0xa1f00,4) + (unique,0x4d300,1) = INT_EQUAL (unique,0xa1f00,4), 0x0 + (unique,0x4d400,4) = INT_SUB (unique,0xa1f00,4), 0x1 + (unique,0x4d500,4) = INT_RIGHT (unique,0xa2000,4), (unique,0x4d400,4) + (unique,0x4d600,4) = INT_AND (unique,0x4d500,4), 0x1 + (unique,0x4d700,1) = INT_NOTEQUAL (unique,0x4d600,4), 0x0 + (unique,0x0,1) = COPY (unique,0x4d300,1) + (unique,0x100,1) = INT_MULT (unique,0x0,1), CF + (unique,0x200,1) = BOOL_NEGATE (unique,0x4d300,1) + (unique,0x300,1) = COPY (unique,0x200,1) + (unique,0x400,1) = INT_MULT (unique,0x300,1), (unique,0x4d700,1) + CF = INT_OR (unique,0x100,1), (unique,0x400,1) + (unique,0x4d800,1) = INT_EQUAL (unique,0xa1f00,4), 0x1 + (unique,0x4d900,1) = INT_SLESS (unique,0xa2000,4), 0x0 + (unique,0x0,1) = COPY (unique,0x4d800,1) + (unique,0x100,1) = INT_MULT (unique,0x0,1), 0x0 + (unique,0x200,1) = BOOL_NEGATE (unique,0x4d800,1) + (unique,0x300,1) = COPY (unique,0x200,1) + (unique,0x400,1) = INT_MULT (unique,0x300,1), (unique,0x4d900,1) + OF = INT_OR (unique,0x100,1), (unique,0x400,1) + (unique,0x49d00,1) = INT_NOTEQUAL (unique,0xa1f00,4), 0x0 (unique,0x49f00,1) = INT_SLESS EAX, 0x0 (unique,0x4a000,1) = BOOL_NEGATE (unique,0x49d00,1) (unique,0x4a100,1) = INT_AND (unique,0x4a000,1), SF @@ -1053,6 +1057,6 @@ s main pdg~gmon_start EOF2 EXPECT=<