Skip to content

Conversation

@jryans
Copy link
Member

@jryans jryans commented Aug 12, 2024

This allows llvm-dwarfdump to decode the DWARF 5 opcode DW_OP_implicit_pointer (0xa0). GCC makes use of this opcode in recent versions. LLVM contains some (unfinished) support as well. With existing usage in the ecosystem, adding decoding support here seems reasonable.

This allows `llvm-dwarfdump` to decode the DWARF 5 opcode `DW_OP_implicit_pointer` (0xa0). GCC makes use of this opcode in recent versions. LLVM contains some (unfinished) support as well. With existing usage in the ecosystem, adding decoding support here seems reasonable.
@llvmbot
Copy link
Member

llvmbot commented Aug 12, 2024

@llvm/pr-subscribers-debuginfo

Author: J. Ryan Stinnett (jryans)

Changes

This allows llvm-dwarfdump to decode the DWARF 5 opcode DW_OP_implicit_pointer (0xa0). GCC makes use of this opcode in recent versions. LLVM contains some (unfinished) support as well. With existing usage in the ecosystem, adding decoding support here seems reasonable.


Full diff: https://github.com/llvm/llvm-project/pull/102923.diff

3 Files Affected:

  • (modified) llvm/lib/DebugInfo/DWARF/DWARFDebugLoc.cpp (+2-5)
  • (modified) llvm/lib/DebugInfo/DWARF/DWARFExpression.cpp (+2)
  • (added) llvm/test/tools/llvm-dwarfdump/X86/DW_OP_implicit_pointer.yaml (+87)
diff --git a/llvm/lib/DebugInfo/DWARF/DWARFDebugLoc.cpp b/llvm/lib/DebugInfo/DWARF/DWARFDebugLoc.cpp index 00c2823cee0af9..6cb4c1ac01fbb0 100644 --- a/llvm/lib/DebugInfo/DWARF/DWARFDebugLoc.cpp +++ b/llvm/lib/DebugInfo/DWARF/DWARFDebugLoc.cpp @@ -113,11 +113,8 @@ static void dumpExpression(raw_ostream &OS, DIDumpOptions DumpOpts, ArrayRef<uint8_t> Data, bool IsLittleEndian, unsigned AddressSize, DWARFUnit *U) { DWARFDataExtractor Extractor(Data, IsLittleEndian, AddressSize); - // Note. We do not pass any format to DWARFExpression, even if the - // corresponding unit is known. For now, there is only one operation, - // DW_OP_call_ref, which depends on the format; it is rarely used, and - // is unexpected in location tables. - DWARFExpression(Extractor, AddressSize).print(OS, DumpOpts, U); + DWARFExpression(Extractor, AddressSize, U->getFormat()) + .print(OS, DumpOpts, U); } bool DWARFLocationTable::dumpLocationList( diff --git a/llvm/lib/DebugInfo/DWARF/DWARFExpression.cpp b/llvm/lib/DebugInfo/DWARF/DWARFExpression.cpp index b90addbfba04af..2ae5ff3efc8c5f 100644 --- a/llvm/lib/DebugInfo/DWARF/DWARFExpression.cpp +++ b/llvm/lib/DebugInfo/DWARF/DWARFExpression.cpp @@ -90,6 +90,8 @@ static std::vector<Desc> getOpDescriptions() { Descriptions[DW_OP_implicit_value] = Desc(Op::Dwarf4, Op::SizeLEB, Op::SizeBlock); Descriptions[DW_OP_stack_value] = Desc(Op::Dwarf4); + Descriptions[DW_OP_implicit_pointer] = + Desc(Op::Dwarf5, Op::SizeRefAddr, Op::SignedSizeLEB); Descriptions[DW_OP_addrx] = Desc(Op::Dwarf5, Op::SizeLEB); Descriptions[DW_OP_constx] = Desc(Op::Dwarf5, Op::SizeLEB); Descriptions[DW_OP_entry_value] = Desc(Op::Dwarf5, Op::SizeLEB); diff --git a/llvm/test/tools/llvm-dwarfdump/X86/DW_OP_implicit_pointer.yaml b/llvm/test/tools/llvm-dwarfdump/X86/DW_OP_implicit_pointer.yaml new file mode 100644 index 00000000000000..04c35da34658a9 --- /dev/null +++ b/llvm/test/tools/llvm-dwarfdump/X86/DW_OP_implicit_pointer.yaml @@ -0,0 +1,87 @@ +# Test that we can decode `DW_OP_implicit_pointer` (0xa0) +# RUN: yaml2obj %s | llvm-dwarfdump - | FileCheck %s + +# CHECK: DW_TAG_variable +# CHECK-NEXT: DW_AT_location (DW_OP_implicit_pointer 0x2a +0) + +--- !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: + - 0xa0 + - 0x2a + - 0x00 + - 0x00 + - 0x00 + - 0x00 + - AbbrCode: 0x00000000 + Values: + - AbbrCode: 0x00000000 + Values: +... 
@jryans
Copy link
Member Author

jryans commented Aug 12, 2024

Thanks for review! 😄 I believe all comments are addressed now.

@jryans jryans requested a review from felipepiovezan August 12, 2024 16:28
@jryans jryans merged commit f807c5e into llvm:main Aug 13, 2024
@jryans jryans deleted the dwarfdump-imp-ptr branch August 13, 2024 14:34
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

3 participants