summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSanjiv Gupta <sanjiv.gupta@microchip.com>2010-02-17 18:11:29 +0000
committerSanjiv Gupta <sanjiv.gupta@microchip.com>2010-02-17 18:11:29 +0000
commit69346eb94ff6b3ce96137662e68dd1e97f8c9e26 (patch)
treeac6ca51763653e1900182480682e1290b9b41c17
parentc0309cd3d1f645f235245085827f33adecf1ff50 (diff)
downloadbcm5719-llvm-69346eb94ff6b3ce96137662e68dd1e97f8c9e26.tar.gz
bcm5719-llvm-69346eb94ff6b3ce96137662e68dd1e97f8c9e26.zip
Added routine to clone the body of a function and maintain a map of already
cloned functions. llvm-svn: 96485
-rw-r--r--llvm/lib/Target/PIC16/PIC16Passes/PIC16Cloner.cpp38
-rw-r--r--llvm/lib/Target/PIC16/PIC16Passes/PIC16Cloner.h7
2 files changed, 45 insertions, 0 deletions
diff --git a/llvm/lib/Target/PIC16/PIC16Passes/PIC16Cloner.cpp b/llvm/lib/Target/PIC16/PIC16Passes/PIC16Cloner.cpp
index 79f49465427..06e56a6e805 100644
--- a/llvm/lib/Target/PIC16/PIC16Passes/PIC16Cloner.cpp
+++ b/llvm/lib/Target/PIC16/PIC16Passes/PIC16Cloner.cpp
@@ -212,3 +212,41 @@ void PIC16Cloner::markCallGraph(CallGraphNode *CGN, string StringMark) {
} // end of loop of all called functions.
}
+// Clone the given function and return it.
+// Note: it uses the ValueMap member of the class, which is already populated
+// by cloneAutos by the time we reach here.
+// FIXME: Should we just pass ValueMap's ref as a parameter here? rather
+// than keeping the ValueMap as a member.
+Function *
+PIC16Cloner::cloneFunction(Function *OrgF) {
+ Function *ClonedF;
+
+ // See if we already cloned it. Return that.
+ cloned_map_iterator cm_it = ClonedFunctionMap.find(OrgF);
+ if(cm_it != ClonedFunctionMap.end()) {
+ ClonedF = cm_it->second;
+ return ClonedF;
+ }
+
+ // Clone does not exist.
+ // First clone the autos, and populate ValueMap.
+ CloneAutos(OrgF);
+
+ // Now create the clone.
+ ClonedF = CloneFunction(OrgF, ValueMap);
+
+ // The new function should be for interrupt line. Therefore should have
+ // the name suffixed with IL and section attribute marked with IL.
+ ClonedF->setName(PAN::getCloneFnName(OrgF->getName()));
+ ClonedF->setSection("IL");
+
+ // Add the newly created function to the module.
+ OrgF->getParent()->getFunctionList().push_back(ClonedF);
+
+ // Update the ClonedFunctionMap to record this cloning activity.
+ ClonedFunctionMap[OrgF] = ClonedF;
+
+ return ClonedF;
+}
+
+
diff --git a/llvm/lib/Target/PIC16/PIC16Passes/PIC16Cloner.h b/llvm/lib/Target/PIC16/PIC16Passes/PIC16Cloner.h
index beeef7d25d2..19f18561108 100644
--- a/llvm/lib/Target/PIC16/PIC16Passes/PIC16Cloner.h
+++ b/llvm/lib/Target/PIC16/PIC16Passes/PIC16Cloner.h
@@ -48,6 +48,9 @@ namespace llvm {
// Clone auto variables of function specified.
void CloneAutos(Function *F);
+
+ // Clone the body of a function.
+ Function *cloneFunction(Function *F);
// Error reporting for PIC16Pass
void reportError(string ErrorString, vector<string> &Values);
@@ -64,6 +67,10 @@ namespace llvm {
// This value map is passed during the function cloning so that all the
// uses of auto variables be updated properly.
DenseMap<const Value*, Value*> ValueMap;
+
+ // Map of a already cloned functions.
+ map<Function *, Function *> ClonedFunctionMap;
+ typedef map<Function *, Function *>::iterator cloned_map_iterator;
};
} // End of anonymous namespace
OpenPOWER on IntegriCloud