Added a function to clone locals of a function.( which for pic16 are globals
authorSanjiv Gupta <sanjiv.gupta@microchip.com>
Wed, 17 Feb 2010 06:48:50 +0000 (06:48 +0000)
committerSanjiv Gupta <sanjiv.gupta@microchip.com>
Wed, 17 Feb 2010 06:48:50 +0000 (06:48 +0000)
with mangled names).

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@96465 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/PIC16/PIC16ABINames.h
lib/Target/PIC16/PIC16Passes/PIC16Cloner.cpp

index b0b9318d43896811be12a752e3e76d5917a04996..e7c0ad58e160cb943bb248b64d5348dba337de94 100644 (file)
@@ -338,6 +338,22 @@ namespace llvm {
     inline static std::string getISRAddr(void) {
       return "0x4";
     }
+
+    // Returns the name of clone of a function.
+    static std::string getCloneFnName(const std::string &Func) {
+       return (Func + ".IL");
+    }
+
+    // Returns the name of clone of a variable.
+    static std::string getCloneVarName(const std::string &Fn, 
+                                       const std::string &Var) {
+      std::string cloneVarName = Var;
+      // These vars are named like fun.auto.var.
+      // Just replace the function name, with clone function name.
+      std::string cloneFnName = getCloneFnName(Fn);
+      cloneVarName.replace(cloneVarName.find(Fn), Fn.length(), cloneFnName);
+      return cloneVarName;
+    }
   }; // class PAN.
 } // end namespace llvm;
 
index 58f72ee5ceef6c4d875b8a9b5e95c8c1151f779f..79f49465427f9a04f72df273ceb9b4e5a67afae3 100644 (file)
@@ -124,7 +124,37 @@ bool PIC16Cloner::runOnModule(Module &M) {
 // Cloning the code of function itself.
 //
 void PIC16Cloner::CloneAutos(Function *F) {
-  // Not implemented yet.
+  // We'll need to update module's globals list as well. So keep a reference
+  // handy.
+  Module *M = F->getParent();
+  Module::GlobalListType &Globals = M->getGlobalList();
+
+  // Clear the leftovers in ValueMap by any previous cloning.
+  ValueMap.clear();
+
+  // Find the auto globls for this function and clone them, and put them
+  // in ValueMap.
+  std::string FnName = F->getName().str();
+  std::string VarName, ClonedVarName;
+  for (Module::global_iterator I = M->global_begin(), E = M->global_end();
+       I != E; ++I) {
+    VarName = I->getName().str();
+    if (PAN::isLocalToFunc(FnName, VarName)) {
+      // Auto variable for current function found. Clone it.
+      GlobalVariable *GV = I;
+
+      const Type *InitTy = GV->getInitializer()->getType();
+      GlobalVariable *ClonedGV = 
+        new GlobalVariable(InitTy, false, GV->getLinkage(), 
+                           GV->getInitializer());
+      ClonedGV->setName(PAN::getCloneVarName(FnName, VarName));
+      // Add these new globals to module's globals list.
+      Globals.push_back(ClonedGV);
+      // Update ValueMap.
+      ValueMap[GV] = ClonedGV;
+     }
+  }
 }