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 @@ public: 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 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@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@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@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@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); + llvm::DataExtractor extractor(dwarf.GetString(), /*IsLittleEndian=*/true, + 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()); + 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(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) {