diff --git a/llvm/include/llvm/BinaryFormat/Dwarf.def b/llvm/include/llvm/BinaryFormat/Dwarf.def index e52324a8ebc12..2bde762d7d82f 100644 --- a/llvm/include/llvm/BinaryFormat/Dwarf.def +++ b/llvm/include/llvm/BinaryFormat/Dwarf.def @@ -887,6 +887,7 @@ HANDLE_DW_OP(0xed, WASM_location, -1, -1, 0, WASM) HANDLE_DW_OP(0xee, WASM_location_int, -1, -1, 0, WASM) // Historic and not implemented in LLVM. HANDLE_DW_OP(0xf0, APPLE_uninit, -1, -1, 0, APPLE) +HANDLE_DW_OP(0xf2, GNU_implicit_pointer, 2, 0, 4, GNU) // The GNU entry value extension. HANDLE_DW_OP(0xf3, GNU_entry_value, 2, 0, 0, GNU) HANDLE_DW_OP(0xf8, PGI_omp_thread_num, -1, -1, 0, PGI) diff --git a/llvm/lib/DebugInfo/DWARF/DWARFExpression.cpp b/llvm/lib/DebugInfo/DWARF/DWARFExpression.cpp index 2ae5ff3efc8c5..3f6695ef25663 100644 --- a/llvm/lib/DebugInfo/DWARF/DWARFExpression.cpp +++ b/llvm/lib/DebugInfo/DWARF/DWARFExpression.cpp @@ -104,6 +104,8 @@ static std::vector getOpDescriptions() { Descriptions[DW_OP_GNU_addr_index] = Desc(Op::Dwarf4, Op::SizeLEB); Descriptions[DW_OP_GNU_const_index] = Desc(Op::Dwarf4, Op::SizeLEB); Descriptions[DW_OP_GNU_entry_value] = Desc(Op::Dwarf4, Op::SizeLEB); + Descriptions[DW_OP_GNU_implicit_pointer] = + Desc(Op::Dwarf4, Op::SizeRefAddr, Op::SignedSizeLEB); // This Description acts as a marker that getSubOpDesc must be called // to fetch the final Description for the operation. Each such final // Description must share the same first SizeSubOpLEB operand. diff --git a/llvm/test/tools/llvm-dwarfdump/X86/DW_OP_GNU_implicit_pointer.yaml b/llvm/test/tools/llvm-dwarfdump/X86/DW_OP_GNU_implicit_pointer.yaml new file mode 100644 index 0000000000000..56dcbc036cbbb --- /dev/null +++ b/llvm/test/tools/llvm-dwarfdump/X86/DW_OP_GNU_implicit_pointer.yaml @@ -0,0 +1,87 @@ +# Test that we can decode `DW_OP_GNU_implicit_pointer` (0xf2) +# RUN: yaml2obj %s | llvm-dwarfdump - | FileCheck %s + +# CHECK: DW_TAG_variable +# CHECK-NEXT: DW_AT_location (DW_OP_GNU_implicit_pointer 0x2a +4) + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_DYN + Machine: EM_X86_64 +DWARF: + debug_abbrev: + - Table: + - Code: 0x00000001 + Tag: DW_TAG_compile_unit + Children: DW_CHILDREN_yes + Attributes: + - Attribute: DW_AT_language + Form: DW_FORM_data2 + - Attribute: DW_AT_low_pc + Form: DW_FORM_addr + - Attribute: DW_AT_high_pc + Form: DW_FORM_data4 + - Code: 0x00000002 + Tag: DW_TAG_subprogram + Children: DW_CHILDREN_yes + Attributes: + - Attribute: DW_AT_low_pc + Form: DW_FORM_addr + - Attribute: DW_AT_high_pc + Form: DW_FORM_data4 + - Attribute: DW_AT_frame_base + Form: DW_FORM_exprloc + - Code: 0x00000003 + Tag: DW_TAG_formal_parameter + Children: DW_CHILDREN_no + Attributes: + - Attribute: DW_AT_location + Form: DW_FORM_exprloc + - Code: 0x00000004 + Tag: DW_TAG_variable + Children: DW_CHILDREN_no + Attributes: + - Attribute: DW_AT_location + Form: DW_FORM_exprloc + debug_info: + - Length: 52 + Version: 5 + UnitType: DW_UT_compile + AbbrOffset: 0 + AddrSize: 8 + Entries: + - AbbrCode: 0x00000001 + Values: + - Value: 0x000000000000000C + - Value: 0x0000000100000F50 + - Value: 0x0000000000000034 + - AbbrCode: 0x00000002 + Values: + - Value: 0x0000000100000F50 + - Value: 0x0000000000000034 + - Value: 0x0000000000000001 + BlockData: + - 0x56 + - AbbrCode: 0x00000003 + Values: + - Value: 0x0000000000000002 + BlockData: + - 0x91 + - 0x78 + - AbbrCode: 0x00000004 + Values: + - Value: 0x0000000000000006 + BlockData: + - 0xf2 # DW_OP_GNU_implicit_pointer + - 0x2a # Section offset of parameter in the previous entry + - 0x00 + - 0x00 + - 0x00 + - 0x04 # Pointer references location 4 bytes into value of previous entry + - AbbrCode: 0x00000000 + Values: + - AbbrCode: 0x00000000 + Values: +...