[llvm] r300790 - 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:53:40 PDT 2017
Once again I forgot to git-add. Thanks!
-- adrian
> On Apr 19, 2017, at 4:52 PM, Robinson, Paul <paul.robinson at sony.com> wrote:
>
> Test?
>
> -----Original Message-----
> From: llvm-commits [mailto:llvm-commits-bounces at lists.llvm.org] On Behalf Of Adrian Prantl via llvm-commits
> Sent: Wednesday, April 19, 2017 4:34 PM
> To: llvm-commits at lists.llvm.org
> Subject: [llvm] r300790 - Fix bug that caused DwarfExpression to drop DW_OP_deref from FI locations
>
> Author: adrian
> Date: Wed Apr 19 18:34:14 2017
> New Revision: 300790
>
> URL: http://llvm.org/viewvc/llvm-project?rev=300790&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
>
> 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=300790&r1=300789&r2=300790&view=diff
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp (original)
> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp Wed Apr 19 18:34:14 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=300790&r1=300789&r2=300790&view=diff
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp (original)
> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp Wed Apr 19 18:34:14 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=300790&r1=300789&r2=300790&view=diff
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfExpression.cpp (original)
> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfExpression.cpp Wed Apr 19 18:34:14 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=300790&r1=300789&r2=300790&view=diff
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfExpression.h (original)
> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfExpression.h Wed Apr 19 18:34:14 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=300790&r1=300789&r2=300790&view=diff
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfUnit.cpp (original)
> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfUnit.cpp Wed Apr 19 18:34:14 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));
>
>
>
> _______________________________________________
> 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