Skip to content
Snippets Groups Projects
Commit cb38c5d7 authored by an7s's avatar an7s
Browse files

Added more # ATTRIBUTES output

Former-commit-id: 6082af2e0c330db5c9490db2b72d5083c0006814
parents 14a458d5 980967ae
No related branches found
No related tags found
No related merge requests found
......@@ -72,11 +72,14 @@ bool ColoredInstructionNonces_t::create()
}
// output stats
cout<<"#ATTRIBUTE slots_used="<<slots_used.size()<<endl;
cout<<"# ATTRIBUTE slots_used="<<slots_used.size()<<endl;
int total_slots = 0;
for(int slot_no=0; slot_no<slots_used.size(); slot_no++)
{
cout<<"#ATTRIBUTE used_slot"<<slot_no<<"="<<slots_used[slot_no].SlotsUsed()<<endl;
cout<<"# ATTRIBUTE used_slot"<<slot_no<<"="<<slots_used[slot_no].SlotsUsed()<<endl;
total_slots += slots_used[slot_no].SlotsUsed();
}
cout<<"# ATTRIBUTE total_slots="<<total_slots<<endl;
return true;
}
......
......@@ -25,6 +25,7 @@
#include "color_map.hpp"
#include <stdlib.h>
#include <memory>
#include <math.h>
......@@ -471,7 +472,7 @@ void SCFI_Instrument::AddReturnCFI(Instruction_t* insn, ColoredSlotValue_t *v)
if(d.Argument1.ArgType!=NO_ARGUMENT)
{
unsigned int sp_adjust=d.Instruction.Immediat-firp->GetArchitectureBitWidth()/8;
cout<<"Found relateively rare ret_with_pop insn: "<<d.CompleteInstr<<endl;
cout<<"Found relatively rare ret_with_pop insn: "<<d.CompleteInstr<<endl;
char buf[30];
sprintf(buf, "pop %s [%s+%d]", worddec.c_str(), rspreg.c_str(), sp_adjust);
Instruction_t* newafter=insertAssemblyBefore(firp,insn,buf);
......@@ -562,9 +563,42 @@ void SCFI_Instrument::AddReturnCFI(Instruction_t* insn, ColoredSlotValue_t *v)
#endif
}
static void display_histogram(std::ostream& out, std::string attr_label, std::map<int,int> & p_map)
{
if (p_map.size())
{
out<<"# ATTRIBUTE " << attr_label << "=";
out<<"{ibt_size:count,";
bool first_time=true;
for (map<int,int>::iterator it = p_map.begin();
it != p_map.end(); ++it)
{
if (!first_time)
out << ",";
out << it->first << ":" << it->second;
first_time = false;
}
out<<"}"<<endl;
}
}
bool SCFI_Instrument::instrument_jumps()
{
int cfi_checks=0;
int cfi_branch_jmp_checks=0;
int cfi_branch_jmp_complete=0;
int cfi_branch_call_checks=0;
int cfi_branch_call_complete=0;
int cfi_branch_ret_checks=0;
int cfi_branch_ret_complete=0;
int ibt_complete=0;
double cfi_branch_jmp_complete_ratio = NAN;
double cfi_branch_ret_complete_ratio = NAN;
std::map<int, int> jmps;
std::map<int, int> rets;
// build histogram of target sizes
// for each instruction
for(InstructionSet_t::iterator it=firp->GetInstructions().begin();
......@@ -590,6 +624,12 @@ bool SCFI_Instrument::instrument_jumps()
if((d.Argument1.ArgType&MEMORY_TYPE)==MEMORY_TYPE)
{
cfi_checks++;
cfi_branch_jmp_checks++;
if (insn->GetIBTargets() && insn->GetIBTargets()->IsComplete())
{
cfi_branch_jmp_complete++;
jmps[insn->GetIBTargets()->size()]++;
}
AddJumpCFI(insn);
}
break;
......@@ -599,9 +639,19 @@ bool SCFI_Instrument::instrument_jumps()
{
// not yet implemented.
assert(0); // fix calls should conver these to jumps
cfi_branch_call_checks++;
if (insn->GetIBTargets() && insn->GetIBTargets()->IsComplete())
cfi_branch_call_complete++;
cfi_checks++;
}
break;
case RetType:
cfi_branch_ret_checks++;
if (insn->GetIBTargets() && insn->GetIBTargets()->IsComplete())
{
cfi_branch_ret_complete++;
rets[insn->GetIBTargets()->size()]++;
}
cfi_checks++;
AddReturnCFI(insn);
break;
......@@ -611,9 +661,39 @@ bool SCFI_Instrument::instrument_jumps()
}
}
cout<<"# ATTRIBUTE cfi_jmp_checks="<<std::dec<<cfi_branch_jmp_checks<<endl;
cout<<"# ATTRIBUTE cfi_jmp_complete="<<std::dec<<cfi_branch_jmp_complete<<endl;
display_histogram(cout, "cfi_jmp_complete_histogram", jmps);
/*
cout<<"# ATTRIBUTE cfi_branch_call_checks="<<std::dec<<cfi_branch_call_checks<<endl;
cout<<"# ATTRIBUTE cfi_branch_call_complete="<<std::dec<<cfi_branch_call_complete<<endl;
*/
cout<<"# ATTRIBUTE cfi_ret_checks="<<std::dec<<cfi_branch_ret_checks<<endl;
cout<<"# ATTRIBUTE cfi_ret_complete="<<std::dec<<cfi_branch_ret_complete<<endl;
display_histogram(cout, "cfi_ret_complete_histogram", rets);
cout<<"# ATTRIBUTE cfi_checks="<<std::dec<<cfi_checks<<endl;
ibt_complete = cfi_branch_jmp_complete + cfi_branch_call_complete + cfi_branch_ret_complete;
cout<<"# ATTRIBUTE ibt_complete="<<std::dec<<ibt_complete<<endl;
if (cfi_branch_jmp_checks > 0)
cfi_branch_jmp_complete_ratio = (double)cfi_branch_jmp_complete / cfi_branch_jmp_checks;
if (cfi_branch_ret_checks > 0)
cfi_branch_ret_complete_ratio = (double)cfi_branch_ret_complete / cfi_branch_ret_checks;
double cfi_branch_complete_ratio = NAN;
if (ibt_complete > 0)
cfi_branch_complete_ratio = (double) cfi_checks / ibt_complete;
cout << "# ATTRIBUTE cfi_jmp_complete_ratio=" << cfi_branch_jmp_complete_ratio << endl;
cout << "# ATTRIBUTE cfi_ret_complete_ratio=" << cfi_branch_ret_complete_ratio << endl;
cout << "# ATTRIBUTE cfi_complete_ratio=" << cfi_branch_ret_complete_ratio << endl;
return true;
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment