charmxi: Encapsulate epidx static member within static method
authorRamprasad Venkataraman <ramv@illinois.edu>
Tue, 27 Mar 2012 15:49:54 +0000 (10:49 -0500)
committerRamprasad Venkataraman <ramv@illinois.edu>
Tue, 27 Mar 2012 16:08:17 +0000 (11:08 -0500)
Originally, any charm entity (chare,group,array etc) would have
a CkIndex_Foo class that held all the entry point indices. These
were simply stored as static member variables of the CkIndex class
and accessed directly throughout the generated code. The variable
was initialized in the entity's CkIndex_Foo::__register() method.

This commit hides the variable behind a static method that has a
similarly mangled name and does not take any arguments. This method
will almost certainly be inlined by the compiler. The ep index is
initialized in place via a call to CkRegisterEp(). We still ensure
identical registration sequence on all PEs by calling all these static
methods from the CkIndex_Foo::__register() method.

This is a preliminary step enroute to support for template entry methods.

src/xlat-i/xi-symbol.C
src/xlat-i/xi-symbol.h

index fb4184b81418844ec296cb2acb51ba2a41c4d1bf..cff9dbc58c89fe4d78af7f59f8c9c1863f697517 100644 (file)
@@ -3013,7 +3013,7 @@ XStr Entry::epIdx(int fromProxy)
   XStr str;
   if (fromProxy)
     str << indexName()<<"::";
-  str << "__idx_"<<epStr();
+  str << "idx_"<<epStr()<<"()";
   return str;
 }
 
@@ -4174,10 +4174,13 @@ void Entry::genAccels_ppe_c_regFuncs(XStr& str) {
 /******************* Shared Entry Point Code **************************/
 void Entry::genIndexDecls(XStr& str)
 {
-  str << "/* DECLS: "; print(str); str << " */\n";
+  str << "/* DECLS: "; print(str); str << " */";
 
   // Entry point index storage
-  str << "    static int "<<epIdx(0)<<";\n";
+  str << "\n    inline static int "<<epIdx(0)<<"{"
+      << "\n      static int __epidx = " << genRegEp()
+      << "\n      return __epidx;"
+      << "\n    }\n";
 
   // DMK - Accel Support - Also declare the function index for the Offload API call
   #if CMK_CELL != 0
@@ -4201,9 +4204,15 @@ void Entry::genIndexDecls(XStr& str)
   }
 
   if (isReductionTarget()) {
-      str << "    static int __idx_" << name << "_redn_wrapper;\n"
+      str << "    inline static int idx_" << name << "_redn_wrapper() {"
+          << "\n        static int __epidx = CkRegisterEp(\""
+          << name << "_redn_wrapper(CkReductionMsg* impl_msg)\","
+          << "\n        (CkCallFnPtr)_" << name << "_redn_wrapper,"
+          << " CMessage_CkReductionMsg::__idx, __idx, 0);"
+          << "\n        return __epidx;"
+          << "\n    }\n"
           << "    static int " << name << "_redn_wrapper"
-          << "(CkReductionMsg* impl_msg) { return __idx_" << name << "_redn_wrapper; }\n"
+          << "(CkReductionMsg* impl_msg) { return idx_" << name << "_redn_wrapper(); }\n"
           << "    static void _" << name << "_redn_wrapper(void* impl_msg, "
           << container->baseName() <<"* impl_obj);\n";
   }
@@ -4519,12 +4528,6 @@ void Entry::genDefs(XStr& str)
   //Prevents repeated call and __idx definitions:
   if (container->getForWhom()!=forAll) return;
 
-  //Define storage for entry point number
-  str << container->tspec()<<" int "<<indexName()<<"::"<<epIdx(0)<<"=0;\n";
-  if (isReductionTarget()) {
-      str << " int " << indexName() << "::__idx_" << name <<"_redn_wrapper=0;\n";
-  }
-
   // DMK - Accel Support
   #if CMK_CELL != 0
     if (isAccel()) {
@@ -4668,11 +4671,11 @@ void Entry::genDefs(XStr& str)
   }
 }
 
-void Entry::genReg(XStr& str)
+XStr Entry::genRegEp()
 {
-  str << "// REG: "<<*this;
-  str << "  "<<epIdx(0)<<" = CkRegisterEp(\""<<name<<"("<<paramType(0)<<")\",\n"
-       "     (CkCallFnPtr)_call_"<<epStr()<<", ";
+  XStr str;
+  str << "CkRegisterEp(\"" << name << "("<<paramType(0)<<")\",\n"
+      << "      (CkCallFnPtr)_call_" << epStr() << ", ";
   /* messageIdx: */
   if (param->isMarshalled()) {
     if (param->hasConditional())  str<<"MarshallMsg_"<<epStr()<<"::__idx";
@@ -4695,7 +4698,16 @@ void Entry::genReg(XStr& str)
   if (attribs & SMEM) str << "+CK_EP_MEMCRITICAL";
   
   if (internalMode) str << "+CK_EP_INTRINSIC";
-  str << ");\n";
+  str << ");";
+  return str;
+}
+
+void Entry::genReg(XStr& str)
+{
+  str << "  // REG: "<<*this;
+  str << "  " << epIdx(0) << ";\n";
+  if (isReductionTarget())
+    str << "  idx_" << name << "_redn_wrapper();\n";
   if (isConstructor()) {
     if(container->isMainChare()&&!(attribs&SMIGRATE))
       str << "  CkRegisterMainChare(__idx, "<<epIdx(0)<<");\n";
@@ -4716,12 +4728,6 @@ void Entry::genReg(XStr& str)
       str << "  CkRegisterMessagePupFn("<<epIdx(0)<<", (CkMessagePupFn)";
       str << param->param->getType()->getBaseName() <<"::ckDebugPup);\n";
   }
-  if (isReductionTarget()) {
-      str << "  " << "__idx_" << name << "_redn_wrapper = CkRegisterEp(\""
-          << name << "_redn_wrapper(CkReductionMsg* impl_msg)\",\n"
-          << "     (CkCallFnPtr)_" << name << "_redn_wrapper, "
-          << "CMessage_CkReductionMsg::__idx, __idx, 0);";
-  }
 }
 
 void Entry::preprocess() {
index 7f47fd69629618b76244aba5f0306dc2ede25071..c72d7988612b19709985c99698ed47d99ec49457 100644 (file)
@@ -1018,6 +1018,7 @@ class Entry : public Member {
     void genDecls(XStr& str);
     void genDefs(XStr& str);
     void genReg(XStr& str);
+    XStr genRegEp();
     void preprocess();
     char *getEntryName() { return name; }
     void generateEntryList(TList<CEntry*>&, SdagConstruct *);