mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-02-01 13:11:39 +01:00
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 llvm-svn: 300793
This commit is contained in:
parent
3f8b068b8e
commit
ff3f98982f
@ -556,9 +556,9 @@ DIE *DwarfCompileUnit::constructVariableDIEImpl(const DbgVariable &DV,
|
||||
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 &Die, dwarf::Attribute Attribute,
|
||||
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 &Die, dwarf::Attribute Attribute,
|
||||
}
|
||||
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(const DbgVariable &DV, DIE &Die,
|
||||
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(const DbgVariable &DV, DIE &Die,
|
||||
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));
|
||||
|
||||
|
@ -1517,6 +1517,8 @@ static void emitDebugLocValue(const AsmPrinter &AP, const DIBasicType *BT,
|
||||
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 AsmPrinter &AP, const DIBasicType *BT,
|
||||
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()) {
|
||||
|
@ -193,14 +193,10 @@ void DwarfExpression::addUnsignedConstant(const APInt &Value) {
|
||||
}
|
||||
}
|
||||
|
||||
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;
|
||||
|
@ -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.
|
||||
///
|
||||
|
@ -472,6 +472,8 @@ void DwarfUnit::addBlockByrefAddress(const DbgVariable &DV, DIE &Die,
|
||||
// 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(const DbgVariable &DV, DIE &Die,
|
||||
|
||||
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));
|
||||
|
||||
|
35
test/DebugInfo/X86/fi-expr.ll
Normal file
35
test/DebugInfo/X86/fi-expr.ll
Normal file
@ -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)
|
Loading…
x
Reference in New Issue
Block a user