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