tstellar / rpms / llvm

Forked from rpms/llvm 5 years ago
Clone
7a0f3d9
From 9848d812bc6a5ecbac4b64b28d580f5f5ce16c4f Mon Sep 17 00:00:00 2001
7a0f3d9
From: Bjorn Steinbrink <bsteinbr@gmail.com>
7a0f3d9
Date: Tue, 10 Oct 2017 07:46:17 +0000
7a0f3d9
Subject: [PATCH 1/2] Ignore all duplicate frame index expression
7a0f3d9
7a0f3d9
Some passes might duplicate calls to llvm.dbg.declare creating
7a0f3d9
duplicate frame index expression which currently trigger an assertion
7a0f3d9
which is meant to catch erroneous, overlapping fragment declarations.
7a0f3d9
But identical frame index expressions are just redundant and don't
7a0f3d9
actually conflict with each other, so we can be more lenient and just
7a0f3d9
ignore the duplicates.
7a0f3d9
7a0f3d9
Reviewers: aprantl, rnk
7a0f3d9
7a0f3d9
Subscribers: llvm-commits, JDevlieghere
7a0f3d9
7a0f3d9
Differential Revision: https://reviews.llvm.org/D38540
7a0f3d9
7a0f3d9
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@315279 91177308-0d34-0410-b5e6-96231b3b80d8
7a0f3d9
7a0f3d9
Conflicts:
7a0f3d9
	lib/CodeGen/AsmPrinter/DwarfDebug.h
7a0f3d9
---
7a0f3d9
 lib/CodeGen/AsmPrinter/DwarfDebug.cpp | 25 +++++++++++++++++++++++++
7a0f3d9
 lib/CodeGen/AsmPrinter/DwarfDebug.h   | 25 +------------------------
7a0f3d9
 2 files changed, 26 insertions(+), 24 deletions(-)
7a0f3d9
7a0f3d9
diff --git a/lib/CodeGen/AsmPrinter/DwarfDebug.cpp b/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
7a0f3d9
index f1b4d9f..90f6f2f 100644
7a0f3d9
--- a/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
7a0f3d9
+++ b/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
7a0f3d9
@@ -206,9 +206,34 @@ ArrayRef<DbgVariable::FrameIndexExpr> DbgVariable::getFrameIndexExprs() const {
7a0f3d9
               return A.Expr->getFragmentInfo()->OffsetInBits <
7a0f3d9
                      B.Expr->getFragmentInfo()->OffsetInBits;
7a0f3d9
             });
7a0f3d9
+
7a0f3d9
   return FrameIndexExprs;
7a0f3d9
 }
7a0f3d9
 
7a0f3d9
+void DbgVariable::addMMIEntry(const DbgVariable &V) {
7a0f3d9
+  assert(DebugLocListIndex == ~0U && !MInsn && "not an MMI entry");
7a0f3d9
+  assert(V.DebugLocListIndex == ~0U && !V.MInsn && "not an MMI entry");
7a0f3d9
+  assert(V.Var == Var && "conflicting variable");
7a0f3d9
+  assert(V.IA == IA && "conflicting inlined-at location");
7a0f3d9
+
7a0f3d9
+  assert(!FrameIndexExprs.empty() && "Expected an MMI entry");
7a0f3d9
+  assert(!V.FrameIndexExprs.empty() && "Expected an MMI entry");
7a0f3d9
+
7a0f3d9
+  for (const auto &FIE : V.FrameIndexExprs)
7a0f3d9
+    // Ignore duplicate entries.
7a0f3d9
+    if (llvm::none_of(FrameIndexExprs, [&](const FrameIndexExpr &Other) {
7a0f3d9
+          return FIE.FI == Other.FI && FIE.Expr == Other.Expr;
7a0f3d9
+        }))
7a0f3d9
+      FrameIndexExprs.push_back(FIE);
7a0f3d9
+
7a0f3d9
+  assert((FrameIndexExprs.size() == 1 ||
7a0f3d9
+          llvm::all_of(FrameIndexExprs,
7a0f3d9
+                       [](FrameIndexExpr &FIE) {
7a0f3d9
+                         return FIE.Expr && FIE.Expr->isFragment();
7a0f3d9
+                       })) &&
7a0f3d9
+         "conflicting locations for variable");
7a0f3d9
+}
7a0f3d9
+
7a0f3d9
 static const DwarfAccelTable::Atom TypeAtoms[] = {
7a0f3d9
     DwarfAccelTable::Atom(dwarf::DW_ATOM_die_offset, dwarf::DW_FORM_data4),
7a0f3d9
     DwarfAccelTable::Atom(dwarf::DW_ATOM_die_tag, dwarf::DW_FORM_data2),
7a0f3d9
diff --git a/lib/CodeGen/AsmPrinter/DwarfDebug.h b/lib/CodeGen/AsmPrinter/DwarfDebug.h
7a0f3d9
index 78ee9a1..44107aa 100644
7a0f3d9
--- a/lib/CodeGen/AsmPrinter/DwarfDebug.h
7a0f3d9
+++ b/lib/CodeGen/AsmPrinter/DwarfDebug.h
7a0f3d9
@@ -124,30 +124,7 @@ public:
7a0f3d9
   /// Get the FI entries, sorted by fragment offset.
7a0f3d9
   ArrayRef<FrameIndexExpr> getFrameIndexExprs() const;
7a0f3d9
   bool hasFrameIndexExprs() const { return !FrameIndexExprs.empty(); }
7a0f3d9
-
7a0f3d9
-  void addMMIEntry(const DbgVariable &V) {
7a0f3d9
-    assert(DebugLocListIndex == ~0U && !MInsn && "not an MMI entry");
7a0f3d9
-    assert(V.DebugLocListIndex == ~0U && !V.MInsn && "not an MMI entry");
7a0f3d9
-    assert(V.Var == Var && "conflicting variable");
7a0f3d9
-    assert(V.IA == IA && "conflicting inlined-at location");
7a0f3d9
-
7a0f3d9
-    assert(!FrameIndexExprs.empty() && "Expected an MMI entry");
7a0f3d9
-    assert(!V.FrameIndexExprs.empty() && "Expected an MMI entry");
7a0f3d9
-
7a0f3d9
-    if (FrameIndexExprs.size()) {
7a0f3d9
-      auto *Expr = FrameIndexExprs.back().Expr;
7a0f3d9
-      // Get rid of duplicate non-fragment entries. More than one non-fragment
7a0f3d9
-      // dbg.declare makes no sense so ignore all but the first.
7a0f3d9
-      if (!Expr || !Expr->isFragment())
7a0f3d9
-        return;
7a0f3d9
-    }
7a0f3d9
-    FrameIndexExprs.append(V.FrameIndexExprs.begin(), V.FrameIndexExprs.end());
7a0f3d9
-    assert(all_of(FrameIndexExprs,
7a0f3d9
-                  [](FrameIndexExpr &FIE) {
7a0f3d9
-                    return FIE.Expr && FIE.Expr->isFragment();
7a0f3d9
-                  }) &&
7a0f3d9
-           "conflicting locations for variable");
7a0f3d9
-  }
7a0f3d9
+  void addMMIEntry(const DbgVariable &V);
7a0f3d9
 
7a0f3d9
   // Translate tag to proper Dwarf tag.
7a0f3d9
   dwarf::Tag getTag() const {
7a0f3d9
-- 
7a0f3d9
1.8.3.1
7a0f3d9