forked from OSchip/llvm-project
Fix a bug when emitting debug info for partially constant global variables.
While fixing a malformed testcase, I discovered that the code exercised by it was wrong, too. llvm-svn: 298664
This commit is contained in:
parent
11873949e0
commit
f0ffc5233d
|
@ -142,12 +142,6 @@ DIE *DwarfCompileUnit::getOrCreateGlobalVariableDIE(
|
|||
bool addToAccelTable = false;
|
||||
DIELoc *Loc = nullptr;
|
||||
std::unique_ptr<DIEDwarfExpression> DwarfExpr;
|
||||
bool AllConstant = std::all_of(
|
||||
GlobalExprs.begin(), GlobalExprs.end(),
|
||||
[&](const GlobalExpr GE) {
|
||||
return GE.Expr && GE.Expr->isConstant();
|
||||
});
|
||||
|
||||
for (const auto &GE : GlobalExprs) {
|
||||
const GlobalVariable *Global = GE.Var;
|
||||
const DIExpression *Expr = GE.Expr;
|
||||
|
@ -158,7 +152,8 @@ DIE *DwarfCompileUnit::getOrCreateGlobalVariableDIE(
|
|||
addConstantValue(*VariableDIE, /*Unsigned=*/true, Expr->getElement(1));
|
||||
// We cannot describe the location of dllimport'd variables: the
|
||||
// computation of their address requires loads from the IAT.
|
||||
} else if ((Global && !Global->hasDLLImportStorageClass()) || AllConstant) {
|
||||
} else if ((Global && !Global->hasDLLImportStorageClass()) ||
|
||||
(Expr && Expr->isConstant())) {
|
||||
if (!Loc) {
|
||||
Loc = new (DIEValueAllocator) DIELoc;
|
||||
DwarfExpr = llvm::make_unique<DIEDwarfExpression>(*Asm, *this, *Loc);
|
||||
|
|
|
@ -30,7 +30,7 @@ target triple = "x86_64-apple-macosx10.12.0"
|
|||
@point.y = global i32 2, align 4, !dbg !13
|
||||
@point.x = global i32 1, align 4, !dbg !12
|
||||
|
||||
@part_const.x = global i32 1, align 4, !dbg !15
|
||||
@part_const.x = global i32 1, align 4, !dbg !14
|
||||
|
||||
!llvm.dbg.cu = !{!1}
|
||||
!llvm.module.flags = !{!10, !11}
|
||||
|
|
Loading…
Reference in New Issue