From cdc72eb11d1b1905eb291384548703a32d737859 Mon Sep 17 00:00:00 2001 From: Bill Williams Date: Thu, 6 May 2010 14:42:29 -0500 Subject: [PATCH] Slight optimization: statically construct stack pointer/frame pointer/PC ASTs. --- dyninstAPI/src/IA_IAPI.C | 30 ++++++++++++++++++++---------- dyninstAPI/src/IA_IAPI.h | 6 +++--- dyninstAPI/src/IA_x86.C | 16 +++++++--------- 3 files changed, 30 insertions(+), 22 deletions(-) diff --git a/dyninstAPI/src/IA_IAPI.C b/dyninstAPI/src/IA_IAPI.C index 0cd02c3..1f0a1ef 100644 --- a/dyninstAPI/src/IA_IAPI.C +++ b/dyninstAPI/src/IA_IAPI.C @@ -40,10 +40,26 @@ #include +#include using namespace Dyninst; using namespace InstructionAPI; +std::map IA_IAPI::framePtr = boost::assign::map_list_of + (Arch_x86, RegisterAST::Ptr(new RegisterAST(MachRegister::getFramePointer(Arch_x86)))) + (Arch_x86_64, RegisterAST::Ptr(new RegisterAST(MachRegister::getFramePointer(Arch_x86_64)))) + (Arch_ppc32, RegisterAST::Ptr(new RegisterAST(MachRegister::getFramePointer(Arch_ppc32)))) + (Arch_ppc64, RegisterAST::Ptr(new RegisterAST(MachRegister::getFramePointer(Arch_ppc64)))); +std::map IA_IAPI::stackPtr = boost::assign::map_list_of + (Arch_x86, RegisterAST::Ptr(new RegisterAST(MachRegister::getStackPointer(Arch_x86)))) + (Arch_x86_64, RegisterAST::Ptr(new RegisterAST(MachRegister::getStackPointer(Arch_x86_64)))) + (Arch_ppc32, RegisterAST::Ptr(new RegisterAST(MachRegister::getStackPointer(Arch_ppc32)))) + (Arch_ppc64, RegisterAST::Ptr(new RegisterAST(MachRegister::getStackPointer(Arch_ppc64)))); +std::map IA_IAPI::thePC = boost::assign::map_list_of + (Arch_x86, RegisterAST::Ptr(new RegisterAST(MachRegister::getPC(Arch_x86)))) + (Arch_x86_64, RegisterAST::Ptr(new RegisterAST(MachRegister::getPC(Arch_x86_64)))) + (Arch_ppc32, RegisterAST::Ptr(new RegisterAST(MachRegister::getPC(Arch_ppc32)))) + (Arch_ppc64, RegisterAST::Ptr(new RegisterAST(MachRegister::getPC(Arch_ppc64)))); IA_IAPI::IA_IAPI(InstructionDecoder dec_, Address where_, image_func* f) @@ -53,9 +69,6 @@ IA_IAPI::IA_IAPI(InstructionDecoder dec_, Address where_, hascftstatus.first = false; tailCall.first = false; boost::tuples::tie(curInsnIter, boost::tuples::ignore) = allInsns.insert(std::make_pair(current, dec.decode())); - stackPtr.reset(new RegisterAST(MachRegister::getStackPointer(img->getArch()))); - framePtr.reset(new RegisterAST(MachRegister::getFramePointer(img->getArch()))); - thePC.reset(new RegisterAST(MachRegister::getPC(img->getArch()))); } IA_IAPI::IA_IAPI(InstructionDecoder dec_, Address where_, @@ -66,9 +79,6 @@ IA_IAPI::IA_IAPI(InstructionDecoder dec_, Address where_, hascftstatus.first = false; tailCall.first = false; boost::tuples::tie(curInsnIter, boost::tuples::ignore) = allInsns.insert(std::make_pair(current, dec.decode())); - stackPtr.reset(new RegisterAST(MachRegister::getStackPointer(img->getArch()))); - framePtr.reset(new RegisterAST(MachRegister::getFramePointer(img->getArch()))); - thePC.reset(new RegisterAST(MachRegister::getPC(img->getArch()))); } void IA_IAPI::advance() @@ -337,7 +347,7 @@ bool IA_IAPI::isIPRelativeBranch() const !getCFT()) { Expression::Ptr cft = curInsn()->getControlFlowTarget(); - if(cft->isUsed(thePC)) + if(cft->isUsed(thePC[img->getArch()])) { parsing_printf("\tIP-relative indirect jump to %s at 0x%lx\n", cft->format().c_str(), current); @@ -407,9 +417,9 @@ Address IA_IAPI::getCFT() const if(validCFT) return cachedCFT; Expression::Ptr callTarget = curInsn()->getControlFlowTarget(); // FIXME: templated bind(),dammit! - callTarget->bind(thePC.get(), Result(s64, current)); - parsing_printf("%s[%d]: binding PC in %s to 0x%x...", FILE__, __LINE__, - curInsn()->format().c_str(), current); + callTarget->bind(thePC[img->getArch()].get(), Result(s64, current)); + parsing_printf("%s[%d]: binding PC %s in %s to 0x%x...", FILE__, __LINE__, + thePC[img->getArch()]->format().c_str(), curInsn()->format().c_str(), current); Result actualTarget = callTarget->eval(); if(actualTarget.defined) { diff --git a/dyninstAPI/src/IA_IAPI.h b/dyninstAPI/src/IA_IAPI.h index 6398975..9fa8e65 100644 --- a/dyninstAPI/src/IA_IAPI.h +++ b/dyninstAPI/src/IA_IAPI.h @@ -121,9 +121,9 @@ class IA_IAPI : public InstructionAdapter mutable Address cachedCFT; mutable std::pair hascftstatus; mutable std::pair tailCall; - Dyninst::InstructionAPI::RegisterAST::Ptr framePtr; - Dyninst::InstructionAPI::RegisterAST::Ptr stackPtr; - Dyninst::InstructionAPI::RegisterAST::Ptr thePC; + static std::map framePtr; + static std::map stackPtr; + static std::map thePC; static std::map thunkAtTarget; }; diff --git a/dyninstAPI/src/IA_x86.C b/dyninstAPI/src/IA_x86.C index a0fd780..d2961f0 100644 --- a/dyninstAPI/src/IA_x86.C +++ b/dyninstAPI/src/IA_x86.C @@ -101,8 +101,8 @@ bool IA_IAPI::isFrameSetupInsn(Instruction::Ptr i) const { if(i->getOperation().getID() == e_mov) { - if(i->isRead(stackPtr) && - i->isWritten(framePtr)) + if(i->isRead(stackPtr[img->getArch()]) && + i->isWritten(framePtr[img->getArch()])) { return true; } @@ -322,8 +322,7 @@ bool IA_IAPI::parseJumpTable(image_basicBlock* currBlk, parsing_printf("\tchecking instruction %s at 0x%lx for IP-relative LEA\n", tableLoc->second->format().c_str(), tableLoc->first); Expression::Ptr IPRelAddr = tableLoc->second->getOperand(1).getValue(); - static RegisterAST* thePC = new RegisterAST(RegisterAST::makePC(img->getArch())); - IPRelAddr->bind(thePC, Result(s64, tableLoc->first + tableLoc->second->size())); + IPRelAddr->bind(thePC[img->getArch()].get(), Result(s64, tableLoc->first + tableLoc->second->size())); Result iprel = IPRelAddr->eval(); if(iprel.defined) { @@ -469,8 +468,7 @@ Address IA_IAPI::findThunkInBlock(image_basicBlock* curBlock, Address& thunkOffs parsing_printf("\tchecking instruction %s at 0x%lx for IP-relative LEA\n", block.getInstruction()->format().c_str(), block.getAddr()); Expression::Ptr IPRelAddr = block.getInstruction()->getOperand(1).getValue(); - static RegisterAST* thePC = new RegisterAST(RegisterAST::makePC(img->getArch())); - IPRelAddr->bind(thePC, Result(s64, block.getNextAddr())); + IPRelAddr->bind(thePC[img->getArch()].get(), Result(s64, block.getNextAddr())); Result iprel = IPRelAddr->eval(); if(iprel.defined) { @@ -872,7 +870,7 @@ bool IA_IAPI::isThunk() const { thunkSecond->format().c_str()); if(thunkFirst && (thunkFirst->getOperation().getID() == e_mov)) { - if(thunkFirst->isRead(stackPtr)) + if(thunkFirst->isRead(stackPtr[img->getArch()])) { parsing_printf("... checking second insn\n"); if(!thunkSecond) { @@ -927,7 +925,7 @@ bool IA_IAPI::isTailCall(unsigned int) const } if(prevInsn->getOperation().getID() == e_pop) { - if(prevInsn->isWritten(framePtr)) + if(prevInsn->isWritten(framePtr[img->getArch()])) { parsing_printf("\tprev insn was %s, TAIL CALL\n", prevInsn->format().c_str()); tailCall.second = true; @@ -968,7 +966,7 @@ bool IA_IAPI::savesFP() const { if(curInsn()->getOperation().getID() == e_push) { - return(curInsn()->isRead(framePtr)); + return(curInsn()->isRead(framePtr[img->getArch()])); } return false; } -- 1.8.3.1