xref: /llvm-project/llvm/test/CodeGen/X86/inline-asm-function-call-pic.ll (revision 0d471b3f64d3116bd57c79d872f7384fff80daa5)
1; RUN: llc -O2 --relocation-model=pic -mtriple=i386-unknown-linux-gnu < %s 2>&1 | FileCheck %s
2
3; List the source code:
4; // clang  -m32 -fasm-blocks -S t.c -O2  -fpic -emit-llvm
5; int GV = 17;
6;
7; extern unsigned int extern_func();
8; static unsigned int static_func()  __attribute__((noinline));
9; static unsigned int static_func() {
10;   return GV++;
11; }
12;
13; void func() {
14;   static_func();
15;   __asm {
16;           call static_func
17;           call extern_func
18;           jmp extern_func
19;           shr eax, 0
20;           shr ebx, 0
21;           shr ecx, 0
22;           shr edx, 0
23;           shr edi, 0
24;           shr esi, 0
25;           shr ebp, 0
26;           shr esp, 0
27;         }
28; }
29
30@GV = local_unnamed_addr global i32 17, align 4
31
32define void @func() local_unnamed_addr #0 {
33; CHECK-LABEL: func:
34; CHECK:         calll .L0$pb
35; CHECK-NEXT:  .L0$pb:
36; CHECK-NEXT:    popl %ebx
37; CHECK-NEXT:  .Ltmp0:
38; CHECK-NEXT:    addl $_GLOBAL_OFFSET_TABLE_+(.Ltmp0-.L0$pb), %ebx
39; CHECK-NEXT:    calll static_func
40; CHECK-NEXT:    pushl %ebp
41; CHECK-NEXT:    subl $12, %esp
42; CHECK-NEXT:    #APP
43; CHECK-EMPTY:
44; CHECK-NEXT:    calll static_func
45; CHECK-NEXT:    calll extern_func@PLT
46; CHECK-NEXT:    jmp extern_func@PLT
47; CHECK-NEXT:    shrl $0, %eax
48; CHECK-NEXT:    shrl $0, %ebx
49; CHECK-NEXT:    shrl $0, %ecx
50; CHECK-NEXT:    shrl $0, %edx
51; CHECK-NEXT:    shrl $0, %edi
52; CHECK-NEXT:    shrl $0, %esi
53; CHECK-NEXT:    shrl $0, %ebp
54; CHECK-NEXT:    shrl $0, %esp
55; CHECK-EMPTY:
56; CHECK-NEXT:    #NO_APP
57; CHECK-NEXT:    addl $12, %esp
58; CHECK-NEXT:    popl %ebp
59entry:
60  %call = tail call i32 @static_func()
61;; We test call, CALL, and jmp.
62  tail call void asm sideeffect inteldialect "call ${0:P}\0A\09CALL ${1:P}\0A\09jmp ${1:P}\0A\09shr eax, $$0\0A\09shr ebx, $$0\0A\09shr ecx, $$0\0A\09shr edx, $$0\0A\09shr edi, $$0\0A\09shr esi, $$0\0A\09shr ebp, $$0\0A\09shr esp, $$0", "*m,*m,~{eax},~{ebp},~{ebx},~{ecx},~{edi},~{edx},~{flags},~{esi},~{esp},~{dirflag},~{fpsr},~{flags}"(ptr nonnull elementtype(i32 (...)) @static_func, ptr nonnull elementtype(i32 (...)) @extern_func) #0
63  ret void
64}
65
66declare i32 @extern_func(...) #0
67
68define internal i32 @static_func() #0 {
69entry:
70  %0 = load i32, ptr @GV, align 4
71  %inc = add nsw i32 %0, 1
72  store i32 %inc, ptr @GV, align 4
73  ret i32 %0
74}
75
76attributes #0 = { nounwind }
77