[llvm] [DebugInfo] Add expression decoding for `DW_OP_implicit_pointer` (PR #102923)
J. Ryan Stinnett via llvm-commits
llvm-commits at lists.llvm.org
Mon Aug 12 09:25:54 PDT 2024
https://github.com/jryans updated https://github.com/llvm/llvm-project/pull/102923
>From 0caed0b3d7830eb4b737bf8861ed7c0e014dcc99 Mon Sep 17 00:00:00 2001
From: "J. Ryan Stinnett" <jryans at gmail.com>
Date: Mon, 12 Aug 2024 14:59:50 +0100
Subject: [PATCH 1/2] [DebugInfo] Add expression decoding for
`DW_OP_implicit_pointer`
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.
---
llvm/lib/DebugInfo/DWARF/DWARFDebugLoc.cpp | 7 +-
llvm/lib/DebugInfo/DWARF/DWARFExpression.cpp | 2 +
.../X86/DW_OP_implicit_pointer.yaml | 87 +++++++++++++++++++
3 files changed, 91 insertions(+), 5 deletions(-)
create mode 100644 llvm/test/tools/llvm-dwarfdump/X86/DW_OP_implicit_pointer.yaml
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:
+...
>From 3ac2ecead2ea6bb4f2ff5964de126b9755058f1e Mon Sep 17 00:00:00 2001
From: "J. Ryan Stinnett" <jryans at gmail.com>
Date: Mon, 12 Aug 2024 17:25:10 +0100
Subject: [PATCH 2/2] Add comments and extend test to check value offset
---
.../tools/llvm-dwarfdump/X86/DW_OP_implicit_pointer.yaml | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
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
index 04c35da34658a9..b6b2d1d0e183e1 100644
--- a/llvm/test/tools/llvm-dwarfdump/X86/DW_OP_implicit_pointer.yaml
+++ b/llvm/test/tools/llvm-dwarfdump/X86/DW_OP_implicit_pointer.yaml
@@ -2,7 +2,7 @@
# RUN: yaml2obj %s | llvm-dwarfdump - | FileCheck %s
# CHECK: DW_TAG_variable
-# CHECK-NEXT: DW_AT_location (DW_OP_implicit_pointer 0x2a +0)
+# CHECK-NEXT: DW_AT_location (DW_OP_implicit_pointer 0x2a +4)
--- !ELF
FileHeader:
@@ -74,12 +74,12 @@ DWARF:
Values:
- Value: 0x0000000000000006
BlockData:
- - 0xa0
- - 0x2a
- - 0x00
+ - 0xa0 # DW_OP_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
More information about the llvm-commits
mailing list