Chuanqi Xu b0f10a1dc3
[C++20] [Modules] Don't generate the defintition for non-const available external variables (#93530)
Close https://github.com/llvm/llvm-project/issues/93497

The root cause of the problem is, we mark the variable from other
modules as constnant in LLVM incorrectly. This patch fixes this problem
by not emitting the defintition for non-const available external
variables. Since the non const available externally variable is not
helpful to the optimization.
2024-05-29 13:39:57 +08:00

52 lines
1.6 KiB
C++

// RUN: rm -rf %t
// RUN: mkdir %t
// RUN: split-file %s %t
// RUN: %clang_cc1 -std=c++20 -emit-module-interface -triple %itanium_abi_triple %t/parta.cppm -o %t/mod-parta.pcm
// RUN: %clang_cc1 -std=c++20 -emit-module-interface -triple %itanium_abi_triple %t/partb.cppm -o %t/mod-partb.pcm
// RUN: %clang_cc1 -std=c++20 -emit-module-interface -triple %itanium_abi_triple %t/mod.cppm \
// RUN: -fprebuilt-module-path=%t -o %t/mod.pcm
// RUN: %clang_cc1 -std=c++20 -triple %itanium_abi_triple %t/mod.pcm -emit-llvm -disable-llvm-passes -o - \
// RUN: -fprebuilt-module-path=%t | FileCheck %t/mod.cppm
// RUN: %clang_cc1 -std=c++20 -O2 -emit-module-interface -triple %itanium_abi_triple \
// RUN: -fprebuilt-module-path=%t %t/mod.cppm -o %t/mod.pcm
// RUN: %clang_cc1 -std=c++20 -O2 -triple %itanium_abi_triple %t/mod.pcm -emit-llvm \
// RUN: -fprebuilt-module-path=%t -disable-llvm-passes -o - | FileCheck %t/mod.cppm -check-prefix=CHECK-OPT
//--- parta.cppm
export module mod:parta;
export int a = 43;
export int foo() {
return 3 + a;
}
//--- partb.cppm
module mod:partb;
int b = 43;
int bar() {
return 43 + b;
}
//--- mod.cppm
export module mod;
import :parta;
import :partb;
export int use() {
return foo() + bar() + a + b;
}
// FIXME: The definition of the variables shouldn't be exported too.
// CHECK: @_ZW3mod1a = external global
// CHECK: @_ZW3mod1b = external global
// CHECK: declare{{.*}} i32 @_ZW3mod3foov
// CHECK: declare{{.*}} i32 @_ZW3mod3barv
// CHECK-OPT: @_ZW3mod1a = external global
// CHECK-OPT: @_ZW3mod1b = external global
// CHECK-OPT: declare{{.*}} i32 @_ZW3mod3foov
// CHECK-OPT: declare{{.*}} i32 @_ZW3mod3barv