No subject

Keno Fischer kfischer at college.harvard.edu
Tue Jun 9 12:01:01 PDT 2015


Thanks, David. I'm right in the middle of figuring this out and should have
it soon.

On Tue, Jun 9, 2015 at 2:06 PM, David Blaikie <dblaikie at gmail.com> wrote:

>
>
> On Mon, Jun 8, 2015 at 9:05 PM, David Blaikie <dblaikie at gmail.com> wrote:
>
>> Looks like this might've caused:
>>
>> http://lab.llvm.org:8011/builders/clang-x86_64-ubuntu-gdb-75/builds/22562
>>
>
> Reverted in r239420 to hopefully get the buildbot back to green.
>
>
>>
>>
>> On Mon, Jun 8, 2015 at 6:54 PM, Keno Fischer <
>> kfischer at college.harvard.edu> wrote:
>>
>>> Author: kfischer
>>> Date: Mon Jun  8 20:53:59 2015
>>> New Revision: 239380
>>>
>>> URL: http://llvm.org/viewvc/llvm-project?rev=239380&view=rev
>>> Log:
>>> [DWARF] Fix a few corner cases in expression emission
>>>
>>> Summary: I noticed an object file with `DW_OP_reg4 DW_OP_breg4 0` as a
>>> DWARF expression,
>>> which I traced to a missing break (and `++I`) in this code snippet.
>>> While I was at it, I also added support for a few other corner cases
>>> along the same lines that I could think of.
>>>
>>> Test Plan: Hand-crafted test case to exercises these cases is included.
>>>
>>> Reviewers: echristo, dblaikie, aprantl
>>>
>>> Reviewed By: aprantl
>>>
>>> Subscribers: llvm-commits
>>>
>>> Differential Revision: http://reviews.llvm.org/D10302
>>>
>>> Added:
>>>     llvm/trunk/test/DebugInfo/expressions.ll
>>> Modified:
>>>     llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
>>>     llvm/trunk/lib/CodeGen/AsmPrinter/DwarfExpression.cpp
>>>     llvm/trunk/lib/CodeGen/AsmPrinter/DwarfExpression.h
>>>
>>> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp?rev=239380&r1=239379&r2=239380&view=diff
>>>
>>> ==============================================================================
>>> --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp (original)
>>> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp Mon Jun  8 20:53:59
>>> 2015
>>> @@ -1562,6 +1562,8 @@ void DwarfDebug::emitDebugLoc() {
>>>      Asm->OutStreamer->EmitLabel(List.Label);
>>>      const DwarfCompileUnit *CU = List.CU;
>>>      for (const auto &Entry : DebugLocs.getEntries(List)) {
>>> +       if (Entry.BeginSym == Entry.EndSym)
>>> +        continue;
>>>        // Set up the range. This range is relative to the entry point of
>>> the
>>>        // compile unit. This is a hard coded 0 for low_pc when we're
>>> emitting
>>>        // ranges, or the DW_AT_low_pc on the compile unit otherwise.
>>>
>>> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfExpression.cpp
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfExpression.cpp?rev=239380&r1=239379&r2=239380&view=diff
>>>
>>> ==============================================================================
>>> --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfExpression.cpp (original)
>>> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfExpression.cpp Mon Jun  8
>>> 20:53:59 2015
>>> @@ -65,6 +65,11 @@ void DwarfExpression::AddShr(unsigned Sh
>>>    EmitOp(dwarf::DW_OP_shr);
>>>  }
>>>
>>> +void DwarfExpression::AddOpStackValue() {
>>> +  if (DwarfVersion >= 4)
>>> +    EmitOp(dwarf::DW_OP_stack_value);
>>> +}
>>> +
>>>  bool DwarfExpression::AddMachineRegIndirect(unsigned MachineReg, int
>>> Offset) {
>>>    if (isFrameRegister(MachineReg)) {
>>>      // If variable offset is based in frame register then use fbreg.
>>> @@ -172,16 +177,14 @@ void DwarfExpression::AddSignedConstant(
>>>    // value, so the producers and consumers started to rely on heuristics
>>>    // to disambiguate the value vs. location status of the expression.
>>>    // See PR21176 for more details.
>>> -  if (DwarfVersion >= 4)
>>> -    EmitOp(dwarf::DW_OP_stack_value);
>>> +  AddOpStackValue();
>>>  }
>>>
>>>  void DwarfExpression::AddUnsignedConstant(unsigned Value) {
>>>    EmitOp(dwarf::DW_OP_constu);
>>>    EmitUnsigned(Value);
>>>    // cf. comment in DwarfExpression::AddSignedConstant().
>>> -  if (DwarfVersion >= 4)
>>> -    EmitOp(dwarf::DW_OP_stack_value);
>>> +  AddOpStackValue();
>>>  }
>>>
>>>  static unsigned getOffsetOrZero(unsigned OffsetInBits,
>>> @@ -212,15 +215,30 @@ bool DwarfExpression::AddMachineRegExpre
>>>                 getOffsetOrZero(OffsetInBits, PieceOffsetInBits));
>>>    }
>>>    case dwarf::DW_OP_plus: {
>>> -    // [DW_OP_reg,Offset,DW_OP_plus,DW_OP_deref] -->
>>> [DW_OP_breg,Offset].
>>>      auto N = I.getNext();
>>> +    unsigned Offset = I->getArg(0);
>>> +    // First combine all DW_OP_plus until we hit either a DW_OP_deref
>>> or a
>>> +    // DW_OP_bit_piece
>>> +    while (N != E && N->getOp() == dwarf::DW_OP_plus) {
>>> +      Offset += N->getArg(0);
>>> +      ++I;
>>> +      N = I.getNext();
>>> +    }
>>>      if (N != E && N->getOp() == dwarf::DW_OP_deref) {
>>> -      unsigned Offset = I->getArg(0);
>>> +      // [DW_OP_reg,Offset,DW_OP_plus,DW_OP_deref] -->
>>> [DW_OP_breg,Offset].
>>>        ValidReg = AddMachineRegIndirect(MachineReg, Offset);
>>>        std::advance(I, 2);
>>> -      break;
>>> -    } else
>>> -      ValidReg = AddMachineRegPiece(MachineReg);
>>> +    } else {
>>> +      assert ((N == E) || (N->getOp() == dwarf::DW_OP_bit_piece));
>>> +      if (Offset == 0) {
>>> +        ValidReg = AddMachineRegPiece(MachineReg);
>>> +      } else {
>>> +        ValidReg = AddMachineRegIndirect(MachineReg, Offset);
>>> +        AddOpStackValue();
>>> +      }
>>> +      ++I;
>>> +    }
>>> +    break;
>>>    }
>>>    case dwarf::DW_OP_deref: {
>>>        // [DW_OP_reg,DW_OP_deref] --> [DW_OP_breg].
>>> @@ -237,6 +255,7 @@ bool DwarfExpression::AddMachineRegExpre
>>>
>>>    // Emit remaining elements of the expression.
>>>    AddExpression(I, E, PieceOffsetInBits);
>>> +
>>>    return true;
>>>  }
>>>
>>>
>>> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfExpression.h
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfExpression.h?rev=239380&r1=239379&r2=239380&view=diff
>>>
>>> ==============================================================================
>>> --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfExpression.h (original)
>>> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfExpression.h Mon Jun  8
>>> 20:53:59 2015
>>> @@ -83,6 +83,9 @@ public:
>>>    bool AddMachineRegPiece(unsigned MachineReg, unsigned PieceSizeInBits
>>> = 0,
>>>                            unsigned PieceOffsetInBits = 0);
>>>
>>> +  /// Emit a DW_OP_stack_value
>>> +  void AddOpStackValue();
>>> +
>>>    /// Emit a signed constant.
>>>    void AddSignedConstant(int Value);
>>>    /// Emit an unsigned constant.
>>>
>>> Added: llvm/trunk/test/DebugInfo/expressions.ll
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/expressions.ll?rev=239380&view=auto
>>>
>>> ==============================================================================
>>> --- llvm/trunk/test/DebugInfo/expressions.ll (added)
>>> +++ llvm/trunk/test/DebugInfo/expressions.ll Mon Jun  8 20:53:59 2015
>>> @@ -0,0 +1,110 @@
>>> +; REQUIRES: object-emission
>>> +; RUN: %llc_dwarf -mtriple x86_64-apple-darwin14.0.0-elf -filetype=obj
>>> %s -o %t
>>> +; RUN: %llc_dwarf -mtriple x86_64-apple-darwin14.0.0-elf -O0
>>> -filetype=obj %s -o %t0
>>> +; RUN: llvm-dwarfdump -debug-dump=loc %t | FileCheck %s
>>> +; RUN: llvm-dwarfdump -debug-dump=loc %t0 | FileCheck -check-prefix
>>> CHECK-O0 %s
>>> +
>>> +; CHECK: 0x00000000: Beginning address offset: 0x0000000000000000
>>> +; CHECK:                Ending address offset: 0x[[END:[0-9a-f]+]]
>>> +; CHECK:                 Location description:
>>> +; CHECK-NOT:                                   75 00 55
>>> +; CHECK-SAME:                                  55
>>> +; CHECK: 0x00000023: Beginning address offset: 0x0000000000000000
>>> +; CHECK:                Ending address offset: 0x{{.*}}[[END]]
>>> +; CHECK:                 Location description: 75 08 9f
>>> +; CHECK: 0x00000048: Beginning address offset: 0x0000000000000000
>>> +; CHECK:                Ending address offset: 0x{{.*}}[[END]]
>>> +; CHECK:                 Location description: 75 10 9f
>>> +; CHECK: 0x0000006d: Beginning address offset: 0x0000000000000000
>>> +; CHECK:                Ending address offset: 0x{{.*}}[[END]]
>>> +; CHECK:                 Location description: 75 18
>>> +
>>> +
>>> +; CHECK-O0: 0x00000000: Beginning address offset: 0x0000000000000000
>>> +; CHECK-O0:                Ending address offset: 0x000000000000001b
>>> +; CHECK-O0:                 Location description: 55
>>> +; CHECK-O0:             Beginning address offset: 0x000000000000001b
>>> +; CHECK-O0:                Ending address offset: 0x0000000000000024
>>> +; CHECK-O0:                 Location description: 54
>>> +; CHECK-O0:             Beginning address offset: 0x0000000000000024
>>> +; CHECK-O0:                Ending address offset: 0x0000000000000025
>>> +; CHECK-O0:                 Location description: 77 78 23 00
>>> +; CHECK-O0: 0x0000004c: Beginning address offset: 0x0000000000000000
>>> +; CHECK-O0:                Ending address offset: 0x000000000000001b
>>> +; CHECK-O0:                 Location description: 75 08 9f
>>> +; CHECK-O0:             Beginning address offset: 0x000000000000001b
>>> +; CHECK-O0:                Ending address offset: 0x0000000000000024
>>> +; CHECK-O0:                 Location description: 74 08 9f
>>> +; CHECK-O0:             Beginning address offset: 0x0000000000000024
>>> +; CHECK-O0:                Ending address offset: 0x0000000000000025
>>> +; CHECK-O0:                 Location description: 77 78 23 08
>>> +; CHECK-O0: 0x0000009c: Beginning address offset: 0x0000000000000000
>>> +; CHECK-O0:                Ending address offset: 0x000000000000001b
>>> +; CHECK-O0:                 Location description: 75 10 9f
>>> +; CHECK-O0:             Beginning address offset: 0x000000000000001b
>>> +; CHECK-O0:                Ending address offset: 0x0000000000000024
>>> +; CHECK-O0:                 Location description: 74 10 9f
>>> +; CHECK-O0:             Beginning address offset: 0x0000000000000024
>>> +; CHECK-O0:                Ending address offset: 0x0000000000000025
>>> +; CHECK-O0:                 Location description: 77 78 23 08 23 08
>>> +; CHECK-O0: 0x000000ee: Beginning address offset: 0x0000000000000000
>>> +; CHECK-O0:                Ending address offset: 0x000000000000001b
>>> +; CHECK-O0:                 Location description: 75 18
>>> +; CHECK-O0:             Beginning address offset: 0x000000000000001b
>>> +; CHECK-O0:                Ending address offset: 0x0000000000000024
>>> +; CHECK-O0:                 Location description: 74 18
>>> +; CHECK-O0:             Beginning address offset: 0x0000000000000024
>>> +; CHECK-O0:                Ending address offset: 0x0000000000000025
>>> +; CHECK-O0:                 Location description: 77 78 23 10 23 08 06
>>> +
>>> +declare void @llvm.dbg.value(metadata, i64, metadata, metadata) #0
>>> +
>>> +define float @foo(float* %args, float *%args2)
>>> +{
>>> +    call void @llvm.dbg.value(metadata float* %args, i64 0, metadata
>>> !11, metadata !12), !dbg !19
>>> +    call void @llvm.dbg.value(metadata float* %args, i64 0, metadata
>>> !13, metadata !14), !dbg !19
>>> +    call void @llvm.dbg.value(metadata float* %args, i64 0, metadata
>>> !15, metadata !16), !dbg !19
>>> +    call void @llvm.dbg.value(metadata float* %args, i64 0, metadata
>>> !17, metadata !18), !dbg !19
>>> +    %a = load float, float* %args, !dbg !19
>>> +    %bptr = getelementptr float, float* %args, i32 1, !dbg !19
>>> +    %b = load float, float* %bptr, !dbg !19
>>> +    %cptr = getelementptr float, float* %args, i32 2, !dbg !19
>>> +    %c = load float, float* %cptr, !dbg !19
>>> +    %dptr = getelementptr float, float* %args, i32 3, !dbg !19
>>> +    %d = load float, float* %dptr, !dbg !19
>>> +    %ret1 = fadd float %a, %b, !dbg !19
>>> +    %ret2 = fadd float %c, %d, !dbg !19
>>> +    call void @llvm.dbg.value(metadata float* %args2, i64 0, metadata
>>> !11, metadata !12), !dbg !19
>>> +    call void @llvm.dbg.value(metadata float* %args2, i64 0, metadata
>>> !13, metadata !14), !dbg !19
>>> +    call void @llvm.dbg.value(metadata float* %args2, i64 0, metadata
>>> !15, metadata !16), !dbg !19
>>> +    call void @llvm.dbg.value(metadata float* %args2, i64 0, metadata
>>> !17, metadata !18), !dbg !19
>>> +    %ret  = fsub float %ret1, %ret2, !dbg !19
>>> +    ret float %ret, !dbg !19
>>> +}
>>> +
>>> +attributes #0 = { nounwind readnone }
>>> +
>>> +!llvm.module.flags = !{!0, !1}
>>> +!llvm.dbg.cu = !{!2}
>>> +
>>> +!0 = !{i32 2, !"Dwarf Version", i32 4}
>>> +!1 = !{i32 1, !"Debug Info Version", i32 3}
>>> +
>>> +!2 = !DICompileUnit(language: DW_LANG_C89, file: !3, producer:
>>> "byHand", isOptimized: true, runtimeVersion: 0, emissionKind: 1, enums: !4,
>>> retainedTypes: !4, subprograms: !5, globals: !4, imports: !4)
>>> +!3 = !DIFile(filename: "expressions", directory: ".")
>>> +!4 = !{}
>>> +!5 = !{!6}
>>> +!6 = !DISubprogram(name: "foo", linkageName: "foo", scope: null, file:
>>> !3, type: !7, isLocal: false, isDefinition: true, isOptimized: true,
>>> function: float (float*, float*)* @foo, variables: !4)
>>> +!7 = !DISubroutineType(types: !8)
>>> +!8 = !{!10, !10}
>>> +!9 = !DIBasicType(name: "float", size: 4, align: 4, encoding:
>>> DW_ATE_float)
>>> +!10 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !9, size: 64,
>>> align: 64)
>>> +!11 = !DILocalVariable(tag: DW_TAG_arg_variable, name: "a", arg: 1,
>>> scope: !6, file: !3, line: 1, type: !10)
>>> +!12 = !DIExpression(DW_OP_plus, 0)
>>> +!13 = !DILocalVariable(tag: DW_TAG_arg_variable, name: "b", arg: 2,
>>> scope: !6, file: !3, line: 1, type: !10)
>>> +!14 = !DIExpression(DW_OP_plus, 8)
>>> +!15 = !DILocalVariable(tag: DW_TAG_arg_variable, name: "c", arg: 3,
>>> scope: !6, file: !3, line: 1, type: !10)
>>> +!16 = !DIExpression(DW_OP_plus, 8, DW_OP_plus, 8)
>>> +!17 = !DILocalVariable(tag: DW_TAG_arg_variable, name: "d", arg: 4,
>>> scope: !6, file: !3, line: 1, type: !9)
>>> +!18 = !DIExpression(DW_OP_plus, 16, DW_OP_plus, 8, DW_OP_deref)
>>> +!19 = !DILocation(line: 1, scope: !6)
>>>
>>>
>>> _______________________________________________
>>> llvm-commits mailing list
>>> llvm-commits at cs.uiuc.edu
>>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>>>
>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20150609/dab91f44/attachment.html>


More information about the llvm-commits mailing list