[clang] 235d684 - [C++20] [Modules] [Reduced BMI] Don't record declarations in functions

Chuanqi Xu via cfe-commits cfe-commits at lists.llvm.org
Thu Mar 28 23:22:28 PDT 2024


Author: Chuanqi Xu
Date: 2024-03-29T14:21:45+08:00
New Revision: 235d6841601a9dbea293b8e82b0c994f91f42d76

URL: https://github.com/llvm/llvm-project/commit/235d6841601a9dbea293b8e82b0c994f91f42d76
DIFF: https://github.com/llvm/llvm-project/commit/235d6841601a9dbea293b8e82b0c994f91f42d76.diff

LOG: [C++20] [Modules] [Reduced BMI] Don't record declarations in functions
by default

For reduced BMI, it is meaningless to record the local declarations in
functions if not required explicitly during the process of writing the
function bodies.

It wastes time for reduced BMI and may be problematic if we want to
avoid transiting unnecessary changes.

Added: 
    clang/test/Modules/no-local-decl-in-reduced-bmi.cppm

Modified: 
    clang/lib/Serialization/ASTWriter.cpp

Removed: 
    


################################################################################
diff  --git a/clang/lib/Serialization/ASTWriter.cpp b/clang/lib/Serialization/ASTWriter.cpp
index 2cc7f21bf60c49..1e5734c9c834eb 100644
--- a/clang/lib/Serialization/ASTWriter.cpp
+++ b/clang/lib/Serialization/ASTWriter.cpp
@@ -3195,6 +3195,10 @@ uint64_t ASTWriter::WriteDeclContextLexicalBlock(ASTContext &Context,
   if (DC->decls_empty())
     return 0;
 
+  // In reduced BMI, we don't care the declarations in functions.
+  if (GeneratingReducedBMI && DC->isFunctionOrMethod())
+    return 0;
+
   uint64_t Offset = Stream.GetCurrentBitNo();
   SmallVector<uint32_t, 128> KindDeclPairs;
   for (const auto *D : DC->decls()) {

diff  --git a/clang/test/Modules/no-local-decl-in-reduced-bmi.cppm b/clang/test/Modules/no-local-decl-in-reduced-bmi.cppm
new file mode 100644
index 00000000000000..41ae2bf0dec809
--- /dev/null
+++ b/clang/test/Modules/no-local-decl-in-reduced-bmi.cppm
@@ -0,0 +1,33 @@
+// Test that we won't record local declarations by default in reduced BMI.
+
+// RUN: rm -rf %t
+// RUN: split-file %s %t
+// RUN: cd %t
+//
+// RUN: %clang_cc1 -std=c++20 %t/a.cppm -emit-reduced-module-interface -o %t/a.pcm
+// RUN: llvm-bcanalyzer --dump --disable-histogram --show-binary-blobs %t/a.pcm > %t/a.dump
+// RUN: cat %t/a.dump | FileCheck %t/a.cppm
+//
+// RUN: %clang_cc1 -std=c++20 %t/b.cppm -emit-reduced-module-interface -o %t/b.pcm
+// RUN: llvm-bcanalyzer --dump --disable-histogram --show-binary-blobs %t/b.pcm > %t/b.dump
+// RUN: cat %t/b.dump | FileCheck %t/b.cppm
+
+//--- a.cppm
+export module a;
+export int func() {
+    int v = 43;
+    return 43;
+}
+
+// Test that the variable declaration is not recorded completely.
+// CHECK-NOT: <DECL_VAR
+
+//--- b.cppm
+export module b;
+export inline int func() {
+    int v = 43;
+    return v;
+}
+
+// Check that we still records the declaration from inline functions.
+// CHECK: <DECL_VAR


        


More information about the cfe-commits mailing list