Merging r310543:
authorTom Stellard <tstellar@redhat.com>
Tue, 14 Nov 2017 19:47:47 +0000 (19:47 +0000)
committerTom Stellard <tstellar@redhat.com>
Tue, 14 Nov 2017 19:47:47 +0000 (19:47 +0000)
------------------------------------------------------------------------
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

lib/Linker/IRMover.cpp
test/LTO/Resolution/X86/function-alias-non-prevailing.ll [new file with mode: 0644]

index f486e525b5e767124a5009023e51b913a095443b..ee067a912e3c939e54d356dc5a51db0698cc8ae9 100644 (file)
@@ -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 (file)
index 0000000..ab2cefe
--- /dev/null
@@ -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
+}