Fix a bug when emitting debug info for partially constant global variables.
authorAdrian Prantl <aprantl@apple.com>
Thu, 23 Mar 2017 23:35:00 +0000 (23:35 +0000)
committerAdrian Prantl <aprantl@apple.com>
Thu, 23 Mar 2017 23:35:00 +0000 (23:35 +0000)
While fixing a malformed testcase, I discovered that the code
exercised by it was wrong, too.

llvm-svn: 298664

llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp
llvm/test/DebugInfo/X86/split-global.ll

index 60973f3..4071246 100644 (file)
@@ -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);
index 536ed04..3cdecda 100644 (file)
@@ -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}