#include #include #include #include "dcc.h" #include "CallGraph.h" #include "project.h" #include "Procedure.h" using namespace std; //Project g_proj; QString asm1_name, asm2_name; /* Assembler output filenames */ SYMTAB symtab; /* Global symbol table */ STATS stats; /* cfg statistics */ //PROG prog; /* programs fields */ OPTION option; /* Command line options */ Project *Project::s_instance = nullptr; Project::Project() : callGraph(nullptr) { memset(&prog,0,sizeof(prog)); } void Project::initialize() { delete callGraph; callGraph = nullptr; } void Project::create(const QString &a) { initialize(); m_fname=a; auto ext_loc=a.lastIndexOf('.'); auto slash_loc=a.lastIndexOf('/',ext_loc); if(slash_loc==-1) slash_loc=0; else slash_loc++; if(ext_loc!=-1) { m_project_name = a.mid(slash_loc,ext_loc-slash_loc); } else m_project_name = a.mid(slash_loc); m_output_path = a.left(slash_loc); } QString Project::output_name(const char *ext) { return m_output_path+QDir::separator()+m_project_name+"."+ext; } bool Project::valid(ilFunction iter) { return iter!=pProcList.end(); } ilFunction Project::funcIter(Function *to_find) { auto iter=std::find_if(pProcList.begin(),pProcList.end(), [to_find](const Function &f)->bool {return to_find==&f;}); assert(iter!=pProcList.end()); return iter; } ilFunction Project::findByEntry(uint32_t entry) { /* Search procedure list for one with appropriate entry point */ ilFunction iter= std::find_if(pProcList.begin(),pProcList.end(), [entry](const Function &f) { return f.procEntry==entry; }); return iter; } ilFunction Project::createFunction(FunctionType *f,const std::string &name) { pProcList.push_back(Function::Create(f,0,name,0)); return (++pProcList.rbegin()).base(); } int Project::getSymIdxByAdd(uint32_t adr) { size_t i; for (i = 0; i < symtab.size(); i++) if (symtab[i].label == adr) break; return i; } bool Project::validSymIdx(size_t idx) { return idx