[lld] fa6da90 - [lld][ELF][test] Add additional LTO testing

James Henderson via llvm-commits llvm-commits at lists.llvm.org
Mon Sep 21 02:18:31 PDT 2020


Author: James Henderson
Date: 2020-09-21T10:18:09+01:00
New Revision: fa6da90aef004339e768c84d648f449348a5b13c

URL: https://github.com/llvm/llvm-project/commit/fa6da90aef004339e768c84d648f449348a5b13c
DIFF: https://github.com/llvm/llvm-project/commit/fa6da90aef004339e768c84d648f449348a5b13c.diff

LOG: [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

Added: 
    lld/test/ELF/lto/archive-mixed.test
    lld/test/ELF/lto/undef-mixed2.test

Modified: 
    lld/test/ELF/lto/internalize-basic.ll
    lld/test/ELF/lto/wrap-2.ll

Removed: 
    


################################################################################
diff  --git a/lld/test/ELF/lto/archive-mixed.test b/lld/test/ELF/lto/archive-mixed.test
new file mode 100644
index 000000000000..fbb84a1d8bb7
--- /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 
diff erence 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 704ea011f7d4..9af8236d2df0 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 000000000000..2ee707ea15c0
--- /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 a441c9837bda..9eefca62bf50 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:


        


More information about the llvm-commits mailing list