Be more consistent in the naming convention for the various RET instructions to specify in terms of bitwidth. Helps prevent future scheduler model mismatches like those that were only addressed in D44687. Differential Revision: https://reviews.llvm.org/D113302
277 lines
13 KiB
YAML
277 lines
13 KiB
YAML
# RUN: llc -o - %s -start-after=patchable-function -filetype=obj -O0 -mtriple=i386-unknown-linux-gnu -dwarf-version=4 | llvm-dwarfdump -v - | FileCheck %s
|
|
|
|
# From the code:
|
|
#
|
|
# debug-loc-offset1.cc
|
|
# int bar (int b) {
|
|
# return b+4;
|
|
# }
|
|
#
|
|
# debug-loc-offset2.cc
|
|
# struct A {
|
|
# int var;
|
|
# virtual char foo();
|
|
# };
|
|
#
|
|
# void baz(struct A a) {
|
|
# int z = 2;
|
|
# if (a.var > 2)
|
|
# z++;
|
|
# if (a.foo() == 'a')
|
|
# z++;
|
|
# }
|
|
#
|
|
# Compiled separately for i386-pc-linux-gnu and linked together.
|
|
# This ensures that we have multiple compile units and multiple location lists
|
|
# so that we can verify that
|
|
# debug_loc entries are relative to the low_pc of the CU. The loc entry for
|
|
# the byval argument in foo.cpp is in the second CU and so should have
|
|
# an offset relative to that CU rather than from the beginning of the text
|
|
# section.
|
|
#
|
|
# Checking that we have two compile units with two sets of high/lo_pc.
|
|
# CHECK: .debug_info contents
|
|
# CHECK: DW_TAG_compile_unit
|
|
# CHECK: DW_AT_low_pc {{.*}} (0x00000020 ".text")
|
|
# CHECK: DW_AT_high_pc
|
|
#
|
|
# CHECK: DW_TAG_subprogram
|
|
# CHECK-NOT: DW_TAG
|
|
# CHECK: DW_AT_linkage_name [DW_FORM_strp]{{.*}}"_Z3baz1A"
|
|
# CHECK-NOT: {{DW_TAG|NULL}}
|
|
# CHECK: DW_TAG_formal_parameter
|
|
# CHECK-NOT: DW_TAG
|
|
# CHECK: DW_AT_location [DW_FORM_sec_offset] ({{.*}}
|
|
# CHECK-NEXT: [0x00000029, 0x00000037) ".text": DW_OP_breg0 EAX+0, DW_OP_deref
|
|
# CHECK-NEXT: [0x00000037, 0x00000063) ".text": DW_OP_breg5 EBP-8, DW_OP_deref, DW_OP_deref
|
|
# CHECK-NEXT: DW_AT_name [DW_FORM_strp]{{.*}}"a"
|
|
#
|
|
# CHECK: DW_TAG_variable
|
|
# CHECK: DW_AT_location [DW_FORM_exprloc]
|
|
# CHECK-NOT: DW_AT_location
|
|
#
|
|
# CHECK: DW_TAG_compile_unit
|
|
# CHECK: DW_AT_low_pc {{.*}} (0x00000000 ".text")
|
|
# CHECK: DW_AT_high_pc
|
|
#
|
|
# CHECK: DW_TAG_subprogram
|
|
# CHECK-NOT: DW_TAG
|
|
# CHECK: DW_AT_linkage_name [DW_FORM_strp]{{.*}}"_Z3bari"
|
|
# CHECK-NOT: {{DW_TAG|NULL}}
|
|
# CHECK: DW_TAG_formal_parameter
|
|
# CHECK-NOT: DW_TAG
|
|
# CHECK: DW_AT_location [DW_FORM_sec_offset] ({{.*}}
|
|
# CHECK-NEXT: [0x00000000, 0x0000000a) ".text": DW_OP_consts +0, DW_OP_stack_value
|
|
# CHECK-NEXT: [0x0000000a, 0x00000017) ".text": DW_OP_consts +1, DW_OP_stack_value)
|
|
# CHECK-NEXT: DW_AT_name [DW_FORM_strp]{{.*}}"b"
|
|
#
|
|
# CHECK: .debug_loc contents:
|
|
# CHECK: 0x00000000:
|
|
# CHECK-NEXT: (0x00000000, 0x0000000a): DW_OP_consts +0, DW_OP_stack_value
|
|
# CHECK-NEXT: (0x0000000a, 0x00000017): DW_OP_consts +1, DW_OP_stack_value
|
|
# CHECK: 0x00000022:
|
|
# CHECK-NEXT: (0x00000009, 0x00000017): DW_OP_breg0 EAX+0, DW_OP_deref
|
|
# CHECK-NEXT: (0x00000017, 0x00000043): DW_OP_breg5 EBP-8, DW_OP_deref, DW_OP_deref
|
|
--- |
|
|
target triple = "i386-unknown-linux-gnu"
|
|
|
|
%struct.A = type { i32 (...)**, i32 }
|
|
|
|
; Function Attrs: nounwind
|
|
define i32 @_Z3bari(i32 %b) #0 !dbg !10 {
|
|
entry:
|
|
%b.addr = alloca i32, align 4
|
|
store i32 %b, i32* %b.addr, align 4
|
|
call void @llvm.dbg.value(metadata i32 0, metadata !14, metadata !DIExpression()), !dbg !15
|
|
%0 = load i32, i32* %b.addr, align 4, !dbg !16
|
|
call void @llvm.dbg.value(metadata i32 1, metadata !14, metadata !DIExpression()), !dbg !15
|
|
%add = add nsw i32 %0, 4, !dbg !16
|
|
ret i32 %add, !dbg !16
|
|
}
|
|
|
|
; Function Attrs: nounwind readnone speculatable
|
|
declare void @llvm.dbg.declare(metadata, metadata, metadata) #1
|
|
|
|
; Function Attrs: nounwind readnone speculatable
|
|
declare void @llvm.dbg.value(metadata, metadata, metadata) #1
|
|
|
|
define void @_Z3baz1A(%struct.A* %a) #2 !dbg !17 {
|
|
entry:
|
|
%z = alloca i32, align 4
|
|
call void @llvm.dbg.declare(metadata %struct.A* %a, metadata !20, metadata !DIExpression(DW_OP_deref)), !dbg !21
|
|
call void @llvm.dbg.declare(metadata i32* %z, metadata !22, metadata !DIExpression()), !dbg !23
|
|
store i32 2, i32* %z, align 4, !dbg !23
|
|
%var = getelementptr inbounds %struct.A, %struct.A* %a, i32 0, i32 1, !dbg !24
|
|
%0 = load i32, i32* %var, align 4, !dbg !24
|
|
%cmp = icmp sgt i32 %0, 2, !dbg !24
|
|
br i1 %cmp, label %if.then, label %if.end, !dbg !24
|
|
|
|
if.then: ; preds = %entry
|
|
%1 = load i32, i32* %z, align 4, !dbg !26
|
|
%inc = add nsw i32 %1, 1, !dbg !26
|
|
store i32 %inc, i32* %z, align 4, !dbg !26
|
|
br label %if.end, !dbg !26
|
|
|
|
if.end: ; preds = %if.then, %entry
|
|
%call = call signext i8 @_ZN1A3fooEv(%struct.A* %a), !dbg !27
|
|
%conv = sext i8 %call to i32, !dbg !27
|
|
%cmp1 = icmp eq i32 %conv, 97, !dbg !27
|
|
br i1 %cmp1, label %if.then2, label %if.end4, !dbg !27
|
|
|
|
if.then2: ; preds = %if.end
|
|
%2 = load i32, i32* %z, align 4, !dbg !29
|
|
%inc3 = add nsw i32 %2, 1, !dbg !29
|
|
store i32 %inc3, i32* %z, align 4, !dbg !29
|
|
br label %if.end4, !dbg !29
|
|
|
|
if.end4: ; preds = %if.then2, %if.end
|
|
ret void, !dbg !30
|
|
}
|
|
|
|
declare signext i8 @_ZN1A3fooEv(%struct.A*) #2
|
|
|
|
; Function Attrs: nounwind
|
|
declare void @llvm.stackprotector(i8*, i8**) #3
|
|
|
|
attributes #0 = { nounwind "less-precise-fpmad"="false" "frame-pointer"="all" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" }
|
|
attributes #1 = { nounwind readnone speculatable }
|
|
attributes #2 = { "less-precise-fpmad"="false" "frame-pointer"="all" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" }
|
|
attributes #3 = { nounwind }
|
|
|
|
!llvm.dbg.cu = !{!0, !3}
|
|
!llvm.module.flags = !{!7, !8}
|
|
!llvm.ident = !{!9, !9}
|
|
|
|
!0 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus, file: !1, producer: "clang version 3.5.0 (210479)", isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug, enums: !2, retainedTypes: !2, globals: !2, imports: !2)
|
|
!1 = !DIFile(filename: "debug-loc-offset1.cc", directory: "/llvm_cmake_gcc")
|
|
!2 = !{}
|
|
!3 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus, file: !4, producer: "clang version 3.5.0 (210479)", isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug, enums: !2, retainedTypes: !5, globals: !2, imports: !2)
|
|
!4 = !DIFile(filename: "debug-loc-offset2.cc", directory: "/llvm_cmake_gcc")
|
|
!5 = !{!6}
|
|
!6 = !DICompositeType(tag: DW_TAG_structure_type, name: "A", file: !4, line: 1, flags: DIFlagFwdDecl, identifier: "_ZTS1A")
|
|
!7 = !{i32 2, !"Dwarf Version", i32 4}
|
|
!8 = !{i32 2, !"Debug Info Version", i32 3}
|
|
!9 = !{!"clang version 3.5.0 (210479)"}
|
|
!10 = distinct !DISubprogram(name: "bar", linkageName: "_Z3bari", scope: !1, file: !1, line: 1, type: !11, isLocal: false, isDefinition: true, scopeLine: 1, virtualIndex: 6, flags: DIFlagPrototyped, isOptimized: false, unit: !0, retainedNodes: !2)
|
|
!11 = !DISubroutineType(types: !12)
|
|
!12 = !{!13, !13}
|
|
!13 = !DIBasicType(name: "int", size: 32, align: 32, encoding: DW_ATE_signed)
|
|
!14 = !DILocalVariable(name: "b", arg: 1, scope: !10, file: !1, line: 1, type: !13)
|
|
!15 = !DILocation(line: 1, scope: !10)
|
|
!16 = !DILocation(line: 2, scope: !10)
|
|
!17 = distinct !DISubprogram(name: "baz", linkageName: "_Z3baz1A", scope: !4, file: !4, line: 6, type: !18, isLocal: false, isDefinition: true, scopeLine: 6, virtualIndex: 6, flags: DIFlagPrototyped, isOptimized: false, unit: !3, retainedNodes: !2)
|
|
!18 = !DISubroutineType(types: !19)
|
|
!19 = !{null, !6}
|
|
!20 = !DILocalVariable(name: "a", arg: 1, scope: !17, file: !4, line: 6, type: !6)
|
|
!21 = !DILocation(line: 6, scope: !17)
|
|
!22 = !DILocalVariable(name: "z", scope: !17, file: !4, line: 7, type: !13)
|
|
!23 = !DILocation(line: 7, scope: !17)
|
|
!24 = !DILocation(line: 8, scope: !25)
|
|
!25 = distinct !DILexicalBlock(scope: !17, file: !4, line: 8)
|
|
!26 = !DILocation(line: 9, scope: !25)
|
|
!27 = !DILocation(line: 10, scope: !28)
|
|
!28 = distinct !DILexicalBlock(scope: !17, file: !4, line: 10)
|
|
!29 = !DILocation(line: 11, scope: !28)
|
|
!30 = !DILocation(line: 12, scope: !17)
|
|
|
|
...
|
|
---
|
|
name: _Z3bari
|
|
alignment: 16
|
|
tracksRegLiveness: true
|
|
frameInfo:
|
|
stackSize: 8
|
|
offsetAdjustment: -4
|
|
maxAlignment: 4
|
|
maxCallFrameSize: 0
|
|
fixedStack:
|
|
- { id: 0, type: spill-slot, offset: -8, size: 4, alignment: 8, stack-id: default }
|
|
- { id: 1, size: 4, alignment: 16, stack-id: default }
|
|
stack:
|
|
- { id: 0, type: spill-slot, offset: -12, size: 4, alignment: 4, stack-id: default }
|
|
body: |
|
|
bb.0.entry:
|
|
frame-setup PUSH32r killed $ebp, implicit-def $esp, implicit $esp
|
|
CFI_INSTRUCTION def_cfa_offset 8
|
|
CFI_INSTRUCTION offset $ebp, -8
|
|
$ebp = frame-setup MOV32rr $esp
|
|
CFI_INSTRUCTION def_cfa_register $ebp
|
|
frame-setup PUSH32r undef $eax, implicit-def $esp, implicit $esp
|
|
renamable $eax = MOV32rm $ebp, 1, $noreg, 8, $noreg :: (load (s32) from %fixed-stack.1)
|
|
DBG_VALUE 0, 0, !14, !DIExpression(), debug-location !15
|
|
renamable $ecx = MOV32rm $ebp, 1, $noreg, 8, $noreg, debug-location !16 :: (load (s32) from %ir.b.addr)
|
|
DBG_VALUE 1, 0, !14, !DIExpression(), debug-location !15
|
|
renamable $ecx = ADD32ri8 renamable $ecx, 4, implicit-def $eflags, debug-location !16
|
|
MOV32mr $ebp, 1, $noreg, -4, $noreg, killed $eax :: (store (s32) into %fixed-stack.1)
|
|
$eax = MOV32rr killed $ecx, debug-location !16
|
|
$esp = frame-destroy ADD32ri8 $esp, 4, implicit-def dead $eflags, debug-location !16
|
|
$ebp = frame-destroy POP32r implicit-def $esp, implicit $esp, debug-location !16
|
|
CFI_INSTRUCTION def_cfa $esp, 4, debug-location !16
|
|
RET32 implicit killed $eax, debug-location !16
|
|
|
|
...
|
|
---
|
|
name: _Z3baz1A
|
|
alignment: 16
|
|
tracksRegLiveness: true
|
|
frameInfo:
|
|
stackSize: 28
|
|
offsetAdjustment: -24
|
|
maxAlignment: 4
|
|
adjustsStack: true
|
|
hasCalls: true
|
|
maxCallFrameSize: 4
|
|
fixedStack:
|
|
- { id: 0, type: spill-slot, offset: -8, size: 4, alignment: 8, stack-id: default }
|
|
- { id: 1, size: 4, alignment: 16, stack-id: default, isImmutable: true }
|
|
stack:
|
|
- { id: 0, name: z, offset: -12, size: 4, alignment: 4, stack-id: default,
|
|
debug-info-variable: '!22', debug-info-expression: '!DIExpression()',
|
|
debug-info-location: '!23' }
|
|
- { id: 1, type: spill-slot, offset: -16, size: 4, alignment: 4, stack-id: default }
|
|
body: |
|
|
bb.0.entry:
|
|
frame-setup PUSH32r killed $ebp, implicit-def $esp, implicit $esp
|
|
CFI_INSTRUCTION def_cfa_offset 8
|
|
CFI_INSTRUCTION offset $ebp, -8
|
|
$ebp = frame-setup MOV32rr $esp
|
|
CFI_INSTRUCTION def_cfa_register $ebp
|
|
$esp = frame-setup SUB32ri8 $esp, 24, implicit-def dead $eflags
|
|
renamable $eax = MOV32rm $ebp, 1, $noreg, 8, $noreg :: (load (s32) from %fixed-stack.1)
|
|
DBG_VALUE renamable $eax, 0, !20, !DIExpression(DW_OP_deref), debug-location !21
|
|
MOV32mi $ebp, 1, $noreg, -4, $noreg, 2, debug-location !23 :: (store (s32) into %ir.z)
|
|
CMP32mi8 renamable $eax, 1, $noreg, 4, $noreg, 2, implicit-def $eflags, debug-location !24 :: (load (s32) from %ir.var)
|
|
MOV32mr $ebp, 1, $noreg, -8, $noreg, killed $eax :: (store (s32) into %stack.1)
|
|
DBG_VALUE $ebp, 0, !20, !DIExpression(DW_OP_constu, 8, DW_OP_minus, DW_OP_deref, DW_OP_deref), debug-location !21
|
|
JCC_1 %bb.2, 14, implicit $eflags, debug-location !24
|
|
|
|
bb.1.if.then:
|
|
DBG_VALUE $ebp, 0, !20, !DIExpression(DW_OP_constu, 8, DW_OP_minus, DW_OP_deref, DW_OP_deref), debug-location !21
|
|
renamable $eax = MOV32rm $ebp, 1, $noreg, -4, $noreg, debug-location !26 :: (load (s32) from %ir.z)
|
|
renamable $eax = ADD32ri8 renamable $eax, 1, implicit-def $eflags, debug-location !26
|
|
MOV32mr $ebp, 1, $noreg, -4, $noreg, killed renamable $eax, debug-location !26 :: (store (s32) into %ir.z)
|
|
|
|
bb.2.if.end:
|
|
DBG_VALUE $ebp, 0, !20, !DIExpression(DW_OP_constu, 8, DW_OP_minus, DW_OP_deref, DW_OP_deref), debug-location !21
|
|
$eax = MOV32rm $ebp, 1, $noreg, -8, $noreg :: (load (s32) from %stack.1)
|
|
MOV32mr $esp, 1, $noreg, 0, $noreg, killed renamable $eax, debug-location !27 :: (store (s32) into stack)
|
|
CALLpcrel32 @_ZN1A3fooEv, csr_32, implicit $esp, implicit $ssp, implicit-def $al, debug-location !27
|
|
renamable $ecx = MOVSX32rr8 killed renamable $al, debug-location !27
|
|
CMP32ri8 killed renamable $ecx, 97, implicit-def $eflags, debug-location !27
|
|
JCC_1 %bb.4, 5, implicit $eflags, debug-location !27
|
|
|
|
bb.3.if.then2:
|
|
DBG_VALUE $ebp, 0, !20, !DIExpression(DW_OP_constu, 8, DW_OP_minus, DW_OP_deref, DW_OP_deref), debug-location !21
|
|
renamable $eax = MOV32rm $ebp, 1, $noreg, -4, $noreg, debug-location !29 :: (load (s32) from %ir.z)
|
|
renamable $eax = ADD32ri8 renamable $eax, 1, implicit-def $eflags, debug-location !29
|
|
MOV32mr $ebp, 1, $noreg, -4, $noreg, killed renamable $eax, debug-location !29 :: (store (s32) into %ir.z)
|
|
|
|
bb.4.if.end4:
|
|
DBG_VALUE $ebp, 0, !20, !DIExpression(DW_OP_constu, 8, DW_OP_minus, DW_OP_deref, DW_OP_deref), debug-location !21
|
|
$esp = frame-destroy ADD32ri8 $esp, 24, implicit-def dead $eflags, debug-location !30
|
|
$ebp = frame-destroy POP32r implicit-def $esp, implicit $esp, debug-location !30
|
|
CFI_INSTRUCTION def_cfa $esp, 4, debug-location !30
|
|
RET32 debug-location !30
|
|
|
|
...
|