150
|
1 // RUN: %clang_cc1 -triple i686-windows-msvc -fms-extensions -emit-llvm -std=c11 -O0 -o - %s | FileCheck %s
|
|
2 // RUN: %clang_cc1 -triple x86_64-windows-msvc -fms-extensions -emit-llvm -std=c11 -O0 -o - %s | FileCheck %s
|
|
3 // RUN: %clang_cc1 -triple i686-windows-gnu -fms-extensions -emit-llvm -std=c11 -O0 -o - %s | FileCheck %s
|
|
4 // RUN: %clang_cc1 -triple x86_64-windows-gnu -fms-extensions -emit-llvm -std=c11 -O0 -o - %s | FileCheck %s
|
|
5
|
|
6
|
|
7
|
|
8 //===----------------------------------------------------------------------===//
|
|
9 // Globals
|
|
10 //===----------------------------------------------------------------------===//
|
|
11
|
|
12 // Declarations are not exported.
|
|
13 // CHECK-NOT: @ExternGlobalDecl
|
|
14 __declspec(dllexport) extern int ExternGlobalDecl;
|
|
15
|
|
16 // dllexport implies a definition.
|
173
|
17 // CHECK-DAG: @GlobalDef = dso_local dllexport global i32 0, align 4
|
150
|
18 __declspec(dllexport) int GlobalDef;
|
|
19
|
|
20 // Export definition.
|
|
21 // CHECK-DAG: @GlobalInit = dso_local dllexport global i32 1, align 4
|
|
22 __declspec(dllexport) int GlobalInit = 1;
|
|
23
|
|
24 // Declare, then export definition.
|
|
25 // CHECK-DAG: @GlobalDeclInit = dso_local dllexport global i32 1, align 4
|
|
26 __declspec(dllexport) extern int GlobalDeclInit;
|
|
27 int GlobalDeclInit = 1;
|
|
28
|
|
29 // Redeclarations
|
173
|
30 // CHECK-DAG: @GlobalRedecl1 = dso_local dllexport global i32 0, align 4
|
150
|
31 __declspec(dllexport) extern int GlobalRedecl1;
|
|
32 __declspec(dllexport) int GlobalRedecl1;
|
|
33
|
173
|
34 // CHECK-DAG: @GlobalRedecl2 = dso_local dllexport global i32 0, align 4
|
150
|
35 __declspec(dllexport) extern int GlobalRedecl2;
|
|
36 int GlobalRedecl2;
|
|
37
|
|
38
|
|
39
|
|
40 //===----------------------------------------------------------------------===//
|
|
41 // Functions
|
|
42 //===----------------------------------------------------------------------===//
|
|
43
|
|
44 // Declarations are not exported.
|
|
45
|
|
46 // Export function definition.
|
|
47 // CHECK-DAG: define dso_local dllexport void @def()
|
|
48 __declspec(dllexport) void def(void) {}
|
|
49
|
|
50 // Export inline function.
|
|
51 // CHECK-DAG: define weak_odr dso_local dllexport void @inlineFunc()
|
|
52 // CHECK-DAG: define weak_odr dso_local dllexport void @externInlineFunc()
|
|
53 __declspec(dllexport) inline void inlineFunc(void) {}
|
|
54 __declspec(dllexport) inline void externInlineFunc(void) {}
|
|
55 extern void externInlineFunc(void);
|
|
56
|
|
57 // Redeclarations
|
|
58 // CHECK-DAG: define dso_local dllexport void @redecl1()
|
|
59 __declspec(dllexport) void redecl1(void);
|
|
60 __declspec(dllexport) void redecl1(void) {}
|
|
61
|
|
62 // CHECK-DAG: define dso_local dllexport void @redecl2()
|
|
63 __declspec(dllexport) void redecl2(void);
|
|
64 void redecl2(void) {}
|
|
65
|
|
66
|
|
67
|
|
68 //===----------------------------------------------------------------------===//
|
|
69 // Precedence
|
|
70 //===----------------------------------------------------------------------===//
|
|
71
|
|
72 // dllexport takes precedence over the dllimport if both are specified.
|
173
|
73 // CHECK-DAG: @PrecedenceGlobal1A = dso_local dllexport global i32 0, align 4
|
|
74 // CHECK-DAG: @PrecedenceGlobal1B = dso_local dllexport global i32 0, align 4
|
150
|
75 __attribute__((dllimport, dllexport)) int PrecedenceGlobal1A;
|
|
76 __declspec(dllimport) __declspec(dllexport) int PrecedenceGlobal1B;
|
|
77
|
173
|
78 // CHECK-DAG: @PrecedenceGlobal2A = dso_local dllexport global i32 0, align 4
|
|
79 // CHECK-DAG: @PrecedenceGlobal2B = dso_local dllexport global i32 0, align 4
|
150
|
80 __attribute__((dllexport, dllimport)) int PrecedenceGlobal2A;
|
|
81 __declspec(dllexport) __declspec(dllimport) int PrecedenceGlobal2B;
|
|
82
|
|
83 // CHECK-DAG: @PrecedenceGlobalRedecl1 = dso_local dllexport global i32 0, align 4
|
|
84 __declspec(dllexport) extern int PrecedenceGlobalRedecl1;
|
|
85 __declspec(dllimport) int PrecedenceGlobalRedecl1 = 0;
|
|
86
|
173
|
87 // CHECK-DAG: @PrecedenceGlobalRedecl2 = dso_local dllexport global i32 0, align 4
|
150
|
88 __declspec(dllimport) extern int PrecedenceGlobalRedecl2;
|
|
89 __declspec(dllexport) int PrecedenceGlobalRedecl2;
|
|
90
|
|
91 // CHECK-DAG: @PrecedenceGlobalMixed1 = dso_local dllexport global i32 1, align 4
|
|
92 __attribute__((dllexport)) extern int PrecedenceGlobalMixed1;
|
|
93 __declspec(dllimport) int PrecedenceGlobalMixed1 = 1;
|
|
94
|
173
|
95 // CHECK-DAG: @PrecedenceGlobalMixed2 = dso_local dllexport global i32 0, align 4
|
150
|
96 __attribute__((dllimport)) extern int PrecedenceGlobalMixed2;
|
|
97 __declspec(dllexport) int PrecedenceGlobalMixed2;
|
|
98
|
|
99 // CHECK-DAG: define dso_local dllexport void @precedence1A()
|
|
100 // CHECK-DAG: define dso_local dllexport void @precedence1B()
|
|
101 void __attribute__((dllimport, dllexport)) precedence1A(void) {}
|
|
102 void __declspec(dllimport) __declspec(dllexport) precedence1B(void) {}
|
|
103
|
|
104 // CHECK-DAG: define dso_local dllexport void @precedence2A()
|
|
105 // CHECK-DAG: define dso_local dllexport void @precedence2B()
|
|
106 void __attribute__((dllexport, dllimport)) precedence2A(void) {}
|
|
107 void __declspec(dllexport) __declspec(dllimport) precedence2B(void) {}
|
|
108
|
|
109 // CHECK-DAG: define dso_local dllexport void @precedenceRedecl1()
|
|
110 void __declspec(dllimport) precedenceRedecl1(void);
|
|
111 void __declspec(dllexport) precedenceRedecl1(void) {}
|
|
112
|
|
113 // CHECK-DAG: define dso_local dllexport void @precedenceRedecl2()
|
|
114 void __declspec(dllexport) precedenceRedecl2(void);
|
|
115 void __declspec(dllimport) precedenceRedecl2(void) {}
|