[llvm] [DWARF] Add support for DW_GNU_call_target_clobbered (PR #172336)
Orlando Cazalet-Hyams via llvm-commits
llvm-commits at lists.llvm.org
Mon Dec 15 09:00:16 PST 2025
https://github.com/OCHyams created https://github.com/llvm/llvm-project/pull/172336
Fixes assertion trip introduced in #172167
See https://issues.chromium.org/issues/468825583#comment2
>From 330760dc1db0336941ab29842c43807e0290e492 Mon Sep 17 00:00:00 2001
From: Orlando Cazalet-Hyams <orlando.hyams at sony.com>
Date: Mon, 15 Dec 2025 16:57:37 +0000
Subject: [PATCH] [DWARF] Add support for DW_GNU_call_target_clobbered
Fixes assertion trip introduced in #172167
See https://issues.chromium.org/issues/468825583#comment2
---
.../CodeGen/AsmPrinter/DwarfCompileUnit.cpp | 2 +
.../X86/dwarf-gnu-call-target-clobbered.mir | 58 +++++++++++++++++++
2 files changed, 60 insertions(+)
create mode 100644 llvm/test/DebugInfo/X86/dwarf-gnu-call-target-clobbered.mir
diff --git a/llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp b/llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp
index d19de7f8000ec..12bbe7f4c3849 100644
--- a/llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp
+++ b/llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp
@@ -1293,6 +1293,8 @@ DwarfCompileUnit::getDwarf5OrGNUAttr(dwarf::Attribute Attr) const {
return dwarf::DW_AT_GNU_all_call_sites;
case dwarf::DW_AT_call_target:
return dwarf::DW_AT_GNU_call_site_target;
+ case dwarf::DW_AT_call_target_clobbered:
+ return dwarf::DW_AT_GNU_call_site_target_clobbered;
case dwarf::DW_AT_call_origin:
return dwarf::DW_AT_abstract_origin;
case dwarf::DW_AT_call_return_pc:
diff --git a/llvm/test/DebugInfo/X86/dwarf-gnu-call-target-clobbered.mir b/llvm/test/DebugInfo/X86/dwarf-gnu-call-target-clobbered.mir
new file mode 100644
index 0000000000000..c03829a9490bd
--- /dev/null
+++ b/llvm/test/DebugInfo/X86/dwarf-gnu-call-target-clobbered.mir
@@ -0,0 +1,58 @@
+# RUN: llc %s -start-after=livedebugvalues -debugger-tune=gdb --filetype=obj -o - \
+# RUN: | llvm-dwarfdump -
+
+# Generated from IR crash reproducer with `llc -stop-after=livedebugvalues -simplify-mir`.
+# Check the GNU equivalent of DW_AT_call_target_clobbered is emitted without
+# hitting assertions (DWARF version 4, -debuger-tune=gdb).
+
+# CHECK: DW_GNU_AT_call_target_clobbered
+
+--- |
+ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128"
+ target triple = "x86_64-unknown-linux-gnu"
+
+ define void @foo(ptr %p) !dbg !5 {
+ entry:
+ %call = tail call ptr %p(i64 0)
+ ret void
+ }
+
+ !llvm.dbg.cu = !{!0}
+ !llvm.module.flags = !{!3, !4}
+
+ !0 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus_14, file: !1, isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, enums: !2, retainedTypes: !2, globals: !2, imports: !2, splitDebugInlining: false)
+ !1 = !DIFile(filename: "test.cpp", directory: ".")
+ !2 = !{}
+ !3 = !{i32 2, !"Debug Info Version", i32 3}
+ !4 = !{i32 7, !"Dwarf Version", i32 4}
+ !5 = distinct !DISubprogram(name: "foo", linkageName: "foo", scope: !1, file: !1, line: 479, type: !6, scopeLine: 479, flags: DIFlagPrototyped | DIFlagAllCallsDescribed, spFlags: DISPFlagLocalToUnit | DISPFlagDefinition | DISPFlagOptimized, unit: !0, retainedNodes: !2, keyInstructions: true)
+ !6 = distinct !DISubroutineType(types: !7)
+ !7 = !{null}
+...
+---
+name: foo
+alignment: 16
+tracksRegLiveness: true
+noPhis: true
+isSSA: false
+noVRegs: true
+hasFakeUses: false
+debugInstrRef: true
+tracksDebugUserValues: true
+liveins:
+ - { reg: '$rdi' }
+frameInfo:
+ maxAlignment: 1
+ maxCallFrameSize: 0
+ hasTailCall: true
+ isCalleeSavedInfoValid: true
+machineFunctionInfo:
+ amxProgModel: None
+body: |
+ bb.0.entry:
+ liveins: $rdi
+
+ $rax = MOV64rr $rdi
+ dead $edi = XOR32rr undef $edi, undef $edi, implicit-def dead $eflags, implicit-def $rdi
+ TAILJMPr64 killed renamable $rax, csr_64, implicit $rsp, implicit $ssp, implicit $rsp, implicit $ssp, implicit $rdi
+...
More information about the llvm-commits
mailing list