Insert dbg_value instructions for function entry block liveins (i.e. function arguments).

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@102368 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Evan Cheng 2010-04-26 19:16:00 +00:00
parent 552f09a0d7
commit f48023b3cf

View File

@ -12,8 +12,9 @@
//===----------------------------------------------------------------------===//
#include "llvm/CodeGen/MachineRegisterInfo.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/CodeGen/MachineInstrBuilder.h"
#include "llvm/Target/TargetInstrInfo.h"
#include "llvm/Support/CommandLine.h"
using namespace llvm;
MachineRegisterInfo::MachineRegisterInfo(const TargetRegisterInfo &TRI) {
@ -219,6 +220,30 @@ static void EmitLiveInCopy(MachineBasicBlock *MBB,
}
}
/// InsertLiveInDbgValue - Insert a DBG_VALUE instruction for each live-in
/// register that has a corresponding source information metadata. e.g.
/// function parameters.
static void InsertLiveInDbgValue(MachineBasicBlock *MBB,
MachineBasicBlock::iterator InsertPos,
unsigned LiveInReg, unsigned VirtReg,
const MachineRegisterInfo &MRI,
const TargetInstrInfo &TII) {
for (MachineRegisterInfo::use_iterator UI = MRI.use_begin(VirtReg),
UE = MRI.use_end(); UI != UE; ++UI) {
MachineInstr *UseMI = &*UI;
if (!UseMI->isDebugValue() || UseMI->getParent() != MBB)
continue;
// Found local dbg_value. FIXME: Verify it's not possible to have multiple
// dbg_value's which reference the vr in the same mbb.
uint64_t Offset = UseMI->getOperand(1).getImm();
const MDNode *MDPtr = UseMI->getOperand(2).getMetadata();
BuildMI(*MBB, InsertPos, InsertPos->getDebugLoc(),
TII.get(TargetOpcode::DBG_VALUE))
.addReg(LiveInReg).addImm(Offset).addMetadata(MDPtr);
return;
}
}
/// EmitLiveInCopies - Emit copies to initialize livein virtual registers
/// into the given entry block.
void
@ -235,6 +260,8 @@ MachineRegisterInfo::EmitLiveInCopies(MachineBasicBlock *EntryMBB,
const TargetRegisterClass *RC = getRegClass(LI->second);
EmitLiveInCopy(EntryMBB, InsertPos, LI->second, LI->first,
RC, CopyRegMap, *this, TRI, TII);
InsertLiveInDbgValue(EntryMBB, InsertPos,
LI->first, LI->second, *this, TII);
}
} else {
// Emit the copies into the top of the block.
@ -246,6 +273,8 @@ MachineRegisterInfo::EmitLiveInCopies(MachineBasicBlock *EntryMBB,
LI->second, LI->first, RC, RC);
assert(Emitted && "Unable to issue a live-in copy instruction!\n");
(void) Emitted;
InsertLiveInDbgValue(EntryMBB, EntryMBB->begin(),
LI->first, LI->second, *this, TII);
}
}