diff --git a/include/base/SMPFunction.h b/include/base/SMPFunction.h index 9d75c85c94bd021fd3df232db3e3ece935bc3adc..06e410058a25e820bdc97b107a23734b89d46a18 100644 --- a/include/base/SMPFunction.h +++ b/include/base/SMPFunction.h @@ -268,7 +268,7 @@ public: inline void SetHasHashingCode(bool Hashes) { HasHashingCode = Hashes; }; void AddCallSource(STARS_ea_t addr); // Add a caller to the list of all callers of this function. bool AddDirectCallTarget(STARS_ea_t addr); // Add a direct call target; return true if new target, false if target already added - bool RemoveDirectCallTarget(STARS_ea_t TargetAddr); // Remove TargetAddr from DirectCallTargets and AllCallTargets. + std::set<STARS_ea_t>::iterator RemoveDirectCallTarget(STARS_ea_t TargetAddr); // Remove TargetAddr from DirectCallTargets and AllCallTargets. bool RemoveIndirectCallTarget(STARS_ea_t TargetAddr); // Remove TargetAddr from IndirectCallTargets and AllCallTargets. void AddLeaOperand(STARS_ea_t addr, STARSOpndTypePtr LeaOperand); // add map entry to LeaInstOpMap void AddNormalizedStackOperand(STARSOpndTypePtr OldOp, STARS_ea_t InstAddr, STARSOpndTypePtr NormalizedOp); // add to map for RTL lookup later @@ -311,9 +311,9 @@ public: inline bool HasReducibleControlFlow(void) const { return HasReducibleCFG; }; inline bool HasPushAfterFrameAlloc(void) const { return PushAfterLocalVarAlloc; }; inline bool IsLinkerStub(void) const { return LinkerStub; }; -// inline bool IsAddrInFunc(STARS_ea_t addr) { return ((addr >= FuncInfo->get_startEA()) && (addr <= FuncInfo->get_endEA())); } +// inline bool IsInstIDInFunc(STARS_ea_t addr) { return ((addr >= FuncInfo->get_startEA()) && (addr < FuncInfo->get_endEA())); } inline bool IsLibFunc(void) const { return LibFunc; }; - inline bool IsLeaf(void) const { return (!IndirectCalls && DirectCallTargets.empty()); }; + inline bool IsLeaf(void) const { return (!IndirectCalls && (DirectCallTargets.empty() || ((1 == DirectCallTargets.size()) && IsDirectlyRecursive()))); }; inline bool IsSafe(void) const { return SafeFunc; }; // safe to follow stack access DEF-USE chains inline bool IsSpecSafe(void) const { return SpecSafeFunc; }; // safe if we can resolve indirect calls at run time in mmStrata inline bool IsSafeCallee(void) const { return SafeCallee; }; diff --git a/include/interfaces/abstract/STARSFunction.h b/include/interfaces/abstract/STARSFunction.h index 5a669f14375920e3af53efd7863034bb1c8735ca..795ea261e15a26b67592747326bf56fcee9793ae 100644 --- a/include/interfaces/abstract/STARSFunction.h +++ b/include/interfaces/abstract/STARSFunction.h @@ -8,27 +8,28 @@ class SMPFunction; class STARS_Function_t { public: - virtual char* GetFunctionName(const char* name, const int len) const =0; - virtual STARS_ea_t get_startEA()=0; - virtual STARS_ea_t get_endEA()=0; - virtual std::size_t GetFrameSize()=0; + virtual char* GetFunctionName(const char* name, const int len) const = 0; + virtual STARS_ea_t get_startEA() = 0; + virtual STARS_ea_t get_endEA() = 0; + virtual std::size_t GetFrameSize() = 0; virtual void SetFrameSize(std::size_t size) = 0; virtual std::size_t GetSavedRegSize() = 0; virtual std::size_t GetIncomingArgumentSize() = 0; virtual std::size_t GetFrameReturnAddressSize() = 0; - virtual bool FunctionUsesFP()=0; - virtual bool IsStaticFunction()=0; - virtual bool IsLibraryFunction()=0; - virtual bool IsStackPointerAnalyzed()=0; - virtual STARS_sval_t get_spd(STARS_ea_t ea)=0; - virtual bool HasReturnPoints()=0; - virtual bool IsMultiEntry()=0; - virtual void MarkSharedChunks()=0; - virtual bool HasSharedChunks() const =0; - virtual void SetSharedChunks(bool v) =0; - virtual void UpdateXrefs()=0; - virtual void BuildFuncIR(SMPFunction *func)=0; - virtual bool FindDistantCodeFragment(SMPFunction* func, STARS_ea_t TargetAddr)=0; + virtual bool IsInstIDInFunc(STARS_ea_t InstID) = 0; + virtual bool FunctionUsesFP() = 0; + virtual bool IsStaticFunction() = 0; + virtual bool IsLibraryFunction() = 0; + virtual bool IsStackPointerAnalyzed() = 0; + virtual STARS_sval_t get_spd(STARS_ea_t ea) = 0; + virtual bool HasReturnPoints() = 0; + virtual bool IsMultiEntry() = 0; + virtual void MarkSharedChunks() = 0; + virtual bool HasSharedChunks() const = 0; + virtual void SetSharedChunks(bool v) = 0; + virtual void UpdateXrefs() = 0; + virtual void BuildFuncIR(SMPFunction *func) = 0; + virtual bool FindDistantCodeFragment(SMPFunction* func, STARS_ea_t TargetAddr) = 0; virtual void FillInLocalVarTable(SMPFunction *CurrFunc) = 0; // get stack frame fine-grained info virtual bool AnalyzeInstAsCallTarget(SMPFunction *CurrFunc, bool &IsIndirectCallTarget, bool &IsTailCallTarget) = 0; // return success or failure of analysis virtual bool IsChunkUnshared(STARS_ea_t ChunkAddr, STARS_ea_t FuncHeadStart, STARS_ea_t FuncHeadEnd) = 0; diff --git a/include/interfaces/idapro/STARSFunction.h b/include/interfaces/idapro/STARSFunction.h index b6ffbf87ebcfc3969f39a36045cfbdf9f607d0d4..47ef5c38e605cbeb1b5a63098023fe567789973a 100644 --- a/include/interfaces/idapro/STARSFunction.h +++ b/include/interfaces/idapro/STARSFunction.h @@ -44,6 +44,7 @@ public: virtual bool HasReturnPoints() { return the_func->does_return(); } virtual bool IsMultiEntry(); virtual bool IsChunkUnshared(STARS_ea_t ChunkAddr, STARS_ea_t FuncHeadStart, STARS_ea_t FuncHeadEnd); + virtual bool IsInstIDInFunc(STARS_ea_t InstID); // Analysis methods virtual void MarkSharedChunks(); diff --git a/include/interfaces/irdb/STARSFunction.h b/include/interfaces/irdb/STARSFunction.h index ebacbcdb3489b3c6b91390bbf5c8d643e28c3f10..90c0ce69f596c3f1325a11a6b4331ca5db7abcfb 100644 --- a/include/interfaces/irdb/STARSFunction.h +++ b/include/interfaces/irdb/STARSFunction.h @@ -2,7 +2,6 @@ #define STARS_IRDB_Function_h #include "interfaces/STARSTypes.h" -#include <libIRDB-core.hpp> class SMPFunction; @@ -10,54 +9,47 @@ class STARS_IRDB_Function_t : public STARS_Function_t { public: - STARS_IRDB_Function_t(libIRDB::Function_t* f): the_func(f) - { - } - // obvious - virtual char* GetFunctionName(const char* name, const int len) const { assert(0); } + virtual char* GetFunctionName(const char* name, const int len) const =0; // get entry point of function - virtual STARS_ea_t get_startEA(){ return the_func->GetEntryPoint()->GetBaseID(); } + virtual STARS_ea_t get_startEA()=0; // clc needs to review and get back to me. - virtual STARS_ea_t get_endEA(){ assert(0); } + // NOTE: All calls to this should be eliminated in IRDB code. + virtual STARS_ea_t get_endEA()=0; // init class-local variable with IRDB value // and these are accessors to that. - virtual std::size_t GetFrameSize(){ return the_func -> GetStackFrameSize(); } - virtual void SetFrameSize(std::size_t size) { assert(0); } + virtual std::size_t GetFrameSize()=0; + virtual void SetFrameSize(std::size_t size) = 0; // todo for clc: audit these functions and see if they are really getting info from idapro // or if these can be removed from the interface because they are calculated by STARS // interface-independent routines. - virtual std::size_t GetSavedRegSize() { assert(0); } - virtual std::size_t GetIncomingArgumentSize() { assert(0); } - virtual std::size_t GetFrameReturnAddressSize() { assert(0); } - - - - virtual bool FunctionUsesFP(){ return the_func->GetUseFramePointer(); } - virtual bool IsStaticFunction(){ return false; } - virtual bool IsLibraryFunction(){ return false; } - - - virtual bool IsStackPointerAnalyzed(){ assert(0); } - virtual STARS_sval_t get_spd(STARS_ea_t ea){ assert(0); } - virtual bool HasReturnPoints(){ assert(0); } - virtual bool IsMultiEntry(){ assert(0); } - virtual void MarkSharedChunks(){ assert(0); } - virtual bool HasSharedChunks() const { assert(0); } - virtual void SetSharedChunks(bool v) { assert(0); } - virtual void UpdateXrefs(){ assert(0); } - virtual void BuildFuncIR(SMPFunction *func){ assert(0); } - virtual bool FindDistantCodeFragment(SMPFunction* func, STARS_ea_t TargetAddr){ assert(0); } - virtual void FillInLocalVarTable(SMPFunction *CurrFunc) { assert(0); } - virtual bool AnalyzeInstAsCallTarget(SMPFunction *CurrFunc, bool &IsIndirectCallTarget, bool &IsTailCallTarget) { assert(0); } - virtual bool IsChunkUnshared(STARS_ea_t ChunkAddr, STARS_ea_t FuncHeadStart, STARS_ea_t FuncHeadEnd) { assert(0); } - -private: - libIRDB::Function_t* the_func; + virtual std::size_t GetSavedRegSize() = 0; + virtual std::size_t GetIncomingArgumentSize() = 0; + virtual std::size_t GetFrameReturnAddressSize() = 0; + + + + virtual bool FunctionUsesFP()=0; + virtual bool IsStaticFunction()=0; + virtual bool IsLibraryFunction()=0; + virtual bool IsStackPointerAnalyzed()=0; + virtual STARS_sval_t get_spd(STARS_ea_t ea)=0; + virtual bool HasReturnPoints()=0; + virtual bool IsMultiEntry()=0; + virtual void MarkSharedChunks()=0; + virtual bool HasSharedChunks() const =0; + virtual void SetSharedChunks(bool v) =0; + virtual void UpdateXrefs()=0; + virtual void BuildFuncIR(SMPFunction *func)=0; + virtual bool FindDistantCodeFragment(SMPFunction* func, STARS_ea_t TargetAddr)=0; + virtual void FillInLocalVarTable(SMPFunction *CurrFunc) = 0; // get stack frame fine-grained info + virtual bool AnalyzeInstAsCallTarget(SMPFunction *CurrFunc, bool &IsIndirectCallTarget, bool &IsTailCallTarget) = 0; // return success or failure of analysis + virtual bool IsChunkUnshared(STARS_ea_t ChunkAddr, STARS_ea_t FuncHeadStart, STARS_ea_t FuncHeadEnd) = 0; + virtual bool IsInstIDInFunc(STARS_ea_t InstID) { return false; }; // TODO: Determine if InstID is in IRDB func }; diff --git a/src/base/SMPFunction.cpp b/src/base/SMPFunction.cpp index b0a7b3d152460ff18ebc50434ea4116346b54d6c..88a8379e0ddc3adbf55be8eecacc56772ab9a063 100644 --- a/src/base/SMPFunction.cpp +++ b/src/base/SMPFunction.cpp @@ -522,15 +522,15 @@ bool SMPFunction::AddDirectCallTarget(STARS_ea_t addr) { } // Remove TargetAddr from DirectCallTargets and AllCallTargets. -bool SMPFunction::RemoveDirectCallTarget(STARS_ea_t TargetAddr) { +set<STARS_ea_t>::iterator SMPFunction::RemoveDirectCallTarget(STARS_ea_t TargetAddr) { set<STARS_ea_t>::iterator TargetIter = this->DirectCallTargets.find(TargetAddr); - bool RemovedTarget = false; + set<STARS_ea_t>::iterator ReturnIter = TargetIter; if (TargetIter != this->DirectCallTargets.end()) { + ++ReturnIter; this->DirectCallTargets.erase(TargetIter); - RemovedTarget = true; this->RebuildCallTargets(); // remove from AllCallTargets } - return RemovedTarget; + return ReturnIter; } // Remove TargetAddr from IndirectCallTargets and AllCallTargets. @@ -4089,11 +4089,9 @@ void SMPFunction::AdvancedAnalysis(void) { bool CallTargetRemoved = false; while (CurrDirectTarget != this->DirectCallTargets.end()) { STARS_ea_t TargetAddr = (*CurrDirectTarget); - if ((this->GetFirstFuncAddr() <= TargetAddr) && (this->FuncInfo->get_endEA() >= TargetAddr)) { - // Found a call target that is within the function. - CopyOfIterator = CurrDirectTarget; - ++CopyOfIterator; // point to element after element that will be erased - this->DirectCallTargets.erase(CurrDirectTarget); + if (this->FuncInfo->IsInstIDInFunc(TargetAddr) && (this->FuncInfo->get_startEA() != TargetAddr)) { + // Found a call target that is within the function, but not recursive call to func entry. + CopyOfIterator = this->RemoveDirectCallTarget(TargetAddr); CurrDirectTarget = CopyOfIterator; CallTargetRemoved = true; } diff --git a/src/base/SMPInstr.cpp b/src/base/SMPInstr.cpp index e8d251a48aaf09071e06bdf47f703f5330096f2f..2e5d50caf40f1101ea05ad64350bce1bca4394a5 100644 --- a/src/base/SMPInstr.cpp +++ b/src/base/SMPInstr.cpp @@ -4241,8 +4241,7 @@ void SMPInstr::AnalyzeCallInst(STARS_ea_t FirstFuncAddr, STARS_ea_t LastFuncAddr // Remove the call target from the sets and lists in the function. bool Removed; if (CALL == this->GetDataFlowType()) { - Removed = this->GetBlock()->GetFunc()->RemoveDirectCallTarget(this->CallTarget); - // assert(Removed); + set<STARS_ea_t>::iterator NextTarget = this->GetBlock()->GetFunc()->RemoveDirectCallTarget(this->CallTarget); } else if (INDIR_CALL == this->GetDataFlowType()) { Removed = this->GetBlock()->GetFunc()->RemoveIndirectCallTarget(this->CallTarget); diff --git a/src/interfaces/idapro/STARSFunction.cpp b/src/interfaces/idapro/STARSFunction.cpp index e063d1d725718a33c0ef52d2da9f861f24e8e096..7948352b52dbfaa54e0bcba595da8008c47f3655 100644 --- a/src/interfaces/idapro/STARSFunction.cpp +++ b/src/interfaces/idapro/STARSFunction.cpp @@ -25,53 +25,57 @@ bool SMPBinaryDebug = false; bool STARS_IDA_Function_t::IsChunkUnshared(STARS_ea_t ChunkAddr, STARS_ea_t FuncHeadStart, STARS_ea_t FuncHeadEnd) { - bool Unshared = true; - SMP_xref_t CurrXrefs; - - // See if any xref reaches this ChunkAddr from outside the FuncHead range. - for (bool ok = CurrXrefs.SMP_first_to(ChunkAddr, XREF_ALL); ok; ok = CurrXrefs.SMP_next_to()) { - STARS_ea_t FromAddr = CurrXrefs.GetFrom(); - if ((FromAddr != 0) && (CurrXrefs.GetIscode())) { - // We found a code xref that comes to the ChunkAddr. Whether it is a fall-through or - // a jump/call, it is unshared only if it comes from within the FuncHead address range. - if ((FromAddr < FuncHeadStart) || (FromAddr >= FuncHeadEnd)) { - Unshared = false; - break; - } - } - } - - return Unshared; + bool Unshared = true; + SMP_xref_t CurrXrefs; + + // See if any xref reaches this ChunkAddr from outside the FuncHead range. + for (bool ok = CurrXrefs.SMP_first_to(ChunkAddr, XREF_ALL); ok; ok = CurrXrefs.SMP_next_to()) { + STARS_ea_t FromAddr = CurrXrefs.GetFrom(); + if ((FromAddr != 0) && (CurrXrefs.GetIscode())) { + // We found a code xref that comes to the ChunkAddr. Whether it is a fall-through or + // a jump/call, it is unshared only if it comes from within the FuncHead address range. + if ((FromAddr < FuncHeadStart) || (FromAddr >= FuncHeadEnd)) { + Unshared = false; + break; + } + } + } + + return Unshared; } // end of STARS_IDA_Function_t::IsChunkUnshared() +// Is InstID in this function? For IDA Pro, InstID is a code address. +bool STARS_IDA_Function_t::IsInstIDInFunc(STARS_ea_t InstID) { + return ((InstID >= this->get_startEA()) && (InstID < this->get_endEA())); +} void STARS_IDA_Function_t::MarkSharedChunks(void) { char name[1000]; STARS_ea_t FirstEA = this->get_startEA(); ::get_func_name(FirstEA,name,sizeof(name)); - // Determine if we are dealing with shared chunks. - STARS_ea_t FuncHeadLastAddr = 0; - size_t ChunkCounter = 0; - //func_tail_iterator_t FuncTail((func_t*)*dynamic_cast<STARS_IDA_Function_t*>(this->GetFuncInfo())); - func_tail_iterator_t FuncTail(the_func);// (func_t*)*(dynamic_cast<STARS_IDA_Function_t*>(this->GetFuncInfo()))); - for (bool ChunkOK = FuncTail.main(); ChunkOK; ChunkOK = FuncTail.next()) { - const area_t &CurrChunk = FuncTail.chunk(); - ++ChunkCounter; - if (1 == ChunkCounter) { // head chunk - FuncHeadLastAddr = CurrChunk.endEA; - } - else { // a tail chunk - if (this->IsChunkUnshared(CurrChunk.startEA, FirstEA, FuncHeadLastAddr)) { + // Determine if we are dealing with shared chunks. + STARS_ea_t FuncHeadLastAddr = 0; + size_t ChunkCounter = 0; + //func_tail_iterator_t FuncTail((func_t*)*dynamic_cast<STARS_IDA_Function_t*>(this->GetFuncInfo())); + func_tail_iterator_t FuncTail(the_func);// (func_t*)*(dynamic_cast<STARS_IDA_Function_t*>(this->GetFuncInfo()))); + for (bool ChunkOK = FuncTail.main(); ChunkOK; ChunkOK = FuncTail.next()) { + const area_t &CurrChunk = FuncTail.chunk(); + ++ChunkCounter; + if (1 == ChunkCounter) { // head chunk + FuncHeadLastAddr = CurrChunk.endEA; + } + else { // a tail chunk + if (this->IsChunkUnshared(CurrChunk.startEA, FirstEA, FuncHeadLastAddr)) { // this->UnsharedChunks = true; // SMP_msg("INFO: Interface Found unshared tail chunk for %s at %lx\n", // name, (unsigned long) CurrChunk.startEA); - } - else { - this->SharedChunks = true; + } + else { + this->SharedChunks = true; // SMP_msg("INFO: Interface Found tail chunk for %s at %lx\n", // name, (unsigned long) CurrChunk.startEA); - } + } } } return; @@ -80,33 +84,33 @@ void STARS_IDA_Function_t::MarkSharedChunks(void) { bool STARS_IDA_Function_t::IsMultiEntry() { STARS_ea_t FirstEA=this->get_startEA(); - func_tail_iterator_t FuncTail(the_func);// (func_t*)*(dynamic_cast<STARS_IDA_Function_t*>(this->GetFuncInfo()))); - size_t CallTargetCount = 0; // how many addresses in this function are called? - - if (this->HasSharedChunks() || this->UnsharedChunks) { - for (bool ChunkOK = FuncTail.main(); ChunkOK; ChunkOK = FuncTail.next()) { - const area_t &CurrChunk = FuncTail.chunk(); - STARS_ea_t addr = CurrChunk.startEA; // Start with just the beginning addrs of chunks. - // Determine whether the instruction is a call target by looking - // at its cross references and seeing if it has "TO" code xrefs. - SMP_xref_t xrefs, Distant_xrefs; - for (bool ok = xrefs.SMP_first_to(addr, XREF_FAR); ok; ok = xrefs.SMP_next_to()) { - STARS_ea_t DistantAddr = xrefs.GetFrom(); - if ((DistantAddr != 0) && (xrefs.GetIscode())) { - // Now we see if the distant instruction is in another function. - STARS_Function_t *SourceFunc = SMP_get_func(DistantAddr); - if (NULL != SourceFunc) { - if (SourceFunc->get_startEA() != FirstEA) { - ++CallTargetCount; - break; - } - } - } - } // end for all xrefs - } // end for all chunks - } - - return CallTargetCount > 1; + func_tail_iterator_t FuncTail(the_func);// (func_t*)*(dynamic_cast<STARS_IDA_Function_t*>(this->GetFuncInfo()))); + size_t CallTargetCount = 0; // how many addresses in this function are called? + + if (this->HasSharedChunks() || this->UnsharedChunks) { + for (bool ChunkOK = FuncTail.main(); ChunkOK; ChunkOK = FuncTail.next()) { + const area_t &CurrChunk = FuncTail.chunk(); + STARS_ea_t addr = CurrChunk.startEA; // Start with just the beginning addrs of chunks. + // Determine whether the instruction is a call target by looking + // at its cross references and seeing if it has "TO" code xrefs. + SMP_xref_t xrefs, Distant_xrefs; + for (bool ok = xrefs.SMP_first_to(addr, XREF_FAR); ok; ok = xrefs.SMP_next_to()) { + STARS_ea_t DistantAddr = xrefs.GetFrom(); + if ((DistantAddr != 0) && (xrefs.GetIscode())) { + // Now we see if the distant instruction is in another function. + STARS_Function_t *SourceFunc = SMP_get_func(DistantAddr); + if (NULL != SourceFunc) { + if (SourceFunc->get_startEA() != FirstEA) { + ++CallTargetCount; + break; + } + } + } + } // end for all xrefs + } // end for all chunks + } + + return CallTargetCount > 1; } void STARS_IDA_Function_t::UpdateXrefs() @@ -117,7 +121,7 @@ void STARS_IDA_Function_t::UpdateXrefs() enum cref_t NearJump = (cref_t)(fl_JN | XREF_USER); enum cref_t FarJump = (cref_t)(fl_JF | XREF_USER); - for (bool ChunkOK = FuncTail.main(); ChunkOK; ChunkOK = FuncTail.next()) { + for (bool ChunkOK = FuncTail.main(); ChunkOK; ChunkOK = FuncTail.next()) { const area_t &CurrChunk = FuncTail.chunk(); // Find the instructions for each chunk, audit the xrefs. @@ -214,7 +218,7 @@ void STARS_IDA_Function_t::BuildFuncIR(SMPFunction *func) size_t ChunkCounter = 0; bool GoodRTL; func->BuiltRTLs = true; - for (bool ChunkOK = FuncTail.main(); ChunkOK; ChunkOK = FuncTail.next()) { + for (bool ChunkOK = FuncTail.main(); ChunkOK; ChunkOK = FuncTail.next()) { const area_t &CurrChunk = FuncTail.chunk(); ++ChunkCounter; #if 0 @@ -544,7 +548,7 @@ bool STARS_IDA_Function_t::FindDistantCodeFragment(SMPFunction* func, STARS_ea_t bool JumpsBackIntoCurrentFunc = false; bool HasReturnInstruction = false; bool AllocatesStackFrame = false; - for (bool ChunkOK = FuncTail.main(); ChunkOK; ChunkOK = FuncTail.next()) { + for (bool ChunkOK = FuncTail.main(); ChunkOK; ChunkOK = FuncTail.next()) { const area_t &CurrChunk = FuncTail.chunk(); ++ChunkCounter; // Build the instruction and block lists for the function. diff --git a/tests/commit/save-gimp.psexe.infoannot b/tests/commit/save-gimp.psexe.infoannot index 42c0740994b6e0f6d1b6846d51b99e9865d24b6d..0674e5c9e549e46d88125499a88783500d5bb387 100644 --- a/tests/commit/save-gimp.psexe.infoannot +++ b/tests/commit/save-gimp.psexe.infoannot @@ -5014,7 +5014,7 @@ 487060 71 FUNC RETURNTYPE RAX 0 487060 71 FUNC INARGS 6 ARG0 0 ARG1 0 ARG2 1 ARG3 0 ARG4 0 ARG5 0 4870a7 46 FUNC RETURNTYPE RAX 0 - 4870a7 46 FUNC INARGS 6 ARG0 4 ARG1 0 ARG2 0 ARG3 0 ARG4 0 ARG5 0 + 4870a7 46 FUNC INARGS 6 ARG0 4 ARG1 4 ARG2 1 ARG3 0 ARG4 0 ARG5 0 4870d8 45 FUNC RETURNTYPE RAX 0 4870d8 45 FUNC INARGS 6 ARG0 0 ARG1 0 ARG2 0 ARG3 0 ARG4 0 ARG5 0 487105 162 FUNC RETURNTYPE RAX 0 @@ -5423,7 +5423,7 @@ 495ee7 133 FUNC INARGS 6 ARG0 0 ARG1 0 ARG2 0 ARG3 0 ARG4 0 ARG5 0 495f6c 89 FUNC RETURNTYPE RAX 0 495f6c 89 FUNC INARGS 6 ARG0 0 ARG1 0 ARG2 0 ARG3 0 ARG4 0 ARG5 0 - 495fc5 252 FUNC RETURNTYPE RAX 0 + 495fc5 252 FUNC RETURNTYPE RAX 4 495fc5 252 FUNC INARGS 6 ARG0 0 ARG1 4 ARG2 0 ARG3 4 ARG4 0 ARG5 0 4960c1 99 FUNC RETURNTYPE RAX 0 4960c1 99 FUNC INARGS 6 ARG0 0 ARG1 0 ARG2 0 ARG3 0 ARG4 0 ARG5 0 @@ -11042,7 +11042,7 @@ 563dd3 170 FUNC RETURNTYPE RAX 0 563dd3 170 FUNC INARGS 6 ARG0 4 ARG1 0 ARG2 0 ARG3 0 ARG4 0 ARG5 0 563e7d 208 FUNC RETURNTYPE RAX 0 - 563e7d 208 FUNC INARGS 6 ARG0 4 ARG1 0 ARG2 0 ARG3 96 ARG4 0 ARG5 0 + 563e7d 208 FUNC INARGS 6 ARG0 4 ARG1 4 ARG2 4 ARG3 96 ARG4 0 ARG5 0 563f4d 460 FUNC RETURNTYPE RAX 0 563f4d 460 FUNC INARGS 6 ARG0 0 ARG1 0 ARG2 96 ARG3 0 ARG4 0 ARG5 0 564119 597 FUNC RETURNTYPE RAX 0 @@ -11211,7 +11211,7 @@ 569be4 286 FUNC INARGS 6 ARG0 4 ARG1 4 ARG2 4 ARG3 4 ARG4 0 ARG5 0 569ce6 2 INSTR CHECK UNDERFLOW SIGNED 32 ESI ZZ sub esi, eax 569d02 93 FUNC RETURNTYPE RAX 0 - 569d02 93 FUNC INARGS 6 ARG0 4 ARG1 0 ARG2 0 ARG3 96 ARG4 0 ARG5 0 + 569d02 93 FUNC INARGS 6 ARG0 4 ARG1 4 ARG2 4 ARG3 96 ARG4 0 ARG5 0 569d5f 644 FUNC RETURNTYPE RAX 4 569d5f 644 FUNC INARGS 6 ARG0 0 ARG1 0 ARG2 0 ARG3 4 ARG4 0 ARG5 0 569fe3 355 FUNC RETURNTYPE RAX 4 @@ -29463,7 +29463,7 @@ 7fa6ae 2181 FUNC RETURNTYPE RAX 0 7fa6ae 2181 FUNC INARGS 6 ARG0 0 ARG1 4 ARG2 4 ARG3 0 ARG4 0 ARG5 8 7fabf9 4 INSTR CHECK OVERFLOW NOFLAGUNKNOWNSIGN 64 RAX+24 ZZ lea rdx, [rax+18h] - 7faf33 92 FUNC RETURNTYPE RAX 0 + 7faf33 92 FUNC RETURNTYPE RAX 4 7faf33 92 FUNC INARGS 6 ARG0 4 ARG1 4 ARG2 1 ARG3 4 ARG4 1 ARG5 8 7faf8f 1043 FUNC RETURNTYPE RAX 4 7faf8f 1043 FUNC INARGS 6 ARG0 4 ARG1 4 ARG2 4 ARG3 4 ARG4 4 ARG5 1 @@ -32768,7 +32768,7 @@ 86bd27 59 FUNC INARGS 6 ARG0 4 ARG1 0 ARG2 0 ARG3 0 ARG4 0 ARG5 0 86bd62 31 FUNC RETURNTYPE RAX 1 86bd62 31 FUNC INARGS 6 ARG0 4 ARG1 0 ARG2 4 ARG3 0 ARG4 0 ARG5 0 - 86bd81 31 FUNC RETURNTYPE RAX 0 + 86bd81 31 FUNC RETURNTYPE RAX 1 86bd81 31 FUNC INARGS 6 ARG0 4 ARG1 0 ARG2 1 ARG3 0 ARG4 0 ARG5 0 86bda0 154 FUNC RETURNTYPE RAX 1 86bda0 154 FUNC INARGS 6 ARG0 4 ARG1 1 ARG2 0 ARG3 0 ARG4 0 ARG5 0 diff --git a/tests/commit/trimmed-sorted-save-busybox.psexe.annot.REMOVED.git-id b/tests/commit/trimmed-sorted-save-busybox.psexe.annot.REMOVED.git-id index 0670b95ddc415c044119af5d9f5064cf2d9a8572..151de1aaea3204dd9e942be53e5423551e6a841c 100644 --- a/tests/commit/trimmed-sorted-save-busybox.psexe.annot.REMOVED.git-id +++ b/tests/commit/trimmed-sorted-save-busybox.psexe.annot.REMOVED.git-id @@ -1 +1 @@ -6aaa36387ec5be51fdaaa65c83135ae9680253b8 \ No newline at end of file +4c7acef2da8488994e2ee89875fc7bfa3eecf775 \ No newline at end of file diff --git a/tests/commit/trimmed-sorted-save-gimp.psexe.annot.REMOVED.git-id b/tests/commit/trimmed-sorted-save-gimp.psexe.annot.REMOVED.git-id index 2d3d019bf5d23cdcc27cc38a50c21c5257b1eaf3..e5597994e9f701f8036954fcdddbbb8615cd0070 100644 --- a/tests/commit/trimmed-sorted-save-gimp.psexe.annot.REMOVED.git-id +++ b/tests/commit/trimmed-sorted-save-gimp.psexe.annot.REMOVED.git-id @@ -1 +1 @@ -c80520bd972c7b73b18e5f89edead58489933a08 \ No newline at end of file +5d0b606ac413db81391af68c150af2d353e7fcc3 \ No newline at end of file diff --git a/tests/commit/trimmed-sorted-save-openssl.psexe.annot.REMOVED.git-id b/tests/commit/trimmed-sorted-save-openssl.psexe.annot.REMOVED.git-id index 4134625b7d9b486f751b8d9387307ec148054dc7..833610d63370a0987aad7163f986f5048782d816 100644 --- a/tests/commit/trimmed-sorted-save-openssl.psexe.annot.REMOVED.git-id +++ b/tests/commit/trimmed-sorted-save-openssl.psexe.annot.REMOVED.git-id @@ -1 +1 @@ -15afaa1d951a1321dc249f648a40960eccd0d030 \ No newline at end of file +73c495a66c8795ab3b2b54b5a41080b9c406427b \ No newline at end of file