diff options
author | Chris Lattner <sabre@nondot.org> | 2004-08-04 22:39:54 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2004-08-04 22:39:54 +0000 |
commit | 5e18a2489d1604ff96f3684c6746127bca721bb0 (patch) | |
tree | aa0266bbeea7eb49d6e446bf7648205fc5981b30 | |
parent | 6722f851efea8d60a6d1db96aa07e2fe67dc25ed (diff) | |
download | llvm-5e18a2489d1604ff96f3684c6746127bca721bb0.zip llvm-5e18a2489d1604ff96f3684c6746127bca721bb0.tar.gz llvm-5e18a2489d1604ff96f3684c6746127bca721bb0.tar.bz2 |
Fix another minor problem that exists if you ahve multiple functions with
nonunifiable types but the same name. Down with PR411!
llvm-svn: 15511
-rw-r--r-- | llvm/lib/VMCore/Linker.cpp | 33 |
1 files changed, 18 insertions, 15 deletions
diff --git a/llvm/lib/VMCore/Linker.cpp b/llvm/lib/VMCore/Linker.cpp index cfb67a0..ef3349c 100644 --- a/llvm/lib/VMCore/Linker.cpp +++ b/llvm/lib/VMCore/Linker.cpp @@ -24,7 +24,6 @@ #include "llvm/Instructions.h" #include "llvm/Assembly/Writer.h" #include <iostream> - using namespace llvm; // Error - Simple wrapper function to conditionally assign to E and return true. @@ -406,14 +405,16 @@ static bool LinkGlobals(Module *Dest, const Module *Src, const GlobalVariable *SGV = I; GlobalVariable *DGV = 0; // Check to see if may have to link the global. - if (SGV->hasName() && !SGV->hasInternalLinkage()) { - std::map<std::string, GlobalValue*>::iterator EGV = - GlobalsByName.find(SGV->getName()); - if (EGV != GlobalsByName.end()) - DGV = dyn_cast<GlobalVariable>(EGV->second); - if (DGV && RecursiveResolveTypes(SGV->getType(), DGV->getType(), ST, "")) - DGV = 0; // FIXME: gross. - } + if (SGV->hasName() && !SGV->hasInternalLinkage()) + if (!(DGV = Dest->getGlobalVariable(SGV->getName(), + SGV->getType()->getElementType()))) { + std::map<std::string, GlobalValue*>::iterator EGV = + GlobalsByName.find(SGV->getName()); + if (EGV != GlobalsByName.end()) + DGV = dyn_cast<GlobalVariable>(EGV->second); + if (DGV && RecursiveResolveTypes(SGV->getType(), DGV->getType(), ST, "")) + DGV = 0; // FIXME: gross. + } assert(SGV->hasInitializer() || SGV->hasExternalLinkage() && "Global must either be external or have an initializer!"); @@ -587,12 +588,14 @@ static bool LinkFunctionProtos(Module *Dest, const Module *Src, Function *DF = 0; if (SF->hasName() && !SF->hasInternalLinkage()) { // Check to see if may have to link the function. - std::map<std::string, GlobalValue*>::iterator EF = - GlobalsByName.find(SF->getName()); - if (EF != GlobalsByName.end()) - DF = dyn_cast<Function>(EF->second); - if (DF && RecursiveResolveTypes(SF->getType(), DF->getType(), ST, "")) - DF = 0; // FIXME: gross. + if (!(DF = Dest->getFunction(SF->getName(), SF->getFunctionType()))) { + std::map<std::string, GlobalValue*>::iterator EF = + GlobalsByName.find(SF->getName()); + if (EF != GlobalsByName.end()) + DF = dyn_cast<Function>(EF->second); + if (DF && RecursiveResolveTypes(SF->getType(), DF->getType(), ST, "")) + DF = 0; // FIXME: gross. + } } if (!DF || SF->hasInternalLinkage() || DF->hasInternalLinkage()) { |