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