This patch adds a per-global code model attribute, which can override the target's code model to access global variables. Currently, the code model attribute is only supported on LoongArch. This patch also maps GCC's code model names to LLVM's, which allows for better compatibility between the two compilers. Suggested-by: Arthur Eubanks <aeubanks@google.com> Link: https://discourse.llvm.org/t/how-to-best-implement-code-model-overriding-for-certain-values/71816 Link: https://discourse.llvm.org/t/rfc-add-per-global-code-model-attribute/74944 --------- Signed-off-by: WANG Rui <wangrui@loongson.cn>
35 lines
828 B
C++
35 lines
828 B
C++
// RUN: %clang_cc1 -emit-llvm -triple loongarch64 %s -o - | FileCheck %s
|
|
|
|
// CHECK: @_ZL2v1 ={{.*}} global i32 0, code_model "small"
|
|
static int v1 __attribute__((model("normal")));
|
|
|
|
void use1() {
|
|
v1 = 1;
|
|
}
|
|
|
|
// CHECK: @v2 ={{.*}} global i32 0, code_model "medium"
|
|
int v2 __attribute__((model("medium")));
|
|
|
|
// CHECK: @v3 ={{.*}} global float 0.000000e+00, code_model "large"
|
|
float v3 __attribute__((model("extreme")));
|
|
|
|
// CHECK: @_ZL2v4IiE ={{.*}} global i32 0, code_model "medium"
|
|
template <typename T>
|
|
static T v4 __attribute__((model("medium")));
|
|
|
|
void use2() {
|
|
v4<int> = 1;
|
|
}
|
|
|
|
struct S {
|
|
double d;
|
|
};
|
|
|
|
// CHECK: @v5 ={{.*}} global {{.*}}, code_model "medium"
|
|
S v5 __attribute__((model("medium")));
|
|
|
|
typedef void (*F)();
|
|
|
|
// CHECK: @v6 ={{.*}} global ptr null, code_model "large"
|
|
F v6 __attribute__((model("extreme")));
|