Author: Chuanqi Xu Date: 2024-04-18T15:38:02+08:00 New Revision: 5d4e072a253afac018e312d75290314bd2d03b30
URL: https://github.com/llvm/llvm-project/commit/5d4e072a253afac018e312d75290314bd2d03b30 DIFF: https://github.com/llvm/llvm-project/commit/5d4e072a253afac018e312d75290314bd2d03b30.diff LOG: [C++20] [Modules] [Reduced BMI] Don't eagerly write static entities in module purview For, ``` export module A; static int impl() { ... } export int func() { return impl(); } ``` Previously, even with reduced BMI, the function `impl` will be emitted into the BMI. After the patch, the static entities in module purview won't get emitted eagerly. Now the static entities may only be emitted if required. Note that, this restriction is actually more relaxed than the language standard required. The language spec said, the program is ill-formed if any TU-local entities get exposed. However, we can't do this since there are many static entities in the headers of existing libraries. Forbidding that will cause many existing program fail immediately. Another note here is, we can't do this for non-static non-exported entities, they can be used for other module units within the same module. Added: clang/test/Modules/unreached-static-entities.cppm Modified: clang/lib/Serialization/ASTWriter.cpp Removed: ################################################################################ diff --git a/clang/lib/Serialization/ASTWriter.cpp b/clang/lib/Serialization/ASTWriter.cpp index 9ae9648f38a3b7..522b8ce56c3266 100644 --- a/clang/lib/Serialization/ASTWriter.cpp +++ b/clang/lib/Serialization/ASTWriter.cpp @@ -4892,8 +4892,21 @@ void ASTWriter::PrepareWritingSpecialDecls(Sema &SemaRef) { if (D->isFromASTFile()) continue; - if (GeneratingReducedBMI && D->isFromExplicitGlobalModule()) - continue; + if (GeneratingReducedBMI) { + if (D->isFromExplicitGlobalModule()) + continue; + + // Don't force emitting static entities. + // + // Technically, all static entities shouldn't be in reduced BMI. The + // language also specifies that the program exposes TU-local entities + // is ill-formed. However, in practice, there are a lot of projects + // uses `static inline` in the headers. So we can't get rid of all + // static entities in reduced BMI now. + if (auto *ND = dyn_cast<NamedDecl>(D); + ND && ND->getFormalLinkage() == Linkage::Internal) + continue; + } GetDeclRef(D); } diff --git a/clang/test/Modules/unreached-static-entities.cppm b/clang/test/Modules/unreached-static-entities.cppm new file mode 100644 index 00000000000000..10f70ae09e5a1a --- /dev/null +++ b/clang/test/Modules/unreached-static-entities.cppm @@ -0,0 +1,22 @@ +// Test that the static function only used in non-inline functions won't get emitted +// into the BMI. +// +// RUN: rm -rf %t +// RUN: mkdir -p %t +// +// RUN: %clang_cc1 -std=c++20 %s -emit-reduced-module-interface -o %t/S.pcm +// RUN: llvm-bcanalyzer --dump --disable-histogram --show-binary-blobs %t/S.pcm > %t/S.dump +// RUN: cat %t/S.dump | FileCheck %s + +export module S; +static int static_func() { + return 43; +} + +export int func() { + return static_func(); +} + +// CHECK: <DECL_FUNCTION +// Checks that we won't see a second function +// CHECK-NOT: <DECL_FUNCTION _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits