Revert "[C++20] [Modules] Handle initializer for Header Units"
authorChuanqi Xu <yedeng.yd@linux.alibaba.com>
Tue, 2 Aug 2022 03:08:41 +0000 (11:08 +0800)
committerChuanqi Xu <yedeng.yd@linux.alibaba.com>
Tue, 2 Aug 2022 03:09:38 +0000 (11:09 +0800)
This reverts commit db6152ad66d7cf48f9f5c3eb28bf54c092978773.

This commit fails in ppc64. Since we want to backport it to 15.x. So
revert it now to keep the patch complete.

clang/lib/CodeGen/CGDeclCXX.cpp
clang/lib/CodeGen/CodeGenModule.cpp
clang/test/CodeGenCXX/module-initializer-header.cppm [deleted file]

index 4201413..620af1e 100644 (file)
@@ -650,8 +650,8 @@ void CodeGenModule::EmitCXXModuleInitFunc(Module *Primary) {
 
   SmallVector<llvm::Function *, 8> ModuleInits;
   for (Module *M : AllImports) {
-    // No Itanium initializer in header like modules.
-    if (M->isHeaderLikeModule())
+    // No Itanium initializer in module map modules.
+    if (M->isModuleMapModule())
       continue; // TODO: warn of mixed use of module map modules and C++20?
     llvm::FunctionType *FTy = llvm::FunctionType::get(VoidTy, false);
     SmallString<256> FnName;
@@ -779,8 +779,8 @@ CodeGenModule::EmitCXXGlobalInitFunc() {
   SmallVector<llvm::Function *, 8> ModuleInits;
   if (CXX20ModuleInits)
     for (Module *M : ImportedModules) {
-      // No Itanium initializer in header like modules.
-      if (M->isHeaderLikeModule())
+      // No Itanium initializer in module map modules.
+      if (M->isModuleMapModule())
         continue;
       llvm::FunctionType *FTy = llvm::FunctionType::get(VoidTy, false);
       SmallString<256> FnName;
index dc1122f..579ebba 100644 (file)
@@ -521,7 +521,7 @@ static void setVisibilityFromDLLStorageClass(const clang::LangOptions &LO,
 
 void CodeGenModule::Release() {
   Module *Primary = getContext().getModuleForCodeGen();
-  if (CXX20ModuleInits && Primary && !Primary->isHeaderLikeModule())
+  if (CXX20ModuleInits && Primary && !Primary->isModuleMapModule())
     EmitModuleInitializers(Primary);
   EmitDeferred();
   DeferredDecls.insert(EmittedDeferredDecls.begin(),
@@ -2521,23 +2521,21 @@ void CodeGenModule::EmitModuleInitializers(clang::Module *Primary) {
   // source, first Global Module Fragments, if present.
   if (auto GMF = Primary->getGlobalModuleFragment()) {
     for (Decl *D : getContext().getModuleInitializers(GMF)) {
-      if (isa<ImportDecl>(D))
-        continue;
-      assert(isa<VarDecl>(D) && "GMF initializer decl is not a var?");
+      assert(D->getKind() == Decl::Var && "GMF initializer decl is not a var?");
       EmitTopLevelDecl(D);
     }
   }
   // Second any associated with the module, itself.
   for (Decl *D : getContext().getModuleInitializers(Primary)) {
     // Skip import decls, the inits for those are called explicitly.
-    if (isa<ImportDecl>(D))
+    if (D->getKind() == Decl::Import)
       continue;
     EmitTopLevelDecl(D);
   }
   // Third any associated with the Privat eMOdule Fragment, if present.
   if (auto PMF = Primary->getPrivateModuleFragment()) {
     for (Decl *D : getContext().getModuleInitializers(PMF)) {
-      assert(isa<VarDecl>(D) && "PMF initializer decl is not a var?");
+      assert(D->getKind() == Decl::Var && "PMF initializer decl is not a var?");
       EmitTopLevelDecl(D);
     }
   }
diff --git a/clang/test/CodeGenCXX/module-initializer-header.cppm b/clang/test/CodeGenCXX/module-initializer-header.cppm
deleted file mode 100644 (file)
index d60ad45..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py
-// RUN: rm -rf %t
-// RUN: split-file %s %t
-//
-// RUN: %clang_cc1 -std=c++20 -triple %itanium_abi_triple -xc++-user-header -emit-header-unit %t/header.h -o %t/header.pcm
-// RUN: %clang_cc1 -std=c++20 -triple %itanium_abi_triple -fmodule-file=%t/header.pcm %t/M.cppm -S -emit-llvm -o - | FileCheck %t/M.cppm
-// RUN: %clang_cc1 -std=c++20 -triple %itanium_abi_triple -fmodule-file=%t/header.pcm %t/Use.cpp -S -emit-llvm -o - | FileCheck %t/Use.cpp
-//
-//--- header.h
-int foo();
-int i = foo();
-
-//--- M.cppm
-module;
-import "header.h";
-export module M;
-
-// CHECK: @i = {{.*}}global i32 0
-// CHECK: void @__cxx_global_var_init()
-// CHECK-NEXT: entry:
-// CHECK-NEXT:  %call = call noundef i32 @_Z3foov()
-// CHECK-NEXT:  store i32 %call, ptr @i  
-
-//--- Use.cpp
-import "header.h";
-
-// CHECK: @i = {{.*}}global i32 0
-// CHECK: void @__cxx_global_var_init()
-// CHECK-NEXT: entry:
-// CHECK-NEXT:  %call = call noundef i32 @_Z3foov()
-// CHECK-NEXT:  store i32 %call, ptr @i