brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.7 KiB · 9eefca6 Raw
74 lines · plain
1; REQUIRES: x862;; This test verifies that --wrap works correctly for inter-module references to3;; the wrapped symbol, when LTO or ThinLTO is involved. It checks for various4;; combinations of bitcode and regular objects.5 6;; LTO + LTO7; RUN: llvm-as %s -o %t1.bc8; RUN: llvm-as %S/Inputs/wrap-bar.ll -o %t2.bc9; RUN: ld.lld %t1.bc %t2.bc -shared -o %t.bc-bc.so -wrap=bar10; RUN: llvm-objdump -d %t.bc-bc.so | FileCheck %s --check-prefixes=CHECK,JMP11; RUN: llvm-readobj --symbols %t.bc-bc.so | FileCheck --check-prefix=BIND %s12 13;; LTO + Object14; RUN: llc %S/Inputs/wrap-bar.ll -o %t2.o --filetype=obj15; RUN: ld.lld %t1.bc %t2.o -shared -o %t.bc-o.so -wrap=bar16; RUN: llvm-objdump -d %t.bc-o.so | FileCheck %s --check-prefixes=CHECK,JMP17; RUN: llvm-readobj --symbols %t.bc-o.so | FileCheck --check-prefix=BIND %s18 19;; Object + LTO20; RUN: llc %s -o %t1.o --filetype=obj21; RUN: ld.lld %t1.o %t2.bc -shared -o %t.o-bc.so -wrap=bar22; RUN: llvm-objdump -d %t.o-bc.so | FileCheck %s --check-prefixes=CHECK,CALL23; RUN: llvm-readobj --symbols %t.o-bc.so | FileCheck --check-prefix=BIND %s24 25;; ThinLTO + ThinLTO26; RUN: opt -module-summary %s -o %t1.thin27; RUN: opt -module-summary %S/Inputs/wrap-bar.ll -o %t2.thin28; RUN: ld.lld %t1.thin %t2.thin -shared -o %t.thin-thin.so -wrap=bar29; RUN: llvm-objdump -d %t.thin-thin.so | FileCheck %s --check-prefixes=CHECK,JMP30; RUN: llvm-readobj --symbols %t.thin-thin.so | FileCheck --check-prefix=BIND %s31 32;; ThinLTO + Object33; RUN: ld.lld %t1.thin %t2.o -shared -o %t.thin-o.so -wrap=bar34; RUN: llvm-objdump -d %t.thin-o.so | FileCheck %s --check-prefixes=CHECK,JMP35; RUN: llvm-readobj --symbols %t.thin-o.so | FileCheck --check-prefix=BIND %s36 37;; Object + ThinLTO38; RUN: ld.lld %t1.o %t2.thin -shared -o %t.o-thin.so -wrap=bar39; RUN: llvm-objdump -d %t.o-thin.so | FileCheck %s --check-prefixes=CHECK,CALL40; RUN: llvm-readobj --symbols %t.o-thin.so | FileCheck --check-prefix=BIND %s41 42;; Make sure that calls in foo() are not eliminated and that bar is43;; routed to __wrap_bar and __real_bar is routed to bar.44 45; CHECK:      <foo>:46; CHECK-NEXT: pushq	%rax47; CHECK-NEXT: callq{{.*}}<__wrap_bar>48; JMP-NEXT:   popq  %rax49; JMP-NEXT:   jmp{{.*}}<bar>50; CALL-NEXT:  callq{{.*}}<bar>51; CALL-NEXT:  popq  %rax52 53;; Check that bar and __wrap_bar retain their original binding.54; BIND:      Name: bar55; BIND-NEXT: Value:56; BIND-NEXT: Size:57; BIND-NEXT: Binding: Local58; BIND:      Name: __wrap_bar59; BIND-NEXT: Value:60; BIND-NEXT: Size:61; BIND-NEXT: Binding: Local62 63target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"64target triple = "x86_64-unknown-linux-gnu"65 66declare void @bar()67declare void @__real_bar()68 69define void @foo() {70  call void @bar()71  call void @__real_bar()72  ret void73}74