diff --git a/clang/lib/CodeGen/CodeGenModule.cpp b/clang/lib/CodeGen/CodeGenModule.cpp --- a/clang/lib/CodeGen/CodeGenModule.cpp +++ b/clang/lib/CodeGen/CodeGenModule.cpp @@ -4284,7 +4284,7 @@ OpenMPRuntime->emitTargetGlobalVariable(D)) return; - llvm::Constant *Init = nullptr; + llvm::TrackingVH Init; bool NeedsGlobalCtor = false; bool NeedsGlobalDtor = D->needsDestruction(getContext()) == QualType::DK_cxx_destructor; @@ -4330,9 +4330,8 @@ } else { initializedGlobalDecl = GlobalDecl(D); emitter.emplace(*this); - Init = emitter->tryEmitForInitializer(*InitDecl); - - if (!Init) { + llvm::Constant *Initializer = emitter->tryEmitForInitializer(*InitDecl); + if (!Initializer) { QualType T = InitExpr->getType(); if (D->getType()->isReferenceType()) T = D->getType(); @@ -4345,6 +4344,7 @@ Init = llvm::UndefValue::get(getTypes().ConvertType(T)); } } else { + Init = Initializer; // We don't need an initializer, so remove the entry for the delayed // initializer position (just in case this entry was delayed) if we // also don't need to register a destructor. diff --git a/clang/test/CodeGenCXX/dso-handle-custom.cpp b/clang/test/CodeGenCXX/dso-handle-custom.cpp new file mode 100644 --- /dev/null +++ b/clang/test/CodeGenCXX/dso-handle-custom.cpp @@ -0,0 +1,23 @@ +// 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); +}