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