|
|
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 |
|