diff options
| author | Evan Cheng <evan.cheng@apple.com> | 2010-04-26 19:16:00 +0000 | 
|---|---|---|
| committer | Evan Cheng <evan.cheng@apple.com> | 2010-04-26 19:16:00 +0000 | 
| commit | 0e6fc61f21749111c5a1fcd33203cac412c0dcec (patch) | |
| tree | edeb0fded0f50a8dd5a39ab315fc3f67d03d4ab4 /llvm/lib | |
| parent | 6e45f1d1ffb903f3f4bc347418fdd1e087247a24 (diff) | |
| download | bcm5719-llvm-0e6fc61f21749111c5a1fcd33203cac412c0dcec.tar.gz bcm5719-llvm-0e6fc61f21749111c5a1fcd33203cac412c0dcec.zip  | |
Insert dbg_value instructions for function entry block liveins (i.e. function arguments).
llvm-svn: 102368
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/CodeGen/MachineRegisterInfo.cpp | 31 | 
1 files changed, 30 insertions, 1 deletions
diff --git a/llvm/lib/CodeGen/MachineRegisterInfo.cpp b/llvm/lib/CodeGen/MachineRegisterInfo.cpp index 850ade25da5..724d81cdba8 100644 --- a/llvm/lib/CodeGen/MachineRegisterInfo.cpp +++ b/llvm/lib/CodeGen/MachineRegisterInfo.cpp @@ -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);        }    }  | 

