示例#1
0
  bool ProgramAnalysis :: runOnModule(Module &M)
    {
        PI = &getAnalysis<ProfileInfo>();
      //Code to set the Hot trace pointer for the Function ; MergeBlocks ; Function
        HOTTRACEBLOCKCOUNT = -1;
        MERGEBLOCKCOUNT = -1;
      for (Module::iterator i = M.begin(), e = M.end(); i!=e; ++i )
        {
         if(i->isDeclaration())
          continue;
         AnalyseFunction(*i);
         FUNCTIONCOUNT++;

         HOTTRACEBLOCKCOUNT += HotTraceCounter;
         HotTraceLink.push_back(HOTTRACEBLOCKCOUNT);
         MERGEBLOCKCOUNT += MergeCounter;
         MergeBlockLink.push_back(MERGEBLOCKCOUNT);

        }
      // Save things to a File ; Things to be saved: vectors: MergeBlocks && HotTrace
      // Vectors: BasicBlock Link; MergeBlock Link
      //Two files created: arrays stores HotTrace and MergeBlocks, seperated by Commas
      // Each is separated by \n
      // HotTrace and MergeBlocks are Seperated by --
      FILE *fhottrace,*fmerge,*fhotlink,*fmergelink;
      if((fhottrace=fopen("hottrace", "w"))==NULL)
        printf("Cannot open file hottrace for reading.\n");
      if((fmerge=fopen("merge", "w"))==NULL)
        printf("Cannot open file merge for reading.\n");
      if((fhotlink=fopen("hotlinks", "w"))==NULL)
        printf("Cannot open file hotlink for reading.\n");
      if((fmergelink=fopen("mergelinks", "w"))==NULL)
        printf("Cannot open file mergelink for reading.\n");

      for(int i=0; i<(int)HotTrace.size();i++)
         fprintf(fhottrace, "%s\n", (HotTrace.at(i)->getName()));
      for(int i=0; i<(int)MergeBlocks.size();i++)
         fprintf(fmerge, "%s\n", (MergeBlocks.at(i)->getName()));
      for(int i=0; i<(int)HotTraceLink.size();i++)
         fprintf(fhotlink, "%d\n", HotTraceLink.at(i));
      for(int i=0; i<(int)MergeBlockLink.size();i++)
         fprintf(fmergelink, "%d\n", MergeBlockLink.at(i));


        printAnalysis();
      //Code to set the Hot trace pointer for the Function ; MergeBlocks ; Function End Pointers
      return false;
    }
void
SymbolTableAnalyse::_Analyse(ast* node){
	if (node == NULL)
		return;
	switch (node->nodetype)
	{
	case 5:
	{
		//cout << "variable" << endl;
		AnalyseVariable(node);
		return;
	}
	case 6:
	{
		//cout << "type" << endl;
		AnalyseType(node);
		return;
	}
	case 7:
	{
		//cout << "func" << endl;
		AnalyseFunction(node);
		return;
	}
	case 8:
	{
		AnalyseClassDec(node);
		return;
	}
	case 9:
	{
		AnalyseClassDef(node);
		return;
	}
	case 'L':
	{
		_Analyse(node->l);
		_Analyse(node->r);
		return;
	}
	}
}