forked from llvm/llvm-project
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[DwarfExpression] Support entry values for indirect parameters
Summary: A struct argument can be passed-by-value to a callee via a pointer to a temporary stack copy. Add support for emitting an entry value DBG_VALUE when an indirect parameter DBG_VALUE becomes unavailable. This is done by omitting DW_OP_stack_value from the entry value expression, to make the expression describe the location of an object. rdar://63373691 Reviewers: djtodoro, aprantl, dstenb Subscribers: hiraditya, lldb-commits, llvm-commits Tags: #lldb, #llvm Differential Revision: https://reviews.llvm.org/D80345
- Loading branch information
Showing
8 changed files
with
261 additions
and
25 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
102 changes: 102 additions & 0 deletions
102
llvm/test/DebugInfo/MIR/AArch64/dbgcall-site-indirect-param-with-offset.mir
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,102 @@ | ||
# RUN: llc -start-before=livedebugvalues -stop-after=machineverifier -o - %s \ | ||
# RUN: | FileCheck %s -check-prefix=MIR | ||
|
||
# Copied from dbgcall-site-indirect-param.mir, with hand modifications: | ||
# an offset is added to the indirect parameter DBG_VALUE. | ||
# | ||
# We do not support emitting an entry value in this case. | ||
|
||
# MIR: renamable $w0 = LDRWui killed renamable $x8 | ||
# MIR-NOT: DBG_VALUE $x0, 0, {{.*}}, !DIExpression(DW_OP_LLVM_entry_value | ||
# MIR-NEXT: BL @baz | ||
# MIR-NEXT: frame-destroy LDPXpost | ||
# MIR-NEXT: TCRETURNdi @baz | ||
|
||
--- | | ||
target datalayout = "e-m:o-i64:64-i128:128-n32:64-S128" | ||
target triple = "arm64-apple-ios10.0.0" | ||
|
||
%struct.fat_ptr = type { i32*, i32*, i32* } | ||
|
||
define i32 @bar(%struct.fat_ptr* nocapture readonly %f) local_unnamed_addr !dbg !13 { | ||
entry: | ||
call void @llvm.dbg.declare(metadata %struct.fat_ptr* %f, metadata !23, metadata !DIExpression()), !dbg !24 | ||
%ptr2 = bitcast %struct.fat_ptr* %f to i32**, !dbg !25 | ||
%0 = load i32*, i32** %ptr2, align 8, !dbg !25 | ||
%1 = load i32, i32* %0, align 4, !dbg !31 | ||
%call = tail call i32 @baz(i32 %1), !dbg !34 | ||
%call1 = tail call i32 @baz(i32 %call), !dbg !35 | ||
ret i32 %call1, !dbg !36 | ||
} | ||
|
||
declare void @llvm.dbg.declare(metadata, metadata, metadata) | ||
|
||
declare !dbg !4 i32 @baz(i32) local_unnamed_addr optsize | ||
|
||
!llvm.dbg.cu = !{!0} | ||
!llvm.module.flags = !{!8, !9, !10, !11} | ||
!llvm.ident = !{!12} | ||
|
||
!0 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, producer: "clang", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, enums: !2, retainedTypes: !3, nameTableKind: None, sysroot: "/") | ||
!1 = !DIFile(filename: "indirect.c", directory: "/tmp/fatptr") | ||
!2 = !{} | ||
!3 = !{!4} | ||
!4 = !DISubprogram(name: "baz", scope: !1, file: !1, line: 4, type: !5, flags: DIFlagPrototyped, spFlags: DISPFlagOptimized, retainedNodes: !2) | ||
!5 = !DISubroutineType(types: !6) | ||
!6 = !{!7, !7} | ||
!7 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed) | ||
!8 = !{i32 7, !"Dwarf Version", i32 4} | ||
!9 = !{i32 2, !"Debug Info Version", i32 3} | ||
!10 = !{i32 1, !"wchar_size", i32 4} | ||
!11 = !{i32 7, !"PIC Level", i32 2} | ||
!12 = !{!"clang"} | ||
!13 = distinct !DISubprogram(name: "bar", scope: !1, file: !1, line: 5, type: !14, scopeLine: 5, flags: DIFlagPrototyped | DIFlagAllCallsDescribed, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0, retainedNodes: !22) | ||
!14 = !DISubroutineType(types: !15) | ||
!15 = !{!7, !16} | ||
!16 = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "fat_ptr", file: !1, line: 1, size: 192, elements: !17) | ||
!17 = !{!18, !20, !21} | ||
!18 = !DIDerivedType(tag: DW_TAG_member, name: "ptr", scope: !16, file: !1, line: 2, baseType: !19, size: 64) | ||
!19 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !7, size: 64) | ||
!20 = !DIDerivedType(tag: DW_TAG_member, name: "low", scope: !16, file: !1, line: 2, baseType: !19, size: 64, offset: 64) | ||
!21 = !DIDerivedType(tag: DW_TAG_member, name: "high", scope: !16, file: !1, line: 2, baseType: !19, size: 64, offset: 128) | ||
!22 = !{!23} | ||
!23 = !DILocalVariable(name: "f", arg: 1, scope: !13, file: !1, line: 5, type: !16) | ||
!24 = !DILocation(line: 5, column: 24, scope: !13) | ||
!25 = !DILocation(line: 6, column: 23, scope: !13) | ||
!31 = !DILocation(line: 6, column: 20, scope: !13) | ||
!34 = !DILocation(line: 6, column: 16, scope: !13) | ||
!35 = !DILocation(line: 6, column: 12, scope: !13) | ||
!36 = !DILocation(line: 6, column: 5, scope: !13) | ||
|
||
... | ||
--- | ||
name: bar | ||
stack: | ||
- { id: 0, name: '', type: spill-slot, offset: -8, size: 8, alignment: 8, | ||
stack-id: default, callee-saved-register: '$lr', callee-saved-restored: true, | ||
debug-info-variable: '', debug-info-expression: '', debug-info-location: '' } | ||
- { id: 1, name: '', type: spill-slot, offset: -16, size: 8, alignment: 8, | ||
stack-id: default, callee-saved-register: '$fp', callee-saved-restored: true, | ||
debug-info-variable: '', debug-info-expression: '', debug-info-location: '' } | ||
callSites: | ||
- { bb: 0, offset: 8, fwdArgRegs: | ||
- { arg: 0, reg: '$w0' } } | ||
- { bb: 0, offset: 10, fwdArgRegs: | ||
- { arg: 0, reg: '$w0' } } | ||
body: | | ||
bb.0.entry: | ||
liveins: $x0, $lr | ||
DBG_VALUE $x0, 0, !23, !DIExpression(DW_OP_plus_uconst, 12), debug-location !24 | ||
early-clobber $sp = frame-setup STPXpre killed $fp, killed $lr, $sp, -2 :: (store 8 into %stack.1), (store 8 into %stack.0) | ||
$fp = frame-setup ADDXri $sp, 0, 0 | ||
frame-setup CFI_INSTRUCTION def_cfa $w29, 16 | ||
frame-setup CFI_INSTRUCTION offset $w30, -8, debug-location !25 | ||
frame-setup CFI_INSTRUCTION offset $w29, -16, debug-location !25 | ||
renamable $x8 = LDRXui killed renamable $x0, 0, debug-location !25 :: (load 8 from %ir.ptr2) | ||
renamable $w0 = LDRWui killed renamable $x8, 0, debug-location !31 :: (load 4 from %ir.0) | ||
BL @baz, csr_aarch64_aapcs, implicit-def dead $lr, implicit $sp, implicit $w0, implicit-def $sp, implicit-def $w0, debug-location !34 | ||
early-clobber $sp, $fp, $lr = frame-destroy LDPXpost $sp, 2, debug-location !35 :: (load 8 from %stack.1), (load 8 from %stack.0) | ||
TCRETURNdi @baz, 0, csr_aarch64_aapcs, implicit $sp, implicit $w0, debug-location !35 | ||
... |
117 changes: 117 additions & 0 deletions
117
llvm/test/DebugInfo/MIR/AArch64/dbgcall-site-indirect-param.mir
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,117 @@ | ||
# RUN: llc -start-before=livedebugvalues -stop-after=machineverifier -o - %s \ | ||
# RUN: | FileCheck %s -check-prefix=MIR | ||
|
||
# RUN: llc -start-before=livedebugvalues -filetype=obj -o - %s \ | ||
# RUN: | llvm-dwarfdump - | FileCheck %s -check-prefix=DWARF -implicit-check-not=DW_OP_entry_value | ||
|
||
# // Original Source | ||
# struct fat_ptr { | ||
# int *ptr, *low, *high; | ||
# }; | ||
# extern int baz(int x); | ||
# int bar(struct fat_ptr f) { | ||
# return baz(baz(*f.ptr)); | ||
# } | ||
|
||
# MIR: renamable $w0 = LDRWui killed renamable $x8 | ||
# MIR-NEXT: DBG_VALUE $x0, 0, {{.*}}, !DIExpression(DW_OP_LLVM_entry_value, 1) | ||
# MIR-NEXT: BL @baz | ||
# MIR-NEXT: frame-destroy LDPXpost | ||
# MIR-NEXT: TCRETURNdi @baz | ||
|
||
# After w0 is clobbered, we should get an indirect parameter entry value for "f". | ||
|
||
# DWARF-LABEL: DW_TAG_formal_parameter | ||
# DWARF-NEXT: DW_AT_location | ||
# DWARF-NEXT: [0x0000000000000000, 0x0000000000000010): DW_OP_breg0 W0+0 | ||
# DWARF-NEXT: [0x0000000000000010, 0x000000000000001c): DW_OP_entry_value(DW_OP_reg0 W0)) | ||
# DWARF-NEXT: DW_AT_name ("f") | ||
|
||
--- | | ||
target datalayout = "e-m:o-i64:64-i128:128-n32:64-S128" | ||
target triple = "arm64-apple-ios10.0.0" | ||
|
||
%struct.fat_ptr = type { i32*, i32*, i32* } | ||
|
||
define i32 @bar(%struct.fat_ptr* nocapture readonly %f) local_unnamed_addr !dbg !13 { | ||
entry: | ||
call void @llvm.dbg.declare(metadata %struct.fat_ptr* %f, metadata !23, metadata !DIExpression()), !dbg !24 | ||
%ptr2 = bitcast %struct.fat_ptr* %f to i32**, !dbg !25 | ||
%0 = load i32*, i32** %ptr2, align 8, !dbg !25 | ||
%1 = load i32, i32* %0, align 4, !dbg !31 | ||
%call = tail call i32 @baz(i32 %1), !dbg !34 | ||
%call1 = tail call i32 @baz(i32 %call), !dbg !35 | ||
ret i32 %call1, !dbg !36 | ||
} | ||
|
||
declare void @llvm.dbg.declare(metadata, metadata, metadata) | ||
|
||
declare !dbg !4 i32 @baz(i32) local_unnamed_addr optsize | ||
|
||
!llvm.dbg.cu = !{!0} | ||
!llvm.module.flags = !{!8, !9, !10, !11} | ||
!llvm.ident = !{!12} | ||
|
||
!0 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, producer: "clang", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, enums: !2, retainedTypes: !3, nameTableKind: None, sysroot: "/") | ||
!1 = !DIFile(filename: "indirect.c", directory: "/tmp/fatptr") | ||
!2 = !{} | ||
!3 = !{!4} | ||
!4 = !DISubprogram(name: "baz", scope: !1, file: !1, line: 4, type: !5, flags: DIFlagPrototyped, spFlags: DISPFlagOptimized, retainedNodes: !2) | ||
!5 = !DISubroutineType(types: !6) | ||
!6 = !{!7, !7} | ||
!7 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed) | ||
!8 = !{i32 7, !"Dwarf Version", i32 4} | ||
!9 = !{i32 2, !"Debug Info Version", i32 3} | ||
!10 = !{i32 1, !"wchar_size", i32 4} | ||
!11 = !{i32 7, !"PIC Level", i32 2} | ||
!12 = !{!"clang"} | ||
!13 = distinct !DISubprogram(name: "bar", scope: !1, file: !1, line: 5, type: !14, scopeLine: 5, flags: DIFlagPrototyped | DIFlagAllCallsDescribed, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0, retainedNodes: !22) | ||
!14 = !DISubroutineType(types: !15) | ||
!15 = !{!7, !16} | ||
!16 = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "fat_ptr", file: !1, line: 1, size: 192, elements: !17) | ||
!17 = !{!18, !20, !21} | ||
!18 = !DIDerivedType(tag: DW_TAG_member, name: "ptr", scope: !16, file: !1, line: 2, baseType: !19, size: 64) | ||
!19 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !7, size: 64) | ||
!20 = !DIDerivedType(tag: DW_TAG_member, name: "low", scope: !16, file: !1, line: 2, baseType: !19, size: 64, offset: 64) | ||
!21 = !DIDerivedType(tag: DW_TAG_member, name: "high", scope: !16, file: !1, line: 2, baseType: !19, size: 64, offset: 128) | ||
!22 = !{!23} | ||
!23 = !DILocalVariable(name: "f", arg: 1, scope: !13, file: !1, line: 5, type: !16) | ||
!24 = !DILocation(line: 5, column: 24, scope: !13) | ||
!25 = !DILocation(line: 6, column: 23, scope: !13) | ||
!31 = !DILocation(line: 6, column: 20, scope: !13) | ||
!34 = !DILocation(line: 6, column: 16, scope: !13) | ||
!35 = !DILocation(line: 6, column: 12, scope: !13) | ||
!36 = !DILocation(line: 6, column: 5, scope: !13) | ||
|
||
... | ||
--- | ||
name: bar | ||
stack: | ||
- { id: 0, name: '', type: spill-slot, offset: -8, size: 8, alignment: 8, | ||
stack-id: default, callee-saved-register: '$lr', callee-saved-restored: true, | ||
debug-info-variable: '', debug-info-expression: '', debug-info-location: '' } | ||
- { id: 1, name: '', type: spill-slot, offset: -16, size: 8, alignment: 8, | ||
stack-id: default, callee-saved-register: '$fp', callee-saved-restored: true, | ||
debug-info-variable: '', debug-info-expression: '', debug-info-location: '' } | ||
callSites: | ||
- { bb: 0, offset: 8, fwdArgRegs: | ||
- { arg: 0, reg: '$w0' } } | ||
- { bb: 0, offset: 10, fwdArgRegs: | ||
- { arg: 0, reg: '$w0' } } | ||
body: | | ||
bb.0.entry: | ||
liveins: $x0, $lr | ||
DBG_VALUE $x0, 0, !23, !DIExpression(), debug-location !24 | ||
early-clobber $sp = frame-setup STPXpre killed $fp, killed $lr, $sp, -2 :: (store 8 into %stack.1), (store 8 into %stack.0) | ||
$fp = frame-setup ADDXri $sp, 0, 0 | ||
frame-setup CFI_INSTRUCTION def_cfa $w29, 16 | ||
frame-setup CFI_INSTRUCTION offset $w30, -8, debug-location !25 | ||
frame-setup CFI_INSTRUCTION offset $w29, -16, debug-location !25 | ||
renamable $x8 = LDRXui killed renamable $x0, 0, debug-location !25 :: (load 8 from %ir.ptr2) | ||
renamable $w0 = LDRWui killed renamable $x8, 0, debug-location !31 :: (load 4 from %ir.0) | ||
BL @baz, csr_aarch64_aapcs, implicit-def dead $lr, implicit $sp, implicit $w0, implicit-def $sp, implicit-def $w0, debug-location !34 | ||
early-clobber $sp, $fp, $lr = frame-destroy LDPXpost $sp, 2, debug-location !35 :: (load 8 from %stack.1), (load 8 from %stack.0) | ||
TCRETURNdi @baz, 0, csr_aarch64_aapcs, implicit $sp, implicit $w0, debug-location !35 | ||
... |