diff options
author | Chris Lattner <sabre@nondot.org> | 2008-06-09 07:25:28 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2008-06-09 07:25:28 +0000 |
commit | f7e8419816cbd5209c9049cdce1f93858c8863a3 (patch) | |
tree | 0bc4e8a52a5d95b3fccc3322809d6b0347777ae1 /lib/Linker/LinkModules.cpp | |
parent | 00c6191504b552965802a365635e993e4a73a16c (diff) | |
download | external_llvm-f7e8419816cbd5209c9049cdce1f93858c8863a3.zip external_llvm-f7e8419816cbd5209c9049cdce1f93858c8863a3.tar.gz external_llvm-f7e8419816cbd5209c9049cdce1f93858c8863a3.tar.bz2 |
simplify function visibility handling.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@52133 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Linker/LinkModules.cpp')
-rw-r--r-- | lib/Linker/LinkModules.cpp | 15 |
1 files changed, 8 insertions, 7 deletions
diff --git a/lib/Linker/LinkModules.cpp b/lib/Linker/LinkModules.cpp index 66c68ca..7368c2c 100644 --- a/lib/Linker/LinkModules.cpp +++ b/lib/Linker/LinkModules.cpp @@ -827,19 +827,22 @@ static bool LinkFunctionProtos(Module *Dest, const Module *Src, &Dest->getTypeSymbolTable(), ""); } + if (DF && DF->hasInternalLinkage()) + DF = NULL; + // Check visibility - if (DF && !DF->hasInternalLinkage() && - SF->getVisibility() != DF->getVisibility()) { + if (DF && SF->getVisibility() != DF->getVisibility()) { // If one is a prototype, ignore its visibility. Prototypes are always // overridden by the definition. if (!SF->isDeclaration() && !DF->isDeclaration()) return Error(Err, "Linking functions named '" + SF->getName() + "': symbols have different visibilities!"); + + // Otherwise, replace the visibility of DF if DF is a prototype. + if (DF->isDeclaration()) + DF->setVisibility(SF->getVisibility()); } - if (DF && DF->hasInternalLinkage()) - DF = NULL; - if (DF && DF->getType() != SF->getType()) { if (DF->isDeclaration() && !SF->isDeclaration()) { // We have a definition of the same name but different type in the @@ -911,8 +914,6 @@ static bool LinkFunctionProtos(Module *Dest, const Module *Src, // Link the external functions, update linkage qualifiers ValueMap.insert(std::make_pair(SF, DF)); DF->setLinkage(SF->getLinkage()); - // Visibility of prototype is overridden by vis of definition. - DF->setVisibility(SF->getVisibility()); } else if (SF->hasWeakLinkage() || SF->hasLinkOnceLinkage() || SF->hasCommonLinkage()) { // At this point we know that DF has LinkOnce, Weak, or External* linkage. |