[llvm] [llvm][DebugInfo] Add support for DW_OP_GNU_implicit_pointer (PR #142913)
via llvm-commits
llvm-commits at lists.llvm.org
Thu Jun 5 08:02:37 PDT 2025
https://github.com/Thrrreeee updated https://github.com/llvm/llvm-project/pull/142913
>From e7a965e15fd2b95c6ff2a696b6f13a91152c2ff1 Mon Sep 17 00:00:00 2001
From: jinruiShi <1379998393 at qq.com>
Date: Thu, 5 Jun 2025 22:37:48 +0800
Subject: [PATCH] add support for DW_OP_GNU_implicit_pointer
---
llvm/include/llvm/BinaryFormat/Dwarf.def | 1 +
llvm/lib/DebugInfo/DWARF/DWARFExpression.cpp | 2 +
.../X86/DW_OP_GNU_implicit_pointer.yaml | 87 +++++++++++++++++++
3 files changed, 90 insertions(+)
create mode 100644 llvm/test/tools/llvm-dwarfdump/X86/DW_OP_GNU_implicit_pointer.yaml
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..17e816a1e4552 100644
--- a/llvm/lib/DebugInfo/DWARF/DWARFExpression.cpp
+++ b/llvm/lib/DebugInfo/DWARF/DWARFExpression.cpp
@@ -104,6 +104,8 @@ static std::vector<Desc> 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:
+...
More information about the llvm-commits
mailing list