Skip to content

Commit

Permalink
[C++20] [Modules] [Reduced BMI] Don't eagerly write static entities in
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
ChuanqiXu9 committed Apr 18, 2024
1 parent 135472b commit 5d4e072
Show file tree
Hide file tree
Showing 2 changed files with 37 additions and 2 deletions.
17 changes: 15 additions & 2 deletions clang/lib/Serialization/ASTWriter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
Expand Down
22 changes: 22 additions & 0 deletions clang/test/Modules/unreached-static-entities.cppm
Original file line number Diff line number Diff line change
@@ -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

0 comments on commit 5d4e072

Please sign in to comment.