charmxi: do not ignore 'const', instead propagate it in a limited manner for now
authorJonathan Lifflander <avunda@mobile-250-159.near.uiuc.edu>
Tue, 23 Oct 2012 04:33:30 +0000 (23:33 -0500)
committerJonathan Lifflander <avunda@mobile-250-159.near.uiuc.edu>
Tue, 23 Oct 2012 04:33:30 +0000 (23:33 -0500)
Full propagation breaks PUP.

src/xlat-i/sdag/CEntry.C
src/xlat-i/sdag/CSdagConstruct.C
src/xlat-i/sdag/CStateVar.h
src/xlat-i/xi-grammar.tab.C
src/xlat-i/xi-grammar.y
src/xlat-i/xi-symbol.C
src/xlat-i/xi-symbol.h

index a6658f6c939c7083136b9e441061fa58a782db7b..2d818631ef7ff2b8c6290978214f5403bb184181 100644 (file)
@@ -34,6 +34,8 @@ void CEntry::generateCode(XStr& decls, XStr& defs)
     if ((sv->isMsg != 1) && (sv->isVoid != 1)) {
        if (i >0)
          signature <<", ";
+       if (sv->byConst)
+         signature << "const ";
        signature << sv->type << " ";
        if (sv->arrayLength != 0)
          signature << "*";
index 1887fb0d65116b068a959970648e67fd21b810ed..13abe1a071894fa28bdb7c5190826dcec8c84288 100644 (file)
@@ -1419,6 +1419,9 @@ void generateSignature(XStr& decls, XStr& defs,
         if (count != 0)
           op << ", ";
 
+        // @TODO uncommenting this requires that PUP work on const types
+        //if (sv->byConst)
+        //op << "const ";
         if (sv->type != 0) 
           op <<sv->type <<" ";
         if (sv->byRef != 0)
index c0297fd43c77889127ed1808ed434b863e3755fe..42dddf47b3cc2eb9168cdf1b001241b0de4d32fb 100644 (file)
@@ -14,6 +14,7 @@ struct CStateVar {
     int numPtrs;
     XStr *name;
     XStr *byRef;
+    bool byConst;
     XStr *arrayLength;
     int isMsg;
 
@@ -28,9 +29,14 @@ struct CStateVar {
        }
 
 CStateVar(ParamList *pl)
-      : isVoid(0), type(new XStr(*(pl->param->getType()))), numPtrs(0),
-      name(new XStr(pl->getGivenName())), byRef(pl->isReference() ? new XStr("&") : NULL),
-      arrayLength(pl->isArray() ? new XStr(pl->getArrayLen()) : NULL), isMsg(pl->isMessage())
+      : isVoid(0)
+      , type(new XStr(*(pl->param->getType())))
+      , numPtrs(0)
+      , name(new XStr(pl->getGivenName()))
+      , byRef(pl->isReference() ? new XStr("&") : NULL)
+      , byConst(pl->isConst())
+      , arrayLength(pl->isArray() ? new XStr(pl->getArrayLen()) : NULL)
+      , isMsg(pl->isMessage())
       { }
 };
 
index 8db5ba079f6482b24699cc09cd3c93a005e615b5..6896eaea0068b5186069fe7458e5af8a01701e92 100644 (file)
@@ -2548,12 +2548,12 @@ yyreduce:
 
   case 73:
 #line 364 "xi-grammar.y"
-    { (yyval.type) = (yyvsp[(2) - (2)].type); }
+    { (yyval.type) = new ConstType((yyvsp[(2) - (2)].type)); }
     break;
 
   case 74:
 #line 366 "xi-grammar.y"
-    { (yyval.type) = (yyvsp[(1) - (2)].type); }
+    { (yyval.type) = new ConstType((yyvsp[(1) - (2)].type)); }
     break;
 
   case 75:
index 9f5509e8f8e60dc076d65dd4554bea6f846e7ff7..7b1714e5b2127758614b6d619b2c578f67b1238e 100644 (file)
@@ -361,9 +361,9 @@ BaseType    : SimpleType
                { $$ = $1; }
                //{ $$ = $1; }
                | CONST BaseType 
-               { $$ = $2; }
+               { $$ = new ConstType($2); }
                | BaseType CONST
-               { $$ = $1; }
+               { $$ = new ConstType($1); }
                ;
 
 Type           : BaseType '&'
index c40ff8664cf878cef19b74ebcc23df14fb073911..fdffa3964293dd391ee0ecd85080ffada32772c1 100644 (file)
@@ -4858,11 +4858,16 @@ into the message data-- so there's no copy on the receive side.
 The message is freed after the user entry returns.
 */
 Parameter::Parameter(int Nline,Type *Ntype,const char *Nname,
-       const char *NarrLen,Value *Nvalue)
-       :type(Ntype), name(Nname), arrLen(NarrLen), val(Nvalue),line(Nline)
+                     const char *NarrLen,Value *Nvalue)
+  : type(Ntype)
+  , name(Nname)
+  , arrLen(NarrLen)
+  , val(Nvalue)
+  , line(Nline)
+  , byConst(false)
+  , conditional(0)
+  , given_name(Nname)
 {
-        conditional=0;
-        given_name = Nname;
        if (isMessage()) {
                name="impl_msg";
         }
@@ -4885,6 +4890,10 @@ Parameter::Parameter(int Nline,Type *Ntype,const char *Nname,
                           it back ourselves in Parameter::print. */
                        type=type->deref();
                }
+                if (type->isConst()) {
+                  byConst = true;
+                  type = type->deref();
+                }
        }
 }
 
@@ -4910,12 +4919,14 @@ void Parameter::print(XStr &str,int withDefaultValues,int useConst)
            }
            else if (byReference)
                { //Pass named types by const C++ reference
-                       if (useConst) str<<"const ";
+                        if (useConst || byConst) str<<"const ";
                        str<<type<<" &";
                        if (name!=NULL) str<<name;
                }
                else
                { //Pass everything else by value
+                  // @TODO uncommenting this requires that PUP work on const types
+                  //if (byConst) str << "const ";
                        str<<type;
                        if (name!=NULL) str<<" "<<name;
                        if (withDefaultValues && val!=NULL)
index 58da4f5f8fbeb6560d2fb48757211313144b75d6..adbdfe4b93d13f762ca377a20e3a39644ee63896 100644 (file)
@@ -156,6 +156,7 @@ class Type : public Printable {
     virtual int isCkMigMsgPtr(void) const {return 0;}
     virtual int isCkMigMsg(void) const {return 0;}
     virtual int isReference(void) const {return 0;}
+    virtual bool isConst(void) const {return false;}
     virtual Type *deref(void) {return this;}
     virtual const char *getBaseName(void) const = 0;
     virtual const char *getScope(void) const = 0;
@@ -246,6 +247,18 @@ class ReferenceType : public Type {
     const char *getScope(void) const { return NULL; }
 };
 
+class ConstType : public Type {
+private:
+  Type *constType;
+public:
+  ConstType(Type *t) : constType(t) {}
+  void print(XStr& str) {str << "const " << constType;}
+  virtual bool isConst(void) const {return true;}
+  virtual Type *deref(void) {return constType;}
+  const char *getBaseName(void) const { return constType->getBaseName(); }
+  const char *getScope(void) const { return NULL; }
+};
+
 //This is used as a list of base classes
 class TypeList : public Printable {
     Type *type;
@@ -271,6 +284,7 @@ class Parameter {
     int line;
     int byReference; //Fake a pass-by-reference (for efficiency)
     int conditional; //If the parameter is conditionally packed
+    bool byConst;
 
     // DMK - Added field for accelerator options
     int accelBufferType;
@@ -356,6 +370,7 @@ class ParamList {
     const char *getArrayLen(void) const {return param->getArrayLen();}
     int isArray(void) const {return param->isArray();}
     int isReference(void) const {return param->type->isReference() || param->byReference;}
+    bool isConst(void) const {return param->type->isConst() || param->byConst;}
     int isVoid(void) const {
        return (next==NULL) && param->isVoid();
     }