mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-31 20:51:52 +01:00
[DebugInfo] Normalize common kinds of DWARF sub-expressions.
Normalize common kinds of DWARF sub-expressions to make debug info encoding a bit more compact: DW_OP_constu [X < 32] -> DW_OP_litX DW_OP_constu [all ones] -> DW_OP_lit0, DW_OP_not (64-bit only) Differential revision: https://reviews.llvm.org/D51640 llvm-svn: 341457
This commit is contained in:
parent
39bd69ac41
commit
46975d210c
@ -24,6 +24,20 @@
|
||||
|
||||
using namespace llvm;
|
||||
|
||||
void DwarfExpression::emitConstu(uint64_t Value) {
|
||||
if (Value < 32)
|
||||
emitOp(dwarf::DW_OP_lit0 + Value);
|
||||
else if (Value == std::numeric_limits<uint64_t>::max()) {
|
||||
// Only do this for 64-bit values as the DWARF expression stack uses
|
||||
// target-address-size values.
|
||||
emitOp(dwarf::DW_OP_lit0);
|
||||
emitOp(dwarf::DW_OP_not);
|
||||
} else {
|
||||
emitOp(dwarf::DW_OP_constu);
|
||||
emitUnsigned(Value);
|
||||
}
|
||||
}
|
||||
|
||||
void DwarfExpression::addReg(int DwarfReg, const char *Comment) {
|
||||
assert(DwarfReg >= 0 && "invalid negative dwarf register number");
|
||||
assert((LocationKind == Unknown || LocationKind == Register) &&
|
||||
@ -72,14 +86,12 @@ void DwarfExpression::addOpPiece(unsigned SizeInBits, unsigned OffsetInBits) {
|
||||
}
|
||||
|
||||
void DwarfExpression::addShr(unsigned ShiftBy) {
|
||||
emitOp(dwarf::DW_OP_constu);
|
||||
emitUnsigned(ShiftBy);
|
||||
emitConstu(ShiftBy);
|
||||
emitOp(dwarf::DW_OP_shr);
|
||||
}
|
||||
|
||||
void DwarfExpression::addAnd(unsigned Mask) {
|
||||
emitOp(dwarf::DW_OP_constu);
|
||||
emitUnsigned(Mask);
|
||||
emitConstu(Mask);
|
||||
emitOp(dwarf::DW_OP_and);
|
||||
}
|
||||
|
||||
@ -181,8 +193,7 @@ void DwarfExpression::addSignedConstant(int64_t Value) {
|
||||
void DwarfExpression::addUnsignedConstant(uint64_t Value) {
|
||||
assert(LocationKind == Implicit || LocationKind == Unknown);
|
||||
LocationKind = Implicit;
|
||||
emitOp(dwarf::DW_OP_constu);
|
||||
emitUnsigned(Value);
|
||||
emitConstu(Value);
|
||||
}
|
||||
|
||||
void DwarfExpression::addUnsignedConstant(const APInt &Value) {
|
||||
@ -373,8 +384,7 @@ void DwarfExpression::addExpression(DIExpressionCursor &&ExprCursor,
|
||||
break;
|
||||
case dwarf::DW_OP_constu:
|
||||
assert(LocationKind != Register);
|
||||
emitOp(dwarf::DW_OP_constu);
|
||||
emitUnsigned(Op->getArg(0));
|
||||
emitConstu(Op->getArg(0));
|
||||
break;
|
||||
case dwarf::DW_OP_stack_value:
|
||||
LocationKind = Implicit;
|
||||
|
@ -138,6 +138,9 @@ protected:
|
||||
/// Emit a raw unsigned value.
|
||||
virtual void emitUnsigned(uint64_t Value) = 0;
|
||||
|
||||
/// Emit a normalized unsigned constant.
|
||||
void emitConstu(uint64_t Value);
|
||||
|
||||
/// Return whether the given machine register is the frame register in the
|
||||
/// current function.
|
||||
virtual bool isFrameRegister(const TargetRegisterInfo &TRI, unsigned MachineReg) = 0;
|
||||
|
@ -36,15 +36,15 @@ declare void @llvm.dbg.declare(metadata, metadata, metadata)
|
||||
|
||||
define amdgpu_kernel void @kernel1(
|
||||
; CHECK: {{.*}}DW_TAG_formal_parameter
|
||||
; CHECK-NEXT: DW_AT_location [DW_FORM_block1] (DW_OP_fbreg +4, DW_OP_constu 0x1, DW_OP_swap, DW_OP_xderef)
|
||||
; CHECK-NEXT: DW_AT_location [DW_FORM_block1] (DW_OP_fbreg +4, DW_OP_lit1, DW_OP_swap, DW_OP_xderef)
|
||||
; CHECK-NEXT: DW_AT_name {{.*}}"ArgN"
|
||||
i32 %ArgN,
|
||||
; CHECK: {{.*}}DW_TAG_formal_parameter
|
||||
; CHECK-NEXT: DW_AT_location [DW_FORM_block1] (DW_OP_fbreg +8, DW_OP_constu 0x1, DW_OP_swap, DW_OP_xderef)
|
||||
; CHECK-NEXT: DW_AT_location [DW_FORM_block1] (DW_OP_fbreg +8, DW_OP_lit1, DW_OP_swap, DW_OP_xderef)
|
||||
; CHECK-NEXT: DW_AT_name {{.*}}"ArgA"
|
||||
i32 addrspace(1)* %ArgA,
|
||||
; CHECK: {{.*}}DW_TAG_formal_parameter
|
||||
; CHECK-NEXT: DW_AT_location [DW_FORM_block1] (DW_OP_fbreg +16, DW_OP_constu 0x1, DW_OP_swap, DW_OP_xderef)
|
||||
; CHECK-NEXT: DW_AT_location [DW_FORM_block1] (DW_OP_fbreg +16, DW_OP_lit1, DW_OP_swap, DW_OP_xderef)
|
||||
; CHECK-NEXT: DW_AT_name {{.*}}"ArgB"
|
||||
i32 addrspace(1)* %ArgB) !dbg !13 {
|
||||
entry:
|
||||
|
@ -9,8 +9,8 @@
|
||||
; CHECK: DW_TAG_inlined_subroutine
|
||||
; CHECK: DW_TAG_variable
|
||||
; CHECK: DW_AT_location [DW_FORM_sec_offset] ({{.*}}
|
||||
; CHECK: [0x00000004, 0x00000004): DW_OP_constu 0x0, DW_OP_stack_value, DW_OP_piece 0x8
|
||||
; CHECK: [0x00000004, 0x00000014): DW_OP_constu 0x0, DW_OP_stack_value, DW_OP_piece 0x4)
|
||||
; CHECK: [0x00000004, 0x00000004): DW_OP_lit0, DW_OP_stack_value, DW_OP_piece 0x8
|
||||
; CHECK: [0x00000004, 0x00000014): DW_OP_lit0, DW_OP_stack_value, DW_OP_piece 0x4)
|
||||
|
||||
; Created form the following test case (PR26163) with
|
||||
; clang -cc1 -triple armv4t--freebsd11.0-gnueabi -emit-obj -debug-info-kind=standalone -O2 -x c test.c
|
||||
|
@ -14,7 +14,7 @@ entry:
|
||||
; The target has no native double type.
|
||||
; SROA split the complex value into two i64 values.
|
||||
; CHECK: DW_TAG_formal_parameter
|
||||
; CHECK-NEXT: DW_AT_location [DW_FORM_block1] (DW_OP_constu 0x0, DW_OP_piece 0x8)
|
||||
; CHECK-NEXT: DW_AT_location [DW_FORM_block1] (DW_OP_lit0, DW_OP_piece 0x8)
|
||||
; CHECK-NEXT: DW_AT_name {{.*}} "c"
|
||||
tail call void @llvm.dbg.value(metadata i64 0, metadata !14, metadata !17), !dbg !16
|
||||
; Manually removed to disable location list emission:
|
||||
|
@ -1,6 +1,6 @@
|
||||
; REQUIRES: object-emission
|
||||
; This test is failing for powerpc64, because a location list for the
|
||||
; variable 'c' is not generated at all. Temporary marking this test as XFAIL
|
||||
; variable 'c' is not generated at all. Temporary marking this test as XFAIL
|
||||
; for powerpc, until PR21881 is fixed.
|
||||
; XFAIL: powerpc64
|
||||
|
||||
@ -9,13 +9,14 @@
|
||||
; RUN: %llc_dwarf -O2 -dwarf-version 4 -filetype=obj < %s | llvm-dwarfdump - | FileCheck %s --check-prefix=DWARF4
|
||||
|
||||
; This is a test for PR21176.
|
||||
; DW_OP_const <const> doesn't describe a constant value, but a value at a constant address.
|
||||
; DW_OP_const <const> doesn't describe a constant value, but a value at a constant address.
|
||||
; The proper way to describe a constant value is DW_OP_constu <const>, DW_OP_stack_value.
|
||||
; For values < 32 we emit the canonical DW_OP_lit<const>.
|
||||
|
||||
; Generated with clang -S -emit-llvm -g -O2 test.cpp
|
||||
|
||||
; extern int func();
|
||||
;
|
||||
;
|
||||
; int main()
|
||||
; {
|
||||
; volatile int c = 13;
|
||||
@ -26,8 +27,8 @@
|
||||
; CHECK: DW_TAG_variable
|
||||
; CHECK: DW_AT_location
|
||||
; CHECK-NOT: DW_AT
|
||||
; DWARF23: DW_OP_constu 0xd{{$}}
|
||||
; DWARF4: DW_OP_constu 0xd, DW_OP_stack_value{{$}}
|
||||
; DWARF23: DW_OP_lit13{{$}}
|
||||
; DWARF4: DW_OP_lit13, DW_OP_stack_value{{$}}
|
||||
|
||||
; Function Attrs: uwtable
|
||||
define i32 @main() #0 !dbg !4 {
|
||||
|
@ -19,8 +19,8 @@
|
||||
; AS in 26163, we expect two ranges (as opposed to one), the first one being zero sized
|
||||
;
|
||||
;
|
||||
; CHECK: [0x0000000000000004, 0x0000000000000004): DW_OP_constu 0x3, DW_OP_piece 0x4, DW_OP_reg5 RDI, DW_OP_piece 0x2
|
||||
; CHECK: [0x0000000000000004, 0x0000000000000014): DW_OP_constu 0x3, DW_OP_piece 0x4, DW_OP_constu 0x0, DW_OP_piece 0x4
|
||||
; CHECK: [0x0000000000000004, 0x0000000000000004): DW_OP_lit3, DW_OP_piece 0x4, DW_OP_reg5 RDI, DW_OP_piece 0x2
|
||||
; CHECK: [0x0000000000000004, 0x0000000000000014): DW_OP_lit3, DW_OP_piece 0x4, DW_OP_lit0, DW_OP_piece 0x4
|
||||
|
||||
source_filename = "test/DebugInfo/X86/PR26148.ll"
|
||||
target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"
|
||||
|
@ -14,7 +14,7 @@
|
||||
; CHECK-NEXT: DW_AT_name {{.*}}"i"
|
||||
; CHECK: DW_TAG_variable
|
||||
; CHECK-NEXT: DW_AT_location [DW_FORM_data4] (
|
||||
; CHECK-NEXT: [0x{{.*}}, 0x{{.*}}): DW_OP_constu 0x0
|
||||
; CHECK-NEXT: [0x{{.*}}, 0x{{.*}}): DW_OP_lit0
|
||||
; CHECK-NEXT: [0x{{.*}}, 0x{{.*}}): DW_OP_constu 0x4000000000000000)
|
||||
; CHECK-NEXT: DW_AT_name {{.*}}"u"
|
||||
|
||||
|
@ -17,7 +17,7 @@
|
||||
|
||||
; CHECK: .debug_loc contents:
|
||||
; CHECK: 0x00000000:
|
||||
; CHECK-NEXT: [0x0000000000000000, 0x0000000000000004): DW_OP_breg0 RAX+0, DW_OP_constu 0xffffffff, DW_OP_and, DW_OP_constu 0x1, DW_OP_minus, DW_OP_stack_value
|
||||
; CHECK-NEXT: [0x0000000000000000, 0x0000000000000004): DW_OP_breg0 RAX+0, DW_OP_constu 0xffffffff, DW_OP_and, DW_OP_lit1, DW_OP_minus, DW_OP_stack_value
|
||||
; rax+0, constu 0xffffffff, and, constu 0x00000001, minus, stack-value
|
||||
|
||||
source_filename = "minus.c"
|
||||
|
@ -18,7 +18,7 @@
|
||||
; CHECK-NOT: DW_AT_const_value
|
||||
; CHECK: .debug_loc contents:
|
||||
; CHECK-NEXT: 0x00000000:
|
||||
; CHECK-NEXT: {{.*}}: DW_OP_constu 0x1, DW_OP_stack_value
|
||||
; CHECK-NEXT: {{.*}}: DW_OP_lit1, DW_OP_stack_value
|
||||
|
||||
source_filename = "test.ii"
|
||||
target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"
|
||||
|
@ -25,7 +25,7 @@
|
||||
|
||||
; DWARF: .debug_loc contents:
|
||||
; DWARF-NEXT: 0x00000000:
|
||||
; DWARF-NEXT: {{.*}}: DW_OP_breg7 RSP+{{[0-9]+}}, DW_OP_piece 0x4, DW_OP_constu 0x0, DW_OP_stack_value, DW_OP_piece 0x4
|
||||
; DWARF-NEXT: {{.*}}: DW_OP_breg7 RSP+{{[0-9]+}}, DW_OP_piece 0x4, DW_OP_lit0, DW_OP_stack_value, DW_OP_piece 0x4
|
||||
|
||||
; ModuleID = 't.c'
|
||||
source_filename = "t.c"
|
||||
|
@ -17,13 +17,13 @@ target triple = "x86_64-apple-macosx10.12.0"
|
||||
; CHECK: DW_TAG_variable
|
||||
; CHECK-NEXT: DW_AT_name {{.*}}"part_const"
|
||||
; CHECK-NOT: DW_TAG
|
||||
; CHECK: DW_AT_location [DW_FORM_exprloc] (DW_OP_addr 0x8, DW_OP_piece 0x4, DW_OP_constu 0x2, DW_OP_stack_value, DW_OP_piece 0x4)
|
||||
; CHECK: DW_AT_location [DW_FORM_exprloc] (DW_OP_addr 0x8, DW_OP_piece 0x4, DW_OP_lit2, DW_OP_stack_value, DW_OP_piece 0x4)
|
||||
; [0x0000000000000008], piece 0x00000004, constu 0x00000002, stack-value, piece 0x00000004
|
||||
; CHECK-NOT: DW_TAG
|
||||
; CHECK: DW_TAG_variable
|
||||
; CHECK-NEXT: DW_AT_name {{.*}}"full_const"
|
||||
; CHECK-NOT: DW_TAG
|
||||
; CHECK: DW_AT_location [DW_FORM_exprloc] (DW_OP_constu 0x1, DW_OP_stack_value, DW_OP_piece 0x4, DW_OP_constu 0x2, DW_OP_stack_value, DW_OP_piece 0x4)
|
||||
; CHECK: DW_AT_location [DW_FORM_exprloc] (DW_OP_lit1, DW_OP_stack_value, DW_OP_piece 0x4, DW_OP_lit2, DW_OP_stack_value, DW_OP_piece 0x4)
|
||||
; CHECK-NOT: DW_TAG
|
||||
@point.y = global i32 2, align 4, !dbg !13
|
||||
@point.x = global i32 1, align 4, !dbg !12
|
||||
|
@ -6,25 +6,23 @@
|
||||
target datalayout = "e-p:64:64"
|
||||
target triple = "x86_64-unknown-linux-gnu"
|
||||
|
||||
; CHECK-DWARF2: .byte 8 # DW_AT_location
|
||||
; CHECK-DWARF2 .byte 16
|
||||
; CHECK-DWARF2 .byte 4
|
||||
; CHECK-DWARF2 .byte 147
|
||||
; CHECK-DWARF2 .byte 2
|
||||
; CHECK-DWARF2 .byte 16
|
||||
; CHECK-DWARF2 .byte 0
|
||||
; CHECK-DWARF2 .byte 147
|
||||
; CHECK-DWARF2 .byte 2
|
||||
; CHECK-DWARF2: .byte 6 # DW_AT_location
|
||||
; CHECK-DWARF2-NEXT: .byte 52
|
||||
; CHECK-DWARF2-NEXT: .byte 147
|
||||
; CHECK-DWARF2-NEXT: .byte 2
|
||||
; CHECK-DWARF2-NEXT: .byte 48
|
||||
; CHECK-DWARF2-NEXT: .byte 147
|
||||
; CHECK-DWARF2-NEXT: .byte 2
|
||||
|
||||
; CHECK-DWARF4: .byte 10 # DW_AT_location
|
||||
; CHECK-DWARF4-NEXT: .byte 16
|
||||
; CHECK-DWARF4-NEXT: .byte 4
|
||||
; CHECK-DWARF4-NEXT: .byte 159
|
||||
; CHECK-DWARF4-NEXT: .byte 147
|
||||
; CHECK-DWARF4-NEXT: .byte 2
|
||||
; CHECK-DWARF4-NEXT: .byte 16
|
||||
; CHECK-DWARF4-NEXT: .byte 0
|
||||
; CHECK-DWARF4-NEXT: .byte 159
|
||||
; CHECK-DWARF4: .byte 8 # DW_AT_location
|
||||
; CHECK-DWARF4-NEXT:.byte 52
|
||||
; CHECK-DWARF4-NEXT:.byte 159
|
||||
; CHECK-DWARF4-NEXT:.byte 147
|
||||
; CHECK-DWARF4-NEXT:.byte 2
|
||||
; CHECK-DWARF4-NEXT:.byte 48
|
||||
; CHECK-DWARF4-NEXT:.byte 159
|
||||
; CHECK-DWARF4-NEXT:.byte 147
|
||||
; CHECK-DWARF4-NEXT:.byte 2
|
||||
|
||||
!0 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus, producer: "clang", file: !4, globals: !1, emissionKind: FullDebug)
|
||||
!1 = !{!2, !10}
|
||||
|
@ -19,21 +19,21 @@
|
||||
; CHECK: DW_AT_name {{.*}} "i"
|
||||
; CHECK: DW_TAG_variable
|
||||
; CHECK-NEXT: DW_AT_location {{.*}} ([[I:.*]]
|
||||
; CHECK-NEXT: [{{.*}}, {{.*}}): DW_OP_reg5 RDI, DW_OP_piece 0x4, DW_OP_constu 0x0, DW_OP_stack_value, DW_OP_piece 0x4)
|
||||
; CHECK-NEXT: [{{.*}}, {{.*}}): DW_OP_reg5 RDI, DW_OP_piece 0x4, DW_OP_lit0, DW_OP_stack_value, DW_OP_piece 0x4)
|
||||
; CHECK-NEXT: DW_AT_name {{.*}} "r"
|
||||
;
|
||||
; CHECK: DW_TAG_subprogram
|
||||
; CHECK: DW_AT_name {{.*}} "f"
|
||||
; CHECK: DW_TAG_variable
|
||||
; CHECK-NEXT: DW_AT_location {{.*}} ([[F:.*]]
|
||||
; CHECK-NEXT: [{{.*}}, {{.*}}): DW_OP_reg17 XMM0, DW_OP_piece 0x4, DW_OP_constu 0x0, DW_OP_stack_value, DW_OP_piece 0x4)
|
||||
; CHECK-NEXT: [{{.*}}, {{.*}}): DW_OP_reg17 XMM0, DW_OP_piece 0x4, DW_OP_lit0, DW_OP_stack_value, DW_OP_piece 0x4)
|
||||
; CHECK-NEXT: DW_AT_name {{.*}} "r"
|
||||
;
|
||||
; CHECK: .debug_loc contents:
|
||||
; CHECK: [[I]]:
|
||||
; CHECK-NEXT: [{{.*}}, {{.*}}): DW_OP_reg5 RDI, DW_OP_piece 0x4, DW_OP_constu 0x0, DW_OP_stack_value, DW_OP_piece 0x4
|
||||
; CHECK-NEXT: [{{.*}}, {{.*}}): DW_OP_reg5 RDI, DW_OP_piece 0x4, DW_OP_lit0, DW_OP_stack_value, DW_OP_piece 0x4
|
||||
; CHECK: [[F]]:
|
||||
; CHECK-NEXT: [{{.*}}, {{.*}}): DW_OP_reg17 XMM0, DW_OP_piece 0x4, DW_OP_constu 0x0, DW_OP_stack_value, DW_OP_piece 0x4
|
||||
; CHECK-NEXT: [{{.*}}, {{.*}}): DW_OP_reg17 XMM0, DW_OP_piece 0x4, DW_OP_lit0, DW_OP_stack_value, DW_OP_piece 0x4
|
||||
|
||||
source_filename = "stack-value-piece.c"
|
||||
target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"
|
||||
|
Loading…
x
Reference in New Issue
Block a user