mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-26 12:46:06 +00:00

`clang -fpic -fno-semantic-interposition` may set dso_local on variables for -fpic. GCC folks consider there are 'address interposition' and 'semantic interposition', and 'disabling semantic interposition' can optimize function calls but cannot change variable references to use local aliases (https://gcc.gnu.org/bugzilla/show_bug.cgi?id=100483). This patch removes dso_local for variables in `clang -fpic -fno-semantic-interposition` mode so that the built shared objects can work with copy relocations. Building llvm-project tiself with -fno-semantic-interposition (D102453) should now be safe with trunk Clang. Example: ``` // a.c int var; int *addr() { return var; } // old: cannot be interposed movslq .Lvar$local(%rip), %rax // new: can be interposed movq var@GOTPCREL(%rip), %rax movslq (%rax), %rax ``` The local alias lowering for `GlobalVariable`s is kept in case there is a future option allowing local aliases. Reviewed By: rnk Differential Revision: https://reviews.llvm.org/D102583
55 lines
1.2 KiB
C
55 lines
1.2 KiB
C
// RUN: %clang_cc1 -emit-llvm -triple i386-linux-gnu -o %t %s
|
|
// RUN: FileCheck --input-file=%t %s
|
|
|
|
// CHECK: @test1_f = extern_weak global i32
|
|
extern int test1_f;
|
|
static int test1_g __attribute__((weakref("test1_f")));
|
|
int test1_h(void) {
|
|
return test1_g;
|
|
}
|
|
|
|
// CHECK: @test2_f = global i32 0, align 4
|
|
int test2_f;
|
|
static int test2_g __attribute__((weakref("test2_f")));
|
|
int test2_h(void) {
|
|
return test2_g;
|
|
}
|
|
|
|
// CHECK: @test3_f = external global i32
|
|
extern int test3_f;
|
|
static int test3_g __attribute__((weakref("test3_f")));
|
|
int test3_foo(void) {
|
|
return test3_f;
|
|
}
|
|
int test3_h(void) {
|
|
return test3_g;
|
|
}
|
|
|
|
// CHECK: @test4_f = global i32 0, align 4
|
|
extern int test4_f;
|
|
static int test4_g __attribute__((weakref("test4_f")));
|
|
int test4_h(void) {
|
|
return test4_g;
|
|
}
|
|
int test4_f;
|
|
|
|
// CHECK: @test5_f = external global i32
|
|
extern int test5_f;
|
|
static int test5_g __attribute__((weakref("test5_f")));
|
|
int test5_h(void) {
|
|
return test5_g;
|
|
}
|
|
int test5_foo(void) {
|
|
return test5_f;
|
|
}
|
|
|
|
// CHECK: @test6_f = extern_weak global i32
|
|
extern int test6_f __attribute__((weak));
|
|
static int test6_g __attribute__((weakref("test6_f")));
|
|
int test6_h(void) {
|
|
return test6_g;
|
|
}
|
|
int test6_foo(void) {
|
|
return test6_f;
|
|
}
|