diff options
| author | Andrew Savonichev <andrew.savonichev@gmail.com> | 2021-05-24 13:29:59 +0300 |
|---|---|---|
| committer | Andrew Savonichev <andrew.savonichev@gmail.com> | 2021-06-07 12:54:08 +0300 |
| commit | b31f41e78b2722785f3df1da0d77dfcd68125d15 (patch) | |
| tree | 33901e9bef01b3ad0481ca3c7415a39831a58031 /clang/lib/CodeGen/CodeGenModule.cpp | |
| parent | 23c2f2e6b24d80d3472dca897feac10e9c34c51f (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.cpp | 8 |
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. |
