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 { 37 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 { 50 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 { 67 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 { 80 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 { 97 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 { 110 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 { 127 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; 144 Baa(){}; 145 Baa(int x) : x(x) {} 146 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 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 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