3 #include "sdag-globals.h"
6 #include "constructs/Constructs.h"
7 #include "CParsedFile.h"
18 SdagConstruct::SdagConstruct(EToken t, SdagConstruct *construct1) {
20 constructs->push_back(construct1);
23 SdagConstruct::SdagConstruct(EToken t, SdagConstruct *construct1, SdagConstruct *aList) {
25 constructs->push_back(construct1);
26 constructs->insert(constructs->end(), aList->constructs->begin(), aList->constructs->end());
29 SdagConstruct::SdagConstruct(EToken t, XStr *txt, SdagConstruct *c1, SdagConstruct *c2, SdagConstruct *c3,
30 SdagConstruct *c4, SdagConstruct *constructAppend, EntryList *el) {
33 con1 = c1; con2 = c2; con3 = c3; con4 = c4;
34 if (constructAppend != 0) constructs->push_back(constructAppend);
38 SdagConstruct::SdagConstruct(EToken t, const char *entryStr, const char *codeStr, ParamList *pl) {
40 text = new XStr(codeStr);
44 void SdagConstruct::init(EToken& t) {
45 con1 = 0; con2 = 0; con3 = 0; con4 = 0;
48 constructs = new list<SdagConstruct*>();
53 SdagConstruct::~SdagConstruct() {
58 void SdagConstruct::numberNodes(void) {
60 for_each(constructs->begin(), constructs->end(), mem_fun(&SdagConstruct::numberNodes));
63 XStr* SdagConstruct::createLabel(const char* str, int nodeNum) {
66 sprintf(text, "_%s_%d", str, nodeNum);
68 sprintf(text, "%s", str);
70 return new XStr(text);
73 void SdagConstruct::labelNodes() {
75 label = createLabel(label_str, nodeNum);
78 for_each(constructs->begin(), constructs->end(), mem_fun(&SdagConstruct::labelNodes));
81 void EntryList::generateEntryList(list<CEntry*>& CEntrylist, WhenConstruct *thisWhen) {
84 el->entry->generateEntryList(CEntrylist, thisWhen);
89 void Entry::generateEntryList(list<CEntry*>& CEntrylist, WhenConstruct *thisWhen) {
93 for(list<CEntry *>::iterator entry=CEntrylist.begin();
94 entry != CEntrylist.end(); ++entry) {
95 if(*((*entry)->entry) == (const char *)name)
98 epl = (*entry)->paramlist;
102 if (((*entry)->paramlist->isVoid() == 1) && (pl->isVoid() == 1)) {
105 while ((pl != NULL) && (epl != NULL))
108 (pl->isArray() && epl->isArray()) ||
109 (pl->isBuiltin() && epl->isBuiltin()) ||
110 (pl->isReference() && epl->isReference()) ||
111 (pl->isMessage() && epl->isMessage()) ||
112 (pl->isNamed() && epl->isNamed());
113 bool baseNameMatches = (strcmp(pl->getBaseName(), epl->getBaseName()) == 0);
114 if (kindMatches && baseNameMatches)
120 if (((pl == NULL) && (epl != NULL)) ||
121 ((pl != NULL) && (epl == NULL)))
124 // check to see if thisWhen is already in entry's whenList
125 bool whenFound = false;
126 for(list<WhenConstruct*>::iterator it = (*entry)->whenList.begin();
127 it != (*entry)->whenList.end(); ++it) {
128 if ((*it)->nodeNum == thisWhen->nodeNum)
132 (*entry)->whenList.push_back(thisWhen);
135 (*entry)->refNumNeeded = 1;
141 newEntry = new CEntry(new XStr(name), param, estateVars, paramIsMarshalled(), first_line_, last_line_);
142 CEntrylist.push_back(newEntry);
144 newEntry->whenList.push_back(thisWhen);
146 newEntry->refNumNeeded = 1;
151 void SdagConstruct::generateEntryList(list<CEntry*>& CEntrylist, WhenConstruct *thisWhen) {
152 if (SIF == type && con2 != 0)
153 con2->generateEntryList(CEntrylist, thisWhen);
154 generateChildrenEntryList(CEntrylist, thisWhen);
157 void SdagConstruct::generateChildrenEntryList(list<CEntry*>& CEntrylist, WhenConstruct *thisWhen) {
159 for (list<SdagConstruct*>::iterator it = constructs->begin(); it != constructs->end(); ++it)
160 (*it)->generateEntryList(CEntrylist, thisWhen);
163 void SdagConstruct::propagateState(int uniqueVarNum) {
165 list<EncapState*> encap;
167 stateVars = new list<CStateVar*>();
168 ParamList *pl = param;
171 stateVars->push_back(new CStateVar(pl));
175 EncapState* state = new EncapState(this->entry, *stateVars);
176 if (!this->entry->paramIsMarshalled() && !this->entry->param->isVoid())
177 state->isMessage = true;
178 encap.push_back(state);
184 // adding _bgParentLog as the last extra parameter for tracing
185 stateVarsChildren = new list<CStateVar*>(*stateVars);
186 sv = new CStateVar(0, "void *", 0,"_bgParentLog", 0, NULL, 1);
187 sv->isBgParentLog = true;
188 stateVarsChildren->push_back(sv);
191 list<CStateVar*> lst;
193 EncapState *state = new EncapState(NULL, lst);
194 state->type = new XStr("void");
195 state->name = new XStr("_bgParentLog");
196 state->isBgParentLog = true;
197 encapStateChild.push_back(state);
198 encap.push_back(state);
201 stateVarsChildren = stateVars;
204 encapStateChild = encap;
206 list<CStateVar*> whensEntryMethodStateVars;
207 for (list<SdagConstruct*>::iterator it = constructs->begin(); it != constructs->end();
209 (*it)->propagateState(encap, *stateVarsChildren, whensEntryMethodStateVars, uniqueVarNum);
212 void SdagConstruct::propagateState(list<EncapState*> encap, list<CStateVar*>& plist, list<CStateVar*>& wlist, int uniqueVarNum) {
214 list<CStateVar*> *whensEntryMethodStateVars = NULL;
218 stateVars = new list<CStateVar*>();
226 fprintf(stderr, "internal error in sdag translator..\n");
231 encapStateChild = encap;
233 propagateStateToChildren(encap, *stateVarsChildren, wlist, uniqueVarNum);
234 delete whensEntryMethodStateVars;
238 void SdagConstruct::propagateStateToChildren(list<EncapState*> encap, list<CStateVar*>& stateVarsChildren, list<CStateVar*>& wlist, int uniqueVarNum) {
240 for (list<SdagConstruct*>::iterator it = constructs->begin(); it != constructs->end(); ++it)
241 (*it)->propagateState(encap, stateVarsChildren, wlist, uniqueVarNum);
244 void SdagConstruct::generateCode(XStr& decls, XStr& defs, Entry *entry) {
245 generateChildrenCode(decls, defs, entry);
248 void SdagConstruct::generateChildrenCode(XStr& decls, XStr& defs, Entry* entry) {
250 for (list<SdagConstruct*>::iterator it = constructs->begin(); it != constructs->end(); ++it)
251 (*it)->generateCode(decls, defs, entry);
254 void SdagConstruct::buildTypes(list<EncapState*>& state) {
255 for (list<EncapState*>::iterator iter = state.begin(); iter != state.end(); ++iter) {
256 EncapState& encap = **iter;
258 if (encap.entry->entryPtr && encap.entry->entryPtr->decl_entry)
259 encap.type = encap.entry->entryPtr->decl_entry->genClosureTypeNameProxyTemp;
261 encap.type = encap.entry->genClosureTypeNameProxyTemp;
266 int SdagConstruct::unravelClosuresBegin(XStr& defs, bool child) {
269 list<EncapState*>& encaps = child ? encapStateChild : encapState;
271 // traverse all the state variables bring them into scope
272 for (list<EncapState*>::iterator iter = encaps.begin(); iter != encaps.end(); ++iter, ++cur) {
273 EncapState& state = **iter;
275 indentBy(defs, cur + 1);
280 for (list<CStateVar*>::iterator iter2 = state.vars.begin(); iter2 != state.vars.end(); ++iter2, ++i) {
281 CStateVar& var = **iter2;
283 // if the var is one of the following it a system state var that should
284 // not be brought into scope
285 if (!var.isCounter && !var.isSpeculator && !var.isBgParentLog) {
286 indentBy(defs, cur + 2);
288 defs << var.type << (var.arrayLength || var.isMsg ? "*" : "") << "& " << var.name << " = ";
289 state.name ? (defs << *state.name) : (defs << "gen" << cur);
291 defs << "->" << "getP" << i << "();\n";
301 void SdagConstruct::unravelClosuresEnd(XStr& defs, bool child) {
302 list<EncapState*>& encaps = child ? encapStateChild : encapState;
304 int cur = encaps.size();
306 // traverse all the state variables bring them into scope
307 for (list<EncapState*>::iterator iter = encaps.begin(); iter != encaps.end(); ++iter, --cur) {
308 EncapState& state = **iter;
316 void generateVarSignature(XStr& str,
317 const XStr* name, const char* suffix,
318 list<CStateVar*>* params) {
321 void generateVarSignature(XStr& decls, XStr& defs,
322 const Entry* entry, bool declareStatic, const char* returnType,
323 const XStr* name, bool isEnd,
324 list<CStateVar*>* params) {
325 generateVarSignature(decls, defs, entry->getContainer(), declareStatic, returnType,
326 name, isEnd, params);
328 void generateVarSignature(XStr& decls, XStr& defs,
329 const Chare* chare, bool declareStatic, const char* returnType,
330 const XStr* name, bool isEnd,
331 list<CStateVar*>* params) {
332 decls << " " << (declareStatic ? "static " : "") << returnType << " ";
334 templateGuardBegin(false, defs);
335 defs << chare->tspec() << returnType << " " << chare->baseName() << "::";
347 for (list<CStateVar*>::iterator iter = params->begin();
348 iter != params->end();
350 CStateVar *sv = *iter;
351 if (sv->isVoid != 1) {
355 // @TODO uncommenting this requires that PUP work on const types
362 if (sv->arrayLength != NULL)
374 decls << op << ";\n";
375 defs << op << " { // Potentially missing " << chare->baseName() << "_SDAG_CODE in your class definition?\n";
377 void endMethod(XStr& op) {
379 templateGuardEnd(op);
383 void generateClosureSignature(XStr& decls, XStr& defs,
384 const Entry* entry, bool declareStatic, const char* returnType,
385 const XStr* name, bool isEnd,
386 list<EncapState*> encap, int numRefs) {
387 generateClosureSignature(decls, defs, entry->getContainer(), declareStatic, returnType,
388 name, isEnd, encap, numRefs);
390 void generateClosureSignature(XStr& decls, XStr& defs, const Chare* chare,
391 bool declareStatic, const char* returnType,
392 const XStr* name, bool isEnd, list<EncapState*> encap, int numRefs) {
393 decls << " " << (declareStatic ? "static " : "") << returnType << " ";
395 templateGuardBegin(false, defs);
396 defs << chare->tspec() << returnType << " " << chare->baseName() << "::";
401 if (isEnd) op << "_end";
405 for (list<EncapState*>::iterator iter = encap.begin();
406 iter != encap.end(); ++iter, ++cur) {
407 EncapState *state = *iter;
410 op << *state->type << "* ";
411 if (state->name) op << *state->name;
412 else op << "gen" << cur;
414 fprintf(stderr, "type was not propagated to this phase");
418 if (cur != encap.size() - 1) op << ", ";
421 for (int i = 0; i < numRefs; i++) op << ((cur+i) > 0 ? ", " : "") << "int refnum_" << i;
425 decls << op << ";\n";
426 defs << op << " {\n";
429 void SdagConstruct::generateCall(XStr& op, list<EncapState*>& scope,
430 list<EncapState*>& next, const XStr* name,
431 const char* nameSuffix) {
432 op << name << (nameSuffix ? nameSuffix : "") << "(";
435 for (list<EncapState*>::iterator iter = next.begin(); iter != next.end(); ++iter, ++cur) {
436 EncapState *state = *iter;
439 if (cur >= scope.size()) {
440 int offset = cur - scope.size();
441 if (!state->isMessage)
442 op << "static_cast<" << *state->type << "*>(buf" << offset << "->cl)";
444 op << "static_cast<" << *state->type << "*>(static_cast<SDAG::MsgClosure*>(buf" << offset << "->cl)->msg)";
446 if (state->name) op << *state->name; else op << "gen" << cur;
449 fprintf(stderr, "type was not propagated to this phase");
453 if (cur != next.size() - 1) op << ", ";
459 // boe = 1, if the next call is to begin construct
460 // boe = 0, if the next call is to end a contruct
461 void SdagConstruct::setNext(SdagConstruct *n, int boe) {
465 nextBeginOrEnd = boe;
467 if (constructs->empty())
470 list<SdagConstruct*>::iterator it = constructs->begin();
471 SdagConstruct *cn = *it;
474 for(; it != constructs->end(); ++it) {
478 cn->setNext(this, 0);
483 nextBeginOrEnd = boe;
485 for(list<SdagConstruct*>::iterator it = constructs->begin();
486 it != constructs->end();
488 (*it)->setNext(this, 0);
503 nextBeginOrEnd = boe;
504 n = this; boe = 0; break;
507 nextBeginOrEnd = boe;
509 con2->setNext(n, boe);
517 if (constructs != 0) {
518 for (list<SdagConstruct*>::iterator it = constructs->begin(); it != constructs->end();
520 (*it)->setNext(n, boe);
526 void SdagConstruct::generateTrace() {
527 for_each(constructs->begin(), constructs->end(), mem_fun(&SdagConstruct::generateTrace));
528 if (con1) con1->generateTrace();
529 if (con2) con2->generateTrace();
530 if (con3) con3->generateTrace();
533 void SdagConstruct::generateTraceBeginCall(XStr& op, int indent) {
535 indentBy(op, indent);
536 op << "_TRACE_BEGIN_EXECUTE_DETAILED(-1, -1, (" << "_sdag_idx_" << traceName << "()), CkMyPe(), 0, ";
538 if (entry->getContainer()->isArray())
539 op << "ckGetArrayIndex().getProjectionID()";
547 void SdagConstruct::generateDummyBeginExecute(XStr& op, int indent, Entry *entry) {
548 indentBy(op, indent);
549 op << "_TRACE_BEGIN_EXECUTE_DETAILED(-1, -1, _sdagEP, CkMyPe(), 0, ";
551 if (entry->getContainer()->isArray())
552 op << "ckGetArrayIndex().getProjectionID()";
559 void SdagConstruct::generateTraceEndCall(XStr& op, int indent) {
560 indentBy(op, indent);
561 op << "_TRACE_END_EXECUTE(); \n";
564 void SdagConstruct::generateBeginExec(XStr& op, const char *name) {
565 op << " " << "_TRACE_BG_BEGIN_EXECUTE_NOMSG(\""<<name<<"\", &_bgParentLog,1);\n";
568 void SdagConstruct::generateEndExec(XStr& op){
569 op << " " << "_TRACE_BG_END_EXECUTE(0);\n";
572 void SdagConstruct::generateBeginTime(XStr& op) {
573 //Record begin time for tracing
574 op << " double __begintime = CkVTimer(); \n";
577 void SdagConstruct::generateTlineEndCall(XStr& op) {
579 op <<" _TRACE_BG_TLINE_END(&_bgParentLog);\n";
582 void SdagConstruct::generateEndSeq(XStr& op) {
583 op << " void* _bgParentLog = NULL;\n";
584 op << " CkElapse(0.01e-6);\n";
585 //op<< " BgElapse(1e-6);\n";
586 generateTlineEndCall(op);
587 generateTraceEndCall(op, 1);
591 void SdagConstruct::generateEventBracket(XStr& op, int eventType) {
594 op << " _TRACE_BG_USER_EVENT_BRACKET(\"" << nameStr
595 << "\", __begintime, CkVTimer(), &_bgParentLog); \n";
598 void SdagConstruct::generateListEventBracket(XStr& op, int eventType) {
600 op << " _TRACE_BGLIST_USER_EVENT_BRACKET(\"" << nameStr
601 << "\", __begintime,CkVTimer(), &_bgParentLog, " << label
605 void SdagConstruct::generateRegisterEp(XStr& defs) {
607 defs << " (void)_sdag_idx_" << traceName << "();\n";
609 for (list<SdagConstruct*>::iterator iter = constructs->begin(); iter != constructs->end(); ++iter)
610 (*iter)->generateRegisterEp(defs);
611 if (con1) con1->generateRegisterEp(defs);
612 if (con2) con2->generateRegisterEp(defs);
613 if (con3) con3->generateRegisterEp(defs);
616 void SdagConstruct::generateTraceEp(XStr& decls, XStr& defs, Chare* chare) {
618 XStr regName, idxName;
620 idxName << "_sdag_idx_" << traceName;
621 regName << "_sdag_reg_" << traceName;
622 generateVarSignature(decls, defs, chare, true, "int", &idxName, false, NULL);
623 defs << " static int epidx = " << regName << "();\n"
624 << " return epidx;\n";
627 generateVarSignature(decls, defs, chare, true, "int", ®Name, false, NULL);
628 defs << " return CkRegisterEp(\""
629 << traceName << "\", NULL, 0, " << chare->indexName() << "::__idx, 0"
634 for (list<SdagConstruct*>::iterator it = constructs->begin(); it != constructs->end();
636 (*it)->generateTraceEp(decls, defs, chare);
638 if (con1) con1->generateTraceEp(decls, defs, chare);
639 if (con2) con2->generateTraceEp(decls, defs, chare);
640 if (con3) con3->generateTraceEp(decls, defs, chare);