[Lldb-commits] [lldb] r373208 - Use llvm for dumping DWARF expressions
Pavel Labath via lldb-commits
lldb-commits at lists.llvm.org
Mon Sep 30 06:44:17 PDT 2019
Author: labath
Date: Mon Sep 30 06:44:17 2019
New Revision: 373208
URL: http://llvm.org/viewvc/llvm-project?rev=373208&view=rev
Log:
Use llvm for dumping DWARF expressions
Summary:
It uses the new ability of ABI plugins to vend llvm::MCRegisterInfo
structs (which is what is needed to turn dwarf register numbers into
strings).
Reviewers: JDevlieghere, aprantl, jasonmolenda
Subscribers: tatyana-krasnukha, lldb-commits
Differential Revision: https://reviews.llvm.org/D67966
Modified:
lldb/trunk/include/lldb/Utility/DataExtractor.h
lldb/trunk/lit/SymbolFile/DWARF/debug_loc.s
lldb/trunk/lit/SymbolFile/DWARF/dwarf5_locations.s
lldb/trunk/source/Expression/DWARFExpression.cpp
lldb/trunk/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp
lldb/trunk/source/Symbol/ClangASTContext.cpp
lldb/trunk/unittests/Utility/ScalarTest.cpp
Modified: lldb/trunk/include/lldb/Utility/DataExtractor.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Utility/DataExtractor.h?rev=373208&r1=373207&r2=373208&view=diff
==============================================================================
--- lldb/trunk/include/lldb/Utility/DataExtractor.h (original)
+++ lldb/trunk/include/lldb/Utility/DataExtractor.h Mon Sep 30 06:44:17 2019
@@ -14,6 +14,7 @@
#include "lldb/lldb-forward.h"
#include "lldb/lldb-types.h"
#include "llvm/ADT/ArrayRef.h"
+#include "llvm/Support/DataExtractor.h"
#include <cassert>
#include <stdint.h>
@@ -995,6 +996,11 @@ public:
return {GetDataStart(), size_t(GetByteSize())};
}
+ llvm::DataExtractor GetAsLLVM() const {
+ return {GetData(), GetByteOrder() == lldb::eByteOrderLittle,
+ uint8_t(GetAddressByteSize())};
+ }
+
protected:
// Member variables
const uint8_t *m_start; ///< A pointer to the first byte of data.
Modified: lldb/trunk/lit/SymbolFile/DWARF/debug_loc.s
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/lit/SymbolFile/DWARF/debug_loc.s?rev=373208&r1=373207&r2=373208&view=diff
==============================================================================
--- lldb/trunk/lit/SymbolFile/DWARF/debug_loc.s (original)
+++ lldb/trunk/lit/SymbolFile/DWARF/debug_loc.s Mon Sep 30 06:44:17 2019
@@ -9,12 +9,12 @@
# RUN: | FileCheck %s
# CHECK-LABEL: image lookup -v -a 0
-# CHECK: Variable: {{.*}}, name = "x0", type = "int", location = rdi,
+# CHECK: Variable: {{.*}}, name = "x0", type = "int", location = DW_OP_reg5 RDI,
# CHECK: Variable: {{.*}}, name = "x1", type = "int", location = ,
# CHECK: Variable: {{.*}}, name = "x2", type = "int", location = ,
# CHECK-LABEL: image lookup -v -a 2
-# CHECK: Variable: {{.*}}, name = "x0", type = "int", location = rax,
+# CHECK: Variable: {{.*}}, name = "x0", type = "int", location = DW_OP_reg0 RAX,
# CHECK: Variable: {{.*}}, name = "x1", type = "int", location = ,
# CHECK: Variable: {{.*}}, name = "x2", type = "int", location = ,
Modified: lldb/trunk/lit/SymbolFile/DWARF/dwarf5_locations.s
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/lit/SymbolFile/DWARF/dwarf5_locations.s?rev=373208&r1=373207&r2=373208&view=diff
==============================================================================
--- lldb/trunk/lit/SymbolFile/DWARF/dwarf5_locations.s (original)
+++ lldb/trunk/lit/SymbolFile/DWARF/dwarf5_locations.s Mon Sep 30 06:44:17 2019
@@ -7,7 +7,7 @@
# RUN: lldb-test symbols %t | FileCheck %s
# CHECK: Variable{0x7fffffff00000011}, name = "color"
-# CHECK-SAME: location = DW_OP_addrx(0x0)
+# CHECK-SAME: location = DW_OP_addrx 0x0
.text
.section .debug_str,"MS", at progbits,1
Modified: lldb/trunk/source/Expression/DWARFExpression.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Expression/DWARFExpression.cpp?rev=373208&r1=373207&r2=373208&view=diff
==============================================================================
--- lldb/trunk/source/Expression/DWARFExpression.cpp (original)
+++ lldb/trunk/source/Expression/DWARFExpression.cpp Mon Sep 30 06:44:17 2019
@@ -88,413 +88,10 @@ void DWARFExpression::DumpLocation(Strea
lldb::offset_t length,
lldb::DescriptionLevel level,
ABI *abi) const {
- if (!m_data.ValidOffsetForDataOfSize(offset, length))
- return;
- const lldb::offset_t start_offset = offset;
- const lldb::offset_t end_offset = offset + length;
-
- // An operation within a DWARF expression may contain a sub-expression. The
- // motivating example for this is DW_OP_entry_value. Keep track of where each
- // each sub-expression ends.
- std::vector<lldb::offset_t> ends_of_subexprs;
-
- // "Finish" (i.e. print the closing right-parens) for sub-expressions up to
- // the specified \p op_offset.
- auto finish_subexpressions_to = [&](const lldb::offset_t op_offset) {
- while (!ends_of_subexprs.empty() && op_offset >= ends_of_subexprs.back()) {
- ends_of_subexprs.pop_back();
- s->Printf(")");
- if (!ends_of_subexprs.empty())
- s->Printf(" ");
- }
- };
-
- while (m_data.ValidOffset(offset) && offset < end_offset) {
- const lldb::offset_t op_offset = offset;
- const uint8_t op = m_data.GetU8(&offset);
- finish_subexpressions_to(op_offset);
-
- switch (level) {
- default:
- break;
-
- case lldb::eDescriptionLevelBrief:
- if (op_offset > start_offset)
- s->PutChar(' ');
- break;
-
- case lldb::eDescriptionLevelFull:
- case lldb::eDescriptionLevelVerbose:
- if (op_offset > start_offset)
- s->EOL();
- s->Indent();
- if (level == lldb::eDescriptionLevelFull)
- break;
- // Fall through for verbose and print offset and DW_OP prefix..
- s->Printf("0x%8.8" PRIx64 ": %s", op_offset,
- op >= DW_OP_APPLE_uninit ? "DW_OP_APPLE_" : "DW_OP_");
- break;
- }
-
- switch (op) {
- case DW_OP_addr:
- *s << "DW_OP_addr(" << m_data.GetAddress(&offset) << ") ";
- break; // 0x03 1 address
- case DW_OP_deref:
- *s << "DW_OP_deref";
- break; // 0x06
- case DW_OP_const1u:
- s->Printf("DW_OP_const1u(0x%2.2x)", m_data.GetU8(&offset));
- break; // 0x08 1 1-byte constant
- case DW_OP_const1s:
- s->Printf("DW_OP_const1s(0x%2.2x)", m_data.GetU8(&offset));
- break; // 0x09 1 1-byte constant
- case DW_OP_const2u:
- s->Printf("DW_OP_const2u(0x%4.4x)", m_data.GetU16(&offset));
- break; // 0x0a 1 2-byte constant
- case DW_OP_const2s:
- s->Printf("DW_OP_const2s(0x%4.4x)", m_data.GetU16(&offset));
- break; // 0x0b 1 2-byte constant
- case DW_OP_const4u:
- s->Printf("DW_OP_const4u(0x%8.8x)", m_data.GetU32(&offset));
- break; // 0x0c 1 4-byte constant
- case DW_OP_const4s:
- s->Printf("DW_OP_const4s(0x%8.8x)", m_data.GetU32(&offset));
- break; // 0x0d 1 4-byte constant
- case DW_OP_const8u:
- s->Printf("DW_OP_const8u(0x%16.16" PRIx64 ")", m_data.GetU64(&offset));
- break; // 0x0e 1 8-byte constant
- case DW_OP_const8s:
- s->Printf("DW_OP_const8s(0x%16.16" PRIx64 ")", m_data.GetU64(&offset));
- break; // 0x0f 1 8-byte constant
- case DW_OP_constu:
- s->Printf("DW_OP_constu(0x%" PRIx64 ")", m_data.GetULEB128(&offset));
- break; // 0x10 1 ULEB128 constant
- case DW_OP_consts:
- s->Printf("DW_OP_consts(0x%" PRId64 ")", m_data.GetSLEB128(&offset));
- break; // 0x11 1 SLEB128 constant
- case DW_OP_dup:
- s->PutCString("DW_OP_dup");
- break; // 0x12
- case DW_OP_drop:
- s->PutCString("DW_OP_drop");
- break; // 0x13
- case DW_OP_over:
- s->PutCString("DW_OP_over");
- break; // 0x14
- case DW_OP_pick:
- s->Printf("DW_OP_pick(0x%2.2x)", m_data.GetU8(&offset));
- break; // 0x15 1 1-byte stack index
- case DW_OP_swap:
- s->PutCString("DW_OP_swap");
- break; // 0x16
- case DW_OP_rot:
- s->PutCString("DW_OP_rot");
- break; // 0x17
- case DW_OP_xderef:
- s->PutCString("DW_OP_xderef");
- break; // 0x18
- case DW_OP_abs:
- s->PutCString("DW_OP_abs");
- break; // 0x19
- case DW_OP_and:
- s->PutCString("DW_OP_and");
- break; // 0x1a
- case DW_OP_div:
- s->PutCString("DW_OP_div");
- break; // 0x1b
- case DW_OP_minus:
- s->PutCString("DW_OP_minus");
- break; // 0x1c
- case DW_OP_mod:
- s->PutCString("DW_OP_mod");
- break; // 0x1d
- case DW_OP_mul:
- s->PutCString("DW_OP_mul");
- break; // 0x1e
- case DW_OP_neg:
- s->PutCString("DW_OP_neg");
- break; // 0x1f
- case DW_OP_not:
- s->PutCString("DW_OP_not");
- break; // 0x20
- case DW_OP_or:
- s->PutCString("DW_OP_or");
- break; // 0x21
- case DW_OP_plus:
- s->PutCString("DW_OP_plus");
- break; // 0x22
- case DW_OP_plus_uconst: // 0x23 1 ULEB128 addend
- s->Printf("DW_OP_plus_uconst(0x%" PRIx64 ")",
- m_data.GetULEB128(&offset));
- break;
-
- case DW_OP_shl:
- s->PutCString("DW_OP_shl");
- break; // 0x24
- case DW_OP_shr:
- s->PutCString("DW_OP_shr");
- break; // 0x25
- case DW_OP_shra:
- s->PutCString("DW_OP_shra");
- break; // 0x26
- case DW_OP_xor:
- s->PutCString("DW_OP_xor");
- break; // 0x27
- case DW_OP_skip:
- s->Printf("DW_OP_skip(0x%4.4x)", m_data.GetU16(&offset));
- break; // 0x2f 1 signed 2-byte constant
- case DW_OP_bra:
- s->Printf("DW_OP_bra(0x%4.4x)", m_data.GetU16(&offset));
- break; // 0x28 1 signed 2-byte constant
- case DW_OP_eq:
- s->PutCString("DW_OP_eq");
- break; // 0x29
- case DW_OP_ge:
- s->PutCString("DW_OP_ge");
- break; // 0x2a
- case DW_OP_gt:
- s->PutCString("DW_OP_gt");
- break; // 0x2b
- case DW_OP_le:
- s->PutCString("DW_OP_le");
- break; // 0x2c
- case DW_OP_lt:
- s->PutCString("DW_OP_lt");
- break; // 0x2d
- case DW_OP_ne:
- s->PutCString("DW_OP_ne");
- break; // 0x2e
-
- case DW_OP_lit0: // 0x30
- case DW_OP_lit1: // 0x31
- case DW_OP_lit2: // 0x32
- case DW_OP_lit3: // 0x33
- case DW_OP_lit4: // 0x34
- case DW_OP_lit5: // 0x35
- case DW_OP_lit6: // 0x36
- case DW_OP_lit7: // 0x37
- case DW_OP_lit8: // 0x38
- case DW_OP_lit9: // 0x39
- case DW_OP_lit10: // 0x3A
- case DW_OP_lit11: // 0x3B
- case DW_OP_lit12: // 0x3C
- case DW_OP_lit13: // 0x3D
- case DW_OP_lit14: // 0x3E
- case DW_OP_lit15: // 0x3F
- case DW_OP_lit16: // 0x40
- case DW_OP_lit17: // 0x41
- case DW_OP_lit18: // 0x42
- case DW_OP_lit19: // 0x43
- case DW_OP_lit20: // 0x44
- case DW_OP_lit21: // 0x45
- case DW_OP_lit22: // 0x46
- case DW_OP_lit23: // 0x47
- case DW_OP_lit24: // 0x48
- case DW_OP_lit25: // 0x49
- case DW_OP_lit26: // 0x4A
- case DW_OP_lit27: // 0x4B
- case DW_OP_lit28: // 0x4C
- case DW_OP_lit29: // 0x4D
- case DW_OP_lit30: // 0x4E
- case DW_OP_lit31:
- s->Printf("DW_OP_lit%i", op - DW_OP_lit0);
- break; // 0x4f
-
- case DW_OP_reg0: // 0x50
- case DW_OP_reg1: // 0x51
- case DW_OP_reg2: // 0x52
- case DW_OP_reg3: // 0x53
- case DW_OP_reg4: // 0x54
- case DW_OP_reg5: // 0x55
- case DW_OP_reg6: // 0x56
- case DW_OP_reg7: // 0x57
- case DW_OP_reg8: // 0x58
- case DW_OP_reg9: // 0x59
- case DW_OP_reg10: // 0x5A
- case DW_OP_reg11: // 0x5B
- case DW_OP_reg12: // 0x5C
- case DW_OP_reg13: // 0x5D
- case DW_OP_reg14: // 0x5E
- case DW_OP_reg15: // 0x5F
- case DW_OP_reg16: // 0x60
- case DW_OP_reg17: // 0x61
- case DW_OP_reg18: // 0x62
- case DW_OP_reg19: // 0x63
- case DW_OP_reg20: // 0x64
- case DW_OP_reg21: // 0x65
- case DW_OP_reg22: // 0x66
- case DW_OP_reg23: // 0x67
- case DW_OP_reg24: // 0x68
- case DW_OP_reg25: // 0x69
- case DW_OP_reg26: // 0x6A
- case DW_OP_reg27: // 0x6B
- case DW_OP_reg28: // 0x6C
- case DW_OP_reg29: // 0x6D
- case DW_OP_reg30: // 0x6E
- case DW_OP_reg31: // 0x6F
- {
- uint32_t reg_num = op - DW_OP_reg0;
- if (abi) {
- RegisterInfo reg_info;
- if (abi->GetRegisterInfoByKind(m_reg_kind, reg_num, reg_info)) {
- if (reg_info.name) {
- s->PutCString(reg_info.name);
- break;
- } else if (reg_info.alt_name) {
- s->PutCString(reg_info.alt_name);
- break;
- }
- }
- }
- s->Printf("DW_OP_reg%u", reg_num);
- break;
- } break;
-
- case DW_OP_breg0:
- case DW_OP_breg1:
- case DW_OP_breg2:
- case DW_OP_breg3:
- case DW_OP_breg4:
- case DW_OP_breg5:
- case DW_OP_breg6:
- case DW_OP_breg7:
- case DW_OP_breg8:
- case DW_OP_breg9:
- case DW_OP_breg10:
- case DW_OP_breg11:
- case DW_OP_breg12:
- case DW_OP_breg13:
- case DW_OP_breg14:
- case DW_OP_breg15:
- case DW_OP_breg16:
- case DW_OP_breg17:
- case DW_OP_breg18:
- case DW_OP_breg19:
- case DW_OP_breg20:
- case DW_OP_breg21:
- case DW_OP_breg22:
- case DW_OP_breg23:
- case DW_OP_breg24:
- case DW_OP_breg25:
- case DW_OP_breg26:
- case DW_OP_breg27:
- case DW_OP_breg28:
- case DW_OP_breg29:
- case DW_OP_breg30:
- case DW_OP_breg31: {
- uint32_t reg_num = op - DW_OP_breg0;
- int64_t reg_offset = m_data.GetSLEB128(&offset);
- if (abi) {
- RegisterInfo reg_info;
- if (abi->GetRegisterInfoByKind(m_reg_kind, reg_num, reg_info)) {
- if (reg_info.name) {
- s->Printf("[%s%+" PRIi64 "]", reg_info.name, reg_offset);
- break;
- } else if (reg_info.alt_name) {
- s->Printf("[%s%+" PRIi64 "]", reg_info.alt_name, reg_offset);
- break;
- }
- }
- }
- s->Printf("DW_OP_breg%i(0x%" PRIx64 ")", reg_num, reg_offset);
- } break;
-
- case DW_OP_regx: // 0x90 1 ULEB128 register
- {
- uint32_t reg_num = m_data.GetULEB128(&offset);
- if (abi) {
- RegisterInfo reg_info;
- if (abi->GetRegisterInfoByKind(m_reg_kind, reg_num, reg_info)) {
- if (reg_info.name) {
- s->PutCString(reg_info.name);
- break;
- } else if (reg_info.alt_name) {
- s->PutCString(reg_info.alt_name);
- break;
- }
- }
- }
- s->Printf("DW_OP_regx(%" PRIu32 ")", reg_num);
- break;
- } break;
- case DW_OP_fbreg: // 0x91 1 SLEB128 offset
- s->Printf("DW_OP_fbreg(%" PRIi64 ")", m_data.GetSLEB128(&offset));
- break;
- case DW_OP_bregx: // 0x92 2 ULEB128 register followed by SLEB128 offset
- {
- uint32_t reg_num = m_data.GetULEB128(&offset);
- int64_t reg_offset = m_data.GetSLEB128(&offset);
- if (abi) {
- RegisterInfo reg_info;
- if (abi->GetRegisterInfoByKind(m_reg_kind, reg_num, reg_info)) {
- if (reg_info.name) {
- s->Printf("[%s%+" PRIi64 "]", reg_info.name, reg_offset);
- break;
- } else if (reg_info.alt_name) {
- s->Printf("[%s%+" PRIi64 "]", reg_info.alt_name, reg_offset);
- break;
- }
- }
- }
- s->Printf("DW_OP_bregx(reg=%" PRIu32 ",offset=%" PRIi64 ")", reg_num,
- reg_offset);
- } break;
- case DW_OP_piece: // 0x93 1 ULEB128 size of piece addressed
- s->Printf("DW_OP_piece(0x%" PRIx64 ")", m_data.GetULEB128(&offset));
- break;
- case DW_OP_deref_size: // 0x94 1 1-byte size of data retrieved
- s->Printf("DW_OP_deref_size(0x%2.2x)", m_data.GetU8(&offset));
- break;
- case DW_OP_xderef_size: // 0x95 1 1-byte size of data retrieved
- s->Printf("DW_OP_xderef_size(0x%2.2x)", m_data.GetU8(&offset));
- break;
- case DW_OP_nop:
- s->PutCString("DW_OP_nop");
- break; // 0x96
- case DW_OP_push_object_address:
- s->PutCString("DW_OP_push_object_address");
- break; // 0x97 DWARF3
- case DW_OP_call2: // 0x98 DWARF3 1 2-byte offset of DIE
- s->Printf("DW_OP_call2(0x%4.4x)", m_data.GetU16(&offset));
- break;
- case DW_OP_call4: // 0x99 DWARF3 1 4-byte offset of DIE
- s->Printf("DW_OP_call4(0x%8.8x)", m_data.GetU32(&offset));
- break;
- case DW_OP_call_ref: // 0x9a DWARF3 1 4- or 8-byte offset of DIE
- s->Printf("DW_OP_call_ref(0x%8.8" PRIx64 ")", m_data.GetAddress(&offset));
- break;
- case DW_OP_form_tls_address:
- s->PutCString("DW_OP_form_tls_address"); // 0x9b
- break;
- case DW_OP_GNU_addr_index: // 0xfb
- s->Printf("DW_OP_GNU_addr_index(0x%" PRIx64 ")",
- m_data.GetULEB128(&offset));
- break;
- case DW_OP_addrx:
- s->Printf("DW_OP_addrx(0x%" PRIx64 ")",
- m_data.GetULEB128(&offset));
- break;
- case DW_OP_GNU_const_index: // 0xfc
- s->Printf("DW_OP_GNU_const_index(0x%" PRIx64 ")",
- m_data.GetULEB128(&offset));
- break;
- case DW_OP_GNU_push_tls_address:
- s->PutCString("DW_OP_GNU_push_tls_address"); // 0xe0
- break;
- case DW_OP_APPLE_uninit:
- s->PutCString("DW_OP_APPLE_uninit"); // 0xF0
- break;
- case DW_OP_entry_value: {
- uint32_t subexpr_len = m_data.GetULEB128(&offset);
- s->PutCString("DW_OP_entry_value(");
- ends_of_subexprs.push_back(offset + subexpr_len);
- break;
- }
- }
- }
-
- finish_subexpressions_to(end_offset);
+ llvm::DWARFExpression(DataExtractor(m_data, offset, length).GetAsLLVM(),
+ llvm::dwarf::DWARF_VERSION, m_data.GetAddressByteSize())
+ .print(s->AsRawOstream(), abi ? &abi->GetMCRegisterInfo() : nullptr,
+ nullptr);
}
void DWARFExpression::SetLocationListSlide(addr_t slide) {
Modified: lldb/trunk/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp?rev=373208&r1=373207&r2=373208&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp (original)
+++ lldb/trunk/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp Mon Sep 30 06:44:17 2019
@@ -86,7 +86,6 @@
#include "llvm/Support/raw_ostream.h"
#define DEBUGSERVER_BASENAME "debugserver"
-using namespace llvm;
using namespace lldb;
using namespace lldb_private;
using namespace lldb_private::process_gdb_remote;
Modified: lldb/trunk/source/Symbol/ClangASTContext.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Symbol/ClangASTContext.cpp?rev=373208&r1=373207&r2=373208&view=diff
==============================================================================
--- lldb/trunk/source/Symbol/ClangASTContext.cpp (original)
+++ lldb/trunk/source/Symbol/ClangASTContext.cpp Mon Sep 30 06:44:17 2019
@@ -103,8 +103,8 @@
using namespace lldb;
using namespace lldb_private;
-using namespace llvm;
using namespace clang;
+using llvm::StringSwitch;
namespace {
#ifdef LLDB_CONFIGURATION_DEBUG
Modified: lldb/trunk/unittests/Utility/ScalarTest.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/unittests/Utility/ScalarTest.cpp?rev=373208&r1=373207&r2=373208&view=diff
==============================================================================
--- lldb/trunk/unittests/Utility/ScalarTest.cpp (original)
+++ lldb/trunk/unittests/Utility/ScalarTest.cpp Mon Sep 30 06:44:17 2019
@@ -16,7 +16,9 @@
#include "llvm/Testing/Support/Error.h"
using namespace lldb_private;
-using namespace llvm;
+using llvm::APInt;
+using llvm::Failed;
+using llvm::Succeeded;
template <typename T>
bool checkInequality(T c1, T c2) {
More information about the lldb-commits
mailing list