mirror of
https://github.com/llvm/llvm-project.git
synced 2025-05-09 08:56:06 +00:00

This fixes PR49198: Wrong usage of __dso_handle in user code leads to a compiler crash. When Init is an address of the global itself, we need to track it across RAUW. Otherwise the initializer can be destroyed if the global is replaced. Differential Revision: https://reviews.llvm.org/D101156
24 lines
855 B
C++
24 lines
855 B
C++
// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -emit-llvm -fexceptions %s -o - | FileCheck %s --check-prefixes CHECK,CHECK-DEFAULT
|
|
// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -emit-llvm -fexceptions %s -o - -DHIDDEN | FileCheck %s --check-prefixes CHECK,CHECK-HIDDEN
|
|
|
|
class A {
|
|
public:
|
|
~A();
|
|
} a;
|
|
|
|
// CHECK-DEFAULT: @__dso_handle = global i8* bitcast (i8** @__dso_handle to i8*), align 8
|
|
// CHECK-HIDDEN: @__dso_handle = hidden global i8* bitcast (i8** @__dso_handle to i8*), align 8
|
|
// CHECK: define internal void @__cxx_global_var_init()
|
|
// CHECK: call i32 @__cxa_atexit({{.*}}, {{.*}}, i8* bitcast (i8** @__dso_handle to i8*))
|
|
|
|
#ifdef HIDDEN
|
|
void *__dso_handle __attribute__((__visibility__("hidden"))) = &__dso_handle;
|
|
#else
|
|
void *__dso_handle = &__dso_handle;
|
|
#endif
|
|
|
|
void use(void *);
|
|
void use_dso_handle() {
|
|
use(__dso_handle);
|
|
}
|