diff --git a/src/base/SMPFunction.cpp b/src/base/SMPFunction.cpp index e959fce17e6ad8218c40dc0c331ea572da60bf68..d34e4f46a0439b557aad28e01bfce2d0cae6268d 100644 --- a/src/base/SMPFunction.cpp +++ b/src/base/SMPFunction.cpp @@ -1897,7 +1897,7 @@ void SMPFunction::FindFramePointerDelta(void) { } } else if (!SPintoFP) { // found "push <framepointerreg>", looking for "fp := sp" - if ((CurrInst->GetIDAOpcode() == MD_MOVE_INSTRUCTION) + if ((CurrInst->GetIDAOpcode() == MD_MOVE_INSTRUCTION) && CurrInst->IsAnalyzeable() && (CurrInst->GetFirstDef()->GetOp()->MatchesReg(MD_FRAME_POINTER_REG)) && (CurrInst->GetFirstUse()->GetOp()->MatchesReg(MD_STACK_POINTER_REG))) { SPintoFP = true; @@ -2035,6 +2035,9 @@ bool SMPFunction::MDFixFrameInfo(void) { for ( ; CurrIter != CurrBlock->GetLastInst(); ++CurrIter) { SMPInstr *CurrInstr = (*CurrIter); STARS_ea_t InstAddr = CurrInstr->GetAddr(); + if (!CurrInstr->IsAnalyzeable()) + continue; + if (FoundAllocInstr && (DEFAULT != CurrInstr->GetDataFlowType())) { // After we find the frame allocation instruction, a call or any other // control flow instruction should terminate our processing. A stack diff --git a/src/base/SMPInstr.cpp b/src/base/SMPInstr.cpp index 8fa1aa3185da718fa03c7ecaf609f665fb470efb..9936e18c4e5cd2a5c4b8ec939e304cbffe4c9cdd 100644 --- a/src/base/SMPInstr.cpp +++ b/src/base/SMPInstr.cpp @@ -3151,7 +3151,7 @@ bool SMPInstr::MDIsFrameDeallocInstr(bool UseFP, STARS_asize_t LocalVarsSize) { unsigned short opcode = this->GetIDAOpcode(); if ((opcode >= MD_FIRST_LEAVE_INSTR) && (opcode <= MD_LAST_LEAVE_INSTR)) return true; - else if (this->HasDestMemoryOperand() || this->HasSourceMemoryOperand()) { + else if (this->HasDestMemoryOperand() || this->HasSourceMemoryOperand() || (!this->IsAnalyzeable())) { // Don't get fooled by USE or DEF entries of EBP or ESP that come // from memory operands, e.g. mov eax,[ebp-20] return false; @@ -5255,6 +5255,9 @@ void SMPInstr::BuildSMPDefUseLists(void) { this->Defs.clear(); this->Uses.clear(); + if (this->IsNop()) + return; + // Start with the Defs. for (OpNum = 0; OpNum < STARS_UA_MAXOP; ++OpNum) { if (this->STARSInstPtr->IsDefOpnd(OpNum)) { // DEF