Summary: This patch is part of 3 patches that together form a single patch, but must be introduced in stages in order not to break things. The way that LLVM interprets DW_OP_plus in DIExpression nodes is basically that of the DW_OP_plus_uconst operator since LLVM expects an unsigned constant operand. This unnecessarily restricts the DW_OP_plus operator, preventing it from being used to describe the evaluation of runtime values on the expression stack. These patches try to align the semantics of DW_OP_plus and DW_OP_minus with that of the DWARF definition, which pops two elements off the expression stack, performs the operation and pushes the result back on the stack. This is done in three stages: • The first patch (LLVM) adds support for DW_OP_plus_uconst. • The second patch (Clang) contains changes all its uses from DW_OP_plus to DW_OP_plus_uconst. • The third patch (LLVM) changes the semantics of DW_OP_plus and DW_OP_minus to be in line with its DWARF meaning. This patch includes the bitcode upgrade from legacy DIExpressions. Patch by Sander de Smalen. Reviewers: echristo, pcc, aprantl Reviewed By: aprantl Subscribers: fhahn, javed.absar, aprantl, llvm-commits Differential Revision: https://reviews.llvm.org/D33894 llvm-svn: 305386
123 lines
5.4 KiB
YAML
123 lines
5.4 KiB
YAML
# RUN: llc -filetype=obj -o - %s | llvm-dwarfdump - | FileCheck %s
|
|
#
|
|
# This is an artificial example of a debug value residing in a composite
|
|
# location with a complex expression. Because the semantics of applying a DWARF
|
|
# expression to a composite location are ill-defined, the compiler should bail
|
|
# out of emitting a location.
|
|
#
|
|
# CHECK: .debug_info contents:
|
|
# CHECK: DW_TAG_variable
|
|
# CHECK-NOT: DW_AT_location
|
|
# CHECK: DW_TAG
|
|
--- |
|
|
; Generated from:
|
|
; typedef float vec2 __attribute__((vector_size(16)));
|
|
; vec2 v();
|
|
; float f() {
|
|
; vec2 vec = v();
|
|
; return vec[0] + vec[1];
|
|
; }
|
|
|
|
target datalayout = "e-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
|
|
target triple = "thumbv7s-apple-ios5.0.0"
|
|
|
|
define float @f() local_unnamed_addr #0 !dbg !9 {
|
|
entry:
|
|
%call = tail call <4 x float> bitcast (<4 x float> (...)* @v to <4 x float> ()*)() #0, !dbg !19
|
|
tail call void @llvm.dbg.value(metadata <4 x float> %call, i64 0, metadata !14, metadata !20), !dbg !21
|
|
%vecext = extractelement <4 x float> %call, i32 0, !dbg !22
|
|
%vecext1 = extractelement <4 x float> %call, i32 1, !dbg !23
|
|
%add = fadd float %vecext, %vecext1, !dbg !24
|
|
ret float %add, !dbg !25
|
|
}
|
|
|
|
declare arm_aapcs_vfpcc <4 x float> @v(...) local_unnamed_addr #0
|
|
declare void @llvm.dbg.value(metadata, i64, metadata, metadata) #0
|
|
|
|
attributes #0 = { nounwind readnone }
|
|
|
|
!llvm.dbg.cu = !{!0}
|
|
!llvm.module.flags = !{!3, !4}
|
|
!llvm.ident = !{!8}
|
|
|
|
!0 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, producer: "clang version 4.0.0 (trunk 286322) (llvm/trunk 286305)", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, enums: !2)
|
|
!1 = !DIFile(filename: "v.c", directory: "/")
|
|
!2 = !{}
|
|
!3 = !{i32 2, !"Dwarf Version", i32 2}
|
|
!4 = !{i32 2, !"Debug Info Version", i32 3}
|
|
!8 = !{!"clang version 4.0.0 (trunk 286322) (llvm/trunk 286305)"}
|
|
!9 = distinct !DISubprogram(name: "f", scope: !1, file: !1, line: 3, type: !10, isLocal: false, isDefinition: true, scopeLine: 3, isOptimized: true, unit: !0, variables: !13)
|
|
!10 = !DISubroutineType(types: !11)
|
|
!11 = !{!12}
|
|
!12 = !DIBasicType(name: "float", size: 32, encoding: DW_ATE_float)
|
|
!13 = !{!14}
|
|
!14 = !DILocalVariable(name: "vec", scope: !9, file: !1, line: 4, type: !15)
|
|
!15 = !DIDerivedType(tag: DW_TAG_typedef, name: "vec2", file: !1, line: 1, baseType: !16)
|
|
!16 = !DICompositeType(tag: DW_TAG_array_type, baseType: !12, size: 128, flags: DIFlagVector, elements: !17)
|
|
!17 = !{!18}
|
|
!18 = !DISubrange(count: 4)
|
|
!19 = !DILocation(line: 4, column: 13, scope: !9)
|
|
!20 = !DIExpression(DW_OP_plus_uconst, 1, DW_OP_constu, 1, DW_OP_minus)
|
|
!21 = !DILocation(line: 4, column: 7, scope: !9)
|
|
!22 = !DILocation(line: 5, column: 9, scope: !9)
|
|
!23 = !DILocation(line: 5, column: 18, scope: !9)
|
|
!24 = !DILocation(line: 5, column: 16, scope: !9)
|
|
!25 = !DILocation(line: 5, column: 2, scope: !9)
|
|
|
|
...
|
|
---
|
|
name: f
|
|
alignment: 1
|
|
exposesReturnsTwice: false
|
|
legalized: false
|
|
regBankSelected: false
|
|
selected: false
|
|
tracksRegLiveness: true
|
|
calleeSavedRegisters: [ '%lr', '%d8', '%d9', '%d10', '%d11', '%d12', '%d13',
|
|
'%d14', '%d15', '%q4', '%q5', '%q6', '%q7', '%r4',
|
|
'%r5', '%r6', '%r7', '%r8', '%r10', '%r11', '%s16',
|
|
'%s17', '%s18', '%s19', '%s20', '%s21', '%s22',
|
|
'%s23', '%s24', '%s25', '%s26', '%s27', '%s28',
|
|
'%s29', '%s30', '%s31', '%d8_d10', '%d9_d11', '%d10_d12',
|
|
'%d11_d13', '%d12_d14', '%d13_d15', '%q4_q5', '%q5_q6',
|
|
'%q6_q7', '%q4_q5_q6_q7', '%r4_r5', '%r6_r7', '%r10_r11',
|
|
'%d8_d9_d10', '%d9_d10_d11', '%d10_d11_d12', '%d11_d12_d13',
|
|
'%d12_d13_d14', '%d13_d14_d15', '%d8_d10_d12',
|
|
'%d9_d11_d13', '%d10_d12_d14', '%d11_d13_d15',
|
|
'%d8_d10_d12_d14', '%d9_d11_d13_d15', '%d9_d10',
|
|
'%d11_d12', '%d13_d14', '%d9_d10_d11_d12', '%d11_d12_d13_d14' ]
|
|
frameInfo:
|
|
isFrameAddressTaken: false
|
|
isReturnAddressTaken: false
|
|
hasStackMap: false
|
|
hasPatchPoint: false
|
|
stackSize: 4
|
|
offsetAdjustment: 0
|
|
maxAlignment: 4
|
|
adjustsStack: true
|
|
hasCalls: true
|
|
maxCallFrameSize: 0
|
|
hasOpaqueSPAdjustment: false
|
|
hasVAStart: false
|
|
hasMustTailInVarArgFunc: false
|
|
stack:
|
|
- { id: 0, type: spill-slot, offset: -4, size: 4, alignment: 4, callee-saved-register: '%lr' }
|
|
body: |
|
|
bb.0.entry:
|
|
liveins: %lr
|
|
|
|
early-clobber %sp = frame-setup t2STR_PRE killed undef %lr, %sp, -4, 14, _
|
|
frame-setup CFI_INSTRUCTION def_cfa_offset 4
|
|
frame-setup CFI_INSTRUCTION offset %lr, -4
|
|
tBL 14, _, @v, csr_ios, implicit-def dead %lr, implicit %sp, implicit-def %sp, implicit-def %r0, implicit-def %r1, implicit-def %r2, implicit-def %r3, debug-location !19
|
|
%d1 = VMOVDRR killed %r2, killed %r3, 14, _, implicit-def %q0, debug-location !19
|
|
%d0 = VMOVDRR killed %r0, killed %r1, 14, _, implicit killed %q0, implicit-def %q0, debug-location !19
|
|
DBG_VALUE debug-use %q0, debug-use _, !14, !20, debug-location !21
|
|
%s4 = VMOVS %s1, 14, _, implicit-def %d2, debug-location !24
|
|
%d0 = VADDfd %d0, killed %d2, 14, _, implicit killed %q0, debug-location !24
|
|
%r0 = VMOVRS %s0, 14, _, implicit killed %d0, debug-location !25
|
|
%lr, %sp = t2LDR_POST %sp, 4, 14, _, debug-location !25
|
|
tBX_RET 14, _, implicit %r0, debug-location !25
|
|
|
|
...
|