#include #include #include #include "dcc.h" #include "CallGraph.h" #include "project.h" #include "Procedure.h" using namespace std; QString asm1_name, asm2_name; /* Assembler output filenames */ STATS stats; /* cfg statistics */ OPTION option; /* Command line options */ Project *Project::s_instance = nullptr; Project::Project() : callGraph(nullptr) { } void Project::initialize() { delete callGraph; callGraph = nullptr; } void Project::create(const QString &a) { initialize(); QFileInfo fi(a); m_fname=a; m_project_name = fi.completeBaseName(); m_output_path = fi.path(); } 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 QString &name) { pProcList.push_back(*Function::Create(f,0,name,0)); return (++pProcList.rbegin()).base(); } int Project::getSymIdxByAddr(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