first step in merging changes from bluegene to sdag translator. Setting up relation...
authorGengbin Zheng <gzheng@illinois.edu>
Fri, 18 Jul 2003 05:26:42 +0000 (05:26 +0000)
committerGengbin Zheng <gzheng@illinois.edu>
Fri, 18 Jul 2003 05:26:42 +0000 (05:26 +0000)
src/xlat-i/sdag/CEntry.h
src/xlat-i/sdag/CParsedFile.h
src/xlat-i/xi-symbol.C
src/xlat-i/xi-symbol.h

index 7c0579e6e675892b21a64ca5710450a92b2a6bde..50c44802a2aae040486d8c0a9d19e9288a6c523d 100644 (file)
 #include "CList.h"
 #include "CStateVar.h"
 
+class Entry;
 class SdagConstruct;
 class ParamList;
 
 class CEntry{
   public:
     XStr *entry;
+    Entry *decl_entry;
     //CParseNode *paramlist;
     ParamList *paramlist;
     int entryNum;
@@ -35,6 +37,7 @@ class CEntry{
        }
        entryNum = numEntries++;
        refNumNeeded =0;
+       decl_entry = NULL;
     }
 
     void print(int indent) {
index e3a6e9dd5aaf1aa13553ac6cc7cb740e1d749acc..cb26f43ca9fa3da87cbc01f021c97edd3a25aa3c 100644 (file)
@@ -2,6 +2,8 @@
 #include "CEntry.h"
 #include "sdag-globals.h"
 #include "EToken.h"
+
+class Chare;
 class Entry;
 
 
@@ -10,19 +12,21 @@ class CParsedFile {
   private:
     void numberNodes(void);
     void labelNodes(void);
+    void mapCEntry();                  // search and check if all functions in when() are defined.
     void propagateState(void);
     void generateConnectEntryList(void);
-    void generateEntryList(void);
+    void generateEntryList(void);       // collect and setup CEntry list for When and If
     void generateCode(XStr& output);
     void generateEntries(XStr& output);
     void generateConnectEntries(XStr& output);
     void generateInitFunction(XStr& output);
     void generatePupFunction(XStr& output);
   public:
+    Chare *container;
     TList<CEntry*> entryList;
     TList<SdagConstruct *> connectEntryList;
     TList<Entry*> nodeList;
-   CParsedFile(void) {}
+    CParsedFile(Chare *c): container(c) {}
     ~CParsedFile(void){}
     void print(int indent);
     void doProcess(XStr& classname, XStr& output) {
@@ -32,6 +36,7 @@ class CParsedFile {
       propagateState();
       generateConnectEntryList();
       generateEntryList();
+      mapCEntry();
       generateCode(output);
       generateEntries(output);
       generateInitFunction(output);
index 29bf6d4cefb58e661c4adb123222934580991684..1437fc7d931f132a368d326cd6853022e91a9b94 100644 (file)
@@ -642,7 +642,7 @@ Chare::genDecls(XStr& str)
     //handle the case that some of the entries may be sdag Entries
     int sdagPresent = 0;
     XStr sdagStr;
-    CParsedFile *myParsedFile = new CParsedFile();
+    CParsedFile *myParsedFile = new CParsedFile(this);
     list->collectSdagCode(myParsedFile, sdagPresent);
     if(sdagPresent) {
       XStr classname;
@@ -1594,6 +1594,42 @@ void MemberList::genReg(XStr& str)
   }
 }
 
+void MemberList::lookforCEntry(CEntry *centry)
+{
+  if(member){
+    member->lookforCEntry(centry);
+  }
+  if(next) {
+    //str << endx;
+    next->lookforCEntry(centry);
+  }
+}
+
+void Entry::lookforCEntry(CEntry *centry)
+{
+   // compare name
+   if (strcmp(name, *centry->entry) != 0) return;
+   // compare param
+   if (param && !centry->paramlist) return;
+   if (!param && centry->paramlist) return;
+   if (param && !(*param == *centry->paramlist)) return;
+
+   isWhenEntry = 1;
+   centry->decl_entry = this;
+}
+
+void Chare::lookforCEntry(CEntry *centry)
+{
+  if(list)
+    list->lookforCEntry(centry);
+  if (centry->decl_entry == NULL)  {
+    cerr<<"Function \""<<*centry->entry
+        <<"\" appears in Sdag When construct, but not defined as an entry function. "
+        << endl;
+    die("(FATAL ERROR)");
+  }
+}
+
 ///////////////////////////// CPARSEDFILE //////////////////////
 /*void CParsedFile::print(int indent)
 {
@@ -1633,6 +1669,14 @@ void CParsedFile::propagateState(void)
   }
 }
 
+void CParsedFile::mapCEntry(void)
+{
+  CEntry *en;
+  for(en=entryList.begin(); !entryList.end(); en=entryList.next()) {
+    container->lookforCEntry(en);
+  }
+}
+
 void CParsedFile::generateEntryList(void)
 {
   for(Entry *cn=nodeList.begin(); !nodeList.end(); cn=nodeList.next()) {
@@ -1746,6 +1790,7 @@ Entry::Entry(int l, int a, Type *r, char *n, ParamList *p, Value *sz, SdagConstr
 { 
   line=l; container=NULL; 
   entryCount=-1;
+  isWhenEntry=0;
   if (param && param->isMarshalled()) attribs|=SNOKEEP;
 
   if(!isThreaded() && stacksize) die("Non-Threaded methods cannot have stacksize",line);
index 8b75ea6836350d0d2adf44ec2c115de0b70ef1d4..35d7ca373b034acf7dc0050d00e5e096c5a1e011 100644 (file)
@@ -108,7 +108,7 @@ class Type : public Printable {
     virtual int isCkArgMsg(void) const {return 0;}
     virtual int isReference(void) const {return 0;}
     virtual Type *deref(void) {return this;}
-    virtual char *getBaseName(void) = 0;
+    virtual char *getBaseName(void) const = 0;
     virtual int getNumStars(void) const {return 0;}
     virtual void genProxyName(XStr &str,forWhom forElement);
     virtual void genIndexName(XStr &str);
@@ -120,6 +120,9 @@ class Type : public Printable {
     XStr msgProxyName(void) 
        {XStr ret; genMsgProxyName(ret); return ret;}
     virtual void printVar(XStr &str, char *var) {print(str); str<<" "; str<<var;}
+    int operator==(const Type &tp) const {
+      return  (strcmp(getBaseName(), tp.getBaseName())==0);
+    }
 };
 
 class BuiltinType : public Type {
@@ -130,7 +133,7 @@ class BuiltinType : public Type {
     int isBuiltin(void) const {return 1;}
     void print(XStr& str) { str << name; }
     int isVoid(void) const { return !strcmp(name, "void"); }
-    char *getBaseName(void) { return name; }
+    char *getBaseName(void) const { return name; }
 };
 
 class NamedType : public Type {
@@ -144,7 +147,7 @@ class NamedType : public Type {
     int isCkArgMsg(void) const {return 0==strcmp(name,"CkArgMsg");}
     void print(XStr& str);
     int isNamed(void) const {return 1;}
-    char *getBaseName(void) { return name; }
+    char *getBaseName(void) const { return name; }
     virtual void genProxyName(XStr& str,forWhom forElement);
     virtual void genIndexName(XStr& str) 
     { 
@@ -169,7 +172,7 @@ class PtrType : public Type {
     void indirect(void) { numstars++; }
     int getNumStars(void) const {return numstars; }
     void print(XStr& str);
-    char *getBaseName(void) { return type->getBaseName(); }
+    char *getBaseName(void) const { return type->getBaseName(); }
     virtual void genMsgProxyName(XStr& str) { 
       if(numstars != 1) {
         die("too many stars-- entry parameter must have form 'MTYPE *msg'"); 
@@ -189,7 +192,7 @@ class ReferenceType : public Type {
     int isReference(void) const {return 1;}
     void print(XStr& str) {str<<referant<<" &";}
     virtual Type *deref(void) {return referant;}
-    char *getBaseName(void) { return referant->getBaseName(); }
+    char *getBaseName(void) const { return referant->getBaseName(); }
 };
 /* I don't think these are useful any longer (OSL 11/30/2001)
 class ConstType : public Type {
@@ -199,7 +202,7 @@ class ConstType : public Type {
     ConstType(Type *t) : type(t) {}
     int isConst(void) const {return 1;}
     void print(XStr& str) {str<<"const "<<type;}
-    char *getBaseName(void) { return type->getBaseName(); }
+    char *getBaseName(void) const { return type->getBaseName(); }
 };
 */
 //This is used as a list of base classes
@@ -251,6 +254,9 @@ class Parameter {
       if(given_name!=0)
         str <<given_name;
     }
+    int operator==(const Parameter &parm) const {
+      return *type == *parm.type;
+    }
 };
 class ParamList {
     typedef int (Parameter::*pred_t)(void) const;
@@ -308,6 +314,12 @@ class ParamList {
     void unmarshall(XStr &str);
     void unmarshallAddress(XStr &str);
     void endUnmarshall(XStr &str);
+    int operator==(const ParamList &plist) const {
+      if (!(*param == *(plist.param))) return 0;
+      if (!next && !plist.next) return 1;
+      if (!next || !plist.next) return 0;
+      return *next ==  *plist.next;
+    }
 };
 
 class FuncType : public Type {
@@ -324,7 +336,7 @@ class FuncType : public Type {
       if(params)
         params->print(str);
     }
-    char *getBaseName(void) { return name; }
+    char *getBaseName(void) const { return name; }
 };
 
 /****************** Template Support **************/
@@ -462,6 +474,7 @@ class Member : public Construct {
     virtual void collectSdagCode(CParsedFile *pf, int& sdagPresent) { return; }
     XStr makeDecl(const XStr &returnType,int forProxy=0);
     virtual void genIndexDecls(XStr& str)=0;
+    virtual void lookforCEntry(CEntry *centry)  {}
 };
 
 /* List of members of a chare or group */
@@ -494,6 +507,7 @@ class MemberList : public Printable {
     void genDefs(XStr& str);
     void genReg(XStr& str);
     void collectSdagCode(CParsedFile *pf, int& sdagPresent);
+    virtual void lookforCEntry(CEntry *centry);
 };
 
 /* Chare or group is a templated entity */
@@ -558,6 +572,7 @@ class Chare : public TEntity {
     virtual char *chareTypeName(void) {return (char *)"chare";}
     virtual char *proxyPrefix(void);
     virtual void genSubRegisterMethodDef(XStr& str);
+    void lookforCEntry(CEntry *centry);
 };
 
 class MainChare : public Chare {
@@ -718,6 +733,7 @@ class Entry : public Member {
     ParamList *param;
     ParamList *connectParam;
     int isConnect;
+    int isWhenEntry;
     Entry(int l, int a, Type *r, char *n, ParamList *p, Value *sz=0, SdagConstruct *sc =0, char *e=0, int connect=0, ParamList *connectPList =0);
     void setChare(Chare *c);
     int isConnectEntry(void) { return isConnect; }
@@ -742,6 +758,7 @@ class Entry : public Member {
     void generateEntryList(TList<CEntry*>&, SdagConstruct *);
     void collectSdagCode(CParsedFile *pf, int& sdagPresent);
     void propagateState(int);
+    void lookforCEntry(CEntry *centry);
 };
 
 class EntryList {