1; RUN: llc -mtriple i386-pc-win32 < %s \
2; RUN:    | FileCheck -check-prefix CHECK -check-prefix CHECK-CL %s
3; RUN: llc -mtriple i386-pc-mingw32 < %s \
4; RUN:    | FileCheck -check-prefix CHECK -check-prefix CHECK-GCC %s
5; RUN: llc -mtriple i686-pc-cygwin %s -o - \
6; RUN:    | FileCheck -check-prefix CHECK -check-prefix CHECK-GCC %s
7; RUN: llc -mtriple i386-pc-win32 < %s \
8; RUN:    | FileCheck -check-prefix NOTEXPORTED %s
9; RUN: llc -mtriple i386-pc-mingw32 < %s \
10; RUN:    | FileCheck -check-prefix NOTEXPORTED %s
11; RUN: llc -mtriple i686-pc-cygwin %s -o - \
12; RUN:    | FileCheck -check-prefix NOTEXPORTED %s
13
14; CHECK: .text
15
16define void @notExported() {
17	ret void
18}
19
20; CHECK: .globl _f1
21define dllexport void @f1() {
22	ret void
23}
24
25; CHECK: .globl _f2
26define dllexport void @f2() unnamed_addr {
27	ret void
28}
29
30declare dllexport void @notDefined()
31
32; CHECK: .globl _stdfun@0
33define dllexport x86_stdcallcc void @stdfun() nounwind {
34	ret void
35}
36
37; CHECK: .globl @fastfun@0
38define dllexport x86_fastcallcc i32 @fastfun() nounwind {
39	ret i32 0
40}
41
42; CHECK: .globl _thisfun
43define dllexport x86_thiscallcc void @thisfun() nounwind {
44	ret void
45}
46
47; CHECK: .globl _lnk1
48$lnk1 = comdat any
49
50define linkonce_odr dllexport void @lnk1() comdat {
51	ret void
52}
53
54; CHECK: .globl _lnk2
55$lnk2 = comdat any
56
57define linkonce_odr dllexport void @lnk2() alwaysinline comdat {
58	ret void
59}
60
61; CHECK: .weak _weak1
62define weak_odr dllexport void @weak1() {
63	ret void
64}
65
66
67; CHECK: .data
68; CHECK: .globl _Var1
69@Var1 = dllexport global i32 1, align 4
70
71; CHECK: .rdata,"dr"
72; CHECK: .globl _Var2
73@Var2 = dllexport unnamed_addr constant i32 1
74
75; CHECK: .comm _Var3
76@Var3 = common dllexport global i32 0, align 4
77
78; CHECK: .weak _WeakVar1
79@WeakVar1 = weak_odr dllexport global i32 1, align 4
80
81; CHECK: .weak _WeakVar2
82@WeakVar2 = weak_odr dllexport unnamed_addr constant i32 1
83
84; CHECK: .globl "_complex-name"
85@"complex-name" = dllexport global i32 1, align 4
86
87
88; Verify items that should not be exported do not appear in the export table.
89; We use a separate check prefix to avoid confusion between -NOT and -SAME.
90; NOTEXPORTED: .section .drectve
91; NOTEXPORTED-NOT: :notExported
92; NOTEXPORTED-NOT: :notDefined
93
94; CHECK: .section .drectve
95; CHECK-CL: .ascii " /EXPORT:_f1"
96; CHECK-CL: .ascii " /EXPORT:_f2"
97; CHECK-CL: .ascii " /EXPORT:_stdfun@0"
98; CHECK-CL: .ascii " /EXPORT:@fastfun@0"
99; CHECK-CL: .ascii " /EXPORT:_thisfun"
100; CHECK-CL: .ascii " /EXPORT:_lnk1"
101; CHECK-CL: .ascii " /EXPORT:_lnk2"
102; CHECK-CL: .ascii " /EXPORT:_weak1"
103; CHECK-CL: .ascii " /EXPORT:_Var1,DATA"
104; CHECK-CL: .ascii " /EXPORT:_Var2,DATA"
105; CHECK-CL: .ascii " /EXPORT:_Var3,DATA"
106; CHECK-CL: .ascii " /EXPORT:_WeakVar1,DATA"
107; CHECK-CL: .ascii " /EXPORT:_WeakVar2,DATA"
108; CHECK-CL: .ascii " /EXPORT:\"_complex-name\",DATA"
109; CHECK-CL: .ascii " /EXPORT:_alias"
110; CHECK-CL: .ascii " /EXPORT:_alias2"
111; CHECK-CL: .ascii " /EXPORT:_alias3"
112; CHECK-CL: .ascii " /EXPORT:_weak_alias"
113; CHECK-GCC: .ascii " -export:f1"
114; CHECK-GCC: .ascii " -export:f2"
115; CHECK-GCC: .ascii " -export:stdfun@0"
116; CHECK-GCC: .ascii " -export:@fastfun@0"
117; CHECK-GCC: .ascii " -export:thisfun"
118; CHECK-GCC: .ascii " -export:lnk1"
119; CHECK-GCC: .ascii " -export:lnk2"
120; CHECK-GCC: .ascii " -export:weak1"
121; CHECK-GCC: .ascii " -export:Var1,data"
122; CHECK-GCC: .ascii " -export:Var2,data"
123; CHECK-GCC: .ascii " -export:Var3,data"
124; CHECK-GCC: .ascii " -export:WeakVar1,data"
125; CHECK-GCC: .ascii " -export:WeakVar2,data"
126; CHECK-GCC: .ascii " -export:\"complex-name\",data"
127; CHECK-GCC: .ascii " -export:alias"
128; CHECK-GCC: .ascii " -export:alias2"
129; CHECK-GCC: .ascii " -export:alias3"
130; CHECK-GCC: .ascii " -export:weak_alias"
131
132; CHECK: .globl _alias
133; CHECK: .set _alias, _notExported
134@alias = dllexport alias void(), void()* @notExported
135
136; CHECK: .globl _alias2
137; CHECK: .set _alias2, _f1
138@alias2 = dllexport alias void(), void()* @f1
139
140; CHECK: .globl _alias3
141; CHECK: .set _alias3, _notExported
142@alias3 = dllexport alias void(), void()* @notExported
143
144; CHECK: .weak _weak_alias
145; CHECK: .set _weak_alias, _f1
146@weak_alias = weak_odr dllexport alias void(), void()* @f1
147