mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-03-24 07:35:04 +00:00
Added routine to clone the body of a function and maintain a map of already
cloned functions. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@96485 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
411432d726
commit
94c3ddbcc6
@ -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;
|
||||
}
|
||||
|
||||
|
||||
|
@ -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
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user