summaryrefslogtreecommitdiff
path: root/clang/lib/CodeGen/CodeGenModule.cpp
diff options
context:
space:
mode:
authorAndrew Savonichev <andrew.savonichev@gmail.com>2021-05-24 13:29:59 +0300
committerAndrew Savonichev <andrew.savonichev@gmail.com>2021-06-07 12:54:08 +0300
commitb31f41e78b2722785f3df1da0d77dfcd68125d15 (patch)
tree33901e9bef01b3ad0481ca3c7415a39831a58031 /clang/lib/CodeGen/CodeGenModule.cpp
parent23c2f2e6b24d80d3472dca897feac10e9c34c51f (diff)
[Clang] Support a user-defined __dso_handle
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
Diffstat (limited to 'clang/lib/CodeGen/CodeGenModule.cpp')
-rw-r--r--clang/lib/CodeGen/CodeGenModule.cpp8
1 files changed, 4 insertions, 4 deletions
diff --git a/clang/lib/CodeGen/CodeGenModule.cpp b/clang/lib/CodeGen/CodeGenModule.cpp
index 9b31ecdbd81a..1f23ce7de52b 100644
--- a/clang/lib/CodeGen/CodeGenModule.cpp
+++ b/clang/lib/CodeGen/CodeGenModule.cpp
@@ -4284,7 +4284,7 @@ void CodeGenModule::EmitGlobalVarDefinition(const VarDecl *D,
OpenMPRuntime->emitTargetGlobalVariable(D))
return;
- llvm::Constant *Init = nullptr;
+ llvm::TrackingVH<llvm::Constant> Init;
bool NeedsGlobalCtor = false;
bool NeedsGlobalDtor =
D->needsDestruction(getContext()) == QualType::DK_cxx_destructor;
@@ -4330,9 +4330,8 @@ void CodeGenModule::EmitGlobalVarDefinition(const VarDecl *D,
} 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 @@ void CodeGenModule::EmitGlobalVarDefinition(const VarDecl *D,
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.