xref: /minix3/minix/llvm/passes/include/common/qprof_common.h (revision 3e457fe321c6af238c180a2b4a0f010f8b4f8c31)
1*3e457fe3SDavid van Moolenbroek #ifndef _QPROF_COMMON_H
2*3e457fe3SDavid van Moolenbroek #define _QPROF_COMMON_H
3*3e457fe3SDavid van Moolenbroek 
4*3e457fe3SDavid van Moolenbroek #include <cstdlib>
5*3e457fe3SDavid van Moolenbroek #include <common/util/stdlib.h>
6*3e457fe3SDavid van Moolenbroek 
7*3e457fe3SDavid van Moolenbroek #define QPROF_SEP   ","
8*3e457fe3SDavid van Moolenbroek #define QPROF_SEP2  ":"
9*3e457fe3SDavid van Moolenbroek #define QPROF_SEP3  "|"
10*3e457fe3SDavid van Moolenbroek 
11*3e457fe3SDavid van Moolenbroek #define QPROF_DECLARE_LL_SITESTACKS_OPT(P, VAR) \
12*3e457fe3SDavid van Moolenbroek     static cl::opt<std::string> \
13*3e457fe3SDavid van Moolenbroek     VAR(#P "-ll-sitestacks", \
14*3e457fe3SDavid van Moolenbroek         cl::desc("Specify all the long-lived sitestacks on a per-task basis in qprof format"), \
15*3e457fe3SDavid van Moolenbroek         cl::init(""), cl::NotHidden, cl::ValueRequired)
16*3e457fe3SDavid van Moolenbroek 
17*3e457fe3SDavid van Moolenbroek #define QPROF_DECLARE_DEEPEST_LL_LOOPS_OPT(P, VAR) \
18*3e457fe3SDavid van Moolenbroek     static cl::opt<std::string> \
19*3e457fe3SDavid van Moolenbroek     VAR(#P "-deepest-ll-loops", \
20*3e457fe3SDavid van Moolenbroek         cl::desc("Specify all the deepest long-lived loops on a per-task basis in qprof format"), \
21*3e457fe3SDavid van Moolenbroek         cl::init(""), cl::NotHidden, cl::ValueRequired)
22*3e457fe3SDavid van Moolenbroek 
23*3e457fe3SDavid van Moolenbroek #define QPROF_DECLARE_DEEPEST_LL_LIBS_OPT(P, VAR) \
24*3e457fe3SDavid van Moolenbroek     static cl::opt<std::string> \
25*3e457fe3SDavid van Moolenbroek     VAR(#P "-deepest-ll-libs", \
26*3e457fe3SDavid van Moolenbroek         cl::desc("Specify all the deepest long-lived loop lib calls on a per-task basis in qprof format"), \
27*3e457fe3SDavid van Moolenbroek         cl::init(""), cl::NotHidden, cl::ValueRequired)
28*3e457fe3SDavid van Moolenbroek 
29*3e457fe3SDavid van Moolenbroek #define QPROF_DECLARE_TASK_CLASSES_OPT(P, VAR) \
30*3e457fe3SDavid van Moolenbroek     static cl::opt<std::string> \
31*3e457fe3SDavid van Moolenbroek     VAR(#P "-task-classes", \
32*3e457fe3SDavid van Moolenbroek         cl::desc("Specify all the task classes in qprof format"), \
33*3e457fe3SDavid van Moolenbroek         cl::init(""), cl::NotHidden, cl::ValueRequired)
34*3e457fe3SDavid van Moolenbroek 
35*3e457fe3SDavid van Moolenbroek #define QPROF_DECLARE_ALL_OPTS(P, VAR1, VAR2, VAR3, VAR4) \
36*3e457fe3SDavid van Moolenbroek     QPROF_DECLARE_LL_SITESTACKS_OPT(P, VAR1); \
37*3e457fe3SDavid van Moolenbroek     QPROF_DECLARE_DEEPEST_LL_LOOPS_OPT(P, VAR2); \
38*3e457fe3SDavid van Moolenbroek     QPROF_DECLARE_DEEPEST_LL_LIBS_OPT(P, VAR3); \
39*3e457fe3SDavid van Moolenbroek     QPROF_DECLARE_TASK_CLASSES_OPT(P, VAR4) \
40*3e457fe3SDavid van Moolenbroek 
41*3e457fe3SDavid van Moolenbroek using namespace llvm;
42*3e457fe3SDavid van Moolenbroek 
43*3e457fe3SDavid van Moolenbroek namespace llvm {
44*3e457fe3SDavid van Moolenbroek 
45*3e457fe3SDavid van Moolenbroek class QProfSite {
46*3e457fe3SDavid van Moolenbroek   public:
47*3e457fe3SDavid van Moolenbroek       static QProfSite* get(Module &M, int taskClassID, int taskSiteID, std::string moduleName, int lineNum, std::string functionName, std::string siteName, std::string siteFuncName, int siteDepth, int lib, unsigned long libFlags, bool refreshSite=true);
48*3e457fe3SDavid van Moolenbroek       static QProfSite* getFromString(Module &M, int taskClassID, int taskSiteID, std::string &siteString, bool refreshSite=true);
49*3e457fe3SDavid van Moolenbroek       static std::vector<QProfSite*> getFromSitesString(Module &M, std::string &sitesString, bool refreshSites=true);
50*3e457fe3SDavid van Moolenbroek 
51*3e457fe3SDavid van Moolenbroek       void refresh(Module &M);
52*3e457fe3SDavid van Moolenbroek       std::string toString();
53*3e457fe3SDavid van Moolenbroek       bool isLoop();
54*3e457fe3SDavid van Moolenbroek       bool isFunction();
55*3e457fe3SDavid van Moolenbroek       bool isCallsite();
56*3e457fe3SDavid van Moolenbroek       bool isLibCallsite();
57*3e457fe3SDavid van Moolenbroek       bool equals(QProfSite *other);
58*3e457fe3SDavid van Moolenbroek 
59*3e457fe3SDavid van Moolenbroek       int taskClassID;
60*3e457fe3SDavid van Moolenbroek       int taskSiteID;
61*3e457fe3SDavid van Moolenbroek       std::string moduleName;
62*3e457fe3SDavid van Moolenbroek       int lineNum;
63*3e457fe3SDavid van Moolenbroek       std::string functionName;
64*3e457fe3SDavid van Moolenbroek       std::string siteName;
65*3e457fe3SDavid van Moolenbroek       std::string siteFuncName;
66*3e457fe3SDavid van Moolenbroek       unsigned long libFlags;
67*3e457fe3SDavid van Moolenbroek       Function *function;
68*3e457fe3SDavid van Moolenbroek       Function *siteFunction;
69*3e457fe3SDavid van Moolenbroek       Instruction *siteInstruction;
70*3e457fe3SDavid van Moolenbroek   private:
QProfSite()71*3e457fe3SDavid van Moolenbroek       QProfSite() {}
72*3e457fe3SDavid van Moolenbroek 
73*3e457fe3SDavid van Moolenbroek       int siteDepth;
74*3e457fe3SDavid van Moolenbroek       int lib;
75*3e457fe3SDavid van Moolenbroek };
76*3e457fe3SDavid van Moolenbroek 
77*3e457fe3SDavid van Moolenbroek class QProfConf {
78*3e457fe3SDavid van Moolenbroek   public:
79*3e457fe3SDavid van Moolenbroek       static QProfConf* get(Module &M, std::string *llSitestacks, std::string *deepestLLLoops, std::string *deepestLLLibs, std::string *taskClasses, bool refreshSites=true);
80*3e457fe3SDavid van Moolenbroek 
81*3e457fe3SDavid van Moolenbroek       std::map<int, std::vector<QProfSite*> > getTaskClassLLSitestacks();
82*3e457fe3SDavid van Moolenbroek       std::map<int, QProfSite*> getTaskClassDeepestLLLoops();
83*3e457fe3SDavid van Moolenbroek       std::map<int, std::vector<QProfSite*> > getTaskClassDeepestLLLibs();
84*3e457fe3SDavid van Moolenbroek       int getNumTaskClasses();
85*3e457fe3SDavid van Moolenbroek       int getNumLLTaskClasses();
86*3e457fe3SDavid van Moolenbroek       int getNumLLBlockExtTaskClasses();
87*3e457fe3SDavid van Moolenbroek       int getNumLLBlockIntTaskClasses();
88*3e457fe3SDavid van Moolenbroek       int getNumLLBlockExtLibs();
89*3e457fe3SDavid van Moolenbroek       int getNumLLBlockIntLibs();
90*3e457fe3SDavid van Moolenbroek 
91*3e457fe3SDavid van Moolenbroek       std::vector<QProfSite*> getLLFunctions();
92*3e457fe3SDavid van Moolenbroek       std::vector<QProfSite*> getDeepestLLLoops();
93*3e457fe3SDavid van Moolenbroek       std::vector<QProfSite*> getDeepestLLLibs();
94*3e457fe3SDavid van Moolenbroek       bool lookupTaskClassLibFlags(int taskClassID, int *libFlags);
95*3e457fe3SDavid van Moolenbroek       void mergeTaskClassLLSitestacks(int taskClassID, int otherTaskClassID);
96*3e457fe3SDavid van Moolenbroek       void mergeTaskClassDeepestLLLoops(int taskClassID, int otherTaskClassID);
97*3e457fe3SDavid van Moolenbroek       void mergeTaskClassDeepestLLLibs(int taskClassID, int otherTaskClassID);
98*3e457fe3SDavid van Moolenbroek       void mergeTaskClassPair(int taskClassID, int otherTaskClassID);
99*3e457fe3SDavid van Moolenbroek       void mergeAllTaskClassesWithSameDeepestLLLoops();
100*3e457fe3SDavid van Moolenbroek       void print(raw_ostream &O);
101*3e457fe3SDavid van Moolenbroek       void printSiteList(raw_ostream &O, std::vector<QProfSite*> &list);
102*3e457fe3SDavid van Moolenbroek 
103*3e457fe3SDavid van Moolenbroek   private:
QProfConf()104*3e457fe3SDavid van Moolenbroek       QProfConf() {}
105*3e457fe3SDavid van Moolenbroek 
106*3e457fe3SDavid van Moolenbroek       static std::map<int, std::vector<QProfSite*> > parseTaskClassSiteList(Module &M, std::string &str, bool refreshSites=true);
107*3e457fe3SDavid van Moolenbroek       static std::map<int, QProfSite*> parseTaskClassSite(Module &M, std::string &str, bool refreshSites=true);
108*3e457fe3SDavid van Moolenbroek       static std::vector<int> parseIntList(std::string &str);
109*3e457fe3SDavid van Moolenbroek 
110*3e457fe3SDavid van Moolenbroek       std::map<int, std::vector<QProfSite*> > taskClassLLSitestacks;
111*3e457fe3SDavid van Moolenbroek       std::map<int, QProfSite*> taskClassDeepestLLLoops;
112*3e457fe3SDavid van Moolenbroek       std::map<int, std::vector<QProfSite*> > taskClassDeepestLLLibs;
113*3e457fe3SDavid van Moolenbroek       int numTaskClasses;
114*3e457fe3SDavid van Moolenbroek       int numLLTaskClasses;
115*3e457fe3SDavid van Moolenbroek       int numLLBlockExtTaskClasses;
116*3e457fe3SDavid van Moolenbroek       int numLLBlockIntTaskClasses;
117*3e457fe3SDavid van Moolenbroek       int numLLBlockExtLibs;
118*3e457fe3SDavid van Moolenbroek       int numLLBlockIntLibs;
119*3e457fe3SDavid van Moolenbroek };
120*3e457fe3SDavid van Moolenbroek 
stringRefToInt(StringRef & ref)121*3e457fe3SDavid van Moolenbroek static int stringRefToInt(StringRef &ref)
122*3e457fe3SDavid van Moolenbroek {
123*3e457fe3SDavid van Moolenbroek     return atoi(ref.str().c_str());
124*3e457fe3SDavid van Moolenbroek }
125*3e457fe3SDavid van Moolenbroek 
get(Module & M,int taskClassID,int taskSiteID,std::string moduleName,int lineNum,std::string functionName,std::string siteName,std::string siteFuncName,int siteDepth,int lib,unsigned long libFlags,bool refreshSite)126*3e457fe3SDavid van Moolenbroek inline QProfSite* QProfSite::get(Module &M, int taskClassID, int taskSiteID,
127*3e457fe3SDavid van Moolenbroek     std::string moduleName, int lineNum, std::string functionName,
128*3e457fe3SDavid van Moolenbroek     std::string siteName, std::string siteFuncName, int siteDepth, int lib,
129*3e457fe3SDavid van Moolenbroek     unsigned long libFlags, bool refreshSite)
130*3e457fe3SDavid van Moolenbroek {
131*3e457fe3SDavid van Moolenbroek     QProfSite *site = new QProfSite();
132*3e457fe3SDavid van Moolenbroek     site->taskClassID = taskClassID;
133*3e457fe3SDavid van Moolenbroek     site->taskSiteID = taskSiteID;
134*3e457fe3SDavid van Moolenbroek     site->moduleName = moduleName;
135*3e457fe3SDavid van Moolenbroek     site->lineNum = lineNum;
136*3e457fe3SDavid van Moolenbroek     site->functionName = functionName;
137*3e457fe3SDavid van Moolenbroek     site->siteName = siteName;
138*3e457fe3SDavid van Moolenbroek     site->siteFuncName = siteFuncName;
139*3e457fe3SDavid van Moolenbroek     site->siteDepth = siteDepth;
140*3e457fe3SDavid van Moolenbroek     site->lib = lib;
141*3e457fe3SDavid van Moolenbroek     site->libFlags = libFlags;
142*3e457fe3SDavid van Moolenbroek     site->function = NULL;
143*3e457fe3SDavid van Moolenbroek     site->siteFunction = NULL;
144*3e457fe3SDavid van Moolenbroek     site->siteInstruction = NULL;
145*3e457fe3SDavid van Moolenbroek     if (refreshSite) {
146*3e457fe3SDavid van Moolenbroek         site->refresh(M);
147*3e457fe3SDavid van Moolenbroek     }
148*3e457fe3SDavid van Moolenbroek 
149*3e457fe3SDavid van Moolenbroek     return site;
150*3e457fe3SDavid van Moolenbroek }
151*3e457fe3SDavid van Moolenbroek 
getFromString(Module & M,int taskClassID,int taskSiteID,std::string & siteString,bool refreshSite)152*3e457fe3SDavid van Moolenbroek inline QProfSite* QProfSite::getFromString(Module &M, int taskClassID, int taskSiteID,
153*3e457fe3SDavid van Moolenbroek     std::string &siteString, bool refreshSite)
154*3e457fe3SDavid van Moolenbroek {
155*3e457fe3SDavid van Moolenbroek     StringRef ref(siteString);
156*3e457fe3SDavid van Moolenbroek     SmallVector< StringRef, 3 > tokenVector;
157*3e457fe3SDavid van Moolenbroek     if (!siteString.compare("")) {
158*3e457fe3SDavid van Moolenbroek         return NULL;
159*3e457fe3SDavid van Moolenbroek     }
160*3e457fe3SDavid van Moolenbroek     ref.split(tokenVector, QPROF_SEP3);
161*3e457fe3SDavid van Moolenbroek     assert(tokenVector.size() == 8);
162*3e457fe3SDavid van Moolenbroek     return get(M, taskClassID, taskSiteID, tokenVector[0], stringRefToInt(tokenVector[1]),
163*3e457fe3SDavid van Moolenbroek         tokenVector[2], tokenVector[3], tokenVector[4],
164*3e457fe3SDavid van Moolenbroek         stringRefToInt(tokenVector[5]), stringRefToInt(tokenVector[6]),
165*3e457fe3SDavid van Moolenbroek         stringRefToInt(tokenVector[7]), refreshSite);
166*3e457fe3SDavid van Moolenbroek }
167*3e457fe3SDavid van Moolenbroek 
getFromSitesString(Module & M,std::string & sitesString,bool refreshSites)168*3e457fe3SDavid van Moolenbroek inline std::vector<QProfSite*> QProfSite::getFromSitesString(Module &M,
169*3e457fe3SDavid van Moolenbroek     std::string &sitesString, bool refreshSites)
170*3e457fe3SDavid van Moolenbroek {
171*3e457fe3SDavid van Moolenbroek     unsigned i;
172*3e457fe3SDavid van Moolenbroek     int taskClassID;
173*3e457fe3SDavid van Moolenbroek     std::vector<QProfSite*> sites;
174*3e457fe3SDavid van Moolenbroek     StringRef ref(sitesString);
175*3e457fe3SDavid van Moolenbroek     SmallVector< StringRef, 3 > tokenVector;
176*3e457fe3SDavid van Moolenbroek     if (!sitesString.compare("")) {
177*3e457fe3SDavid van Moolenbroek         return sites;
178*3e457fe3SDavid van Moolenbroek     }
179*3e457fe3SDavid van Moolenbroek     ref.split(tokenVector, QPROF_SEP2);
180*3e457fe3SDavid van Moolenbroek     assert(tokenVector.size() > 1);
181*3e457fe3SDavid van Moolenbroek     taskClassID = stringRefToInt(tokenVector[0]);
182*3e457fe3SDavid van Moolenbroek     for (i=1;i<tokenVector.size();i++) {
183*3e457fe3SDavid van Moolenbroek         std::string token = tokenVector[i].str();
184*3e457fe3SDavid van Moolenbroek         QProfSite *site = QProfSite::getFromString(M, taskClassID, i, token,
185*3e457fe3SDavid van Moolenbroek             refreshSites);
186*3e457fe3SDavid van Moolenbroek         sites.push_back(site);
187*3e457fe3SDavid van Moolenbroek     }
188*3e457fe3SDavid van Moolenbroek     return sites;
189*3e457fe3SDavid van Moolenbroek }
190*3e457fe3SDavid van Moolenbroek 
refresh(Module & M)191*3e457fe3SDavid van Moolenbroek inline void QProfSite::refresh(Module &M)
192*3e457fe3SDavid van Moolenbroek {
193*3e457fe3SDavid van Moolenbroek     BasicBlock *siteBB = NULL;
194*3e457fe3SDavid van Moolenbroek     function = NULL;
195*3e457fe3SDavid van Moolenbroek     siteFunction = NULL;
196*3e457fe3SDavid van Moolenbroek     siteInstruction = NULL;
197*3e457fe3SDavid van Moolenbroek     function = M.getFunction(functionName);
198*3e457fe3SDavid van Moolenbroek     siteFunction = M.getFunction(siteFuncName);
199*3e457fe3SDavid van Moolenbroek     if (!siteFunction) {
200*3e457fe3SDavid van Moolenbroek         errs() << "Function " << siteFuncName << " not found. Invalid qprof profiling data?\n";
201*3e457fe3SDavid van Moolenbroek     }
202*3e457fe3SDavid van Moolenbroek     assert(siteFunction);
203*3e457fe3SDavid van Moolenbroek     for (Function::iterator BB = siteFunction->begin(),
204*3e457fe3SDavid van Moolenbroek         e = siteFunction->end(); BB != e; ++BB) {
205*3e457fe3SDavid van Moolenbroek         if (!BB->getName().compare(siteName)) {
206*3e457fe3SDavid van Moolenbroek             siteBB = BB;
207*3e457fe3SDavid van Moolenbroek             break;
208*3e457fe3SDavid van Moolenbroek         }
209*3e457fe3SDavid van Moolenbroek     }
210*3e457fe3SDavid van Moolenbroek     assert(siteBB);
211*3e457fe3SDavid van Moolenbroek     if (isCallsite()) {
212*3e457fe3SDavid van Moolenbroek         for (BasicBlock::iterator it = siteBB->begin(); it != siteBB->end(); ++it) {
213*3e457fe3SDavid van Moolenbroek             CallSite CS(it);
214*3e457fe3SDavid van Moolenbroek             if (CS.getInstruction() && CS.getCalledFunction() == function) {
215*3e457fe3SDavid van Moolenbroek                 siteInstruction = it;
216*3e457fe3SDavid van Moolenbroek                 break;
217*3e457fe3SDavid van Moolenbroek             }
218*3e457fe3SDavid van Moolenbroek         }
219*3e457fe3SDavid van Moolenbroek         assert(siteInstruction && "Invalid qprof callsite?");
220*3e457fe3SDavid van Moolenbroek     }
221*3e457fe3SDavid van Moolenbroek     else {
222*3e457fe3SDavid van Moolenbroek         siteInstruction = &siteBB->front();
223*3e457fe3SDavid van Moolenbroek     }
224*3e457fe3SDavid van Moolenbroek }
225*3e457fe3SDavid van Moolenbroek 
toString()226*3e457fe3SDavid van Moolenbroek inline std::string QProfSite::toString()
227*3e457fe3SDavid van Moolenbroek {
228*3e457fe3SDavid van Moolenbroek     std::string str;
229*3e457fe3SDavid van Moolenbroek     raw_string_ostream ostream(str);
230*3e457fe3SDavid van Moolenbroek     ostream << taskClassID << QPROF_SEP3 << taskSiteID << QPROF_SEP3 << moduleName << QPROF_SEP3 << lineNum << QPROF_SEP3 << functionName << QPROF_SEP3 << siteName << QPROF_SEP3 << siteFuncName << QPROF_SEP3 << siteDepth << QPROF_SEP3 << lib << QPROF_SEP3 << libFlags;
231*3e457fe3SDavid van Moolenbroek     ostream.flush();
232*3e457fe3SDavid van Moolenbroek     return str;
233*3e457fe3SDavid van Moolenbroek }
234*3e457fe3SDavid van Moolenbroek 
isLoop()235*3e457fe3SDavid van Moolenbroek inline bool QProfSite::isLoop()
236*3e457fe3SDavid van Moolenbroek {
237*3e457fe3SDavid van Moolenbroek     return siteDepth > 0;
238*3e457fe3SDavid van Moolenbroek }
239*3e457fe3SDavid van Moolenbroek 
isFunction()240*3e457fe3SDavid van Moolenbroek inline bool QProfSite::isFunction()
241*3e457fe3SDavid van Moolenbroek {
242*3e457fe3SDavid van Moolenbroek     return !isLoop() && !isCallsite();
243*3e457fe3SDavid van Moolenbroek }
244*3e457fe3SDavid van Moolenbroek 
isCallsite()245*3e457fe3SDavid van Moolenbroek inline bool QProfSite::isCallsite()
246*3e457fe3SDavid van Moolenbroek {
247*3e457fe3SDavid van Moolenbroek     return isLibCallsite();
248*3e457fe3SDavid van Moolenbroek }
249*3e457fe3SDavid van Moolenbroek 
isLibCallsite()250*3e457fe3SDavid van Moolenbroek inline bool QProfSite::isLibCallsite()
251*3e457fe3SDavid van Moolenbroek {
252*3e457fe3SDavid van Moolenbroek     return lib != 0;
253*3e457fe3SDavid van Moolenbroek }
254*3e457fe3SDavid van Moolenbroek 
equals(QProfSite * other)255*3e457fe3SDavid van Moolenbroek inline bool QProfSite::equals(QProfSite *other)
256*3e457fe3SDavid van Moolenbroek {
257*3e457fe3SDavid van Moolenbroek      if (lineNum != other->lineNum) {
258*3e457fe3SDavid van Moolenbroek          return false;
259*3e457fe3SDavid van Moolenbroek      }
260*3e457fe3SDavid van Moolenbroek      if (libFlags != other->libFlags) {
261*3e457fe3SDavid van Moolenbroek          return false;
262*3e457fe3SDavid van Moolenbroek      }
263*3e457fe3SDavid van Moolenbroek      if (moduleName.compare(other->moduleName)) {
264*3e457fe3SDavid van Moolenbroek          return false;
265*3e457fe3SDavid van Moolenbroek      }
266*3e457fe3SDavid van Moolenbroek      if (functionName.compare(other->functionName)) {
267*3e457fe3SDavid van Moolenbroek          return false;
268*3e457fe3SDavid van Moolenbroek      }
269*3e457fe3SDavid van Moolenbroek      if (siteName.compare(other->siteName)) {
270*3e457fe3SDavid van Moolenbroek          return false;
271*3e457fe3SDavid van Moolenbroek      }
272*3e457fe3SDavid van Moolenbroek      if (siteFuncName.compare(other->siteFuncName)) {
273*3e457fe3SDavid van Moolenbroek          return false;
274*3e457fe3SDavid van Moolenbroek      }
275*3e457fe3SDavid van Moolenbroek      return true;
276*3e457fe3SDavid van Moolenbroek }
277*3e457fe3SDavid van Moolenbroek 
get(Module & M,std::string * llSitestacks,std::string * deepestLLLoops,std::string * deepestLLLibs,std::string * taskClasses,bool refreshSites)278*3e457fe3SDavid van Moolenbroek inline QProfConf* QProfConf::get(Module &M, std::string *llSitestacks,
279*3e457fe3SDavid van Moolenbroek     std::string *deepestLLLoops, std::string *deepestLLLibs,
280*3e457fe3SDavid van Moolenbroek     std::string *taskClasses, bool refreshSites)
281*3e457fe3SDavid van Moolenbroek {
282*3e457fe3SDavid van Moolenbroek     std::vector<int> intValues;
283*3e457fe3SDavid van Moolenbroek     QProfConf *conf = new QProfConf();
284*3e457fe3SDavid van Moolenbroek     if (llSitestacks) {
285*3e457fe3SDavid van Moolenbroek         conf->taskClassLLSitestacks = parseTaskClassSiteList(M,
286*3e457fe3SDavid van Moolenbroek             *llSitestacks, refreshSites);
287*3e457fe3SDavid van Moolenbroek     }
288*3e457fe3SDavid van Moolenbroek     if (deepestLLLoops) {
289*3e457fe3SDavid van Moolenbroek         conf->taskClassDeepestLLLoops = parseTaskClassSite(M,
290*3e457fe3SDavid van Moolenbroek             *deepestLLLoops, refreshSites);
291*3e457fe3SDavid van Moolenbroek     }
292*3e457fe3SDavid van Moolenbroek     if (deepestLLLibs) {
293*3e457fe3SDavid van Moolenbroek         conf->taskClassDeepestLLLibs = parseTaskClassSiteList(M,
294*3e457fe3SDavid van Moolenbroek             *deepestLLLibs, refreshSites);
295*3e457fe3SDavid van Moolenbroek     }
296*3e457fe3SDavid van Moolenbroek     if (taskClasses) {
297*3e457fe3SDavid van Moolenbroek         intValues = parseIntList(*taskClasses);
298*3e457fe3SDavid van Moolenbroek     }
299*3e457fe3SDavid van Moolenbroek     if (intValues.size() > 0) {
300*3e457fe3SDavid van Moolenbroek         assert(intValues.size() == 6);
301*3e457fe3SDavid van Moolenbroek         conf->numTaskClasses = intValues[0];
302*3e457fe3SDavid van Moolenbroek         conf->numLLTaskClasses = intValues[1];
303*3e457fe3SDavid van Moolenbroek         conf->numLLBlockExtTaskClasses = intValues[2];
304*3e457fe3SDavid van Moolenbroek         conf->numLLBlockIntTaskClasses = intValues[3];
305*3e457fe3SDavid van Moolenbroek         conf->numLLBlockExtLibs = intValues[4];
306*3e457fe3SDavid van Moolenbroek         conf->numLLBlockIntLibs = intValues[5];
307*3e457fe3SDavid van Moolenbroek     }
308*3e457fe3SDavid van Moolenbroek     else {
309*3e457fe3SDavid van Moolenbroek         conf->numTaskClasses = 0;
310*3e457fe3SDavid van Moolenbroek         conf->numLLTaskClasses = 0;
311*3e457fe3SDavid van Moolenbroek         conf->numLLBlockExtTaskClasses = 0;
312*3e457fe3SDavid van Moolenbroek         conf->numLLBlockIntTaskClasses = 0;
313*3e457fe3SDavid van Moolenbroek         conf->numLLBlockExtLibs = 0;
314*3e457fe3SDavid van Moolenbroek         conf->numLLBlockIntLibs = 0;
315*3e457fe3SDavid van Moolenbroek     }
316*3e457fe3SDavid van Moolenbroek 
317*3e457fe3SDavid van Moolenbroek     return conf;
318*3e457fe3SDavid van Moolenbroek }
319*3e457fe3SDavid van Moolenbroek 
getTaskClassLLSitestacks()320*3e457fe3SDavid van Moolenbroek inline std::map<int, std::vector<QProfSite*> > QProfConf::getTaskClassLLSitestacks()
321*3e457fe3SDavid van Moolenbroek {
322*3e457fe3SDavid van Moolenbroek     return taskClassLLSitestacks;
323*3e457fe3SDavid van Moolenbroek }
324*3e457fe3SDavid van Moolenbroek 
getTaskClassDeepestLLLoops()325*3e457fe3SDavid van Moolenbroek inline std::map<int, QProfSite*> QProfConf::getTaskClassDeepestLLLoops()
326*3e457fe3SDavid van Moolenbroek {
327*3e457fe3SDavid van Moolenbroek     return taskClassDeepestLLLoops;
328*3e457fe3SDavid van Moolenbroek }
329*3e457fe3SDavid van Moolenbroek 
getTaskClassDeepestLLLibs()330*3e457fe3SDavid van Moolenbroek inline std::map<int, std::vector<QProfSite*> > QProfConf::getTaskClassDeepestLLLibs()
331*3e457fe3SDavid van Moolenbroek {
332*3e457fe3SDavid van Moolenbroek     return taskClassDeepestLLLibs;
333*3e457fe3SDavid van Moolenbroek }
334*3e457fe3SDavid van Moolenbroek 
getNumTaskClasses()335*3e457fe3SDavid van Moolenbroek inline int QProfConf::getNumTaskClasses()
336*3e457fe3SDavid van Moolenbroek {
337*3e457fe3SDavid van Moolenbroek     return numTaskClasses;
338*3e457fe3SDavid van Moolenbroek }
339*3e457fe3SDavid van Moolenbroek 
getNumLLTaskClasses()340*3e457fe3SDavid van Moolenbroek inline int QProfConf::getNumLLTaskClasses()
341*3e457fe3SDavid van Moolenbroek {
342*3e457fe3SDavid van Moolenbroek     return numLLTaskClasses;
343*3e457fe3SDavid van Moolenbroek }
344*3e457fe3SDavid van Moolenbroek 
getNumLLBlockExtTaskClasses()345*3e457fe3SDavid van Moolenbroek inline int QProfConf::getNumLLBlockExtTaskClasses()
346*3e457fe3SDavid van Moolenbroek {
347*3e457fe3SDavid van Moolenbroek     return numLLBlockExtTaskClasses;
348*3e457fe3SDavid van Moolenbroek }
349*3e457fe3SDavid van Moolenbroek 
getNumLLBlockIntTaskClasses()350*3e457fe3SDavid van Moolenbroek inline int QProfConf::getNumLLBlockIntTaskClasses()
351*3e457fe3SDavid van Moolenbroek {
352*3e457fe3SDavid van Moolenbroek     return numLLBlockIntTaskClasses;
353*3e457fe3SDavid van Moolenbroek }
354*3e457fe3SDavid van Moolenbroek 
getNumLLBlockExtLibs()355*3e457fe3SDavid van Moolenbroek inline int QProfConf::getNumLLBlockExtLibs()
356*3e457fe3SDavid van Moolenbroek {
357*3e457fe3SDavid van Moolenbroek     return numLLBlockExtLibs;
358*3e457fe3SDavid van Moolenbroek }
359*3e457fe3SDavid van Moolenbroek 
getNumLLBlockIntLibs()360*3e457fe3SDavid van Moolenbroek inline int QProfConf::getNumLLBlockIntLibs()
361*3e457fe3SDavid van Moolenbroek {
362*3e457fe3SDavid van Moolenbroek     return numLLBlockIntLibs;
363*3e457fe3SDavid van Moolenbroek }
364*3e457fe3SDavid van Moolenbroek 
getLLFunctions()365*3e457fe3SDavid van Moolenbroek inline std::vector<QProfSite*> QProfConf::getLLFunctions()
366*3e457fe3SDavid van Moolenbroek {
367*3e457fe3SDavid van Moolenbroek     std::vector<QProfSite*> sites;
368*3e457fe3SDavid van Moolenbroek     std::map<int, std::vector<QProfSite*> >::iterator it;
369*3e457fe3SDavid van Moolenbroek     it = taskClassLLSitestacks.begin();
370*3e457fe3SDavid van Moolenbroek     for (; it != taskClassLLSitestacks.end(); it++) {
371*3e457fe3SDavid van Moolenbroek         std::vector<QProfSite*> *siteVector = &it->second;
372*3e457fe3SDavid van Moolenbroek         for (unsigned i=0;i<siteVector->size();i++) {
373*3e457fe3SDavid van Moolenbroek             QProfSite* site = (*siteVector)[i];
374*3e457fe3SDavid van Moolenbroek             if (site->isFunction()) {
375*3e457fe3SDavid van Moolenbroek                 sites.push_back((*siteVector)[i]);
376*3e457fe3SDavid van Moolenbroek             }
377*3e457fe3SDavid van Moolenbroek         }
378*3e457fe3SDavid van Moolenbroek     }
379*3e457fe3SDavid van Moolenbroek     return sites;
380*3e457fe3SDavid van Moolenbroek }
381*3e457fe3SDavid van Moolenbroek 
getDeepestLLLoops()382*3e457fe3SDavid van Moolenbroek inline std::vector<QProfSite*> QProfConf::getDeepestLLLoops()
383*3e457fe3SDavid van Moolenbroek {
384*3e457fe3SDavid van Moolenbroek     std::vector<QProfSite*> sites;
385*3e457fe3SDavid van Moolenbroek     std::map<int, QProfSite*>::iterator it;
386*3e457fe3SDavid van Moolenbroek     it = taskClassDeepestLLLoops.begin();
387*3e457fe3SDavid van Moolenbroek     for (; it != taskClassDeepestLLLoops.end(); it++) {
388*3e457fe3SDavid van Moolenbroek         sites.push_back(it->second);
389*3e457fe3SDavid van Moolenbroek     }
390*3e457fe3SDavid van Moolenbroek     return sites;
391*3e457fe3SDavid van Moolenbroek }
392*3e457fe3SDavid van Moolenbroek 
getDeepestLLLibs()393*3e457fe3SDavid van Moolenbroek inline std::vector<QProfSite*> QProfConf::getDeepestLLLibs()
394*3e457fe3SDavid van Moolenbroek {
395*3e457fe3SDavid van Moolenbroek     std::vector<QProfSite*> sites;
396*3e457fe3SDavid van Moolenbroek     std::map<int, std::vector<QProfSite*> >::iterator it;
397*3e457fe3SDavid van Moolenbroek     it = taskClassDeepestLLLibs.begin();
398*3e457fe3SDavid van Moolenbroek     for (; it != taskClassDeepestLLLibs.end(); it++) {
399*3e457fe3SDavid van Moolenbroek         std::vector<QProfSite*> *siteVector = &it->second;
400*3e457fe3SDavid van Moolenbroek         for (unsigned i=0;i<siteVector->size();i++) {
401*3e457fe3SDavid van Moolenbroek             sites.push_back((*siteVector)[i]);
402*3e457fe3SDavid van Moolenbroek         }
403*3e457fe3SDavid van Moolenbroek     }
404*3e457fe3SDavid van Moolenbroek     return sites;
405*3e457fe3SDavid van Moolenbroek }
406*3e457fe3SDavid van Moolenbroek 
lookupTaskClassLibFlags(int taskClassID,int * libFlags)407*3e457fe3SDavid van Moolenbroek inline bool QProfConf::lookupTaskClassLibFlags(int taskClassID, int *libFlags)
408*3e457fe3SDavid van Moolenbroek {
409*3e457fe3SDavid van Moolenbroek     bool found = false;
410*3e457fe3SDavid van Moolenbroek     std::vector<QProfSite*> deepestLLLibs = getDeepestLLLibs();
411*3e457fe3SDavid van Moolenbroek 
412*3e457fe3SDavid van Moolenbroek     *libFlags = 0;
413*3e457fe3SDavid van Moolenbroek     for (unsigned i=0;i<deepestLLLibs.size();i++) {
414*3e457fe3SDavid van Moolenbroek         QProfSite *site = deepestLLLibs[i];
415*3e457fe3SDavid van Moolenbroek         if (site->taskClassID == taskClassID) {
416*3e457fe3SDavid van Moolenbroek             *libFlags |= site->libFlags;
417*3e457fe3SDavid van Moolenbroek             found = true;
418*3e457fe3SDavid van Moolenbroek         }
419*3e457fe3SDavid van Moolenbroek     }
420*3e457fe3SDavid van Moolenbroek     return found;
421*3e457fe3SDavid van Moolenbroek }
422*3e457fe3SDavid van Moolenbroek 
mergeTaskClassLLSitestacks(int taskClassID,int otherTaskClassID)423*3e457fe3SDavid van Moolenbroek inline void QProfConf::mergeTaskClassLLSitestacks(int taskClassID, int otherTaskClassID)
424*3e457fe3SDavid van Moolenbroek {
425*3e457fe3SDavid van Moolenbroek     size_t erased = taskClassLLSitestacks.erase(otherTaskClassID);
426*3e457fe3SDavid van Moolenbroek     assert(erased == 1);
427*3e457fe3SDavid van Moolenbroek }
428*3e457fe3SDavid van Moolenbroek 
mergeTaskClassDeepestLLLoops(int taskClassID,int otherTaskClassID)429*3e457fe3SDavid van Moolenbroek inline void QProfConf::mergeTaskClassDeepestLLLoops(int taskClassID, int otherTaskClassID)
430*3e457fe3SDavid van Moolenbroek {
431*3e457fe3SDavid van Moolenbroek     size_t erased = taskClassDeepestLLLoops.erase(otherTaskClassID);
432*3e457fe3SDavid van Moolenbroek     assert(erased == 1);
433*3e457fe3SDavid van Moolenbroek }
434*3e457fe3SDavid van Moolenbroek 
mergeTaskClassDeepestLLLibs(int taskClassID,int otherTaskClassID)435*3e457fe3SDavid van Moolenbroek inline void QProfConf::mergeTaskClassDeepestLLLibs(int taskClassID, int otherTaskClassID)
436*3e457fe3SDavid van Moolenbroek {
437*3e457fe3SDavid van Moolenbroek     size_t erased = taskClassDeepestLLLibs.erase(otherTaskClassID);
438*3e457fe3SDavid van Moolenbroek     assert(erased == 1);
439*3e457fe3SDavid van Moolenbroek }
440*3e457fe3SDavid van Moolenbroek 
mergeTaskClassPair(int taskClassID,int otherTaskClassID)441*3e457fe3SDavid van Moolenbroek inline void QProfConf::mergeTaskClassPair(int taskClassID,
442*3e457fe3SDavid van Moolenbroek     int otherTaskClassID)
443*3e457fe3SDavid van Moolenbroek {
444*3e457fe3SDavid van Moolenbroek     int libFlags;
445*3e457fe3SDavid van Moolenbroek     mergeTaskClassLLSitestacks(taskClassID, otherTaskClassID);
446*3e457fe3SDavid van Moolenbroek     mergeTaskClassDeepestLLLoops(taskClassID, otherTaskClassID);
447*3e457fe3SDavid van Moolenbroek     mergeTaskClassDeepestLLLibs(taskClassID, otherTaskClassID);
448*3e457fe3SDavid van Moolenbroek 
449*3e457fe3SDavid van Moolenbroek     numTaskClasses--;
450*3e457fe3SDavid van Moolenbroek     if (lookupTaskClassLibFlags(taskClassID, &libFlags)) {
451*3e457fe3SDavid van Moolenbroek         numLLTaskClasses--;
452*3e457fe3SDavid van Moolenbroek         if (libFlags & _UTIL_STLIB_FLAG(STLIB_BLOCK_EXT)) {
453*3e457fe3SDavid van Moolenbroek             numLLBlockExtTaskClasses--;
454*3e457fe3SDavid van Moolenbroek         }
455*3e457fe3SDavid van Moolenbroek         else {
456*3e457fe3SDavid van Moolenbroek             numLLBlockIntTaskClasses--;
457*3e457fe3SDavid van Moolenbroek         }
458*3e457fe3SDavid van Moolenbroek     }
459*3e457fe3SDavid van Moolenbroek }
460*3e457fe3SDavid van Moolenbroek 
mergeAllTaskClassesWithSameDeepestLLLoops()461*3e457fe3SDavid van Moolenbroek inline void QProfConf::mergeAllTaskClassesWithSameDeepestLLLoops()
462*3e457fe3SDavid van Moolenbroek {
463*3e457fe3SDavid van Moolenbroek     std::vector<QProfSite*> deepestLLLoops = getDeepestLLLoops();
464*3e457fe3SDavid van Moolenbroek     std::vector<std::pair<QProfSite*, QProfSite*> > loopPairs;
465*3e457fe3SDavid van Moolenbroek 
466*3e457fe3SDavid van Moolenbroek     for (unsigned i=0;i<deepestLLLoops.size();i++) {
467*3e457fe3SDavid van Moolenbroek         QProfSite *site = deepestLLLoops[i];
468*3e457fe3SDavid van Moolenbroek         for (unsigned j=0;j<i;j++) {
469*3e457fe3SDavid van Moolenbroek             if (site->equals(deepestLLLoops[j])) {
470*3e457fe3SDavid van Moolenbroek                 loopPairs.push_back(std::pair<QProfSite*, QProfSite*>(site, deepestLLLoops[j]));
471*3e457fe3SDavid van Moolenbroek             }
472*3e457fe3SDavid van Moolenbroek         }
473*3e457fe3SDavid van Moolenbroek     }
474*3e457fe3SDavid van Moolenbroek     for (unsigned i=0;i<loopPairs.size();i++) {
475*3e457fe3SDavid van Moolenbroek         int taskClassID = loopPairs[i].first->taskClassID;
476*3e457fe3SDavid van Moolenbroek         int otherTaskClassID = loopPairs[i].second->taskClassID;
477*3e457fe3SDavid van Moolenbroek         mergeTaskClassPair(taskClassID, otherTaskClassID);
478*3e457fe3SDavid van Moolenbroek     }
479*3e457fe3SDavid van Moolenbroek }
480*3e457fe3SDavid van Moolenbroek 
print(raw_ostream & O)481*3e457fe3SDavid van Moolenbroek inline void QProfConf::print(raw_ostream &O)
482*3e457fe3SDavid van Moolenbroek {
483*3e457fe3SDavid van Moolenbroek     std::vector<QProfSite*> list;
484*3e457fe3SDavid van Moolenbroek     O << "*** QProfConf:\n";
485*3e457fe3SDavid van Moolenbroek     O << " - numTaskClasses=" << getNumTaskClasses() << "\n";
486*3e457fe3SDavid van Moolenbroek     O << " - numLLTaskClasses=" << getNumLLTaskClasses() << "\n";
487*3e457fe3SDavid van Moolenbroek     O << " - numLLBlockExtTaskClasses=" << getNumLLBlockExtTaskClasses() << "\n";
488*3e457fe3SDavid van Moolenbroek     O << " - numLLBlockIntTaskClasses=" << getNumLLBlockIntTaskClasses() << "\n";
489*3e457fe3SDavid van Moolenbroek     O << " - numLLBlockExtLibs=" << getNumLLBlockExtLibs() << "\n";
490*3e457fe3SDavid van Moolenbroek     O << " - numLLBlockIntLibs=" << getNumLLBlockIntLibs() << "\n";
491*3e457fe3SDavid van Moolenbroek     list =  getLLFunctions();
492*3e457fe3SDavid van Moolenbroek     O << " - LLFunctions="; printSiteList(O, list); O << "\n";
493*3e457fe3SDavid van Moolenbroek     list = getDeepestLLLoops();
494*3e457fe3SDavid van Moolenbroek     O << " - deepestLLLoops="; printSiteList(O, list); O << "\n";
495*3e457fe3SDavid van Moolenbroek     list = getDeepestLLLibs();
496*3e457fe3SDavid van Moolenbroek     O << " - deepestLLLibs="; printSiteList(O, list); O << "\n";
497*3e457fe3SDavid van Moolenbroek }
498*3e457fe3SDavid van Moolenbroek 
printSiteList(raw_ostream & O,std::vector<QProfSite * > & list)499*3e457fe3SDavid van Moolenbroek inline void QProfConf::printSiteList(raw_ostream &O, std::vector<QProfSite*> &list)
500*3e457fe3SDavid van Moolenbroek {
501*3e457fe3SDavid van Moolenbroek     for (std::vector<QProfSite*>::iterator it = list.begin(); it != list.end(); it++) {
502*3e457fe3SDavid van Moolenbroek         QProfSite* site = *it;
503*3e457fe3SDavid van Moolenbroek         if (it != list.begin()) {
504*3e457fe3SDavid van Moolenbroek             O << ", ";
505*3e457fe3SDavid van Moolenbroek         }
506*3e457fe3SDavid van Moolenbroek         O << "{ ";
507*3e457fe3SDavid van Moolenbroek         O << site->toString();
508*3e457fe3SDavid van Moolenbroek         O << " }";
509*3e457fe3SDavid van Moolenbroek     }
510*3e457fe3SDavid van Moolenbroek }
511*3e457fe3SDavid van Moolenbroek 
parseTaskClassSiteList(Module & M,std::string & str,bool refreshSites)512*3e457fe3SDavid van Moolenbroek inline std::map<int, std::vector<QProfSite*> > QProfConf::parseTaskClassSiteList(Module &M,
513*3e457fe3SDavid van Moolenbroek     std::string &str, bool refreshSites)
514*3e457fe3SDavid van Moolenbroek {
515*3e457fe3SDavid van Moolenbroek     std::map<int, std::vector<QProfSite*> > siteListMap;
516*3e457fe3SDavid van Moolenbroek     StringRef ref(str);
517*3e457fe3SDavid van Moolenbroek     SmallVector< StringRef, 3 > tokenVector;
518*3e457fe3SDavid van Moolenbroek     if (!str.compare("")) {
519*3e457fe3SDavid van Moolenbroek         return siteListMap;
520*3e457fe3SDavid van Moolenbroek     }
521*3e457fe3SDavid van Moolenbroek     ref.split(tokenVector, QPROF_SEP);
522*3e457fe3SDavid van Moolenbroek     for (unsigned i=0;i<tokenVector.size();i++) {
523*3e457fe3SDavid van Moolenbroek         std::string token = tokenVector[i].str();
524*3e457fe3SDavid van Moolenbroek         std::vector<QProfSite*> sites = QProfSite::getFromSitesString(M,
525*3e457fe3SDavid van Moolenbroek             token, refreshSites);
526*3e457fe3SDavid van Moolenbroek         if (sites.size() > 0) {
527*3e457fe3SDavid van Moolenbroek             int taskClassID = sites[0]->taskClassID;
528*3e457fe3SDavid van Moolenbroek             siteListMap.insert(std::pair<int, std::vector<QProfSite*> >(taskClassID,
529*3e457fe3SDavid van Moolenbroek                 sites));
530*3e457fe3SDavid van Moolenbroek         }
531*3e457fe3SDavid van Moolenbroek     }
532*3e457fe3SDavid van Moolenbroek     return siteListMap;
533*3e457fe3SDavid van Moolenbroek }
534*3e457fe3SDavid van Moolenbroek 
parseTaskClassSite(Module & M,std::string & str,bool refreshSites)535*3e457fe3SDavid van Moolenbroek inline std::map<int, QProfSite*> QProfConf::parseTaskClassSite(Module &M,
536*3e457fe3SDavid van Moolenbroek     std::string &str, bool refreshSites)
537*3e457fe3SDavid van Moolenbroek {
538*3e457fe3SDavid van Moolenbroek     std::map<int, std::vector<QProfSite*> >::iterator it;
539*3e457fe3SDavid van Moolenbroek     std::map<int, std::vector<QProfSite*> > siteListMap =
540*3e457fe3SDavid van Moolenbroek         parseTaskClassSiteList(M, str, refreshSites);
541*3e457fe3SDavid van Moolenbroek     std::map<int, QProfSite*> siteMap;
542*3e457fe3SDavid van Moolenbroek     for (it=siteListMap.begin();it!=siteListMap.end();it++) {
543*3e457fe3SDavid van Moolenbroek         std::vector<QProfSite*> list = it->second;
544*3e457fe3SDavid van Moolenbroek         assert(list.size() == 1);
545*3e457fe3SDavid van Moolenbroek         siteMap.insert(std::pair<int, QProfSite*>(it->first, list[0]));
546*3e457fe3SDavid van Moolenbroek     }
547*3e457fe3SDavid van Moolenbroek 
548*3e457fe3SDavid van Moolenbroek     return siteMap;
549*3e457fe3SDavid van Moolenbroek }
550*3e457fe3SDavid van Moolenbroek 
parseIntList(std::string & str)551*3e457fe3SDavid van Moolenbroek inline std::vector<int> QProfConf::parseIntList(std::string &str)
552*3e457fe3SDavid van Moolenbroek {
553*3e457fe3SDavid van Moolenbroek     std::vector<int> intValues;
554*3e457fe3SDavid van Moolenbroek     StringRef ref(str);
555*3e457fe3SDavid van Moolenbroek     SmallVector< StringRef, 3 > tokenVector;
556*3e457fe3SDavid van Moolenbroek     if (!str.compare("")) {
557*3e457fe3SDavid van Moolenbroek         return intValues;
558*3e457fe3SDavid van Moolenbroek     }
559*3e457fe3SDavid van Moolenbroek     ref.split(tokenVector, QPROF_SEP);
560*3e457fe3SDavid van Moolenbroek     for (unsigned i=0;i<tokenVector.size();i++) {
561*3e457fe3SDavid van Moolenbroek         intValues.push_back(stringRefToInt(tokenVector[i]));
562*3e457fe3SDavid van Moolenbroek     }
563*3e457fe3SDavid van Moolenbroek 
564*3e457fe3SDavid van Moolenbroek     return intValues;
565*3e457fe3SDavid van Moolenbroek }
566*3e457fe3SDavid van Moolenbroek 
567*3e457fe3SDavid van Moolenbroek }
568*3e457fe3SDavid van Moolenbroek 
569*3e457fe3SDavid van Moolenbroek #endif /* _QPROF_COMMON_H */
570