diff options
author | James Henderson <james.henderson@sony.com> | 2020-09-17 11:23:58 +0100 |
---|---|---|
committer | James Henderson <james.henderson@sony.com> | 2020-09-21 10:18:09 +0100 |
commit | fa6da90aef004339e768c84d648f449348a5b13c (patch) | |
tree | 49ffd9419999478d63a5377be58e70bacfa5107d /lld | |
parent | 98aed8aa00dcc021686972734b5356c831328721 (diff) | |
download | llvm-fa6da90aef004339e768c84d648f449348a5b13c.zip llvm-fa6da90aef004339e768c84d648f449348a5b13c.tar.gz llvm-fa6da90aef004339e768c84d648f449348a5b13c.tar.bz2 |
[lld][ELF][test] Add additional LTO testing
The additional testing is testing we previously had in a downstream test
suite.
Reviewed by: grimar, MaskRay
Differential Revision: https://reviews.llvm.org/D87824
Diffstat (limited to 'lld')
-rw-r--r-- | lld/test/ELF/lto/archive-mixed.test | 63 | ||||
-rw-r--r-- | lld/test/ELF/lto/internalize-basic.ll | 8 | ||||
-rw-r--r-- | lld/test/ELF/lto/undef-mixed2.test | 33 | ||||
-rw-r--r-- | lld/test/ELF/lto/wrap-2.ll | 66 |
4 files changed, 150 insertions, 20 deletions
diff --git a/lld/test/ELF/lto/archive-mixed.test b/lld/test/ELF/lto/archive-mixed.test new file mode 100644 index 0000000..fbb84a1 --- /dev/null +++ b/lld/test/ELF/lto/archive-mixed.test @@ -0,0 +1,63 @@ +; REQUIRES: x86 +;; Show that whether an object is a bitcode file or regular ELF object does not +;; make any difference to which file is selected from an archive. + +; RUN: rm -rf %t.dir +; RUN: split-file %s %t.dir +; RUN: cd %t.dir + +; RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux ref.s -o ref.o +; RUN: llvm-as a.ll -o a.bc +; RUN: llvm-as b.ll -o b.bc +; RUN: llc -filetype=obj a.ll -o a.o +; RUN: llc -filetype=obj b.ll -o b.o + +; RUN: llvm-ar rc a.bc.b.bc.a a.bc b.bc +; RUN: llvm-ar rc a.bc.b.o.a a.bc b.o +; RUN: llvm-ar rc a.o.b.bc.a a.o b.bc +; RUN: llvm-ar rc a.o.b.o.a a.o b.o +; RUN: llvm-ar rc other.bc.a a.bc +; RUN: llvm-ar rc other.o.a a.o + +; RUN: ld.lld -o /dev/null --trace ref.o a.bc.b.bc.a other.bc.a | \ +; RUN: FileCheck %s --implicit-check-not={{.}} +; RUN: ld.lld -o /dev/null --trace ref.o a.bc.b.bc.a other.o.a | \ +; RUN: FileCheck %s --implicit-check-not={{.}} +; RUN: ld.lld -o /dev/null --trace ref.o a.bc.b.o.a other.bc.a | \ +; RUN: FileCheck %s --implicit-check-not={{.}} +; RUN: ld.lld -o /dev/null --trace ref.o a.bc.b.o.a other.o.a | \ +; RUN: FileCheck %s --implicit-check-not={{.}} +; RUN: ld.lld -o /dev/null --trace ref.o a.o.b.bc.a other.bc.a | \ +; RUN: FileCheck %s --implicit-check-not={{.}} +; RUN: ld.lld -o /dev/null --trace ref.o a.o.b.bc.a other.o.a | \ +; RUN: FileCheck %s --implicit-check-not={{.}} +; RUN: ld.lld -o /dev/null --trace ref.o a.o.b.o.a other.bc.a | \ +; RUN: FileCheck %s --implicit-check-not={{.}} +;; Not an LTO test case, but here for completeness. +; RUN: ld.lld -o /dev/null --trace ref.o a.o.b.o.a other.o.a | \ +; RUN: FileCheck %s --implicit-check-not={{.}} + +; CHECK: ref.o +; CHECK-NEXT: a.{{.*}}.b.{{.*}}.a(b.{{.*}}) +; CHECK-NEXT: a.{{.*}}.b.{{.*}}.a(a.{{.*}}) + +;--- a.ll +target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" +target triple = "x86_64-unknown-linux" +define void @bar() { + ret void +} + +;--- b.ll +target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" +target triple = "x86_64-unknown-linux" +define void @foo() { + call void @bar() + ret void +} +declare void @bar() + +;--- ref.s +.global _start +_start: + call foo diff --git a/lld/test/ELF/lto/internalize-basic.ll b/lld/test/ELF/lto/internalize-basic.ll index 704ea01..9af8236 100644 --- a/lld/test/ELF/lto/internalize-basic.ll +++ b/lld/test/ELF/lto/internalize-basic.ll @@ -7,6 +7,11 @@ target triple = "x86_64-unknown-linux-gnu" target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" define void @_start() { + call void @bar() + ret void +} + +define void @bar() { ret void } @@ -17,5 +22,6 @@ define hidden void @foo() { ; Check that _start is not internalized. ; CHECK: define dso_local void @_start() -; Check that foo function is correctly internalized. +; Check that the foo and bar functions are correctly internalized. +; CHECK: define internal void @bar() ; CHECK: define internal void @foo() diff --git a/lld/test/ELF/lto/undef-mixed2.test b/lld/test/ELF/lto/undef-mixed2.test new file mode 100644 index 0000000..2ee707e --- /dev/null +++ b/lld/test/ELF/lto/undef-mixed2.test @@ -0,0 +1,33 @@ +# REQUIRES: x86 +## Show that a symbol referenced from an object and defined in bitcode is +## not internalized and is emitted in the output. + +# RUN: rm -rf %t.dir +# RUN: split-file %s %t.dir +# RUN: llvm-mc %t.dir/obj.s -o %t.o -filetype=obj -triple=x86_64-pc-linux +# RUN: llvm-as %t.dir/bc.ll -o %t2.o +# RUN: ld.lld %t2.o %t.o -o %t.so -shared +# RUN: llvm-readobj --symbols %t.so | FileCheck %s + +# CHECK: Name: foo +# CHECK-NEXT: Value: +# CHECK-NEXT: Size: +# CHECK-NEXT: Binding: Local +# CHECK-NEXT: Type: Function +# CHECK-NEXT: Other [ +# CHECK-NEXT: STV_HIDDEN +# CHECK-NEXT: ] +# CHECK-NEXT: Section: .text + +#--- obj.s + .globl bar +bar: + call foo + +#--- bc.ll +target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" +target triple = "x86_64-unknown-linux-gnu" + +define hidden void @foo() { + ret void +} diff --git a/lld/test/ELF/lto/wrap-2.ll b/lld/test/ELF/lto/wrap-2.ll index a441c98..9eefca6 100644 --- a/lld/test/ELF/lto/wrap-2.ll +++ b/lld/test/ELF/lto/wrap-2.ll @@ -1,28 +1,56 @@ ; REQUIRES: x86 -; LTO -; RUN: llvm-as %s -o %t.o -; RUN: llvm-as %S/Inputs/wrap-bar.ll -o %t1.o -; RUN: ld.lld %t.o %t1.o -shared -o %t.so -wrap=bar -; RUN: llvm-objdump -d %t.so | FileCheck %s -; RUN: llvm-readobj --symbols %t.so | FileCheck -check-prefix=BIND %s - -; ThinLTO -; RUN: opt -module-summary %s -o %t.o -; RUN: opt -module-summary %S/Inputs/wrap-bar.ll -o %t1.o -; RUN: ld.lld %t.o %t1.o -shared -o %t.so -wrap=bar -; RUN: llvm-objdump -d %t.so | FileCheck %s -; RUN: llvm-readobj --symbols %t.so | FileCheck -check-prefix=BIND %s - -; Make sure that calls in foo() are not eliminated and that bar is -; routed to __wrap_bar and __real_bar is routed to bar. +;; This test verifies that --wrap works correctly for inter-module references to +;; the wrapped symbol, when LTO or ThinLTO is involved. It checks for various +;; combinations of bitcode and regular objects. + +;; LTO + LTO +; RUN: llvm-as %s -o %t1.bc +; RUN: llvm-as %S/Inputs/wrap-bar.ll -o %t2.bc +; RUN: ld.lld %t1.bc %t2.bc -shared -o %t.bc-bc.so -wrap=bar +; RUN: llvm-objdump -d %t.bc-bc.so | FileCheck %s --check-prefixes=CHECK,JMP +; RUN: llvm-readobj --symbols %t.bc-bc.so | FileCheck --check-prefix=BIND %s + +;; LTO + Object +; RUN: llc %S/Inputs/wrap-bar.ll -o %t2.o --filetype=obj +; RUN: ld.lld %t1.bc %t2.o -shared -o %t.bc-o.so -wrap=bar +; RUN: llvm-objdump -d %t.bc-o.so | FileCheck %s --check-prefixes=CHECK,JMP +; RUN: llvm-readobj --symbols %t.bc-o.so | FileCheck --check-prefix=BIND %s + +;; Object + LTO +; RUN: llc %s -o %t1.o --filetype=obj +; RUN: ld.lld %t1.o %t2.bc -shared -o %t.o-bc.so -wrap=bar +; RUN: llvm-objdump -d %t.o-bc.so | FileCheck %s --check-prefixes=CHECK,CALL +; RUN: llvm-readobj --symbols %t.o-bc.so | FileCheck --check-prefix=BIND %s + +;; ThinLTO + ThinLTO +; RUN: opt -module-summary %s -o %t1.thin +; RUN: opt -module-summary %S/Inputs/wrap-bar.ll -o %t2.thin +; RUN: ld.lld %t1.thin %t2.thin -shared -o %t.thin-thin.so -wrap=bar +; RUN: llvm-objdump -d %t.thin-thin.so | FileCheck %s --check-prefixes=CHECK,JMP +; RUN: llvm-readobj --symbols %t.thin-thin.so | FileCheck --check-prefix=BIND %s + +;; ThinLTO + Object +; RUN: ld.lld %t1.thin %t2.o -shared -o %t.thin-o.so -wrap=bar +; RUN: llvm-objdump -d %t.thin-o.so | FileCheck %s --check-prefixes=CHECK,JMP +; RUN: llvm-readobj --symbols %t.thin-o.so | FileCheck --check-prefix=BIND %s + +;; Object + ThinLTO +; RUN: ld.lld %t1.o %t2.thin -shared -o %t.o-thin.so -wrap=bar +; RUN: llvm-objdump -d %t.o-thin.so | FileCheck %s --check-prefixes=CHECK,CALL +; RUN: llvm-readobj --symbols %t.o-thin.so | FileCheck --check-prefix=BIND %s + +;; Make sure that calls in foo() are not eliminated and that bar is +;; routed to __wrap_bar and __real_bar is routed to bar. ; CHECK: <foo>: ; CHECK-NEXT: pushq %rax ; CHECK-NEXT: callq{{.*}}<__wrap_bar> -; CHECK-NEXT: popq %rax -; CHECK-NEXT: jmp{{.*}}<bar> +; JMP-NEXT: popq %rax +; JMP-NEXT: jmp{{.*}}<bar> +; CALL-NEXT: callq{{.*}}<bar> +; CALL-NEXT: popq %rax -; Check that bar and __wrap_bar retain their original binding. +;; Check that bar and __wrap_bar retain their original binding. ; BIND: Name: bar ; BIND-NEXT: Value: ; BIND-NEXT: Size: |