From 5f919da12aebb1d47e78e212ef542c7b12a853f4 Mon Sep 17 00:00:00 2001 From: Jason Hiser <jdhiser@gmail.com> Date: Fri, 7 Sep 2018 01:14:59 +0000 Subject: [PATCH] updates to set USEFP or NOFP Former-commit-id: 3a528c97bb34e178d59e412bba93367cf7182a64 --- tools/rida/rida.cpp | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/tools/rida/rida.cpp b/tools/rida/rida.cpp index 98b478624..30b1dfc3b 100644 --- a/tools/rida/rida.cpp +++ b/tools/rida/rida.cpp @@ -344,11 +344,31 @@ class CreateFunctions_t const auto size=max.second-min.first; cout<<"Function "<<dec<<i++<<" is "<<hex<<min.first<<" "<<dec<<max.second-min.first<<endl; + const auto usefp=getUseFp(scc); - outfile<<hex<<"\t"<<min.first<<"\t"<<dec<<size<<"\tFUNC GLOBAL\t"<<funcNames[scc]<<endl; + outfile<<hex<<"\t"<<min.first<<"\t"<<dec<<size<<"\tFUNC GLOBAL\t"<<funcNames[scc]<<" "<< usefp << endl; doBelongTos(scc); } } + + string getUseFp(const RangeSet_t scc) + { + assert(scc.begin()!=scc.end()); + const auto startAddr=scc.begin()->first; + const auto fde=ehp->findFDE(startAddr); + if(!fde) return "NOFP"; + const auto &ehprogram=fde->getProgram(); + const auto ehprogramInstructions=ehprogram.getInstructions(); + + const auto def_cfa_rbp_it = find_if(ALLOF(*ehprogramInstructions), [](const shared_ptr<EHProgramInstruction_t> insn) + { + assert(insn); + const auto &insnBytes=insn->getBytes(); + // 0xd, 0x6 is "def_cfa_register rbp" + return insnBytes==EHProgramInstructionByteVector_t({(uint8_t)0xd,(uint8_t)0x6}); + }); + return def_cfa_rbp_it == ehprogramInstructions->end() ? "NOFP" : "USEFP"; + } }; -- GitLab