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 | aad2deb17c3e624cae4ebc1ed51fc5264fa1c0b8 (patch) | |
tree | d141421af50a9d05900fb43b0968865426c3ef81 /lib/VMCore | |
parent | 82b5b219dd3b9035442389ddcd58e6f859aae039 (diff) | |
download | external_llvm-aad2deb17c3e624cae4ebc1ed51fc5264fa1c0b8.zip external_llvm-aad2deb17c3e624cae4ebc1ed51fc5264fa1c0b8.tar.gz external_llvm-aad2deb17c3e624cae4ebc1ed51fc5264fa1c0b8.tar.bz2 |
Fix another minor problem that exists if you ahve multiple functions with
nonunifiable types but the same name. Down with PR411!
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@15511 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/VMCore')
-rw-r--r-- | lib/VMCore/Linker.cpp | 33 |
1 files changed, 18 insertions, 15 deletions
diff --git a/lib/VMCore/Linker.cpp b/lib/VMCore/Linker.cpp index cfb67a0..ef3349c 100644 --- a/lib/VMCore/Linker.cpp +++ b/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()) { |