aboutsummaryrefslogtreecommitdiff
path: root/lld
diff options
context:
space:
mode:
authorJames Henderson <james.henderson@sony.com>2020-09-17 11:23:58 +0100
committerJames Henderson <james.henderson@sony.com>2020-09-21 10:18:09 +0100
commitfa6da90aef004339e768c84d648f449348a5b13c (patch)
tree49ffd9419999478d63a5377be58e70bacfa5107d /lld
parent98aed8aa00dcc021686972734b5356c831328721 (diff)
downloadllvm-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.test63
-rw-r--r--lld/test/ELF/lto/internalize-basic.ll8
-rw-r--r--lld/test/ELF/lto/undef-mixed2.test33
-rw-r--r--lld/test/ELF/lto/wrap-2.ll66
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: