diff options
author | Rafael Espindola <rafael.espindola@gmail.com> | 2011-02-01 05:33:52 +0000 |
---|---|---|
committer | Rafael Espindola <rafael.espindola@gmail.com> | 2011-02-01 05:33:52 +0000 |
commit | 4e93885bab8c3738fdad3286e99dc147157218e8 (patch) | |
tree | 4396ae2b4f1b6bb28d39562abb0e13f8caa192d1 | |
parent | e087afa128211285ee41297fa5fc22fe5f2d3eb1 (diff) |
Correctly merge available_externally and regular definitions when they have
different visibilities.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@124650 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/Linker/LinkModules.cpp | 6 | ||||
-rw-r--r-- | test/Linker/available_externally_a.ll | 5 | ||||
-rw-r--r-- | test/Linker/available_externally_b.ll | 4 |
3 files changed, 13 insertions, 2 deletions
diff --git a/lib/Linker/LinkModules.cpp b/lib/Linker/LinkModules.cpp index ec39c93227..5aa06abdd9 100644 --- a/lib/Linker/LinkModules.cpp +++ b/lib/Linker/LinkModules.cpp @@ -434,8 +434,10 @@ static bool GetLinkageResult(GlobalValue *Dest, const GlobalValue *Src, } // Check visibility - if (Dest && Src->getVisibility() != Dest->getVisibility()) - if (!Src->isDeclaration() && !Dest->isDeclaration()) + if (Dest && Src->getVisibility() != Dest->getVisibility() && + !Src->isDeclaration() && !Dest->isDeclaration() && + !Src->hasAvailableExternallyLinkage() && + !Dest->hasAvailableExternallyLinkage()) return Error(Err, "Linking globals named '" + Src->getName() + "': symbols have different visibilities!"); return false; diff --git a/test/Linker/available_externally_a.ll b/test/Linker/available_externally_a.ll new file mode 100644 index 0000000000..3ae4ce2914 --- /dev/null +++ b/test/Linker/available_externally_a.ll @@ -0,0 +1,5 @@ +; RUN: llvm-link %s %p/available_externally_b.ll -S -o - | FileCheck %s + +@foo = available_externally unnamed_addr constant i32 0 + +; CHECK: @foo = hidden unnamed_addr constant i32 0 diff --git a/test/Linker/available_externally_b.ll b/test/Linker/available_externally_b.ll new file mode 100644 index 0000000000..526981715a --- /dev/null +++ b/test/Linker/available_externally_b.ll @@ -0,0 +1,4 @@ +; This file is for use with available_externally_a.ll +; RUN: true + +@foo = hidden unnamed_addr constant i32 0 |