forked from llvm/llvm-project
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[C++20] [Modules] Don't import function bodies from other module unit…
…s even with optimizations Close llvm#60996. Previously, clang will try to import function bodies from other module units to get more optimization oppotunities as much as possible. Then the motivation becomes the direct cause of the above issue. However, according to the discussion in SG15, the behavior of importing function bodies from other module units breaks the ABI compatibility. It is unwanted. So the original behavior of clang is incorrect. This patch choose to not import function bodies from other module units in all cases to follow the expectation. Note that the desired optimized BMI idea is discarded too. Since it will still break the ABI compatibility after we import function bodies seperately. The release note will be added seperately. There is a similar issue for variable definitions. I'll try to handle that in a different commit.
- Loading branch information
1 parent
a737a33
commit 82173f3
Showing
5 changed files
with
91 additions
and
9 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,72 @@ | ||
// RUN: rm -rf %t | ||
// RUN: split-file %s %t | ||
// RUN: cd %t | ||
// | ||
// RUN: %clang_cc1 -std=c++20 -triple %itanium_abi_triple %t/a.cppm \ | ||
// RUN: -emit-module-interface -o %t/a.pcm | ||
// RUN: %clang_cc1 -std=c++20 -triple %itanium_abi_triple %t/b.cppm \ | ||
// RUN: -emit-module-interface -fprebuilt-module-path=%t -o %t/b.pcm | ||
// RUN: %clang_cc1 -std=c++20 -triple %itanium_abi_triple %t/c.cppm \ | ||
// RUN: -emit-module-interface -fprebuilt-module-path=%t -o %t/c.pcm | ||
// RUN: %clang_cc1 -std=c++20 -triple %itanium_abi_triple %t/c.pcm -S \ | ||
// RUN: -emit-llvm -disable-llvm-passes -o - | FileCheck %t/c.cppm | ||
// | ||
// Be sure that we keep the same behavior as if optization not enabled. | ||
// RUN: %clang_cc1 -std=c++20 -triple %itanium_abi_triple -O3 %t/a.cppm \ | ||
// RUN: -emit-module-interface -o %t/a.pcm | ||
// RUN: %clang_cc1 -std=c++20 -triple %itanium_abi_triple -O3 %t/b.cppm \ | ||
// RUN: -emit-module-interface -fprebuilt-module-path=%t -o %t/b.pcm | ||
// RUN: %clang_cc1 -std=c++20 -triple %itanium_abi_triple -O3 %t/c.cppm \ | ||
// RUN: -emit-module-interface -fprebuilt-module-path=%t -o %t/c.pcm | ||
// RUN: %clang_cc1 -std=c++20 -triple %itanium_abi_triple -O3 %t/c.pcm \ | ||
// RUN: -S -emit-llvm -disable-llvm-passes -o - | FileCheck %t/c.cppm | ||
|
||
//--- a.cppm | ||
export module a; | ||
export int a() { | ||
return 43; | ||
} | ||
|
||
template <int C> | ||
int implicitly_inlined_template_function() { | ||
return C; | ||
} | ||
|
||
inline int reachable_inlined_a() { | ||
return 45; | ||
} | ||
|
||
int reachable_notinlined_a() { | ||
return 46; | ||
} | ||
|
||
export inline int inlined_a() { | ||
return 44 + reachable_inlined_a() + | ||
reachable_notinlined_a() + | ||
implicitly_inlined_template_function<47>(); | ||
} | ||
|
||
//--- b.cppm | ||
export module b; | ||
export import a; | ||
export int b() { | ||
return 43 + a(); | ||
} | ||
export inline int inlined_b() { | ||
return 44 + inlined_a() + a();; | ||
} | ||
|
||
//--- c.cppm | ||
export module c; | ||
export import b; | ||
export int c() { | ||
return 43 + b() + a() + inlined_b() + inlined_a(); | ||
} | ||
|
||
// CHECK: declare{{.*}}@_ZW1b1bv | ||
// CHECK: declare{{.*}}@_ZW1a1av | ||
// CHECK: define{{.*}}@_ZW1b9inlined_bv | ||
// CHECK: define{{.*}}@_ZW1a9inlined_av | ||
// CHECK: define{{.*}}@_ZW1a19reachable_inlined_av | ||
// CHECK: declare{{.*}}@_ZW1a22reachable_notinlined_av | ||
// CHECK: define{{.*}}@_ZW1a36implicitly_inlined_template_functionILi47EEiv |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters