xref: /llvm-project/llvm/test/CodeGen/X86/mingw-refptr.ll (revision f03b100e93196ca1ecec20fde3fc48690b3dad7e)
1; RUN: llc < %s -mtriple=x86_64-w64-mingw32 | FileCheck %s -check-prefix=CHECK-X64
2; RUN: llc < %s -mtriple=x86_64-pc-cygwin | FileCheck %s -check-prefix=CHECK-X64
3; RUN: llc < %s -mtriple=i686-w64-mingw32 | FileCheck %s -check-prefix=CHECK-X86
4; RUN: llc < %s -mtriple=i686-w64-mingw32-none-elf | FileCheck %s -check-prefix=CHECK-X86-ELF
5
6@var = external local_unnamed_addr global i32, align 4
7@dsolocalvar = external dso_local local_unnamed_addr global i32, align 4
8@localvar = dso_local local_unnamed_addr global i32 0, align 4
9@localcommon = common dso_local local_unnamed_addr global i32 0, align 4
10@extvar = external dllimport local_unnamed_addr global i32, align 4
11
12define dso_local i32 @getVar() {
13; CHECK-X64-LABEL: getVar:
14; CHECK-X64:    movq .refptr.var(%rip), %rax
15; CHECK-X64:    movl (%rax), %eax
16; CHECK-X64:    retq
17; CHECK-X86-LABEL: _getVar:
18; CHECK-X86:    movl .refptr._var, %eax
19; CHECK-X86:    movl (%eax), %eax
20; CHECK-X86:    retl
21; CHECK-X86-ELF-LABEL: getVar:
22; CHECK-X86-ELF:    movl var, %eax
23; CHECK-X86-ELF:    retl
24entry:
25  %0 = load i32, ptr @var, align 4
26  ret i32 %0
27}
28
29define dso_local i32 @getDsoLocalVar() {
30; CHECK-X64-LABEL: getDsoLocalVar:
31; CHECK-X64:    movl dsolocalvar(%rip), %eax
32; CHECK-X64:    retq
33; CHECK-X86-LABEL: _getDsoLocalVar:
34; CHECK-X86:    movl _dsolocalvar, %eax
35; CHECK-X86:    retl
36entry:
37  %0 = load i32, ptr @dsolocalvar, align 4
38  ret i32 %0
39}
40
41define dso_local i32 @getLocalVar() {
42; CHECK-X64-LABEL: getLocalVar:
43; CHECK-X64:    movl localvar(%rip), %eax
44; CHECK-X64:    retq
45; CHECK-X86-LABEL: _getLocalVar:
46; CHECK-X86:    movl _localvar, %eax
47; CHECK-X86:    retl
48entry:
49  %0 = load i32, ptr @localvar, align 4
50  ret i32 %0
51}
52
53define dso_local i32 @getLocalCommon() {
54; CHECK-X64-LABEL: getLocalCommon:
55; CHECK-X64:    movl localcommon(%rip), %eax
56; CHECK-X64:    retq
57; CHECK-X86-LABEL: _getLocalCommon:
58; CHECK-X86:    movl _localcommon, %eax
59; CHECK-X86:    retl
60entry:
61  %0 = load i32, ptr @localcommon, align 4
62  ret i32 %0
63}
64
65define dso_local i32 @getExtVar() {
66; CHECK-X64-LABEL: getExtVar:
67; CHECK-X64:    movq __imp_extvar(%rip), %rax
68; CHECK-X64:    movl (%rax), %eax
69; CHECK-X64:    retq
70; CHECK-X86-LABEL: _getExtVar:
71; CHECK-X86:    movl __imp__extvar, %eax
72; CHECK-X86:    movl (%eax), %eax
73; CHECK-X86:    retl
74; CHECK-X86-ELF-LABEL: getExtVar:
75; CHECK-X86-ELF:    movl extvar, %eax
76; CHECK-X86-ELF:    retl
77entry:
78  %0 = load i32, ptr @extvar, align 4
79  ret i32 %0
80}
81
82define dso_local void @callFunc() {
83; CHECK-X64-LABEL: callFunc:
84; CHECK-X64:    jmp otherFunc
85; CHECK-X86-LABEL: _callFunc:
86; CHECK-X86:    jmp _otherFunc
87entry:
88  tail call void @otherFunc()
89  ret void
90}
91
92declare dso_local void @otherFunc()
93
94; CHECK-X64:        .section        .rdata$.refptr.var,"dr",discard,.refptr.var
95; CHECK-X64:        .globl  .refptr.var
96; CHECK-X64: .refptr.var:
97; CHECK-X64:        .quad   var
98
99; CHECK-X86:        .section        .rdata$.refptr._var,"dr",discard,.refptr._var
100; CHECK-X86:        .globl  .refptr._var
101; CHECK-X86: .refptr._var:
102; CHECK-X86:        .long   _var
103