From aad2deb17c3e624cae4ebc1ed51fc5264fa1c0b8 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Wed, 4 Aug 2004 22:39:54 +0000 Subject: [PATCH] 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 --- lib/Linker/LinkModules.cpp | 33 ++++++++++++++++++--------------- lib/VMCore/Linker.cpp | 33 ++++++++++++++++++--------------- 2 files changed, 36 insertions(+), 30 deletions(-) diff --git a/lib/Linker/LinkModules.cpp b/lib/Linker/LinkModules.cpp index cfb67a06818..ef3349cd9c1 100644 --- a/lib/Linker/LinkModules.cpp +++ b/lib/Linker/LinkModules.cpp @@ -24,7 +24,6 @@ #include "llvm/Instructions.h" #include "llvm/Assembly/Writer.h" #include - 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::iterator EGV = - GlobalsByName.find(SGV->getName()); - if (EGV != GlobalsByName.end()) - DGV = dyn_cast(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::iterator EGV = + GlobalsByName.find(SGV->getName()); + if (EGV != GlobalsByName.end()) + DGV = dyn_cast(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::iterator EF = - GlobalsByName.find(SF->getName()); - if (EF != GlobalsByName.end()) - DF = dyn_cast(EF->second); - if (DF && RecursiveResolveTypes(SF->getType(), DF->getType(), ST, "")) - DF = 0; // FIXME: gross. + if (!(DF = Dest->getFunction(SF->getName(), SF->getFunctionType()))) { + std::map::iterator EF = + GlobalsByName.find(SF->getName()); + if (EF != GlobalsByName.end()) + DF = dyn_cast(EF->second); + if (DF && RecursiveResolveTypes(SF->getType(), DF->getType(), ST, "")) + DF = 0; // FIXME: gross. + } } if (!DF || SF->hasInternalLinkage() || DF->hasInternalLinkage()) { diff --git a/lib/VMCore/Linker.cpp b/lib/VMCore/Linker.cpp index cfb67a06818..ef3349cd9c1 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 - 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::iterator EGV = - GlobalsByName.find(SGV->getName()); - if (EGV != GlobalsByName.end()) - DGV = dyn_cast(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::iterator EGV = + GlobalsByName.find(SGV->getName()); + if (EGV != GlobalsByName.end()) + DGV = dyn_cast(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::iterator EF = - GlobalsByName.find(SF->getName()); - if (EF != GlobalsByName.end()) - DF = dyn_cast(EF->second); - if (DF && RecursiveResolveTypes(SF->getType(), DF->getType(), ST, "")) - DF = 0; // FIXME: gross. + if (!(DF = Dest->getFunction(SF->getName(), SF->getFunctionType()))) { + std::map::iterator EF = + GlobalsByName.find(SF->getName()); + if (EF != GlobalsByName.end()) + DF = dyn_cast(EF->second); + if (DF && RecursiveResolveTypes(SF->getType(), DF->getType(), ST, "")) + DF = 0; // FIXME: gross. + } } if (!DF || SF->hasInternalLinkage() || DF->hasInternalLinkage()) {