[llvm] r300793 - Fix bug that caused DwarfExpression to drop DW_OP_deref from FI locations

Adrian Prantl via llvm-commits llvm-commits at lists.llvm.org
Wed Apr 19 16:56:47 PDT 2017


This reapplies r300790 with the missing testcase.

-- adrian
> On Apr 19, 2017, at 4:42 PM, Adrian Prantl via llvm-commits <llvm-commits at lists.llvm.org> wrote:
> 
> Author: adrian
> Date: Wed Apr 19 18:42:25 2017
> New Revision: 300793
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=300793&view=rev
> Log:
> Fix bug that caused DwarfExpression to drop DW_OP_deref from FI locations
> - introduced in r300522 and found via the Swift LLDB testsuite.
> 
> The fix is to set the location kind to memory whenever an FrameIndex
> location is emitted.
> 
> rdar://problem/31707602
> 
> Added:
>    llvm/trunk/test/DebugInfo/X86/fi-expr.ll
> Modified:
>    llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp
>    llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
>    llvm/trunk/lib/CodeGen/AsmPrinter/DwarfExpression.cpp
>    llvm/trunk/lib/CodeGen/AsmPrinter/DwarfExpression.h
>    llvm/trunk/lib/CodeGen/AsmPrinter/DwarfUnit.cpp
> 
> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp?rev=300793&r1=300792&r2=300793&view=diff
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp (original)
> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp Wed Apr 19 18:42:25 2017
> @@ -556,9 +556,9 @@ DIE *DwarfCompileUnit::constructVariable
>     Ops.push_back(Offset);
>     Ops.append(Expr->elements_begin(), Expr->elements_end());
>     DIExpressionCursor Cursor(Ops);
> -    DwarfExpr.addMachineLocExpression(
> -        *Asm->MF->getSubtarget().getRegisterInfo(), Cursor,
> -        MachineLocation(FrameReg));
> +    DwarfExpr.setMemoryLocationKind();
> +    DwarfExpr.addMachineRegExpression(
> +        *Asm->MF->getSubtarget().getRegisterInfo(), Cursor, FrameReg);
>     DwarfExpr.addExpression(std::move(Cursor));
>   }
>   addBlock(*VariableDie, dwarf::DW_AT_location, DwarfExpr.finalize());
> @@ -780,6 +780,8 @@ void DwarfCompileUnit::addAddress(DIE &D
>                                   const MachineLocation &Location) {
>   DIELoc *Loc = new (DIEValueAllocator) DIELoc;
>   DIEDwarfExpression DwarfExpr(*Asm, *this, *Loc);
> +  if (Location.isIndirect())
> +    DwarfExpr.setMemoryLocationKind();
> 
>   SmallVector<uint64_t, 8> Ops;
>   if (Location.isIndirect() && Location.getOffset()) {
> @@ -788,7 +790,7 @@ void DwarfCompileUnit::addAddress(DIE &D
>   }
>   DIExpressionCursor Cursor(Ops);
>   const TargetRegisterInfo &TRI = *Asm->MF->getSubtarget().getRegisterInfo();
> -  if (!DwarfExpr.addMachineLocExpression(TRI, Cursor, Location))
> +  if (!DwarfExpr.addMachineRegExpression(TRI, Cursor, Location.getReg()))
>     return;
>   DwarfExpr.addExpression(std::move(Cursor));
> 
> @@ -807,6 +809,8 @@ void DwarfCompileUnit::addComplexAddress
>   DIEDwarfExpression DwarfExpr(*Asm, *this, *Loc);
>   const DIExpression *DIExpr = DV.getSingleExpression();
>   DwarfExpr.addFragmentOffset(DIExpr);
> +  if (Location.isIndirect())
> +    DwarfExpr.setMemoryLocationKind();
> 
>   SmallVector<uint64_t, 8> Ops;
>   if (Location.isIndirect() && Location.getOffset()) {
> @@ -816,7 +820,7 @@ void DwarfCompileUnit::addComplexAddress
>   Ops.append(DIExpr->elements_begin(), DIExpr->elements_end());
>   DIExpressionCursor Cursor(Ops);
>   const TargetRegisterInfo &TRI = *Asm->MF->getSubtarget().getRegisterInfo();
> -  if (!DwarfExpr.addMachineLocExpression(TRI, Cursor, Location))
> +  if (!DwarfExpr.addMachineRegExpression(TRI, Cursor, Location.getReg()))
>     return;
>   DwarfExpr.addExpression(std::move(Cursor));
> 
> 
> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp?rev=300793&r1=300792&r2=300793&view=diff
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp (original)
> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp Wed Apr 19 18:42:25 2017
> @@ -1517,6 +1517,8 @@ static void emitDebugLocValue(const AsmP
>       DwarfExpr.addUnsignedConstant(Value.getInt());
>   } else if (Value.isLocation()) {
>     MachineLocation Location = Value.getLoc();
> +    if (Location.isIndirect())
> +      DwarfExpr.setMemoryLocationKind();
>     SmallVector<uint64_t, 8> Ops;
>     if (Location.isIndirect() && Location.getOffset()) {
>       Ops.push_back(dwarf::DW_OP_plus);
> @@ -1525,7 +1527,7 @@ static void emitDebugLocValue(const AsmP
>     Ops.append(DIExpr->elements_begin(), DIExpr->elements_end());
>     DIExpressionCursor Cursor(Ops);
>     const TargetRegisterInfo &TRI = *AP.MF->getSubtarget().getRegisterInfo();
> -    if (!DwarfExpr.addMachineLocExpression(TRI, Cursor, Location))
> +    if (!DwarfExpr.addMachineRegExpression(TRI, Cursor, Location.getReg()))
>       return;
>     return DwarfExpr.addExpression(std::move(Cursor));
>   } else if (Value.isConstantFP()) {
> 
> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfExpression.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfExpression.cpp?rev=300793&r1=300792&r2=300793&view=diff
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfExpression.cpp (original)
> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfExpression.cpp Wed Apr 19 18:42:25 2017
> @@ -193,14 +193,10 @@ void DwarfExpression::addUnsignedConstan
>   }
> }
> 
> -bool DwarfExpression::addMachineLocExpression(const TargetRegisterInfo &TRI,
> +bool DwarfExpression::addMachineRegExpression(const TargetRegisterInfo &TRI,
>                                               DIExpressionCursor &ExprCursor,
> -                                              MachineLocation Loc,
> +                                              unsigned MachineReg,
>                                               unsigned FragmentOffsetInBits) {
> -  if (Loc.isIndirect())
> -    LocationKind = Memory;
> -
> -  unsigned MachineReg = Loc.getReg();
>   auto Fragment = ExprCursor.getFragmentInfo();
>   if (!addMachineReg(TRI, MachineReg, Fragment ? Fragment->SizeInBits : ~1U))
>     return false;
> 
> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfExpression.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfExpression.h?rev=300793&r1=300792&r2=300793&view=diff
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfExpression.h (original)
> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfExpression.h Wed Apr 19 18:42:25 2017
> @@ -16,7 +16,6 @@
> 
> #include "llvm/IR/DebugInfo.h"
> #include "llvm/Support/DataTypes.h"
> -#include "llvm/MC/MachineLocation.h"
> 
> namespace llvm {
> 
> @@ -113,8 +112,6 @@ protected:
>     SubRegisterOffsetInBits = OffsetInBits;
>   }
> 
> -  void setMemoryLocationKind();
> -
>   /// Add masking operations to stencil out a subregister.
>   void maskSubRegister();
> 
> @@ -192,17 +189,24 @@ public:
>   /// Emit an unsigned constant.
>   void addUnsignedConstant(const APInt &Value);
> 
> +  /// Lock this down to become a memory location description.
> +  void setMemoryLocationKind() {
> +    assert(LocationKind == Unknown);
> +    LocationKind = Memory;
> +  }
> +
>   /// Emit a machine register location. As an optimization this may also consume
>   /// the prefix of a DwarfExpression if a more efficient representation for
>   /// combining the register location and the first operation exists.
>   ///
> -  /// \param FragmentOffsetInBits     If this is one fragment out of a fragmented
> +  /// \param FragmentOffsetInBits     If this is one fragment out of a
> +  /// fragmented
>   ///                                 location, this is the offset of the
>   ///                                 fragment inside the entire variable.
>   /// \return                         false if no DWARF register exists
>   ///                                 for MachineReg.
> -  bool addMachineLocExpression(const TargetRegisterInfo &TRI,
> -                               DIExpressionCursor &Expr, MachineLocation Loc,
> +  bool addMachineRegExpression(const TargetRegisterInfo &TRI,
> +                               DIExpressionCursor &Expr, unsigned MachineReg,
>                                unsigned FragmentOffsetInBits = 0);
>   /// Emit all remaining operations in the DIExpressionCursor.
>   ///
> 
> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfUnit.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfUnit.cpp?rev=300793&r1=300792&r2=300793&view=diff
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfUnit.cpp (original)
> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfUnit.cpp Wed Apr 19 18:42:25 2017
> @@ -472,6 +472,8 @@ void DwarfUnit::addBlockByrefAddress(con
>   // variable's location.
>   DIELoc *Loc = new (DIEValueAllocator) DIELoc;
>   DIEDwarfExpression DwarfExpr(*Asm, *this, *Loc);
> +  if (Location.isIndirect())
> +    DwarfExpr.setMemoryLocationKind();
> 
>   SmallVector<uint64_t, 9> Ops;
>   if (Location.isIndirect() && Location.getOffset()) {
> @@ -505,7 +507,7 @@ void DwarfUnit::addBlockByrefAddress(con
> 
>   DIExpressionCursor Cursor(Ops);
>   const TargetRegisterInfo &TRI = *Asm->MF->getSubtarget().getRegisterInfo();
> -  if (!DwarfExpr.addMachineLocExpression(TRI, Cursor, Location))
> +  if (!DwarfExpr.addMachineRegExpression(TRI, Cursor, Location.getReg()))
>     return;
>   DwarfExpr.addExpression(std::move(Cursor));
> 
> 
> Added: llvm/trunk/test/DebugInfo/X86/fi-expr.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/X86/fi-expr.ll?rev=300793&view=auto
> ==============================================================================
> --- llvm/trunk/test/DebugInfo/X86/fi-expr.ll (added)
> +++ llvm/trunk/test/DebugInfo/X86/fi-expr.ll Wed Apr 19 18:42:25 2017
> @@ -0,0 +1,35 @@
> +; RUN: llc -mtriple=x86_64-apple-darwin -o - %s -filetype=obj \
> +; RUN:   | llvm-dwarfdump -debug-dump=info - | FileCheck %s
> +; A hand-crafted FrameIndex location with a DW_OP_deref.
> +; CHECK: DW_TAG_formal_parameter
> +;                                          fbreg -8, deref
> +; CHECK-NEXT: DW_AT_location {{.*}} (<0x3> 91 78 06 )
> +; CHECK-NEXT: DW_AT_name {{.*}} "foo"
> +define void @f(i8* %bar) !dbg !6 {
> +entry:
> +  %foo.addr = alloca i8*
> +  store i8* %bar, i8** %foo.addr
> +  call void @llvm.dbg.declare(metadata i8** %foo.addr, metadata !12, metadata !13), !dbg !14
> +  ret void, !dbg !15
> +}
> +
> +declare void @llvm.dbg.declare(metadata, metadata, metadata)
> +
> +!llvm.dbg.cu = !{!0}
> +!llvm.module.flags = !{!3, !4}
> +
> +!0 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, producer: "clang", isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug, enums: !2)
> +!1 = !DIFile(filename: "t.c", directory: "/")
> +!2 = !{}
> +!3 = !{i32 2, !"Dwarf Version", i32 4}
> +!4 = !{i32 2, !"Debug Info Version", i32 3}
> +!6 = distinct !DISubprogram(name: "f", scope: !1, file: !1, line: 1, type: !7, isLocal: false, isDefinition: true, scopeLine: 1, flags: DIFlagPrototyped, isOptimized: false, unit: !0, variables: !2)
> +!7 = !DISubroutineType(types: !8)
> +!8 = !{null, !9}
> +!9 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !10, size: 64)
> +!10 = !DIDerivedType(tag: DW_TAG_const_type, baseType: !11)
> +!11 = !DIBasicType(name: "char", size: 8, encoding: DW_ATE_signed_char)
> +!12 = !DILocalVariable(name: "foo", arg: 1, scope: !6, file: !1, line: 1, type: !10)
> +!13 = !DIExpression(DW_OP_deref)
> +!14 = !DILocation(line: 1, scope: !6)
> +!15 = !DILocation(line: 1, scope: !6)
> 
> 
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits



More information about the llvm-commits mailing list