diff options
author | Teresa Johnson <tejohnson@google.com> | 2016-08-11 14:58:12 +0000 |
---|---|---|
committer | Teresa Johnson <tejohnson@google.com> | 2016-08-11 14:58:12 +0000 |
commit | 9ba95f99f3703fd06ce5912343526c2cc6ba353e (patch) | |
tree | bf52a79d2f8cf0359e7a9e7a932e37772b8d6fe8 /llvm/test/LTO/Resolution | |
parent | 3818f1b38ae7b29dfeed0f11cff1a6b30fcc4f0e (diff) | |
download | bcm5719-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.ll | 4 | ||||
-rw-r--r-- | llvm/test/LTO/Resolution/X86/Inputs/comdat.ll | 28 | ||||
-rw-r--r-- | llvm/test/LTO/Resolution/X86/alias.ll | 22 | ||||
-rw-r--r-- | llvm/test/LTO/Resolution/X86/comdat.ll | 86 | ||||
-rw-r--r-- | llvm/test/LTO/Resolution/X86/lit.local.cfg | 2 |
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 |