summaryrefslogtreecommitdiffstats
path: root/llvm/test/LTO/Resolution
diff options
context:
space:
mode:
authorTeresa Johnson <tejohnson@google.com>2016-08-11 14:58:12 +0000
committerTeresa Johnson <tejohnson@google.com>2016-08-11 14:58:12 +0000
commit9ba95f99f3703fd06ce5912343526c2cc6ba353e (patch)
treebf52a79d2f8cf0359e7a9e7a932e37772b8d6fe8 /llvm/test/LTO/Resolution
parent3818f1b38ae7b29dfeed0f11cff1a6b30fcc4f0e (diff)
downloadbcm5719-llvm-9ba95f99f3703fd06ce5912343526c2cc6ba353e.tar.gz
bcm5719-llvm-9ba95f99f3703fd06ce5912343526c2cc6ba353e.zip
Restore "Resolution-based LTO API."
This restores commit r278330, with fixes for a few bot failures: - Fix a late change I had made to the save temps output file that I missed due to existing files sitting on my disk - Fix a bunch of Windows bot failures with "ambiguous call to overloaded function" due to confusion between llvm::make_unique vs std::make_unique (preface the new make_unique calls with "llvm::") - Attempt to fix a modules bot failure by adding a missing include to LTO/Config.h. Original change: Resolution-based LTO API. Summary: This introduces a resolution-based LTO API. The main advantage of this API over existing APIs is that it allows the linker to supply a resolution for each symbol in each object, rather than the combined object as a whole. This will become increasingly important for use cases such as ThinLTO which require us to process symbol resolutions in a more complicated way than just adjusting linkage. Patch by Peter Collingbourne. Reviewers: rafael, tejohnson, mehdi_amini Subscribers: lhames, tejohnson, mehdi_amini, llvm-commits Differential Revision: https://reviews.llvm.org/D20268 llvm-svn: 278338
Diffstat (limited to 'llvm/test/LTO/Resolution')
-rw-r--r--llvm/test/LTO/Resolution/X86/Inputs/alias-1.ll4
-rw-r--r--llvm/test/LTO/Resolution/X86/Inputs/comdat.ll28
-rw-r--r--llvm/test/LTO/Resolution/X86/alias.ll22
-rw-r--r--llvm/test/LTO/Resolution/X86/comdat.ll86
-rw-r--r--llvm/test/LTO/Resolution/X86/lit.local.cfg2
5 files changed, 142 insertions, 0 deletions
diff --git a/llvm/test/LTO/Resolution/X86/Inputs/alias-1.ll b/llvm/test/LTO/Resolution/X86/Inputs/alias-1.ll
new file mode 100644
index 00000000000..01c9987fd3f
--- /dev/null
+++ b/llvm/test/LTO/Resolution/X86/Inputs/alias-1.ll
@@ -0,0 +1,4 @@
+target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
+target triple = "x86_64-unknown-linux-gnu"
+
+@a = global i32 42
diff --git a/llvm/test/LTO/Resolution/X86/Inputs/comdat.ll b/llvm/test/LTO/Resolution/X86/Inputs/comdat.ll
new file mode 100644
index 00000000000..ca4bbb4bf81
--- /dev/null
+++ b/llvm/test/LTO/Resolution/X86/Inputs/comdat.ll
@@ -0,0 +1,28 @@
+target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
+target triple = "x86_64-unknown-linux-gnu"
+
+$c2 = comdat any
+$c1 = comdat any
+
+; This is only present in this file. The linker will keep $c1 from the first
+; file and this will be undefined.
+@will_be_undefined = global i32 1, comdat($c1)
+
+@v1 = weak_odr global i32 41, comdat($c2)
+define weak_odr protected i32 @f1(i8* %this) comdat($c2) {
+bb20:
+ store i8* %this, i8** null
+ br label %bb21
+bb21:
+ ret i32 41
+}
+
+@r21 = global i32* @v1
+@r22 = global i32(i8*)* @f1
+
+@a21 = alias i32, i32* @v1
+@a22 = alias i16, bitcast (i32* @v1 to i16*)
+
+@a23 = alias i32(i8*), i32(i8*)* @f1
+@a24 = alias i16, bitcast (i32(i8*)* @f1 to i16*)
+@a25 = alias i16, i16* @a24
diff --git a/llvm/test/LTO/Resolution/X86/alias.ll b/llvm/test/LTO/Resolution/X86/alias.ll
new file mode 100644
index 00000000000..bd3fcb381b3
--- /dev/null
+++ b/llvm/test/LTO/Resolution/X86/alias.ll
@@ -0,0 +1,22 @@
+; RUN: llvm-as %s -o %t1.o
+; RUN: llvm-as %p/Inputs/alias-1.ll -o %t2.o
+; RUN: llvm-lto2 -o %t3.o %t2.o %t1.o -r %t2.o,a,px -r %t1.o,a, -r %t1.o,b,px -save-temps
+; RUN: llvm-dis < %t3.o.0.preopt.bc -o - | FileCheck %s
+; RUN: FileCheck --check-prefix=RES %s < %t3.o.resolution.txt
+
+; CHECK-NOT: alias
+; CHECK: @a = global i32 42
+; CHECK-NEXT: @b = global i32 1
+; CHECK-NOT: alias
+
+; RES: 2.o{{$}}
+; RES: {{^}}-r={{.*}}2.o,a,px{{$}}
+; RES: 1.o{{$}}
+; RES: {{^}}-r={{.*}}1.o,b,px{{$}}
+; RES: {{^}}-r={{.*}}1.o,a,{{$}}
+
+target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
+target triple = "x86_64-unknown-linux-gnu"
+
+@a = weak alias i32, i32* @b
+@b = global i32 1
diff --git a/llvm/test/LTO/Resolution/X86/comdat.ll b/llvm/test/LTO/Resolution/X86/comdat.ll
new file mode 100644
index 00000000000..29bdcc325f3
--- /dev/null
+++ b/llvm/test/LTO/Resolution/X86/comdat.ll
@@ -0,0 +1,86 @@
+; RUN: llvm-as %s -o %t.o
+; RUN: llvm-as %p/Inputs/comdat.ll -o %t2.o
+; RUN: llvm-lto2 -save-temps -o %t3.o %t.o %t2.o \
+; RUN: -r=%t.o,f1,plx \
+; RUN: -r=%t.o,v1,px \
+; RUN: -r=%t.o,r11,px \
+; RUN: -r=%t.o,r12,px \
+; RUN: -r=%t.o,a11,px \
+; RUN: -r=%t.o,a12,px \
+; RUN: -r=%t.o,a13,px \
+; RUN: -r=%t.o,a14,px \
+; RUN: -r=%t.o,a15,px \
+; RUN: -r=%t2.o,f1,l \
+; RUN: -r=%t2.o,will_be_undefined, \
+; RUN: -r=%t2.o,v1, \
+; RUN: -r=%t2.o,r21,px \
+; RUN: -r=%t2.o,r22,px \
+; RUN: -r=%t2.o,a21,px \
+; RUN: -r=%t2.o,a22,px \
+; RUN: -r=%t2.o,a23,px \
+; RUN: -r=%t2.o,a24,px \
+; RUN: -r=%t2.o,a25,px
+; RUN: llvm-dis %t3.o.2.internalize.bc -o - | FileCheck %s
+
+target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
+target triple = "x86_64-unknown-linux-gnu"
+
+$c1 = comdat any
+
+@v1 = weak_odr global i32 42, comdat($c1)
+define weak_odr i32 @f1(i8*) comdat($c1) {
+bb10:
+ br label %bb11
+bb11:
+ ret i32 42
+}
+
+@r11 = global i32* @v1
+@r12 = global i32 (i8*)* @f1
+
+@a11 = alias i32, i32* @v1
+@a12 = alias i16, bitcast (i32* @v1 to i16*)
+
+@a13 = alias i32 (i8*), i32 (i8*)* @f1
+@a14 = alias i16, bitcast (i32 (i8*)* @f1 to i16*)
+@a15 = alias i16, i16* @a14
+
+; CHECK: $c1 = comdat any
+; CHECK: $c2 = comdat any
+
+; CHECK-DAG: @v1 = weak_odr global i32 42, comdat($c1)
+
+; CHECK-DAG: @r11 = global i32* @v1{{$}}
+; CHECK-DAG: @r12 = global i32 (i8*)* @f1{{$}}
+
+; CHECK-DAG: @r21 = global i32* @v1{{$}}
+; CHECK-DAG: @r22 = global i32 (i8*)* @f1{{$}}
+
+; CHECK-DAG: @v1.1 = internal global i32 41, comdat($c2)
+
+; CHECK-DAG: @a11 = alias i32, i32* @v1{{$}}
+; CHECK-DAG: @a12 = alias i16, bitcast (i32* @v1 to i16*)
+
+; CHECK-DAG: @a13 = alias i32 (i8*), i32 (i8*)* @f1{{$}}
+; CHECK-DAG: @a14 = alias i16, bitcast (i32 (i8*)* @f1 to i16*)
+
+; CHECK-DAG: @a21 = alias i32, i32* @v1.1{{$}}
+; CHECK-DAG: @a22 = alias i16, bitcast (i32* @v1.1 to i16*)
+
+; CHECK-DAG: @a23 = alias i32 (i8*), i32 (i8*)* @f1.2{{$}}
+; CHECK-DAG: @a24 = alias i16, bitcast (i32 (i8*)* @f1.2 to i16*)
+
+; CHECK: define weak_odr i32 @f1(i8*) comdat($c1) {
+; CHECK-NEXT: bb10:
+; CHECK-NEXT: br label %bb11{{$}}
+; CHECK: bb11:
+; CHECK-NEXT: ret i32 42
+; CHECK-NEXT: }
+
+; CHECK: define internal i32 @f1.2(i8* %this) comdat($c2) {
+; CHECK-NEXT: bb20:
+; CHECK-NEXT: store i8* %this, i8** null
+; CHECK-NEXT: br label %bb21
+; CHECK: bb21:
+; CHECK-NEXT: ret i32 41
+; CHECK-NEXT: }
diff --git a/llvm/test/LTO/Resolution/X86/lit.local.cfg b/llvm/test/LTO/Resolution/X86/lit.local.cfg
new file mode 100644
index 00000000000..afde89be896
--- /dev/null
+++ b/llvm/test/LTO/Resolution/X86/lit.local.cfg
@@ -0,0 +1,2 @@
+if not 'X86' in config.root.targets:
+ config.unsupported = True
OpenPOWER on IntegriCloud