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