UnwindPlan: pretty-print dwarf expressions

Summary:
Previously we were printing the dwarf expressions in unwind rules simply
as "dwarf-expr". This patch uses the existing dwarf-printing
capabilities in lldb to enhance this dump output, and print the full
decoded dwarf expression.

Reviewers: jasonmolenda, clayborg

Subscribers: aprantl, lldb-commits

Differential Revision: https://reviews.llvm.org/D60949

llvm-svn: 358959
This commit is contained in:
Pavel Labath 2019-04-23 09:16:51 +00:00
parent 63a2aa715a
commit 7a78420353
3 changed files with 62 additions and 4 deletions

View File

@ -0,0 +1,13 @@
.text
.globl main
.type main, @function
main:
.LFB0:
.cfi_startproc
.cfi_escape 0x0f, 0x05, 0x77, 0x00, 0x08, 0x00, 0x22
.cfi_escape 0x16, 0x10, 0x04, 0x09, 0xf8, 0x22, 0x06
movl $47, %eax
ret
.cfi_endproc
.LFE0:
.size main, .-main

View File

@ -0,0 +1,14 @@
# REQUIRES: target-x86_64, system-linux, native
# RUN: %clang %p/Inputs/unwind-plan-dwarf-dump.s -o %t
# RUN: %lldb %t -s %s -o exit | FileCheck %s
breakpoint set -n main
# CHECK: Breakpoint 1:
process launch
# CHECK: stop reason = breakpoint 1.1
target modules show-unwind -n main
# CHECK: eh_frame UnwindPlan:
# CHECK: row[0]: 0: CFA=DW_OP_breg7 +0, DW_OP_const1u 0x00, DW_OP_plus => rip=DW_OP_const1s -8, DW_OP_plus , DW_OP_deref

View File

@ -8,8 +8,10 @@
#include "lldb/Symbol/UnwindPlan.h"
#include "lldb/Expression/DWARFExpression.h"
#include "lldb/Target/Process.h"
#include "lldb/Target/RegisterContext.h"
#include "lldb/Target/Target.h"
#include "lldb/Target/Thread.h"
#include "lldb/Utility/ConstString.h"
#include "lldb/Utility/Log.h"
@ -64,6 +66,30 @@ void UnwindPlan::Row::RegisterLocation::SetIsDWARFExpression(
m_location.expr.length = len;
}
static llvm::Optional<std::pair<lldb::ByteOrder, uint32_t>>
GetByteOrderAndAddrSize(Thread *thread) {
if (!thread)
return llvm::None;
ProcessSP process_sp = thread->GetProcess();
if (!process_sp)
return llvm::None;
ArchSpec arch = process_sp->GetTarget().GetArchitecture();
return std::make_pair(arch.GetByteOrder(), arch.GetAddressByteSize());
}
static void DumpDWARFExpr(Stream &s, llvm::ArrayRef<uint8_t> expr, Thread *thread) {
if (auto order_and_width = GetByteOrderAndAddrSize(thread)) {
DataExtractor extractor(expr.data(), expr.size(), order_and_width->first,
order_and_width->second);
if (!DWARFExpression::PrintDWARFExpression(s, extractor,
order_and_width->second,
/*dwarf_ref_size*/ 4,
/*location_expression*/ false))
s.PutCString("invalid-dwarf-expr");
} else
s.PutCString("dwarf-expr");
}
void UnwindPlan::Row::RegisterLocation::Dump(Stream &s,
const UnwindPlan *unwind_plan,
const UnwindPlan::Row *row,
@ -120,9 +146,12 @@ void UnwindPlan::Row::RegisterLocation::Dump(Stream &s,
case isDWARFExpression: {
s.PutChar('=');
if (m_type == atDWARFExpression)
s.PutCString("[dwarf-expr]");
else
s.PutCString("dwarf-expr");
s.PutChar('[');
DumpDWARFExpr(
s, llvm::makeArrayRef(m_location.expr.opcodes, m_location.expr.length),
thread);
if (m_type == atDWARFExpression)
s.PutChar(']');
} break;
}
}
@ -172,7 +201,9 @@ void UnwindPlan::Row::FAValue::Dump(Stream &s, const UnwindPlan *unwind_plan,
s.PutChar(']');
break;
case isDWARFExpression:
s.PutCString("dwarf-expr");
DumpDWARFExpr(s,
llvm::makeArrayRef(m_value.expr.opcodes, m_value.expr.length),
thread);
break;
default:
s.PutCString("unspecified");