project.cpp 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. #include <QtCore/QString>
  2. #include <QtCore/QDir>
  3. #include <utility>
  4. #include "dcc.h"
  5. #include "CallGraph.h"
  6. #include "project.h"
  7. #include "Procedure.h"
  8. using namespace std;
  9. //Project g_proj;
  10. QString asm1_name, asm2_name; /* Assembler output filenames */
  11. SYMTAB symtab; /* Global symbol table */
  12. STATS stats; /* cfg statistics */
  13. //PROG prog; /* programs fields */
  14. OPTION option; /* Command line options */
  15. Project *Project::s_instance = nullptr;
  16. Project::Project() : callGraph(nullptr)
  17. {
  18. memset(&prog,0,sizeof(prog));
  19. }
  20. void Project::initialize()
  21. {
  22. delete callGraph;
  23. callGraph = nullptr;
  24. }
  25. void Project::create(const QString &a)
  26. {
  27. initialize();
  28. m_fname=a;
  29. auto ext_loc=a.lastIndexOf('.');
  30. auto slash_loc=a.lastIndexOf('/',ext_loc);
  31. if(slash_loc==-1)
  32. slash_loc=0;
  33. else
  34. slash_loc++;
  35. if(ext_loc!=-1) {
  36. m_project_name = a.mid(slash_loc,ext_loc-slash_loc);
  37. }
  38. else
  39. m_project_name = a.mid(slash_loc);
  40. m_output_path = a.left(slash_loc);
  41. }
  42. QString Project::output_name(const char *ext) {
  43. return m_output_path+QDir::separator()+m_project_name+"."+ext;
  44. }
  45. bool Project::valid(ilFunction iter)
  46. {
  47. return iter!=pProcList.end();
  48. }
  49. ilFunction Project::funcIter(Function *to_find)
  50. {
  51. auto iter=std::find_if(pProcList.begin(),pProcList.end(),
  52. [to_find](const Function &f)->bool {return to_find==&f;});
  53. assert(iter!=pProcList.end());
  54. return iter;
  55. }
  56. ilFunction Project::findByEntry(uint32_t entry)
  57. {
  58. /* Search procedure list for one with appropriate entry point */
  59. ilFunction iter= std::find_if(pProcList.begin(),pProcList.end(),
  60. [entry](const Function &f) { return f.procEntry==entry; });
  61. return iter;
  62. }
  63. ilFunction Project::createFunction(FunctionType *f,const std::string &name)
  64. {
  65. pProcList.push_back(Function::Create(f,0,name,0));
  66. return (++pProcList.rbegin()).base();
  67. }
  68. int Project::getSymIdxByAdd(uint32_t adr)
  69. {
  70. size_t i;
  71. for (i = 0; i < symtab.size(); i++)
  72. if (symtab[i].label == adr)
  73. break;
  74. return i;
  75. }
  76. bool Project::validSymIdx(size_t idx)
  77. {
  78. return idx<symtab.size();
  79. }
  80. const SYM &Project::getSymByIdx(size_t idx) const
  81. {
  82. return symtab[idx];
  83. }
  84. size_t Project::symbolSize(size_t idx)
  85. {
  86. assert(validSymIdx(idx));
  87. return symtab[idx].size;
  88. }
  89. hlType Project::symbolType(size_t idx)
  90. {
  91. assert(validSymIdx(idx));
  92. return symtab[idx].type;
  93. }
  94. const std::string &Project::symbolName(size_t idx)
  95. {
  96. assert(validSymIdx(idx));
  97. return symtab[idx].name;
  98. }
  99. Project *Project::get()
  100. {
  101. //WARNING: poor man's singleton, not thread safe
  102. if(s_instance==nullptr)
  103. s_instance=new Project;
  104. return s_instance;
  105. }
  106. SourceMachine *Project::machine()
  107. {
  108. return nullptr;
  109. }