Close https://github.com/llvm/llvm-project/issues/71034 See https://discourse.llvm.org/t/rfc-c-20-modules-introduce-thin-bmi-and-decls-hash/74755 This patch introduces reduced BMI, which doesn't contain the definitions of functions and variables if its definitions won't contribute to the ABI. Testing is a big part of the patch. We want to make sure the reduced BMI contains the same behavior with the existing and relatively stable fatBMI. This is pretty helpful for further reduction. The user interfaces part it left to following patches to ease the reviewing.
103 lines
2.4 KiB
C++
103 lines
2.4 KiB
C++
// RUN: rm -rf %t
|
|
// RUN: mkdir %t
|
|
// RUN: split-file %s %t
|
|
//
|
|
// RUN: %clang_cc1 -std=c++20 -triple %itanium_abi_triple %t/d.cppm \
|
|
// RUN: -emit-module-interface -o %t/d.pcm
|
|
// RUN: %clang_cc1 -std=c++20 -triple %itanium_abi_triple %t/c.cppm \
|
|
// RUN: -emit-module-interface -o %t/c.pcm -fprebuilt-module-path=%t
|
|
// RUN: %clang_cc1 -std=c++20 -triple %itanium_abi_triple %t/b.cppm \
|
|
// RUN: -emit-module-interface -o %t/b.pcm -fprebuilt-module-path=%t
|
|
// RUN: %clang_cc1 -std=c++20 -triple %itanium_abi_triple %t/a.cppm \
|
|
// RUN: -emit-module-interface -o %t/a.pcm -fprebuilt-module-path=%t
|
|
// RUN: %clang_cc1 -std=c++20 -triple %itanium_abi_triple %t/a.pcm \
|
|
// RUN: -S -emit-llvm -disable-llvm-passes -o - -fprebuilt-module-path=%t \
|
|
// RUN: | FileCheck %t/a.cppm
|
|
|
|
// Test again with reduced BMI.
|
|
// RUN: rm -rf %t
|
|
// RUN: mkdir %t
|
|
// RUN: split-file %s %t
|
|
//
|
|
// RUN: %clang_cc1 -std=c++20 -triple %itanium_abi_triple %t/d.cppm \
|
|
// RUN: -emit-reduced-module-interface -o %t/d.pcm
|
|
// RUN: %clang_cc1 -std=c++20 -triple %itanium_abi_triple %t/c.cppm \
|
|
// RUN: -emit-reduced-module-interface -o %t/c.pcm -fprebuilt-module-path=%t
|
|
// RUN: %clang_cc1 -std=c++20 -triple %itanium_abi_triple %t/b.cppm \
|
|
// RUN: -emit-reduced-module-interface -o %t/b.pcm -fprebuilt-module-path=%t
|
|
// RUN: %clang_cc1 -std=c++20 -triple %itanium_abi_triple %t/a.cppm \
|
|
// RUN: -emit-module-interface -o %t/a.pcm -fprebuilt-module-path=%t
|
|
// RUN: %clang_cc1 -std=c++20 -triple %itanium_abi_triple %t/a.pcm \
|
|
// RUN: -S -emit-llvm -disable-llvm-passes -o - -fprebuilt-module-path=%t \
|
|
// RUN: | FileCheck %t/a.cppm
|
|
|
|
//--- d.cppm
|
|
export module d;
|
|
|
|
export template<typename>
|
|
struct integer {
|
|
using type = int;
|
|
|
|
static constexpr auto value() {
|
|
return 0;
|
|
}
|
|
|
|
friend constexpr void f(integer const x) {
|
|
x.value();
|
|
}
|
|
};
|
|
|
|
export constexpr void ddd(auto const value) {
|
|
f(value);
|
|
}
|
|
|
|
|
|
template<typename T>
|
|
constexpr auto dd = T();
|
|
|
|
export template<typename T>
|
|
constexpr auto d() {
|
|
dd<T>;
|
|
}
|
|
|
|
//--- c.cppm
|
|
export module c;
|
|
|
|
import d;
|
|
|
|
template<typename T>
|
|
auto cc = T();
|
|
|
|
auto c() {
|
|
cc<integer<int>>;
|
|
integer<int>().value();
|
|
}
|
|
|
|
//--- b.cppm
|
|
export module b;
|
|
|
|
import d;
|
|
|
|
auto b() {
|
|
integer<int>::type;
|
|
}
|
|
|
|
//--- a.cppm
|
|
export module a;
|
|
|
|
import b;
|
|
import c;
|
|
import d;
|
|
|
|
constexpr void aa() {
|
|
d<integer<unsigned>>();
|
|
ddd(integer<int>());
|
|
}
|
|
|
|
export extern "C" void a() {
|
|
aa();
|
|
}
|
|
|
|
// Checks that we emit the IR successfully.
|
|
// CHECK: define{{.*}}@a(
|