Files
clang-p2996/llvm/test/DebugInfo/X86/debug-loc-offset.mir
Craig Topper 80aa2290fb [X86] Merge the different Jcc instructions for each condition code into single instructions that store the condition code as an operand.
Summary:
This avoids needing an isel pattern for each condition code. And it removes translation switches for converting between Jcc instructions and condition codes.

Now the printer, encoder and disassembler take care of converting the immediate. We use InstAliases to handle the assembly matching. But we print using the asm string in the instruction definition. The instruction itself is marked IsCodeGenOnly=1 to hide it from the assembly parser.

Reviewers: spatel, lebedev.ri, courbet, gchatelet, RKSimon

Reviewed By: RKSimon

Subscribers: MatzeB, qcolombet, eraman, hiraditya, arphaman, llvm-commits

Tags: #llvm

Differential Revision: https://reviews.llvm.org/D60228

llvm-svn: 357802
2019-04-05 19:28:09 +00:00

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 {{.*}} (0x0000000000000020 ".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): DW_OP_breg0 EAX+0, DW_OP_deref
# CHECK-NEXT: [0x00000037, 0x00000063): 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 {{.*}} (0x0000000000000000 ".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): DW_OP_consts +0, DW_OP_stack_value
# CHECK-NEXT: [0x0000000a, 0x00000017): 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" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "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" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "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: 4
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: 0 }
- { id: 1, size: 4, alignment: 16, stack-id: 0 }
stack:
- { id: 0, type: spill-slot, offset: -12, size: 4, alignment: 4, stack-id: 0 }
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 4 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 4 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 4 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
RETL implicit killed $eax, debug-location !16
...
---
name: _Z3baz1A
alignment: 4
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: 0 }
- { id: 1, size: 4, alignment: 16, stack-id: 0, isImmutable: true }
stack:
- { id: 0, name: z, offset: -12, size: 4, alignment: 4, stack-id: 0,
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: 0 }
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 4 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 4 into %ir.z)
CMP32mi8 renamable $eax, 1, $noreg, 4, $noreg, 2, implicit-def $eflags, debug-location !24 :: (load 4 from %ir.var)
MOV32mr $ebp, 1, $noreg, -8, $noreg, killed $eax :: (store 4 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 4 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 4 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 4 from %stack.1)
MOV32mr $esp, 1, $noreg, 0, $noreg, killed renamable $eax, debug-location !27 :: (store 4 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 4 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 4 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
RETL debug-location !30
...