mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-03-18 12:31:26 +00:00
Directly point debug info to the stack slot of the arugment, instead of trying to keep track of vreg in which it the arugment is copied. The LiveDebugVariable can keep track of variable's ranges.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@139330 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
441462f932
commit
9aee335c23
@ -199,12 +199,12 @@ public:
|
||||
LiveOutRegInfo[Reg].IsValid = false;
|
||||
}
|
||||
|
||||
/// setByValArgumentFrameIndex - Record frame index for the byval
|
||||
/// setArgumentFrameIndex - Record frame index for the byval
|
||||
/// argument.
|
||||
void setByValArgumentFrameIndex(const Argument *A, int FI);
|
||||
void setArgumentFrameIndex(const Argument *A, int FI);
|
||||
|
||||
/// getByValArgumentFrameIndex - Get frame index for the byval argument.
|
||||
int getByValArgumentFrameIndex(const Argument *A);
|
||||
/// getArgumentFrameIndex - Get frame index for the byval argument.
|
||||
int getArgumentFrameIndex(const Argument *A);
|
||||
|
||||
private:
|
||||
/// LiveOutRegInfo - Information about live out vregs.
|
||||
|
@ -531,13 +531,10 @@ bool FastISel::SelectCall(const User *I) {
|
||||
unsigned Reg = 0;
|
||||
unsigned Offset = 0;
|
||||
if (const Argument *Arg = dyn_cast<Argument>(Address)) {
|
||||
if (Arg->hasByValAttr()) {
|
||||
// Byval arguments' frame index is recorded during argument lowering.
|
||||
// Use this info directly.
|
||||
Offset = FuncInfo.getByValArgumentFrameIndex(Arg);
|
||||
if (Offset)
|
||||
Reg = TRI.getFrameRegister(*FuncInfo.MF);
|
||||
}
|
||||
// Some arguments' frame index is recorded during argument lowering.
|
||||
Offset = FuncInfo.getArgumentFrameIndex(Arg);
|
||||
if (Offset)
|
||||
Reg = TRI.getFrameRegister(*FuncInfo.MF);
|
||||
}
|
||||
if (!Reg)
|
||||
Reg = getRegForValue(Address);
|
||||
|
@ -351,20 +351,18 @@ void FunctionLoweringInfo::ComputePHILiveOutRegInfo(const PHINode *PN) {
|
||||
}
|
||||
}
|
||||
|
||||
/// setByValArgumentFrameIndex - Record frame index for the byval
|
||||
/// setArgumentFrameIndex - Record frame index for the byval
|
||||
/// argument. This overrides previous frame index entry for this argument,
|
||||
/// if any.
|
||||
void FunctionLoweringInfo::setByValArgumentFrameIndex(const Argument *A,
|
||||
void FunctionLoweringInfo::setArgumentFrameIndex(const Argument *A,
|
||||
int FI) {
|
||||
assert (A->hasByValAttr() && "Argument does not have byval attribute!");
|
||||
ByValArgFrameIndexMap[A] = FI;
|
||||
}
|
||||
|
||||
/// getByValArgumentFrameIndex - Get frame index for the byval argument.
|
||||
/// getArgumentFrameIndex - Get frame index for the byval argument.
|
||||
/// If the argument does not have any assigned frame index then 0 is
|
||||
/// returned.
|
||||
int FunctionLoweringInfo::getByValArgumentFrameIndex(const Argument *A) {
|
||||
assert (A->hasByValAttr() && "Argument does not have byval attribute!");
|
||||
int FunctionLoweringInfo::getArgumentFrameIndex(const Argument *A) {
|
||||
DenseMap<const Argument *, int>::iterator I =
|
||||
ByValArgFrameIndexMap.find(A);
|
||||
if (I != ByValArgFrameIndexMap.end())
|
||||
|
@ -4394,17 +4394,12 @@ SelectionDAGBuilder::EmitFuncArgumentDbgValue(const Value *V, MDNode *Variable,
|
||||
return false;
|
||||
|
||||
unsigned Reg = 0;
|
||||
if (Arg->hasByValAttr()) {
|
||||
// Byval arguments' frame index is recorded during argument lowering.
|
||||
// Use this info directly.
|
||||
Reg = TRI->getFrameRegister(MF);
|
||||
Offset = FuncInfo.getByValArgumentFrameIndex(Arg);
|
||||
// If byval argument ofset is not recorded then ignore this.
|
||||
if (!Offset)
|
||||
Reg = 0;
|
||||
}
|
||||
// Some arguments' frame index is recorded during argument lowering.
|
||||
Offset = FuncInfo.getArgumentFrameIndex(Arg);
|
||||
if (Offset)
|
||||
Reg = TRI->getFrameRegister(MF);
|
||||
|
||||
if (N.getNode()) {
|
||||
if (!Reg && N.getNode()) {
|
||||
if (N.getOpcode() == ISD::CopyFromReg)
|
||||
Reg = cast<RegisterSDNode>(N.getOperand(1))->getReg();
|
||||
else
|
||||
@ -6733,15 +6728,22 @@ void SelectionDAGISel::LowerArguments(const BasicBlock *LLVMBB) {
|
||||
if (ArgValues.empty())
|
||||
continue;
|
||||
|
||||
// Note down frame index for byval arguments.
|
||||
if (I->hasByValAttr())
|
||||
if (FrameIndexSDNode *FI =
|
||||
dyn_cast<FrameIndexSDNode>(ArgValues[0].getNode()))
|
||||
FuncInfo->setByValArgumentFrameIndex(I, FI->getIndex());
|
||||
// Note down frame index.
|
||||
if (FrameIndexSDNode *FI =
|
||||
dyn_cast<FrameIndexSDNode>(ArgValues[0].getNode()))
|
||||
FuncInfo->setArgumentFrameIndex(I, FI->getIndex());
|
||||
|
||||
SDValue Res = DAG.getMergeValues(&ArgValues[0], NumValues,
|
||||
SDB->getCurDebugLoc());
|
||||
|
||||
SDB->setValue(I, Res);
|
||||
if (!EnableFastISel && Res.getOpcode() == ISD::BUILD_PAIR) {
|
||||
if (LoadSDNode *LNode =
|
||||
dyn_cast<LoadSDNode>(Res.getOperand(0).getNode()))
|
||||
if (FrameIndexSDNode *FI =
|
||||
dyn_cast<FrameIndexSDNode>(LNode->getBasePtr().getNode()))
|
||||
FuncInfo->setArgumentFrameIndex(I, FI->getIndex());
|
||||
}
|
||||
|
||||
// If this argument is live outside of the entry block, insert a copy from
|
||||
// wherever we got it to the vreg that other BB's will reference it as.
|
||||
|
65
test/CodeGen/ARM/debug-info-arg.ll
Normal file
65
test/CodeGen/ARM/debug-info-arg.ll
Normal file
@ -0,0 +1,65 @@
|
||||
; RUN: llc < %s | FileCheck %s
|
||||
; Test to check argument y's debug info uses FI
|
||||
; Radar 10048772
|
||||
target datalayout = "e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:32:64-v128:32:128-a0:0:32-n32"
|
||||
target triple = "thumbv7-apple-macosx10.7.0"
|
||||
|
||||
%struct.tag_s = type { i32, i32, i32 }
|
||||
|
||||
define void @foo(%struct.tag_s* nocapture %this, %struct.tag_s* %c, i64 %x, i64 %y, %struct.tag_s* nocapture %ptr1, %struct.tag_s* nocapture %ptr2) nounwind ssp {
|
||||
tail call void @llvm.dbg.value(metadata !{%struct.tag_s* %this}, i64 0, metadata !5), !dbg !20
|
||||
tail call void @llvm.dbg.value(metadata !{%struct.tag_s* %c}, i64 0, metadata !13), !dbg !21
|
||||
tail call void @llvm.dbg.value(metadata !{i64 %x}, i64 0, metadata !14), !dbg !22
|
||||
tail call void @llvm.dbg.value(metadata !{i64 %y}, i64 0, metadata !17), !dbg !23
|
||||
;CHECK: @DEBUG_VALUE: foo:y <- R7+4294967295
|
||||
tail call void @llvm.dbg.value(metadata !{%struct.tag_s* %ptr1}, i64 0, metadata !18), !dbg !24
|
||||
tail call void @llvm.dbg.value(metadata !{%struct.tag_s* %ptr2}, i64 0, metadata !19), !dbg !25
|
||||
%1 = icmp eq %struct.tag_s* %c, null, !dbg !26
|
||||
br i1 %1, label %3, label %2, !dbg !26
|
||||
|
||||
; <label>:2 ; preds = %0
|
||||
tail call void @foobar(i64 %x, i64 %y) nounwind, !dbg !28
|
||||
br label %3, !dbg !28
|
||||
|
||||
; <label>:3 ; preds = %0, %2
|
||||
ret void, !dbg !29
|
||||
}
|
||||
|
||||
declare void @foobar(i64, i64)
|
||||
|
||||
declare void @llvm.dbg.value(metadata, i64, metadata) nounwind readnone
|
||||
|
||||
!llvm.dbg.cu = !{!0}
|
||||
!llvm.dbg.sp = !{!1}
|
||||
!llvm.dbg.lv.foo = !{!5, !13, !14, !17, !18, !19}
|
||||
|
||||
!0 = metadata !{i32 589841, i32 0, i32 12, metadata !"one.c", metadata !"/Volumes/Athwagate/R10048772", metadata !"Apple clang version 3.0 (tags/Apple/clang-211.10.1) (based on LLVM 3.0svn)", i1 true, i1 true, metadata !"", i32 0} ; [ DW_TAG_compile_unit ]
|
||||
!1 = metadata !{i32 589870, i32 0, metadata !2, metadata !"foo", metadata !"foo", metadata !"", metadata !2, i32 11, metadata !3, i1 false, i1 true, i32 0, i32 0, i32 0, i32 256, i1 true, void (%struct.tag_s*, %struct.tag_s*, i64, i64, %struct.tag_s*, %struct.tag_s*)* @foo, null, null} ; [ DW_TAG_subprogram ]
|
||||
!2 = metadata !{i32 589865, metadata !"one.c", metadata !"/Volumes/Athwagate/R10048772", metadata !0} ; [ DW_TAG_file_type ]
|
||||
!3 = metadata !{i32 589845, metadata !2, metadata !"", metadata !2, i32 0, i64 0, i64 0, i32 0, i32 0, i32 0, metadata !4, i32 0, i32 0} ; [ DW_TAG_subroutine_type ]
|
||||
!4 = metadata !{null}
|
||||
!5 = metadata !{i32 590081, metadata !1, metadata !"this", metadata !2, i32 16777227, metadata !6, i32 0} ; [ DW_TAG_arg_variable ]
|
||||
!6 = metadata !{i32 589839, metadata !0, metadata !"", null, i32 0, i64 32, i64 32, i64 0, i32 0, metadata !7} ; [ DW_TAG_pointer_type ]
|
||||
!7 = metadata !{i32 589843, metadata !0, metadata !"tag_s", metadata !2, i32 5, i64 96, i64 32, i32 0, i32 0, i32 0, metadata !8, i32 0, i32 0} ; [ DW_TAG_structure_type ]
|
||||
!8 = metadata !{metadata !9, metadata !11, metadata !12}
|
||||
!9 = metadata !{i32 589837, metadata !7, metadata !"x", metadata !2, i32 6, i64 32, i64 32, i64 0, i32 0, metadata !10} ; [ DW_TAG_member ]
|
||||
!10 = metadata !{i32 589860, metadata !0, metadata !"int", null, i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ]
|
||||
!11 = metadata !{i32 589837, metadata !7, metadata !"y", metadata !2, i32 7, i64 32, i64 32, i64 32, i32 0, metadata !10} ; [ DW_TAG_member ]
|
||||
!12 = metadata !{i32 589837, metadata !7, metadata !"z", metadata !2, i32 8, i64 32, i64 32, i64 64, i32 0, metadata !10} ; [ DW_TAG_member ]
|
||||
!13 = metadata !{i32 590081, metadata !1, metadata !"c", metadata !2, i32 33554443, metadata !6, i32 0} ; [ DW_TAG_arg_variable ]
|
||||
!14 = metadata !{i32 590081, metadata !1, metadata !"x", metadata !2, i32 50331659, metadata !15, i32 0} ; [ DW_TAG_arg_variable ]
|
||||
!15 = metadata !{i32 589846, metadata !0, metadata !"UInt64", metadata !2, i32 1, i64 0, i64 0, i64 0, i32 0, metadata !16} ; [ DW_TAG_typedef ]
|
||||
!16 = metadata !{i32 589860, metadata !0, metadata !"long long unsigned int", null, i32 0, i64 64, i64 32, i64 0, i32 0, i32 7} ; [ DW_TAG_base_type ]
|
||||
!17 = metadata !{i32 590081, metadata !1, metadata !"y", metadata !2, i32 67108875, metadata !15, i32 0} ; [ DW_TAG_arg_variable ]
|
||||
!18 = metadata !{i32 590081, metadata !1, metadata !"ptr1", metadata !2, i32 83886091, metadata !6, i32 0} ; [ DW_TAG_arg_variable ]
|
||||
!19 = metadata !{i32 590081, metadata !1, metadata !"ptr2", metadata !2, i32 100663307, metadata !6, i32 0} ; [ DW_TAG_arg_variable ]
|
||||
!20 = metadata !{i32 11, i32 24, metadata !1, null}
|
||||
!21 = metadata !{i32 11, i32 44, metadata !1, null}
|
||||
!22 = metadata !{i32 11, i32 54, metadata !1, null}
|
||||
!23 = metadata !{i32 11, i32 64, metadata !1, null}
|
||||
!24 = metadata !{i32 11, i32 81, metadata !1, null}
|
||||
!25 = metadata !{i32 11, i32 101, metadata !1, null}
|
||||
!26 = metadata !{i32 12, i32 3, metadata !27, null}
|
||||
!27 = metadata !{i32 589835, metadata !1, i32 11, i32 107, metadata !2, i32 0} ; [ DW_TAG_lexical_block ]
|
||||
!28 = metadata !{i32 13, i32 5, metadata !27, null}
|
||||
!29 = metadata !{i32 14, i32 1, metadata !27, null}
|
Loading…
x
Reference in New Issue
Block a user