Reduced BMI Mitigate https://github.com/llvm/llvm-project/issues/61447 The root cause of the above problem is that when we write a declaration, we need to lookup all the redeclarations in the imported modules. Then it will be pretty slow if there are too many redeclarations in different modules. This patch doesn't solve the porblem. What the patchs mitigated is, when we writing a named module, we shouldn't write the declarations from GMF if it is unreferenced **in current module unit**. The difference here is that, if the declaration is used in the imported modules, we used to emit it as an update. But we definitely want to avoid that after this patch. For that reproducer in https://github.com/llvm/llvm-project/issues/61447, it used to take 2.5s to compile and now it only takes 0.49s to compile, which is a big win.
97 lines
1.8 KiB
C++
97 lines
1.8 KiB
C++
// Test that we won't write additional information into the Reduced BMI if the
|
|
// module purview is empty.
|
|
//
|
|
// RUN: rm -rf %t
|
|
// RUN: mkdir -p %t
|
|
// RUN: split-file %s %t
|
|
//
|
|
// RUN: %clang_cc1 -std=c++20 %t/M.cppm -emit-reduced-module-interface -o %t/M.pcm
|
|
// RUN: %clang_cc1 -std=c++20 %t/A.cppm -emit-reduced-module-interface -o %t/A.pcm \
|
|
// RUN: -fmodule-file=M=%t/M.pcm
|
|
// RUN: llvm-bcanalyzer --dump --disable-histogram --show-binary-blobs %t/A.pcm > %t/A.dump
|
|
// RUN: cat %t/A.dump | FileCheck %t/A.cppm
|
|
//
|
|
// RUN: %clang_cc1 -std=c++20 %t/A1.cppm -emit-reduced-module-interface -o %t/A1.pcm \
|
|
// RUN: -fmodule-file=M=%t/M.pcm
|
|
// RUN: llvm-bcanalyzer --dump --disable-histogram --show-binary-blobs %t/A1.pcm > %t/A1.dump
|
|
// RUN: cat %t/A1.dump | FileCheck %t/A1.cppm
|
|
|
|
//--- foo.h
|
|
namespace ns {
|
|
template <class C>
|
|
class A {
|
|
|
|
};
|
|
|
|
extern template class A<short>;
|
|
|
|
inline A<int> a() { return A<int>(); }
|
|
template <class T>
|
|
A<T> _av_ = A<T>();
|
|
|
|
auto _av_1 = _av_<int>;
|
|
auto _av_2 = _av_<double>;
|
|
|
|
template <>
|
|
class A<void> {
|
|
|
|
};
|
|
|
|
void func(A<int>, ...) {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
struct S {
|
|
union {
|
|
unsigned int V;
|
|
struct {
|
|
int v1;
|
|
int v2;
|
|
ns::A<int> a1;
|
|
} WESQ;
|
|
};
|
|
|
|
union {
|
|
double d;
|
|
struct {
|
|
int v1;
|
|
unsigned v2;
|
|
ns::A<unsigned> a1;
|
|
} Another;
|
|
};
|
|
};
|
|
|
|
//--- M.cppm
|
|
module;
|
|
#include "foo.h"
|
|
export module M;
|
|
export namespace nv {
|
|
using ns::A;
|
|
using ns::a;
|
|
using ns::_av_;
|
|
|
|
using ns::func;
|
|
}
|
|
using ::S;
|
|
|
|
//--- A.cppm
|
|
module;
|
|
#include "foo.h"
|
|
export module A;
|
|
import M;
|
|
|
|
// CHECK-NOT: <DECL_CXX_RECORD
|
|
// CHECK-NOT: <DECL_UPDATE_OFFSETS
|
|
|
|
//--- A1.cppm
|
|
module;
|
|
import M;
|
|
#include "foo.h"
|
|
export module A;
|
|
|
|
// CHECK-NOT: <DECL_CXX_RECORD
|
|
// CHECK-NOT: <DECL_UPDATE_OFFSETS
|
|
|