diff options
Diffstat (limited to 'lib/CodeGen/LiveDebugVariables.cpp')
| -rw-r--r-- | lib/CodeGen/LiveDebugVariables.cpp | 71 | 
1 files changed, 58 insertions, 13 deletions
| diff --git a/lib/CodeGen/LiveDebugVariables.cpp b/lib/CodeGen/LiveDebugVariables.cpp index 5d38c83b49c2..3dfe4c0e8cfa 100644 --- a/lib/CodeGen/LiveDebugVariables.cpp +++ b/lib/CodeGen/LiveDebugVariables.cpp @@ -25,7 +25,10 @@  #include "llvm/Constants.h"  #include "llvm/Metadata.h"  #include "llvm/Value.h" +#include "llvm/Analysis/DebugInfo.h"  #include "llvm/ADT/IntervalMap.h" +#include "llvm/ADT/Statistic.h" +#include "llvm/CodeGen/LexicalScopes.h"  #include "llvm/CodeGen/LiveIntervalAnalysis.h"  #include "llvm/CodeGen/MachineDominators.h"  #include "llvm/CodeGen/MachineFunction.h" @@ -44,6 +47,7 @@ static cl::opt<bool>  EnableLDV("live-debug-variables", cl::init(true),            cl::desc("Enable the live debug variables pass"), cl::Hidden); +STATISTIC(NumInsertedDebugValues, "Number of DBG_VALUEs inserted");  char LiveDebugVariables::ID = 0;  INITIALIZE_PASS_BEGIN(LiveDebugVariables, "livedebugvars", @@ -67,6 +71,29 @@ LiveDebugVariables::LiveDebugVariables() : MachineFunctionPass(ID), pImpl(0) {  /// LocMap - Map of where a user value is live, and its location.  typedef IntervalMap<SlotIndex, unsigned, 4> LocMap; +namespace { +/// UserValueScopes - Keeps track of lexical scopes associated with an +/// user value's source location. +class UserValueScopes { +  DebugLoc DL; +  LexicalScopes &LS; +  SmallPtrSet<const MachineBasicBlock *, 4> LBlocks; + +public: +  UserValueScopes(DebugLoc D, LexicalScopes &L) : DL(D), LS(L) {} + +  /// dominates - Return true if current scope dominates at least one machine +  /// instruction in a given machine basic block. +  bool dominates(MachineBasicBlock *MBB) { +    if (LBlocks.empty()) +      LS.getMachineBasicBlocks(DL, LBlocks); +    if (LBlocks.count(MBB) != 0 || LS.dominates(DL, MBB)) +      return true; +    return false; +  } +}; +} // end anonymous namespace +  /// UserValue - A user value is a part of a debug info user variable.  ///  /// A DBG_VALUE instruction notes that (a sub-register of) a virtual register @@ -179,6 +206,9 @@ public:      LocMap::iterator I = locInts.find(Idx);      if (!I.valid() || I.start() != Idx)        I.insert(Idx, Idx.getNextSlot(), getLocationNo(LocMO)); +    else +      // A later DBG_VALUE at the same SlotIndex overrides the old location. +      I.setValue(getLocationNo(LocMO));    }    /// extendDef - Extend the current definition as far as possible down the @@ -195,7 +225,8 @@ public:    void extendDef(SlotIndex Idx, unsigned LocNo,                   LiveInterval *LI, const VNInfo *VNI,                   SmallVectorImpl<SlotIndex> *Kills, -                 LiveIntervals &LIS, MachineDominatorTree &MDT); +                 LiveIntervals &LIS, MachineDominatorTree &MDT, +		 UserValueScopes &UVS);    /// addDefsFromCopies - The value in LI/LocNo may be copies to other    /// registers. Determine if any of the copies are available at the kill @@ -213,7 +244,8 @@ public:    /// computeIntervals - Compute the live intervals of all locations after    /// collecting all their def points.    void computeIntervals(MachineRegisterInfo &MRI, -                        LiveIntervals &LIS, MachineDominatorTree &MDT); +                        LiveIntervals &LIS, MachineDominatorTree &MDT, +                        UserValueScopes &UVS);    /// renameRegister - Update locations to rewrite OldReg as NewReg:SubIdx.    void renameRegister(unsigned OldReg, unsigned NewReg, unsigned SubIdx, @@ -236,6 +268,9 @@ public:    /// Only first one needs DebugLoc to identify variable's lexical scope    /// in source file.    DebugLoc findDebugLoc(); + +  /// getDebugLoc - Return DebugLoc of this UserValue. +  DebugLoc getDebugLoc() { return dl;}    void print(raw_ostream&, const TargetMachine*);  };  } // namespace @@ -247,6 +282,7 @@ class LDVImpl {    LocMap::Allocator allocator;    MachineFunction *MF;    LiveIntervals *LIS; +  LexicalScopes LS;    MachineDominatorTree *MDT;    const TargetRegisterInfo *TRI; @@ -312,8 +348,10 @@ public:  } // namespace  void UserValue::print(raw_ostream &OS, const TargetMachine *TM) { -  if (const MDString *MDS = dyn_cast<MDString>(variable->getOperand(2))) -    OS << "!\"" << MDS->getString() << "\"\t"; +  DIVariable DV(variable); +  OS << "!\"";  +  DV.printExtendedName(OS); +  OS << "\"\t";    if (offset)      OS << '+' << offset;    for (LocMap::const_iterator I = locInts.begin(); I.valid(); ++I) { @@ -447,10 +485,10 @@ bool LDVImpl::collectDebugValues(MachineFunction &mf) {  void UserValue::extendDef(SlotIndex Idx, unsigned LocNo,                            LiveInterval *LI, const VNInfo *VNI,                            SmallVectorImpl<SlotIndex> *Kills, -                          LiveIntervals &LIS, MachineDominatorTree &MDT) { +                          LiveIntervals &LIS, MachineDominatorTree &MDT, +			  UserValueScopes &UVS) {    SmallVector<SlotIndex, 16> Todo;    Todo.push_back(Idx); -    do {      SlotIndex Start = Todo.pop_back_val();      MachineBasicBlock *MBB = LIS.getMBBFromIndex(Start); @@ -497,8 +535,11 @@ void UserValue::extendDef(SlotIndex Idx, unsigned LocNo,        continue;      const std::vector<MachineDomTreeNode*> &Children =        MDT.getNode(MBB)->getChildren(); -    for (unsigned i = 0, e = Children.size(); i != e; ++i) -      Todo.push_back(LIS.getMBBStartIdx(Children[i]->getBlock())); +    for (unsigned i = 0, e = Children.size(); i != e; ++i) { +      MachineBasicBlock *MBB = Children[i]->getBlock(); +      if (UVS.dominates(MBB)) +        Todo.push_back(LIS.getMBBStartIdx(MBB)); +    }    } while (!Todo.empty());  } @@ -578,7 +619,8 @@ UserValue::addDefsFromCopies(LiveInterval *LI, unsigned LocNo,  void  UserValue::computeIntervals(MachineRegisterInfo &MRI,                              LiveIntervals &LIS, -                            MachineDominatorTree &MDT) { +                            MachineDominatorTree &MDT, +			    UserValueScopes &UVS) {    SmallVector<std::pair<SlotIndex, unsigned>, 16> Defs;    // Collect all defs to be extended (Skipping undefs). @@ -597,10 +639,10 @@ UserValue::computeIntervals(MachineRegisterInfo &MRI,        LiveInterval *LI = &LIS.getInterval(Loc.getReg());        const VNInfo *VNI = LI->getVNInfoAt(Idx);        SmallVector<SlotIndex, 16> Kills; -      extendDef(Idx, LocNo, LI, VNI, &Kills, LIS, MDT); +      extendDef(Idx, LocNo, LI, VNI, &Kills, LIS, MDT, UVS);        addDefsFromCopies(LI, LocNo, Kills, Defs, MRI, LIS);      } else -      extendDef(Idx, LocNo, 0, 0, 0, LIS, MDT); +      extendDef(Idx, LocNo, 0, 0, 0, LIS, MDT, UVS);    }    // Finally, erase all the undefs. @@ -613,7 +655,8 @@ UserValue::computeIntervals(MachineRegisterInfo &MRI,  void LDVImpl::computeIntervals() {    for (unsigned i = 0, e = userValues.size(); i != e; ++i) { -    userValues[i]->computeIntervals(MF->getRegInfo(), *LIS, *MDT); +    UserValueScopes UVS(userValues[i]->getDebugLoc(), LS); +    userValues[i]->computeIntervals(MF->getRegInfo(), *LIS, *MDT, UVS);      userValues[i]->mapVirtRegs(this);    }  } @@ -624,6 +667,7 @@ bool LDVImpl::runOnMachineFunction(MachineFunction &mf) {    MDT = &pass.getAnalysis<MachineDominatorTree>();    TRI = mf.getTarget().getRegisterInfo();    clear(); +  LS.initialize(mf);    DEBUG(dbgs() << "********** COMPUTING LIVE DEBUG VARIABLES: "                 << ((Value*)mf.getFunction())->getName()                 << " **********\n"); @@ -631,6 +675,7 @@ bool LDVImpl::runOnMachineFunction(MachineFunction &mf) {    bool Changed = collectDebugValues(mf);    computeIntervals();    DEBUG(print(dbgs())); +  LS.releaseMemory();    return Changed;  } @@ -891,6 +936,7 @@ void UserValue::insertDebugValue(MachineBasicBlock *MBB, SlotIndex Idx,                                   const TargetInstrInfo &TII) {    MachineBasicBlock::iterator I = findInsertLocation(MBB, Idx, LIS);    MachineOperand &Loc = locations[LocNo]; +  ++NumInsertedDebugValues;    // Frame index locations may require a target callback.    if (Loc.isFI()) { @@ -921,7 +967,6 @@ void UserValue::emitDebugValues(VirtRegMap *VRM, LiveIntervals &LIS,      DEBUG(dbgs() << " BB#" << MBB->getNumber() << '-' << MBBEnd);      insertDebugValue(MBB, Start, LocNo, LIS, TII); -      // This interval may span multiple basic blocks.      // Insert a DBG_VALUE into each one.      while(Stop > MBBEnd) { | 
