[llvm-bugs] [Bug 26585] New: DBG_VALUE is accidentally promoted to location for the entire function
via llvm-bugs
llvm-bugs at lists.llvm.org
Thu Feb 11 16:56:44 PST 2016
https://llvm.org/bugs/show_bug.cgi?id=26585
Bug ID: 26585
Summary: DBG_VALUE is accidentally promoted to location for the
entire function
Product: libraries
Version: trunk
Hardware: PC
OS: All
Status: NEW
Severity: normal
Priority: P
Component: Common Code Generator Code
Assignee: unassignedbugs at nondot.org
Reporter: aprantl at apple.com
CC: llvm-bugs at lists.llvm.org
Classification: Unclassified
This condition in DwarfDebug::collectVariableInfo() is wrong:
// Check if the first DBG_VALUE is valid for the rest of the function.
if (Ranges.size() == 1 && Ranges.front().second == nullptr) {
RegVar->initializeDbgValue(MInsn);
continue;
}
If a variable is described by a single DBG_VALUE and that location isn't
clobbered until the end of the function this will cause the range to be
extended to cover the entire function (and thus before the first write to that
location).
Example
-------
Compile this with -O.
void h(int);
int g();
void f() {
h(0);
int a = g();
h(a);
}
output of -stop-after=ssa:
--- |
; ModuleID = 'test.ll'
target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-apple-macosx"
; Function Attrs: nounwind ssp uwtable
define void @f() #0 !dbg !4 {
entry:
tail call void @h(i32 0) #3, !dbg !14
%call = tail call i32 (...) @g() #3, !dbg !15
tail call void @llvm.dbg.value(metadata i32 %call, i64 0, metadata !8,
metadata !16), !dbg !17
tail call void @h(i32 %call) #3, !dbg !18
ret void, !dbg !19
}
declare void @h(i32) #1
declare i32 @g(...) #1
; Function Attrs: nounwind readnone
declare void @llvm.dbg.value(metadata, i64, metadata, metadata) #2
attributes #0 = { nounwind ssp uwtable }
attributes #1 = { }
attributes #2 = { nounwind readnone }
attributes #3 = { nounwind }
!llvm.dbg.cu = !{!0}
!llvm.module.flags = !{!10, !11, !12}
!llvm.ident = !{!13}
!0 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, producer:
"clang version 3.9.0 ", isOptimized: true, runtimeVersion: 0, emissionKind: 1,
enums: !2, subprograms: !3)
!1 = !DIFile(filename: "test.c", directory: "/Volumes/Data/llvm")
!2 = !{}
!3 = !{!4}
!4 = distinct !DISubprogram(name: "f", scope: !1, file: !1, line: 3, type:
!5, isLocal: false, isDefinition: true, scopeLine: 3, isOptimized: true,
variables: !7)
!5 = !DISubroutineType(types: !6)
!6 = !{null}
!7 = !{!8}
!8 = !DILocalVariable(name: "a", scope: !4, file: !1, line: 5, type: !9)
!9 = !DIBasicType(name: "int", size: 32, align: 32, encoding: DW_ATE_signed)
!10 = !{i32 2, !"Dwarf Version", i32 2}
!11 = !{i32 2, !"Debug Info Version", i32 3}
!12 = !{i32 1, !"PIC Level", i32 2}
!13 = !{!"clang version 3.9.0 "}
!14 = !DILocation(line: 4, column: 3, scope: !4)
!15 = !DILocation(line: 5, column: 11, scope: !4)
!16 = !DIExpression()
!17 = !DILocation(line: 5, column: 7, scope: !4)
!18 = !DILocation(line: 6, column: 3, scope: !4)
!19 = !DILocation(line: 7, column: 1, scope: !4)
...
---
name: f
alignment: 4
exposesReturnsTwice: false
hasInlineAsm: false
isSSA: false
tracksRegLiveness: true
tracksSubRegLiveness: false
calleeSavedRegisters: [ '%bh', '%bl', '%bp', '%bpl', '%bx', '%ebp', '%ebx',
'%rbp', '%rbx', '%r12', '%r13', '%r14', '%r15',
'%r12b', '%r13b', '%r14b', '%r15b', '%r12d', '%r13d',
'%r14d', '%r15d', '%r12w', '%r13w', '%r14w', '%r15w' ]
frameInfo:
isFrameAddressTaken: false
isReturnAddressTaken: false
hasStackMap: false
hasPatchPoint: false
stackSize: 8
offsetAdjustment: 0
maxAlignment: 0
adjustsStack: true
hasCalls: true
maxCallFrameSize: 0
hasOpaqueSPAdjustment: false
hasVAStart: false
hasMustTailInVarArgFunc: false
fixedStack:
- { id: 0, type: spill-slot, offset: -16, size: 8, alignment: 16 }
body: |
bb.0.entry:
liveins: %rbp
frame-setup PUSH64r killed %rbp, implicit-def %rsp, implicit %rsp
CFI_INSTRUCTION .cfi_def_cfa_offset 16
CFI_INSTRUCTION .cfi_offset %rbp, -16
%rbp = frame-setup MOV64rr %rsp
CFI_INSTRUCTION .cfi_def_cfa_register %rbp
%edi = XOR32rr undef %edi, undef %edi, implicit-def dead %eflags,
debug-location !14
CALL64pcrel32 @h, csr_64, implicit %rsp, implicit killed %edi, implicit-def
%rsp, debug-location !14
dead %eax = XOR32rr undef %eax, undef %eax, implicit-def dead %eflags,
implicit-def %al, debug-location !15
CALL64pcrel32 @g, csr_64, implicit %rsp, implicit %al, implicit-def %rsp,
implicit-def %eax, debug-location !15
DBG_VALUE debug-use %eax, debug-use _, !8, !16, debug-location !17
%edi = MOV32rr killed %eax, debug-location !18
%rbp = POP64r implicit-def %rsp, implicit %rsp, debug-location !18
TAILJMPd64 @h, csr_64, implicit %rsp, implicit %rsp, implicit killed %edi,
debug-location !18
...
Dwarfdump:
0x0000004a: TAG_variable [3]
AT_location( rax, piece 0x00000004 )
^^^^^ this should be a location list instead!
AT_name( "a" )
AT_decl_file( "/Volumes/Data/llvm/test.c" )
AT_decl_line( 5 )
AT_type( {0x0000005a} ( int ) )
--
You are receiving this mail because:
You are on the CC list for the bug.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-bugs/attachments/20160212/cf55bcf9/attachment-0001.html>
More information about the llvm-bugs
mailing list