diff --git a/ProfilerInformation.cpp b/ProfilerInformation.cpp index 766d182776c3006a2eee071f6361fd2d7b0e81bf..77d23c8073f9c44643268ae29717a0490bdf161b 100644 --- a/ProfilerInformation.cpp +++ b/ProfilerInformation.cpp @@ -1,30 +1,56 @@ - - +#include <cstdlib> #include "ProfilerInformation.h" #define qfeof feof +/* + * ascii-to-longlong conversion; Visual Studio 2005 lacks atoll() library func + * + * no error checking; assumes decimal digits + * + * efficient conversion: + * start with value = 0 + * then, starting at first character, repeat the following + * until the end of the string: + * + * new value = (10 * (old value)) + decimal value of next character + * + */ + +long long my_atoll(char *instr) { + long long retval = 0; + + for (; *instr; ++instr) { + retval = 10*retval + (*instr - '0'); + } + return retval; +} + +#ifdef WIN32 +#define atoll my_atoll +#endif + ProfilerInformation::ProfilerInformation(const char* fn) : filename(std::string(fn)) { FILE* fin; int addr; - union { int size, type;} size_type_u; + union {int size, type;} size_type_u; char type[200]; char scope[200]; char remainder[2000]; int line=0; - if(fn[0]==0) + if (fn[0]==0) return; - fin=qfopen(fn, "r"); + fin = qfopen(fn, "r"); - if(!fin) + if (!fin) { msg("Cannot open strata annotation file %s\n", fn); return; @@ -36,26 +62,26 @@ ProfilerInformation::ProfilerInformation(const char* fn) { qfscanf(fin, "%x %d\n", &addr, &size_type_u); - if(qfeof(fin)) // deal with blank lines at the EOF + if (qfeof(fin)) // deal with blank lines at the EOF break; qfscanf(fin, "%s%s", type,scope); /* if the size > 0, then this is a declaration of a variable */ - if(strcmp(type,"FUNC")==0) + if (strcmp(type,"FUNC") == 0) { - // no useful info for the SA. + ; // no useful info for the SA. } - else if(strcmp(type,"MEMORYHOLE")==0) + else if (strcmp(type,"MEMORYHOLE") == 0) { // no useful info for the SA. } - else if(strcmp(type,"INSTR")==0) + else if (strcmp(type,"INSTR") == 0) { // no useful info for the SA. } - else if(strcmp(type,"PTRIMMEDEBP")==0 || + else if (strcmp(type,"PTRIMMEDEBP")==0 || strcmp(type,"PTRIMMEDESP")==0 || strcmp(type,"PTRIMMEDESP2")==0 || strcmp(type,"PTRIMMEDABSOLUTE")==0 @@ -64,25 +90,24 @@ ProfilerInformation::ProfilerInformation(const char* fn) int the_const; int real_const=0; char field[100]; - assert(strcmp(scope,"STACK")==0 || strcmp(scope,"GLOBAL")==0); + assert(strcmp(scope,"STACK") == 0 || strcmp(scope,"GLOBAL") == 0); /* remaining params are <const> <field> <real_const_if_global> <comment> */ qfscanf(fin, "%d %s", &the_const, field); - if( strcmp(type,"PTRIMMEDESP2")==0 || - strcmp(type,"PTRIMMEDABSOLUTE")==0 - ) + if (strcmp(type,"PTRIMMEDESP2") == 0 || + strcmp(type,"PTRIMMEDABSOLUTE") == 0) qfscanf(fin, "%x", &real_const); else real_const=the_const; // successfully read in, but, ignoring for now. - if(strcmp(type,"PTRIMMEDESP2")==0 || strcmp(type,"PTRIMMEDABSOLUTE")==0 ) + if (strcmp(type,"PTRIMMEDESP2")==0 || strcmp(type,"PTRIMMEDABSOLUTE")==0 ) { profileAddressingInformation(addr,size_type_u.size,type, scope,the_const,field,real_const); } } - else if(strcmp(type,"DATAREF")==0) + else if (strcmp(type,"DATAREF")==0) { // no useful info for the SA. @@ -93,17 +118,17 @@ ProfilerInformation::ProfilerInformation(const char* fn) assert(strcmp(scope,"STACK")==0); /* remaining params: comment */ } - else if(strcmp(type,"PROFILEDNUMERIC")==0) + else if (strcmp(type,"PROFILEDNUMERIC")==0) { /* profiler generated information */ addProfileInformation(addr,atoll(scope),0,0); } - else if(strcmp(type,"PROFILEDPOINTER")==0 ) + else if (strcmp(type,"PROFILEDPOINTER")==0 ) { /* profiler generated information */ addProfileInformation(addr,0,atoll(scope),0); } - else if(strcmp(type,"PROFILEDOTHER")==0 ) + else if (strcmp(type,"PROFILEDOTHER")==0 ) { /* profiler generated information */ addProfileInformation(addr,0,0,atoll(scope)); @@ -115,23 +140,21 @@ ProfilerInformation::ProfilerInformation(const char* fn) qfgets(remainder, sizeof(remainder), fin); line++; - } while(!qfeof(fin)); + } while (!qfeof(fin)); qfclose(fin); msg("Successfully loaded annotation file %s\n", fn); } -ProfilerInformation::~ProfilerInformation() -{ - FILE* fout=qfopen(filename.c_str(), "a+"); +ProfilerInformation::~ProfilerInformation() { + FILE* fout = qfopen(filename.c_str(), "a+"); - if(!fout) - { + if (!fout) { msg("Cannot open annotations file (%s) for output\n", filename.c_str()); - assert(0); + assert(fout); } - for( std::set<std::string>::iterator iter=constant_info.begin(); + for (std::set<std::string>::iterator iter=constant_info.begin(); iter != constant_info.end(); ++iter ) @@ -139,27 +162,27 @@ ProfilerInformation::~ProfilerInformation() qfprintf(fout, "%s", (*iter).c_str()); } - for( std::map<ea_t,InstructionInformation*>::iterator iter=the_map.begin(); + for (std::map<ea_t,InstructionInformation*>::iterator iter = the_map.begin(); iter != the_map.end(); ++iter ) { ea_t addr=(*iter).first; InstructionInformation *ii=(*iter).second; - if(ii) + if (ii) { - if(ii->getNumericCount()) + if (ii->getNumericCount()) { qfprintf(fout, "%x %d %s %d Profiler generated, summarized by idal\n", addr, 0, "PROFILEDNUMERIC", ii->getNumericCount()); } - if(ii->getPointerCount()) + if (ii->getPointerCount()) { qfprintf(fout, "%x %d %s %d Profiler generated, summarized by idal\n", addr, 0, "PROFILEDPOINTER", ii->getPointerCount()); } - if(ii->getOtherCount()) + if (ii->getOtherCount()) { qfprintf(fout, "%x %d %s %d Profiler generated, summarized by idal\n", addr, 0, "PROFILEDOTHER", ii->getOtherCount()); @@ -172,22 +195,20 @@ ProfilerInformation::~ProfilerInformation() } -void ProfilerInformation::addProfileInformation(ea_t addr, long long nc, long long pc, long long oc) -{ - InstructionInformation *ii=GetInfo(addr); +void ProfilerInformation::addProfileInformation(ea_t addr, long long nc, long long pc, long long oc) { + InstructionInformation *ii = GetInfo(addr); - if(!ii) - { + if (!ii) { ii = new InstructionInformation; - SetInfo(addr,ii); + SetInfo(addr, ii); } - if(nc) - ii->setNumericCount(nc); - if(pc) - ii->setPointerCount(pc); - if(oc) - ii->setOtherCount(oc); + if (nc) + ii->setNumericCount((int) nc); + if (pc) + ii->setPointerCount((int) pc); + if (oc) + ii->setOtherCount((int) oc); // msg("Profiled %x to be nc:%lld pc:%lld oc:%lld\n", addr, // ii->getNumericCount(),