[Lldb-commits] [lldb] ba03bcb - [lldb] Remove custom DWARF expression printing code
Pavel Labath via lldb-commits
lldb-commits at lists.llvm.org
Mon May 25 07:11:03 PDT 2020
Author: Pavel Labath
Date: 2020-05-25T16:09:25+02:00
New Revision: ba03bcbc4a21b92f6a4a54bd6e90417956da7952
URL: https://github.com/llvm/llvm-project/commit/ba03bcbc4a21b92f6a4a54bd6e90417956da7952
DIFF: https://github.com/llvm/llvm-project/commit/ba03bcbc4a21b92f6a4a54bd6e90417956da7952.diff
LOG: [lldb] Remove custom DWARF expression printing code
The llvm DWARFExpression dump is nearly identical, but better -- for
example it does print a spurious space after zero-argument expressions.
Some parts of our code (variable locations) have been already switched
to llvm-based expression dumping. This switches the remainder: unwind
plans and some unit tests.
Added:
Modified:
lldb/include/lldb/Expression/DWARFExpression.h
lldb/source/Expression/DWARFExpression.cpp
lldb/source/Plugins/SymbolFile/DWARF/DWARFDefines.cpp
lldb/source/Plugins/SymbolFile/DWARF/DWARFDefines.h
lldb/source/Symbol/UnwindPlan.cpp
lldb/test/Shell/SymbolFile/Breakpad/stack-cfi-arm.yaml
lldb/test/Shell/SymbolFile/Breakpad/stack-cfi-parsing.test
lldb/test/Shell/SymbolFile/Breakpad/unwind-via-raSearch.test
lldb/test/Shell/SymbolFile/Breakpad/unwind-via-stack-cfi.test
lldb/test/Shell/SymbolFile/Breakpad/unwind-via-stack-win.test
lldb/test/Shell/Unwind/eh-frame-dwarf-unwind.test
lldb/test/Shell/Unwind/unwind-plan-dwarf-dump.test
lldb/unittests/Symbol/PostfixExpressionTest.cpp
lldb/unittests/SymbolFile/NativePDB/PdbFPOProgramToDWARFExpressionTests.cpp
Removed:
################################################################################
diff --git a/lldb/include/lldb/Expression/DWARFExpression.h b/lldb/include/lldb/Expression/DWARFExpression.h
index 302936172ed2..6b63b186e3e4 100644
--- a/lldb/include/lldb/Expression/DWARFExpression.h
+++ b/lldb/include/lldb/Expression/DWARFExpression.h
@@ -217,14 +217,6 @@ class DWARFExpression {
lldb::addr_t func_load_addr, lldb::addr_t address,
ABI *abi);
- static bool PrintDWARFExpression(Stream &s, const DataExtractor &data,
- int address_size, int dwarf_ref_size,
- bool location_expression);
-
- static void PrintDWARFLocationList(Stream &s, const DWARFUnit *cu,
- const DataExtractor &debug_loc_data,
- lldb::offset_t offset);
-
bool MatchesOperand(StackFrame &frame, const Instruction::Operand &op);
private:
diff --git a/lldb/source/Expression/DWARFExpression.cpp b/lldb/source/Expression/DWARFExpression.cpp
index e85b5f341fe5..f8fc1db7ec29 100644
--- a/lldb/source/Expression/DWARFExpression.cpp
+++ b/lldb/source/Expression/DWARFExpression.cpp
@@ -2566,235 +2566,6 @@ bool DWARFExpression::Evaluate(
return true; // Return true on success
}
-static bool print_dwarf_exp_op(Stream &s, const DataExtractor &data,
- lldb::offset_t *offset_ptr, int address_size,
- int dwarf_ref_size) {
- uint8_t opcode = data.GetU8(offset_ptr);
- DRC_class opcode_class;
- uint64_t uint;
- int64_t sint;
-
- int size;
-
- opcode_class = DW_OP_value_to_class(opcode) & (~DRC_DWARFv3);
-
- s.Printf("%s ", DW_OP_value_to_name(opcode));
-
- /* Does this take zero parameters? If so we can shortcut this function. */
- if (opcode_class == DRC_ZEROOPERANDS)
- return true;
-
- if (opcode_class == DRC_TWOOPERANDS && opcode == DW_OP_bregx) {
- uint = data.GetULEB128(offset_ptr);
- sint = data.GetSLEB128(offset_ptr);
- s.Printf("%" PRIu64 " %" PRIi64, uint, sint);
- return true;
- }
- if (opcode_class == DRC_TWOOPERANDS && opcode == DW_OP_entry_value) {
- uint = data.GetULEB128(offset_ptr);
- s.Printf("%" PRIu64 " ", uint);
- return true;
- }
- if (opcode_class != DRC_ONEOPERAND) {
- s.Printf("UNKNOWN OP %u", opcode);
- return false;
- }
-
- switch (opcode) {
- case DW_OP_addr:
- size = address_size;
- break;
- case DW_OP_const1u:
- size = 1;
- break;
- case DW_OP_const1s:
- size = -1;
- break;
- case DW_OP_const2u:
- size = 2;
- break;
- case DW_OP_const2s:
- size = -2;
- break;
- case DW_OP_const4u:
- size = 4;
- break;
- case DW_OP_const4s:
- size = -4;
- break;
- case DW_OP_const8u:
- size = 8;
- break;
- case DW_OP_const8s:
- size = -8;
- break;
- case DW_OP_constu:
- size = 128;
- break;
- case DW_OP_consts:
- size = -128;
- break;
- case DW_OP_fbreg:
- size = -128;
- 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:
- size = -128;
- break;
- case DW_OP_pick:
- case DW_OP_deref_size:
- case DW_OP_xderef_size:
- size = 1;
- break;
- case DW_OP_skip:
- case DW_OP_bra:
- size = -2;
- break;
- case DW_OP_call2:
- size = 2;
- break;
- case DW_OP_call4:
- size = 4;
- break;
- case DW_OP_call_ref:
- size = dwarf_ref_size;
- break;
- case DW_OP_addrx:
- case DW_OP_piece:
- case DW_OP_plus_uconst:
- case DW_OP_regx:
- case DW_OP_GNU_addr_index:
- case DW_OP_GNU_const_index:
- case DW_OP_entry_value:
- size = 128;
- break;
- default:
- s.Printf("UNKNOWN ONE-OPERAND OPCODE, #%u", opcode);
- return false;
- }
-
- switch (size) {
- case -1:
- sint = (int8_t)data.GetU8(offset_ptr);
- s.Printf("%+" PRIi64, sint);
- break;
- case -2:
- sint = (int16_t)data.GetU16(offset_ptr);
- s.Printf("%+" PRIi64, sint);
- break;
- case -4:
- sint = (int32_t)data.GetU32(offset_ptr);
- s.Printf("%+" PRIi64, sint);
- break;
- case -8:
- sint = (int64_t)data.GetU64(offset_ptr);
- s.Printf("%+" PRIi64, sint);
- break;
- case -128:
- sint = data.GetSLEB128(offset_ptr);
- s.Printf("%+" PRIi64, sint);
- break;
- case 1:
- uint = data.GetU8(offset_ptr);
- s.Printf("0x%2.2" PRIx64, uint);
- break;
- case 2:
- uint = data.GetU16(offset_ptr);
- s.Printf("0x%4.4" PRIx64, uint);
- break;
- case 4:
- uint = data.GetU32(offset_ptr);
- s.Printf("0x%8.8" PRIx64, uint);
- break;
- case 8:
- uint = data.GetU64(offset_ptr);
- s.Printf("0x%16.16" PRIx64, uint);
- break;
- case 128:
- uint = data.GetULEB128(offset_ptr);
- s.Printf("0x%" PRIx64, uint);
- break;
- }
-
- return true;
-}
-
-bool DWARFExpression::PrintDWARFExpression(Stream &s, const DataExtractor &data,
- int address_size, int dwarf_ref_size,
- bool location_expression) {
- int op_count = 0;
- lldb::offset_t offset = 0;
- while (data.ValidOffset(offset)) {
- if (location_expression && op_count > 0)
- return false;
- if (op_count > 0)
- s.PutCString(", ");
- if (!print_dwarf_exp_op(s, data, &offset, address_size, dwarf_ref_size))
- return false;
- op_count++;
- }
-
- return true;
-}
-
-void DWARFExpression::PrintDWARFLocationList(
- Stream &s, const DWARFUnit *cu, const DataExtractor &debug_loc_data,
- lldb::offset_t offset) {
- uint64_t start_addr, end_addr;
- uint32_t addr_size = DWARFUnit::GetAddressByteSize(cu);
- s.SetAddressByteSize(DWARFUnit::GetAddressByteSize(cu));
- dw_addr_t base_addr = cu ? cu->GetBaseAddress() : 0;
- while (debug_loc_data.ValidOffset(offset)) {
- start_addr = debug_loc_data.GetMaxU64(&offset, addr_size);
- end_addr = debug_loc_data.GetMaxU64(&offset, addr_size);
-
- if (start_addr == 0 && end_addr == 0)
- break;
-
- s.PutCString("\n ");
- s.Indent();
- if (cu)
- DumpAddressRange(s.AsRawOstream(), start_addr + base_addr,
- end_addr + base_addr, cu->GetAddressByteSize(), nullptr,
- ": ");
- uint32_t loc_length = debug_loc_data.GetU16(&offset);
-
- DataExtractor locationData(debug_loc_data, offset, loc_length);
- PrintDWARFExpression(s, locationData, addr_size, 4, false);
- offset += loc_length;
- }
-}
-
static DataExtractor ToDataExtractor(const llvm::DWARFLocationExpression &loc,
ByteOrder byte_order, uint32_t addr_size) {
auto buffer_sp =
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDefines.cpp b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDefines.cpp
index 29db1101d997..4e99a295ce50 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDefines.cpp
+++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDefines.cpp
@@ -58,321 +58,6 @@ const char *DW_OP_value_to_name(uint32_t val) {
return llvmstr.data();
}
-DRC_class DW_OP_value_to_class(uint32_t val) {
- // FIXME: If we just used llvm's DWARFExpression printer, we could delete
- // all this code (and more in lldb's DWARFExpression.cpp).
- switch (val) {
- case 0x03:
- return DRC_ONEOPERAND;
- case 0x06:
- return DRC_ZEROOPERANDS;
- case 0x08:
- return DRC_ONEOPERAND;
- case 0x09:
- return DRC_ONEOPERAND;
- case 0x0a:
- return DRC_ONEOPERAND;
- case 0x0b:
- return DRC_ONEOPERAND;
- case 0x0c:
- return DRC_ONEOPERAND;
- case 0x0d:
- return DRC_ONEOPERAND;
- case 0x0e:
- return DRC_ONEOPERAND;
- case 0x0f:
- return DRC_ONEOPERAND;
- case 0x10:
- return DRC_ONEOPERAND;
- case 0x11:
- return DRC_ONEOPERAND;
- case 0x12:
- return DRC_ZEROOPERANDS;
- case 0x13:
- return DRC_ZEROOPERANDS;
- case 0x14:
- return DRC_ZEROOPERANDS;
- case 0x15:
- return DRC_ONEOPERAND;
- case 0x16:
- return DRC_ZEROOPERANDS;
- case 0x17:
- return DRC_ZEROOPERANDS;
- case 0x18:
- return DRC_ZEROOPERANDS;
- case 0x19:
- return DRC_ZEROOPERANDS;
- case 0x1a:
- return DRC_ZEROOPERANDS;
- case 0x1b:
- return DRC_ZEROOPERANDS;
- case 0x1c:
- return DRC_ZEROOPERANDS;
- case 0x1d:
- return DRC_ZEROOPERANDS;
- case 0x1e:
- return DRC_ZEROOPERANDS;
- case 0x1f:
- return DRC_ZEROOPERANDS;
- case 0x20:
- return DRC_ZEROOPERANDS;
- case 0x21:
- return DRC_ZEROOPERANDS;
- case 0x22:
- return DRC_ZEROOPERANDS;
- case 0x23:
- return DRC_ONEOPERAND;
- case 0x24:
- return DRC_ZEROOPERANDS;
- case 0x25:
- return DRC_ZEROOPERANDS;
- case 0x26:
- return DRC_ZEROOPERANDS;
- case 0x27:
- return DRC_ZEROOPERANDS;
- case 0x2f:
- return DRC_ONEOPERAND;
- case 0x28:
- return DRC_ONEOPERAND;
- case 0x29:
- return DRC_ZEROOPERANDS;
- case 0x2a:
- return DRC_ZEROOPERANDS;
- case 0x2b:
- return DRC_ZEROOPERANDS;
- case 0x2c:
- return DRC_ZEROOPERANDS;
- case 0x2d:
- return DRC_ZEROOPERANDS;
- case 0x2e:
- return DRC_ZEROOPERANDS;
- case 0x30:
- return DRC_ZEROOPERANDS;
- case 0x31:
- return DRC_ZEROOPERANDS;
- case 0x32:
- return DRC_ZEROOPERANDS;
- case 0x33:
- return DRC_ZEROOPERANDS;
- case 0x34:
- return DRC_ZEROOPERANDS;
- case 0x35:
- return DRC_ZEROOPERANDS;
- case 0x36:
- return DRC_ZEROOPERANDS;
- case 0x37:
- return DRC_ZEROOPERANDS;
- case 0x38:
- return DRC_ZEROOPERANDS;
- case 0x39:
- return DRC_ZEROOPERANDS;
- case 0x3a:
- return DRC_ZEROOPERANDS;
- case 0x3b:
- return DRC_ZEROOPERANDS;
- case 0x3c:
- return DRC_ZEROOPERANDS;
- case 0x3d:
- return DRC_ZEROOPERANDS;
- case 0x3e:
- return DRC_ZEROOPERANDS;
- case 0x3f:
- return DRC_ZEROOPERANDS;
- case 0x40:
- return DRC_ZEROOPERANDS;
- case 0x41:
- return DRC_ZEROOPERANDS;
- case 0x42:
- return DRC_ZEROOPERANDS;
- case 0x43:
- return DRC_ZEROOPERANDS;
- case 0x44:
- return DRC_ZEROOPERANDS;
- case 0x45:
- return DRC_ZEROOPERANDS;
- case 0x46:
- return DRC_ZEROOPERANDS;
- case 0x47:
- return DRC_ZEROOPERANDS;
- case 0x48:
- return DRC_ZEROOPERANDS;
- case 0x49:
- return DRC_ZEROOPERANDS;
- case 0x4a:
- return DRC_ZEROOPERANDS;
- case 0x4b:
- return DRC_ZEROOPERANDS;
- case 0x4c:
- return DRC_ZEROOPERANDS;
- case 0x4d:
- return DRC_ZEROOPERANDS;
- case 0x4e:
- return DRC_ZEROOPERANDS;
- case 0x4f:
- return DRC_ZEROOPERANDS;
- case 0x50:
- return DRC_ZEROOPERANDS;
- case 0x51:
- return DRC_ZEROOPERANDS;
- case 0x52:
- return DRC_ZEROOPERANDS;
- case 0x53:
- return DRC_ZEROOPERANDS;
- case 0x54:
- return DRC_ZEROOPERANDS;
- case 0x55:
- return DRC_ZEROOPERANDS;
- case 0x56:
- return DRC_ZEROOPERANDS;
- case 0x57:
- return DRC_ZEROOPERANDS;
- case 0x58:
- return DRC_ZEROOPERANDS;
- case 0x59:
- return DRC_ZEROOPERANDS;
- case 0x5a:
- return DRC_ZEROOPERANDS;
- case 0x5b:
- return DRC_ZEROOPERANDS;
- case 0x5c:
- return DRC_ZEROOPERANDS;
- case 0x5d:
- return DRC_ZEROOPERANDS;
- case 0x5e:
- return DRC_ZEROOPERANDS;
- case 0x5f:
- return DRC_ZEROOPERANDS;
- case 0x60:
- return DRC_ZEROOPERANDS;
- case 0x61:
- return DRC_ZEROOPERANDS;
- case 0x62:
- return DRC_ZEROOPERANDS;
- case 0x63:
- return DRC_ZEROOPERANDS;
- case 0x64:
- return DRC_ZEROOPERANDS;
- case 0x65:
- return DRC_ZEROOPERANDS;
- case 0x66:
- return DRC_ZEROOPERANDS;
- case 0x67:
- return DRC_ZEROOPERANDS;
- case 0x68:
- return DRC_ZEROOPERANDS;
- case 0x69:
- return DRC_ZEROOPERANDS;
- case 0x6a:
- return DRC_ZEROOPERANDS;
- case 0x6b:
- return DRC_ZEROOPERANDS;
- case 0x6c:
- return DRC_ZEROOPERANDS;
- case 0x6d:
- return DRC_ZEROOPERANDS;
- case 0x6e:
- return DRC_ZEROOPERANDS;
- case 0x6f:
- return DRC_ZEROOPERANDS;
- case 0x70:
- return DRC_ONEOPERAND;
- case 0x71:
- return DRC_ONEOPERAND;
- case 0x72:
- return DRC_ONEOPERAND;
- case 0x73:
- return DRC_ONEOPERAND;
- case 0x74:
- return DRC_ONEOPERAND;
- case 0x75:
- return DRC_ONEOPERAND;
- case 0x76:
- return DRC_ONEOPERAND;
- case 0x77:
- return DRC_ONEOPERAND;
- case 0x78:
- return DRC_ONEOPERAND;
- case 0x79:
- return DRC_ONEOPERAND;
- case 0x7a:
- return DRC_ONEOPERAND;
- case 0x7b:
- return DRC_ONEOPERAND;
- case 0x7c:
- return DRC_ONEOPERAND;
- case 0x7d:
- return DRC_ONEOPERAND;
- case 0x7e:
- return DRC_ONEOPERAND;
- case 0x7f:
- return DRC_ONEOPERAND;
- case 0x80:
- return DRC_ONEOPERAND;
- case 0x81:
- return DRC_ONEOPERAND;
- case 0x82:
- return DRC_ONEOPERAND;
- case 0x83:
- return DRC_ONEOPERAND;
- case 0x84:
- return DRC_ONEOPERAND;
- case 0x85:
- return DRC_ONEOPERAND;
- case 0x86:
- return DRC_ONEOPERAND;
- case 0x87:
- return DRC_ONEOPERAND;
- case 0x88:
- return DRC_ONEOPERAND;
- case 0x89:
- return DRC_ONEOPERAND;
- case 0x8a:
- return DRC_ONEOPERAND;
- case 0x8b:
- return DRC_ONEOPERAND;
- case 0x8c:
- return DRC_ONEOPERAND;
- case 0x8d:
- return DRC_ONEOPERAND;
- case 0x8e:
- return DRC_ONEOPERAND;
- case 0x8f:
- return DRC_ONEOPERAND;
- case 0x90:
- return DRC_ONEOPERAND;
- case 0x91:
- return DRC_ONEOPERAND;
- case 0x92:
- return DRC_TWOOPERANDS;
- case 0x93:
- return DRC_ONEOPERAND;
- case 0x94:
- return DRC_ONEOPERAND;
- case 0x95:
- return DRC_ONEOPERAND;
- case 0x96:
- return DRC_ZEROOPERANDS;
- case 0x97:
- return DRC_DWARFv3 | DRC_ZEROOPERANDS;
- case 0x98:
- return DRC_DWARFv3 | DRC_ONEOPERAND;
- case 0x99:
- return DRC_DWARFv3 | DRC_ONEOPERAND;
- case 0x9a:
- return DRC_DWARFv3 | DRC_ONEOPERAND;
- case 0xa3: /* DW_OP_entry_value */
- return DRC_TWOOPERANDS;
- case 0xf0:
- return DRC_ZEROOPERANDS; /* DW_OP_APPLE_uninit */
- case 0xe0:
- return 0;
- case 0xff:
- return 0;
- default:
- return 0;
- }
-}
-
const char *DW_ATE_value_to_name(uint32_t val) {
static char invalid[100];
llvm::StringRef llvmstr = llvm::dwarf::AttributeEncodingString(val);
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDefines.h b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDefines.h
index 670fde262e1e..1b7102cd7e31 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDefines.h
+++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDefines.h
@@ -26,52 +26,12 @@ const char *DW_FORM_value_to_name(uint32_t val);
const char *DW_OP_value_to_name(uint32_t val);
-DRC_class DW_OP_value_to_class(uint32_t val);
-
const char *DW_ATE_value_to_name(uint32_t val);
const char *DW_LANG_value_to_name(uint32_t val);
const char *DW_LNS_value_to_name(uint32_t val);
-/* These DRC are entirely our own construction,
- although they are derived from various comments in the DWARF standard.
- Most of these are not useful to the parser, but the DW_AT and DW_FORM
- classes should prove to be usable in some fashion. */
-
-#define DRC_0x65 0x1
-#define DRC_ADDRESS 0x2
-#define DRC_BLOCK 0x4
-#define DRC_CONSTANT 0x8
-#define DRC_DWARFv3 0x10
-#define DRC_FLAG 0x20
-#define DRC_INDIRECT_SPECIAL 0x40
-#define DRC_LINEPTR 0x80
-#define DRC_LOCEXPR 0x100
-#define DRC_LOCLISTPTR 0x200
-#define DRC_MACPTR 0x400
-#define DRC_ONEOPERAND 0x800
-#define DRC_OPERANDONE_1BYTE_DELTA 0x1000
-#define DRC_OPERANDONE_2BYTE_DELTA 0x2000
-#define DRC_OPERANDONE_4BYTE_DELTA 0x4000
-#define DRC_OPERANDONE_ADDRESS 0x8000
-#define DRC_OPERANDONE_BLOCK 0x10000
-#define DRC_OPERANDONE_SLEB128_OFFSET 0x20000
-#define DRC_OPERANDONE_ULEB128_OFFSET 0x40000
-#define DRC_OPERANDONE_ULEB128_REGISTER 0x80000
-#define DRC_OPERANDTWO_BLOCK 0x100000
-#define DRC_OPERANDTWO_SLEB128_OFFSET 0x200000
-#define DRC_OPERANDTWO_ULEB128_OFFSET 0x400000
-#define DRC_OPERANDTWO_ULEB128_REGISTER 0x800000
-#define DRC_OPERNADONE_ULEB128_REGISTER 0x1000000
-#define DRC_RANGELISTPTR 0x2000000
-#define DRC_REFERENCE 0x4000000
-#define DRC_STRING 0x8000000
-#define DRC_TWOOPERANDS 0x10000000
-#define DRC_VENDOR_GNU 0x20000000
-#define DRC_VENDOR_MIPS 0x40000000
-#define DRC_ZEROOPERANDS 0x80000000
-
} // namespace lldb_private
#endif // LLDB_SOURCE_PLUGINS_SYMBOLFILE_DWARF_DWARFDEFINES_H
diff --git a/lldb/source/Symbol/UnwindPlan.cpp b/lldb/source/Symbol/UnwindPlan.cpp
index 438b32927483..e8906f38e2ff 100644
--- a/lldb/source/Symbol/UnwindPlan.cpp
+++ b/lldb/source/Symbol/UnwindPlan.cpp
@@ -15,6 +15,7 @@
#include "lldb/Target/Thread.h"
#include "lldb/Utility/ConstString.h"
#include "lldb/Utility/Log.h"
+#include "llvm/DebugInfo/DWARF/DWARFExpression.h"
using namespace lldb;
using namespace lldb_private;
@@ -79,13 +80,10 @@ GetByteOrderAndAddrSize(Thread *thread) {
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");
+ llvm::DataExtractor data(expr, order_and_width->first == eByteOrderLittle,
+ order_and_width->second);
+ llvm::DWARFExpression(data, order_and_width->second, llvm::dwarf::DWARF32)
+ .print(s.AsRawOstream(), nullptr, nullptr);
} else
s.PutCString("dwarf-expr");
}
diff --git a/lldb/test/Shell/SymbolFile/Breakpad/stack-cfi-arm.yaml b/lldb/test/Shell/SymbolFile/Breakpad/stack-cfi-arm.yaml
index f7f46b7e2bff..61a33e7ba7fc 100644
--- a/lldb/test/Shell/SymbolFile/Breakpad/stack-cfi-arm.yaml
+++ b/lldb/test/Shell/SymbolFile/Breakpad/stack-cfi-arm.yaml
@@ -6,8 +6,7 @@
# CHECK: Symbol file UnwindPlan:
# CHECK: row[0]: 0: CFA=DW_OP_breg13 +0, DW_OP_consts +0, DW_OP_plus => pc=DW_OP_breg14 +0
-# CHECK-NEXT: row[1]: 2: CFA=DW_OP_breg13 +0, DW_OP_consts +8, DW_OP_plus => r7=DW_OP_pick 0x00, DW_OP_consts -8, DW_OP_plus , DW_OP_deref pc=DW_OP_pick 0x00, DW_OP_consts -4, DW_OP_plus , DW_OP_deref
-#
+# CHECK-NEXT: row[1]: 2: CFA=DW_OP_breg13 +0, DW_OP_consts +8, DW_OP_plus => r7=DW_OP_pick 0x0, DW_OP_consts -8, DW_OP_plus, DW_OP_deref pc=DW_OP_pick 0x0, DW_OP_consts -4, DW_OP_plus, DW_OP_deref
--- !minidump
Streams:
diff --git a/lldb/test/Shell/SymbolFile/Breakpad/stack-cfi-parsing.test b/lldb/test/Shell/SymbolFile/Breakpad/stack-cfi-parsing.test
index ffb64602c15e..a6e29290854a 100644
--- a/lldb/test/Shell/SymbolFile/Breakpad/stack-cfi-parsing.test
+++ b/lldb/test/Shell/SymbolFile/Breakpad/stack-cfi-parsing.test
@@ -11,8 +11,8 @@ image show-unwind -n func0
# CHECK-NEXT: This UnwindPlan is sourced from the compiler: yes.
# CHECK-NEXT: This UnwindPlan is valid at all instruction locations: no.
# CHECK-NEXT: Address range of this UnwindPlan: [stack-cfi-parsing.out..module_image + 0-0x0000000000000002)
-# CHECK-NEXT: row[0]: 0: CFA=DW_OP_breg7 +0 => rbp=DW_OP_breg7 +0 rip=DW_OP_pick 0x00
-# CHECK-NEXT: row[1]: 1: CFA=DW_OP_breg7 +0 => rbx=DW_OP_breg2 +0 rbp=DW_OP_breg0 +0 rip=DW_OP_pick 0x00
+# CHECK-NEXT: row[0]: 0: CFA=DW_OP_breg7 +0 => rbp=DW_OP_breg7 +0 rip=DW_OP_pick 0x0
+# CHECK-NEXT: row[1]: 1: CFA=DW_OP_breg7 +0 => rbx=DW_OP_breg2 +0 rbp=DW_OP_breg0 +0 rip=DW_OP_pick 0x0
# The following plans are all (syntactically) invalid for various reasons.
# Processing those should not cause a crash.
diff --git a/lldb/test/Shell/SymbolFile/Breakpad/unwind-via-raSearch.test b/lldb/test/Shell/SymbolFile/Breakpad/unwind-via-raSearch.test
index 02404a86fa94..93ea3ce02941 100644
--- a/lldb/test/Shell/SymbolFile/Breakpad/unwind-via-raSearch.test
+++ b/lldb/test/Shell/SymbolFile/Breakpad/unwind-via-raSearch.test
@@ -13,13 +13,13 @@ image show-unwind -n call_many
# CHECK: This UnwindPlan is sourced from the compiler: yes.
# CHECK: This UnwindPlan is valid at all instruction locations: no.
# CHECK: Address range of this UnwindPlan: [unwind-via-stack-win.exe..module_image + 4112-0x0000107d)
-# CHECK: row[0]: 0: CFA=RaSearch at SP+0 => esp=DW_OP_pick 0x00, DW_OP_consts +4, DW_OP_plus eip=DW_OP_pick 0x00, DW_OP_deref
+# CHECK: row[0]: 0: CFA=RaSearch at SP+0 => esp=DW_OP_pick 0x0, DW_OP_consts +4, DW_OP_plus eip=DW_OP_pick 0x0, DW_OP_deref
image show-unwind -n nonzero_frame_size
# CHECK-LABEL: image show-unwind -n nonzero_frame_size
# CHECK: UNWIND PLANS for unwind-via-stack-win.exe`nonzero_frame_size
# CHECK: Symbol file UnwindPlan:
-# CHECK: row[0]: 0: CFA=RaSearch at SP+12 => esp=DW_OP_pick 0x00, DW_OP_consts +4, DW_OP_plus eip=DW_OP_pick 0x00, DW_OP_deref
+# CHECK: row[0]: 0: CFA=RaSearch at SP+12 => esp=DW_OP_pick 0x0, DW_OP_consts +4, DW_OP_plus eip=DW_OP_pick 0x0, DW_OP_deref
# Then, some invalid rules.
image show-unwind -n complex_rasearch
diff --git a/lldb/test/Shell/SymbolFile/Breakpad/unwind-via-stack-cfi.test b/lldb/test/Shell/SymbolFile/Breakpad/unwind-via-stack-cfi.test
index 0a67cb343110..29cf130694e6 100644
--- a/lldb/test/Shell/SymbolFile/Breakpad/unwind-via-stack-cfi.test
+++ b/lldb/test/Shell/SymbolFile/Breakpad/unwind-via-stack-cfi.test
@@ -13,7 +13,7 @@ image show-unwind -n bar
# CHECK-NEXT: This UnwindPlan is sourced from the compiler: yes.
# CHECK-NEXT: This UnwindPlan is valid at all instruction locations: no.
# CHECK-NEXT: Address range of this UnwindPlan: [unwind-via-stack-cfi..module_image + 1056-0x0000000000000449)
-# CHECK-NEXT: row[0]: 0: CFA=DW_OP_breg6 +0, DW_OP_deref => rbp=DW_OP_pick 0x00, DW_OP_deref rsp=DW_OP_pick 0x00, DW_OP_consts +16, DW_OP_plus rip=DW_OP_pick 0x00, DW_OP_consts +8, DW_OP_plus , DW_OP_deref
+# CHECK-NEXT: row[0]: 0: CFA=DW_OP_breg6 +0, DW_OP_deref => rbp=DW_OP_pick 0x0, DW_OP_deref rsp=DW_OP_pick 0x0, DW_OP_consts +16, DW_OP_plus rip=DW_OP_pick 0x0, DW_OP_consts +8, DW_OP_plus, DW_OP_deref
thread backtrace
# CHECK-LABEL: thread backtrace
diff --git a/lldb/test/Shell/SymbolFile/Breakpad/unwind-via-stack-win.test b/lldb/test/Shell/SymbolFile/Breakpad/unwind-via-stack-win.test
index 522637bf952f..e95367a213f8 100644
--- a/lldb/test/Shell/SymbolFile/Breakpad/unwind-via-stack-win.test
+++ b/lldb/test/Shell/SymbolFile/Breakpad/unwind-via-stack-win.test
@@ -15,7 +15,7 @@ image show-unwind -n call_many
# CHECK: This UnwindPlan is sourced from the compiler: yes.
# CHECK: This UnwindPlan is valid at all instruction locations: no.
# CHECK: Address range of this UnwindPlan: [unwind-via-stack-win.exe..module_image + 4112-0x0000107d)
-# CHECK: row[0]: 0: CFA=DW_OP_breg7 +0, DW_OP_consts +80, DW_OP_plus => esp=DW_OP_pick 0x00, DW_OP_consts +4, DW_OP_plus eip=DW_OP_pick 0x00, DW_OP_deref
+# CHECK: row[0]: 0: CFA=DW_OP_breg7 +0, DW_OP_consts +80, DW_OP_plus => esp=DW_OP_pick 0x0, DW_OP_consts +4, DW_OP_plus eip=DW_OP_pick 0x0, DW_OP_deref
# Then, some invalid rules.
image show-unwind -n bogus_rule
@@ -43,7 +43,7 @@ image show-unwind -n temporary_var
# CHECK: This UnwindPlan is sourced from the compiler: yes.
# CHECK: This UnwindPlan is valid at all instruction locations: no.
# CHECK: Address range of this UnwindPlan: [unwind-via-stack-win.exe..module_image + 4400-0x00001134)
-# CHECK: row[0]: 0: CFA=DW_OP_breg7 +0 => esp=DW_OP_pick 0x00, DW_OP_consts +4, DW_OP_plus eip=DW_OP_pick 0x00, DW_OP_deref
+# CHECK: row[0]: 0: CFA=DW_OP_breg7 +0 => esp=DW_OP_pick 0x0, DW_OP_consts +4, DW_OP_plus eip=DW_OP_pick 0x0, DW_OP_deref
# And finally, check that backtracing works as a whole by unwinding a simple
# stack.
diff --git a/lldb/test/Shell/Unwind/eh-frame-dwarf-unwind.test b/lldb/test/Shell/Unwind/eh-frame-dwarf-unwind.test
index c0b6e5e50f86..3df9906394f4 100644
--- a/lldb/test/Shell/Unwind/eh-frame-dwarf-unwind.test
+++ b/lldb/test/Shell/Unwind/eh-frame-dwarf-unwind.test
@@ -20,4 +20,4 @@ thread backtrace
target modules show-unwind -n foo
# CHECK: eh_frame UnwindPlan:
-# CHECK: row[0]: 0: CFA=rsp +8 => rip=DW_OP_lit8 , DW_OP_minus , DW_OP_deref , DW_OP_const1u 0x47, DW_OP_minus
+# CHECK: row[0]: 0: CFA=rsp +8 => rip=DW_OP_lit8, DW_OP_minus, DW_OP_deref, DW_OP_const1u 0x47, DW_OP_minus
diff --git a/lldb/test/Shell/Unwind/unwind-plan-dwarf-dump.test b/lldb/test/Shell/Unwind/unwind-plan-dwarf-dump.test
index 67b482b2df91..6dbb518a656b 100644
--- a/lldb/test/Shell/Unwind/unwind-plan-dwarf-dump.test
+++ b/lldb/test/Shell/Unwind/unwind-plan-dwarf-dump.test
@@ -11,4 +11,4 @@ process launch
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
+# CHECK: row[0]: 0: CFA=DW_OP_breg7 +0, DW_OP_const1u 0x0, DW_OP_plus => rip=DW_OP_const1s -8, DW_OP_plus, DW_OP_deref
diff --git a/lldb/unittests/Symbol/PostfixExpressionTest.cpp b/lldb/unittests/Symbol/PostfixExpressionTest.cpp
index 1dad83eabb4f..7def709a6090 100644
--- a/lldb/unittests/Symbol/PostfixExpressionTest.cpp
+++ b/lldb/unittests/Symbol/PostfixExpressionTest.cpp
@@ -7,9 +7,9 @@
//===----------------------------------------------------------------------===//
#include "lldb/Symbol/PostfixExpression.h"
-#include "lldb/Expression/DWARFExpression.h"
#include "lldb/Utility/DataExtractor.h"
#include "lldb/Utility/StreamString.h"
+#include "llvm/DebugInfo/DWARF/DWARFExpression.h"
#include "llvm/Support/FormatVariadic.h"
#include "llvm/Support/raw_ostream.h"
#include "gmock/gmock.h"
@@ -152,17 +152,14 @@ static std::string ParseAndGenerateDWARF(llvm::StringRef expr) {
ToDWARF(*ast, dwarf);
// print dwarf expression to comparable textual representation
- DataExtractor extractor(dwarf.GetData(), dwarf.GetSize(),
- lldb::eByteOrderLittle, addr_size);
-
- StreamString result;
- if (!DWARFExpression::PrintDWARFExpression(result, extractor, addr_size,
- /*dwarf_ref_size*/ 4,
- /*location_expression*/ false)) {
- return "DWARF printing failed.";
- }
-
- return std::string(result.GetString());
+ llvm::DataExtractor extractor(dwarf.GetString(), /*IsLittleEndian=*/true,
+ addr_size);
+
+ std::string result;
+ llvm::raw_string_ostream os(result);
+ llvm::DWARFExpression(extractor, addr_size, llvm::dwarf::DWARF32)
+ .print(os, nullptr, nullptr);
+ return std::move(os.str());
}
TEST(PostfixExpression, ToDWARF) {
@@ -170,28 +167,28 @@ TEST(PostfixExpression, ToDWARF) {
EXPECT_EQ("DW_OP_breg1 +0", ParseAndGenerateDWARF("R1"));
- EXPECT_EQ("DW_OP_bregx 65 0", ParseAndGenerateDWARF("R65"));
+ EXPECT_EQ("DW_OP_bregx 0x41 +0", ParseAndGenerateDWARF("R65"));
- EXPECT_EQ("DW_OP_pick 0x00", ParseAndGenerateDWARF("INIT"));
+ EXPECT_EQ("DW_OP_pick 0x0", ParseAndGenerateDWARF("INIT"));
- EXPECT_EQ("DW_OP_pick 0x00, DW_OP_pick 0x01, DW_OP_plus ",
+ EXPECT_EQ("DW_OP_pick 0x0, DW_OP_pick 0x1, DW_OP_plus",
ParseAndGenerateDWARF("INIT INIT +"));
- EXPECT_EQ("DW_OP_breg1 +0, DW_OP_pick 0x01, DW_OP_plus ",
+ EXPECT_EQ("DW_OP_breg1 +0, DW_OP_pick 0x1, DW_OP_plus",
ParseAndGenerateDWARF("R1 INIT +"));
- EXPECT_EQ("DW_OP_consts +1, DW_OP_pick 0x01, DW_OP_deref , DW_OP_plus ",
+ EXPECT_EQ("DW_OP_consts +1, DW_OP_pick 0x1, DW_OP_deref, DW_OP_plus",
ParseAndGenerateDWARF("1 INIT ^ +"));
- EXPECT_EQ("DW_OP_consts +4, DW_OP_consts +5, DW_OP_plus ",
+ EXPECT_EQ("DW_OP_consts +4, DW_OP_consts +5, DW_OP_plus",
ParseAndGenerateDWARF("4 5 +"));
- EXPECT_EQ("DW_OP_consts +4, DW_OP_consts +5, DW_OP_minus ",
+ EXPECT_EQ("DW_OP_consts +4, DW_OP_consts +5, DW_OP_minus",
ParseAndGenerateDWARF("4 5 -"));
- EXPECT_EQ("DW_OP_consts +4, DW_OP_deref ", ParseAndGenerateDWARF("4 ^"));
+ EXPECT_EQ("DW_OP_consts +4, DW_OP_deref", ParseAndGenerateDWARF("4 ^"));
- EXPECT_EQ("DW_OP_breg6 +0, DW_OP_consts +128, DW_OP_lit1 "
- ", DW_OP_minus , DW_OP_not , DW_OP_and ",
+ EXPECT_EQ("DW_OP_breg6 +0, DW_OP_consts +128, DW_OP_lit1, DW_OP_minus, "
+ "DW_OP_not, DW_OP_and",
ParseAndGenerateDWARF("R6 128 @"));
}
diff --git a/lldb/unittests/SymbolFile/NativePDB/PdbFPOProgramToDWARFExpressionTests.cpp b/lldb/unittests/SymbolFile/NativePDB/PdbFPOProgramToDWARFExpressionTests.cpp
index 49e8a1a9fb87..334a08f92033 100644
--- a/lldb/unittests/SymbolFile/NativePDB/PdbFPOProgramToDWARFExpressionTests.cpp
+++ b/lldb/unittests/SymbolFile/NativePDB/PdbFPOProgramToDWARFExpressionTests.cpp
@@ -11,11 +11,11 @@
#include "Plugins/SymbolFile/NativePDB/PdbFPOProgramToDWARFExpression.h"
#include "lldb/Core/StreamBuffer.h"
-#include "lldb/Expression/DWARFExpression.h"
#include "lldb/Utility/ArchSpec.h"
#include "lldb/Utility/DataBufferHeap.h"
#include "lldb/Utility/DataExtractor.h"
#include "lldb/Utility/StreamString.h"
+#include "llvm/DebugInfo/DWARF/DWARFExpression.h"
using namespace lldb;
using namespace lldb_private;
@@ -27,30 +27,22 @@ static void
CheckValidProgramTranslation(llvm::StringRef fpo_program,
llvm::StringRef target_register_name,
llvm::StringRef expected_dwarf_expression) {
- // initial setup
- ArchSpec arch_spec("i686-pc-windows");
- llvm::Triple::ArchType arch_type = arch_spec.GetMachine();
- ByteOrder byte_order = arch_spec.GetByteOrder();
- uint32_t address_size = arch_spec.GetAddressByteSize();
- uint32_t byte_size = arch_spec.GetDataByteSize();
-
// program translation
- StreamBuffer<32> stream(Stream::eBinary, address_size, byte_order);
+ StreamBuffer<32> stream(Stream::eBinary, 4, eByteOrderLittle);
ASSERT_TRUE(TranslateFPOProgramToDWARFExpression(
- fpo_program, target_register_name, arch_type, stream));
+ fpo_program, target_register_name, llvm::Triple::x86, stream));
// print dwarf expression to comparable textual representation
- DataBufferSP buffer =
- std::make_shared<DataBufferHeap>(stream.GetData(), stream.GetSize());
- DataExtractor extractor(buffer, byte_order, address_size, byte_size);
+ llvm::DataExtractor extractor({stream.GetData(), stream.GetSize()},
+ /*IsLittleEndian=*/true, /*AddressSize=*/4);
- StreamString result_dwarf_expression;
- ASSERT_TRUE(DWARFExpression::PrintDWARFExpression(
- result_dwarf_expression, extractor, address_size, 4, false));
+ std::string result;
+ llvm::raw_string_ostream os(result);
+ llvm::DWARFExpression(extractor, /*AddressSize=*/4, llvm::dwarf::DWARF32)
+ .print(os, nullptr, nullptr);
// actual check
- ASSERT_STREQ(expected_dwarf_expression.data(),
- result_dwarf_expression.GetString().data());
+ ASSERT_EQ(expected_dwarf_expression, os.str());
}
TEST(PDBFPOProgramToDWARFExpressionTests, SingleAssignmentRegisterRef) {
@@ -64,9 +56,9 @@ TEST(PDBFPOProgramToDWARFExpressionTests, MultipleIndependentAssignments) {
TEST(PDBFPOProgramToDWARFExpressionTests, MultipleDependentAssignments) {
CheckValidProgramTranslation(
"$T1 $ebp 4 + = $T0 $T1 8 - 128 @ = ", "$T0",
- "DW_OP_breg6 +0, DW_OP_consts +4, DW_OP_plus , DW_OP_consts +8, "
- "DW_OP_minus , DW_OP_consts +128, DW_OP_lit1 , DW_OP_minus , DW_OP_not , "
- "DW_OP_and ");
+ "DW_OP_breg6 +0, DW_OP_consts +4, DW_OP_plus, DW_OP_consts +8, "
+ "DW_OP_minus, DW_OP_consts +128, DW_OP_lit1, DW_OP_minus, DW_OP_not, "
+ "DW_OP_and");
}
TEST(PDBFPOProgramToDWARFExpressionTests, DependencyChain) {
More information about the lldb-commits
mailing list