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 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits