summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTom Stellard <tstellar@redhat.com>2017-11-14 19:47:47 +0000
committerTom Stellard <tstellar@redhat.com>2017-11-14 19:47:47 +0000
commit700eb26beec1dae31db2c86da4f114112c6e50a3 (patch)
tree66fab780f12c0cb01e26c93202e425b9e5429d6a
parent690ade4c465df23d0293dd1b2ebd70debc3554aa (diff)
Merging r310543:
------------------------------------------------------------------------ r310543 | pcc | 2017-08-09 18:07:44 -0700 (Wed, 09 Aug 2017) | 9 lines Linker: Create a function declaration when moving a non-prevailing alias of function type. We were previously creating a global variable of function type, which is invalid IR. This issue was exposed by r304690, in which we started asserting that global variables were of a valid type. Fixes PR33462. Differential Revision: https://reviews.llvm.org/D36438 ------------------------------------------------------------------------ git-svn-id: https://llvm.org/svn/llvm-project/llvm/branches/release_50@318181 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/Linker/IRMover.cpp4
-rw-r--r--test/LTO/Resolution/X86/function-alias-non-prevailing.ll17
2 files changed, 21 insertions, 0 deletions
diff --git a/lib/Linker/IRMover.cpp b/lib/Linker/IRMover.cpp
index f486e525b5e7..ee067a912e3c 100644
--- a/lib/Linker/IRMover.cpp
+++ b/lib/Linker/IRMover.cpp
@@ -640,6 +640,10 @@ GlobalValue *IRLinker::copyGlobalValueProto(const GlobalValue *SGV,
} else {
if (ForDefinition)
NewGV = copyGlobalAliasProto(cast<GlobalAlias>(SGV));
+ else if (SGV->getValueType()->isFunctionTy())
+ NewGV =
+ Function::Create(cast<FunctionType>(TypeMap.get(SGV->getValueType())),
+ GlobalValue::ExternalLinkage, SGV->getName(), &DstM);
else
NewGV = new GlobalVariable(
DstM, TypeMap.get(SGV->getValueType()),
diff --git a/test/LTO/Resolution/X86/function-alias-non-prevailing.ll b/test/LTO/Resolution/X86/function-alias-non-prevailing.ll
new file mode 100644
index 000000000000..ab2cefebb42b
--- /dev/null
+++ b/test/LTO/Resolution/X86/function-alias-non-prevailing.ll
@@ -0,0 +1,17 @@
+; RUN: llvm-as -o %t %s
+; RUN: llvm-lto2 run %t -r %t,foo, -r %t,baz,p -o %t2 -save-temps
+; RUN: llvm-dis -o - %t2.0.0.preopt.bc | FileCheck %s
+
+target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
+target triple = "x86_64--fuchsia"
+
+; CHECK: declare void @foo()
+@foo = weak alias void(), void()* @bar
+
+define internal void @bar() {
+ ret void
+}
+
+define void()* @baz() {
+ ret void()* @foo
+}