1 // RUN: rm -rf %t
2 // RUN: split-file %s %t
3 // RUN: cd %t
4
5 // RUN: %clang_cc1 -triple %itanium_abi_triple -std=c++20 N.cpp \
6 // RUN: -emit-module-interface -o N.pcm
7 // RUN: %clang_cc1 -triple %itanium_abi_triple -std=c++20 N.pcm -S -emit-llvm \
8 // RUN: -o - | FileCheck %s --check-prefix=CHECK-N
9
10 // RUN: %clang_cc1 -triple %itanium_abi_triple -std=c++20 O.cpp \
11 // RUN: -emit-module-interface -o O.pcm
12 // RUN: %clang_cc1 -triple %itanium_abi_triple -std=c++20 O.pcm -S -emit-llvm \
13 // RUN: -o - | FileCheck %s --check-prefix=CHECK-O
14
15 // RUN: %clang_cc1 -triple %itanium_abi_triple -std=c++20 M-part.cpp \
16 // RUN: -emit-module-interface -o M-part.pcm
17 // RUN: %clang_cc1 -triple %itanium_abi_triple -std=c++20 M-part.pcm -S \
18 // RUN: -emit-llvm -o - | FileCheck %s --check-prefix=CHECK-P
19
20 // RUN: %clang_cc1 -triple %itanium_abi_triple -std=c++20 M.cpp \
21 // RUN: -fmodule-file=N.pcm -fmodule-file=O.pcm -fmodule-file=M-part.pcm \
22 // RUN: -emit-module-interface -o M.pcm
23 // RUN: %clang_cc1 -triple %itanium_abi_triple -std=c++20 M.pcm -S -emit-llvm \
24 // RUN: -o - | FileCheck %s --check-prefix=CHECK-M
25
26 // RUN: %clang_cc1 -triple %itanium_abi_triple -std=c++20 useM.cpp \
27 // RUN: -fmodule-file=M.pcm -S -emit-llvm -o - \
28 // RUN: | FileCheck %s --check-prefix=CHECK-USE
29
30 // RUN: %clang_cc1 -triple %itanium_abi_triple -std=c++20 M-impl.cpp \
31 // RUN: -fmodule-file=M.pcm -S -emit-llvm -o - \
32 // RUN: | FileCheck %s --check-prefix=CHECK-IMPL
33
34 //--- N-h.h
35
36 struct Oink {
OinkOink37 Oink(){};
38 };
39
40 Oink Hog;
41
42 //--- N.cpp
43
44 module;
45 #include "N-h.h"
46
47 export module N;
48
49 export struct Quack {
QuackQuack50 Quack(){};
51 };
52
53 export Quack Duck;
54
55 // CHECK-N: define internal void @__cxx_global_var_init
56 // CHECK-N: call {{.*}} @_ZN4OinkC1Ev
57 // CHECK-N: define internal void @__cxx_global_var_init
58 // CHECK-N: call {{.*}} @_ZNW1N5QuackC1Ev
59 // CHECK-N: define void @_ZGIW1N
60 // CHECK-N: store i8 1, ptr @_ZGIW1N__in_chrg
61 // CHECK-N: call void @__cxx_global_var_init
62 // CHECK-N: call void @__cxx_global_var_init
63
64 //--- O-h.h
65
66 struct Meow {
MeowMeow67 Meow(){};
68 };
69
70 Meow Cat;
71
72 //--- O.cpp
73
74 module;
75 #include "O-h.h"
76
77 export module O;
78
79 export struct Bark {
BarkBark80 Bark(){};
81 };
82
83 export Bark Dog;
84
85 // CHECK-O: define internal void @__cxx_global_var_init
86 // CHECK-O: call {{.*}} @_ZN4MeowC2Ev
87 // CHECK-O: define internal void @__cxx_global_var_init
88 // CHECK-O: call {{.*}} @_ZNW1O4BarkC1Ev
89 // CHECK-O: define void @_ZGIW1O
90 // CHECK-O: store i8 1, ptr @_ZGIW1O__in_chrg
91 // CHECK-O: call void @__cxx_global_var_init
92 // CHECK-O: call void @__cxx_global_var_init
93
94 //--- P-h.h
95
96 struct Croak {
CroakCroak97 Croak(){};
98 };
99
100 Croak Frog;
101
102 //--- M-part.cpp
103
104 module;
105 #include "P-h.h"
106
107 module M:Part;
108
109 struct Squawk {
SquawkSquawk110 Squawk(){};
111 };
112
113 Squawk parrot;
114
115 // CHECK-P: define internal void @__cxx_global_var_init
116 // CHECK-P: call {{.*}} @_ZN5CroakC1Ev
117 // CHECK-P: define internal void @__cxx_global_var_init
118 // CHECK-P: call {{.*}} @_ZNW1M6SquawkC1Ev
119 // CHECK-P: define void @_ZGIW1MWP4Part
120 // CHECK-P: store i8 1, ptr @_ZGIW1MWP4Part__in_chrg
121 // CHECK-P: call void @__cxx_global_var_init
122 // CHECK-P: call void @__cxx_global_var_init
123
124 //--- M-h.h
125
126 struct Moo {
MooMoo127 Moo(){};
128 };
129
130 Moo Cow;
131
132 //--- M.cpp
133
134 module;
135 #include "M-h.h"
136
137 export module M;
138 import N;
139 export import O;
140 import :Part;
141
142 export struct Baa {
143 int x;
BaaBaa144 Baa(){};
BaaBaa145 Baa(int x) : x(x) {}
getXBaa146 int getX() { return x; }
147 };
148
149 export Baa Sheep(10);
150
151 // CHECK-M: define internal void @__cxx_global_var_init
152 // CHECK-M: call {{.*}} @_ZN3MooC1Ev
153 // CHECK-M: define internal void @__cxx_global_var_init
154 // CHECK-M: call {{.*}} @_ZNW1M3BaaC1Ei
155 // CHECK-M: declare void @_ZGIW1O()
156 // CHECK-M: declare void @_ZGIW1N()
157 // CHECK-M: declare void @_ZGIW1MWP4Part()
158 // CHECK-M: define void @_ZGIW1M
159 // CHECK-M: store i8 1, ptr @_ZGIW1M__in_chrg
160 // CHECK-M: call void @_ZGIW1O()
161 // CHECK-M: call void @_ZGIW1N()
162 // CHECK-M: call void @_ZGIW1MWP4Part()
163 // CHECK-M: call void @__cxx_global_var_init
164 // CHECK-M: call void @__cxx_global_var_init
165
166 //--- useM.cpp
167
168 import M;
169
main()170 int main() {
171 return Sheep.getX();
172 }
173
174 // CHECK-USE: declare void @_ZGIW1M
175 // CHECK-USE: define internal void @_GLOBAL__sub_I_useM.cpp
176 // CHECK-USE: call void @_ZGIW1M()
177
178 //--- M-impl.cpp
179
180 module M;
181
foo(int i)182 int foo(int i) { return i + 1; }
183
184 // CHECK-IMPL: declare void @_ZGIW1M
185 // CHECK-IMPL: define internal void @_GLOBAL__sub_I_M_impl.cpp
186 // CHECK-IMPL: call void @_ZGIW1M()
187