Close https://github.com/llvm/llvm-project/issues/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.
46 lines
1.2 KiB
C++
46 lines
1.2 KiB
C++
// RUN: rm -rf %t
|
|
// RUN: split-file %s %t
|
|
// RUN: cd %t
|
|
//
|
|
// RUN: %clang_cc1 -std=c++20 -O1 -triple %itanium_abi_triple %t/a.cppm \
|
|
// RUN: -emit-module-interface -o %t/a.pcm
|
|
// RUN: %clang_cc1 -std=c++20 -O1 -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 -O1 -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 -O1 -triple %itanium_abi_triple %t/c.pcm -S \
|
|
// RUN: -emit-llvm -disable-llvm-passes -o - | FileCheck %t/c.cppm
|
|
|
|
//--- a.cppm
|
|
export module a;
|
|
export int a() {
|
|
return 43;
|
|
}
|
|
export __attribute__((noinline)) int a_noinline() {
|
|
return 44;
|
|
}
|
|
|
|
//--- b.cppm
|
|
export module b;
|
|
export import a;
|
|
export int b() {
|
|
return 43 + a();
|
|
}
|
|
|
|
export __attribute__((noinline)) int b_noinline() {
|
|
return 43 + a();
|
|
}
|
|
|
|
//--- c.cppm
|
|
export module c;
|
|
export import b;
|
|
export int c() {
|
|
return 43 + b() + a() + b_noinline() + a_noinline();
|
|
}
|
|
|
|
// CHECK: declare{{.*}}@_ZW1b1bv(
|
|
// CHECK: declare{{.*}}@_ZW1a1av(
|
|
|
|
// CHECK: declare{{.*}}@_ZW1b10b_noinlinev()
|
|
// CHECK: declare{{.*}}@_ZW1a10a_noinlinev()
|