[llvm-commits] [125424] Fix C++Frontend/2007-03-27-FunctionVarRename.cpp
clattner at apple.com
clattner at apple.com
Tue Mar 27 17:04:40 PDT 2007
Revision: 125424
Author: clattner
Date: 2007-03-27 17:04:40 -0700 (Tue, 27 Mar 2007)
Log Message:
-----------
Fix C++Frontend/2007-03-27-FunctionVarRename.cpp
Modified Paths:
--------------
apple-local/branches/llvm/gcc/llvm-backend.cpp
apple-local/branches/llvm/gcc/llvm-convert.cpp
apple-local/branches/llvm/gcc/llvm-internal.h
Modified: apple-local/branches/llvm/gcc/llvm-backend.cpp
===================================================================
--- apple-local/branches/llvm/gcc/llvm-backend.cpp 2007-03-27 23:55:33 UTC (rev 125423)
+++ apple-local/branches/llvm/gcc/llvm-backend.cpp 2007-03-28 00:04:40 UTC (rev 125424)
@@ -789,11 +789,12 @@
// If we have "extern void foo", make the global have type {} instead of
// type void.
- if (Ty == Type::VoidTy) Ty = StructType::get(std::vector<const Type*>(),
- false);
+ if (Ty == Type::VoidTy)
+ Ty = StructType::get(std::vector<const Type*>(), false);
+
if (Name[0] == 0) { // Global has no name.
GV = new GlobalVariable(Ty, false, GlobalValue::ExternalLinkage, 0,
- Name, TheModule);
+ "", TheModule);
// Check for external weak linkage
if (DECL_EXTERNAL(decl) && DECL_WEAK(decl))
@@ -826,6 +827,28 @@
// Handle visibility style
if (TREE_PUBLIC(decl) && DECL_VISIBILITY(decl) == VISIBILITY_HIDDEN)
GV->setVisibility(Function::HiddenVisibility);
+
+ // If GV got renamed, then there is already an object with this name in
+ // the symbol table. If this happens, the old one must be a forward
+ // decl, just replace it with a cast of the new one.
+ if (GV->getName() != Name) {
+ Function *F = TheModule->getFunction(Name);
+ assert(F && F->isDeclaration() && "A function turned into a global?");
+
+ // Replace any uses of "F" with uses of GV.
+ Value *FInNewType = ConstantExpr::getBitCast(GV, F->getType());
+ F->replaceAllUsesWith(FInNewType);
+
+ // Update the decl that points to F.
+ changeLLVMValue(F, FInNewType);
+
+ // F is now dead, nuke it.
+ F->eraseFromParent();
+
+ // Now we can give GV the proper name.
+ GV->setName(Name);
+ }
+
} else {
GV = GVE; // Global already created, reuse it.
}
Modified: apple-local/branches/llvm/gcc/llvm-convert.cpp
===================================================================
--- apple-local/branches/llvm/gcc/llvm-convert.cpp 2007-03-27 23:55:33 UTC (rev 125423)
+++ apple-local/branches/llvm/gcc/llvm-convert.cpp 2007-03-28 00:04:40 UTC (rev 125424)
@@ -133,6 +133,29 @@
return LLVMValues[Index - 1];
}
+/// changeLLVMValue - If Old exists in the LLVMValues map, rewrite it to New.
+/// At this point we know that New is not in the map.
+void changeLLVMValue(Value *Old, Value *New) {
+ assert(!LLVMValuesMap.count(New) && "New cannot be in the map!");
+
+ // Find Old in the table.
+ LLVMValuesMapTy::iterator I = LLVMValuesMap.find(Old);
+ if (I == LLVMValuesMap.end()) return;
+
+ unsigned Idx = I->second-1;
+ assert(Idx < LLVMValues.size() && "Out of range index!");
+ assert(LLVMValues[Idx] == Old && "Inconsistent LLVMValues mapping!");
+
+ LLVMValues[Idx] = New;
+
+ // Remove the old value from the value map.
+ LLVMValuesMap.erase(I);
+
+ // Insert the new value into the value map. We know that it can't already
+ // exist in the mapping.
+ LLVMValuesMap[New] = Idx+1;
+}
+
// Read LLVM Types string table
void readLLVMValuesStringTable() {
Modified: apple-local/branches/llvm/gcc/llvm-internal.h
===================================================================
--- apple-local/branches/llvm/gcc/llvm-internal.h 2007-03-27 23:55:33 UTC (rev 125423)
+++ apple-local/branches/llvm/gcc/llvm-internal.h 2007-03-28 00:04:40 UTC (rev 125424)
@@ -87,11 +87,12 @@
/// AttributeUsedGlobals - The list of globals that are marked attribute(used).
extern std::vector<GlobalValue*> AttributeUsedGlobals;
-extern void readLLVMTypesStringTable();
-extern void writeLLVMTypesStringTable();
-extern void readLLVMValuesStringTable();
-extern void writeLLVMValuesStringTable();
-extern void clearTargetBuiltinCache();
+void changeLLVMValue(Value *Old, Value *New);
+void readLLVMTypesStringTable();
+void writeLLVMTypesStringTable();
+void readLLVMValuesStringTable();
+void writeLLVMValuesStringTable();
+void clearTargetBuiltinCache();
struct StructTypeConversionInfo;
More information about the llvm-commits
mailing list