diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2015-01-18 16:17:27 +0000 | 
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2015-01-18 16:17:27 +0000 | 
| commit | 67c32a98315f785a9ec9d531c1f571a0196c7463 (patch) | |
| tree | 4abb9cbeecc7901726dd0b4a37369596c852e9ef /lib/CodeGen/LiveDebugVariables.cpp | |
| parent | 9f61947910e6ab40de38e6b4034751ef1513200f (diff) | |
Notes
Diffstat (limited to 'lib/CodeGen/LiveDebugVariables.cpp')
| -rw-r--r-- | lib/CodeGen/LiveDebugVariables.cpp | 88 | 
1 files changed, 60 insertions, 28 deletions
diff --git a/lib/CodeGen/LiveDebugVariables.cpp b/lib/CodeGen/LiveDebugVariables.cpp index 388f58fde2ab..dc936a3f5b85 100644 --- a/lib/CodeGen/LiveDebugVariables.cpp +++ b/lib/CodeGen/LiveDebugVariables.cpp @@ -39,7 +39,7 @@  #include "llvm/Target/TargetInstrInfo.h"  #include "llvm/Target/TargetMachine.h"  #include "llvm/Target/TargetRegisterInfo.h" - +#include "llvm/Target/TargetSubtargetInfo.h"  #include <memory>  using namespace llvm; @@ -109,7 +109,8 @@ public:  namespace {  class LDVImpl;  class UserValue { -  const MDNode *variable; ///< The debug info variable we are part of. +  const MDNode *Variable;   ///< The debug info variable we are part of. +  const MDNode *Expression; ///< Any complex address expression.    unsigned offset;        ///< Byte offset into variable.    bool IsIndirect;        ///< true if this is a register-indirect+offset value.    DebugLoc dl;            ///< The debug location for the variable. This is @@ -139,11 +140,10 @@ class UserValue {  public:    /// UserValue - Create a new UserValue. -  UserValue(const MDNode *var, unsigned o, bool i, DebugLoc L, -            LocMap::Allocator &alloc) -    : variable(var), offset(o), IsIndirect(i), dl(L), leader(this), -      next(nullptr), locInts(alloc) -  {} +  UserValue(const MDNode *var, const MDNode *expr, unsigned o, bool i, +            DebugLoc L, LocMap::Allocator &alloc) +      : Variable(var), Expression(expr), offset(o), IsIndirect(i), dl(L), +        leader(this), next(nullptr), locInts(alloc) {}    /// getLeader - Get the leader of this value's equivalence class.    UserValue *getLeader() { @@ -157,8 +157,10 @@ public:    UserValue *getNext() const { return next; }    /// match - Does this UserValue match the parameters? -  bool match(const MDNode *Var, unsigned Offset, bool indirect) const { -    return Var == variable && Offset == offset && indirect == IsIndirect; +  bool match(const MDNode *Var, const MDNode *Expr, unsigned Offset, +             bool indirect) const { +    return Var == Variable && Expr == Expression && Offset == offset && +           indirect == IsIndirect;    }    /// merge - Merge equivalence classes. @@ -267,7 +269,7 @@ public:                         LiveIntervals &LIS, const TargetInstrInfo &TRI);    /// findDebugLoc - Return DebugLoc used for this DBG_VALUE instruction. A -  /// variable may have more than one corresponding DBG_VALUE instructions.  +  /// variable may have more than one corresponding DBG_VALUE instructions.    /// Only first one needs DebugLoc to identify variable's lexical scope    /// in source file.    DebugLoc findDebugLoc(); @@ -306,8 +308,8 @@ class LDVImpl {    UVMap userVarMap;    /// getUserValue - Find or create a UserValue. -  UserValue *getUserValue(const MDNode *Var, unsigned Offset, -                          bool IsIndirect, DebugLoc DL); +  UserValue *getUserValue(const MDNode *Var, const MDNode *Expr, +                          unsigned Offset, bool IsIndirect, DebugLoc DL);    /// lookupVirtReg - Find the EC leader for VirtReg or null.    UserValue *lookupVirtReg(unsigned VirtReg); @@ -329,12 +331,13 @@ class LDVImpl {    void computeIntervals();  public: -  LDVImpl(LiveDebugVariables *ps) : pass(*ps), EmitDone(false), -                                    ModifiedMF(false) {} +  LDVImpl(LiveDebugVariables *ps) +      : pass(*ps), MF(nullptr), EmitDone(false), ModifiedMF(false) {}    bool runOnMachineFunction(MachineFunction &mf);    /// clear - Release all memory.    void clear() { +    MF = nullptr;      userValues.clear();      virtRegToEqClass.clear();      userVarMap.clear(); @@ -343,6 +346,7 @@ public:             "Dbg values are not emitted in LDV");      EmitDone = false;      ModifiedMF = false; +    LS.reset();    }    /// mapVirtReg - Map virtual register to an equivalence class. @@ -359,8 +363,8 @@ public:  } // namespace  void UserValue::print(raw_ostream &OS, const TargetMachine *TM) { -  DIVariable DV(variable); -  OS << "!\"";  +  DIVariable DV(Variable); +  OS << "!\"";    DV.printExtendedName(OS);    OS << "\"\t";    if (offset) @@ -420,19 +424,20 @@ void UserValue::mapVirtRegs(LDVImpl *LDV) {        LDV->mapVirtReg(locations[i].getReg(), this);  } -UserValue *LDVImpl::getUserValue(const MDNode *Var, unsigned Offset, -                                 bool IsIndirect, DebugLoc DL) { +UserValue *LDVImpl::getUserValue(const MDNode *Var, const MDNode *Expr, +                                 unsigned Offset, bool IsIndirect, +                                 DebugLoc DL) {    UserValue *&Leader = userVarMap[Var];    if (Leader) {      UserValue *UV = Leader->getLeader();      Leader = UV;      for (; UV; UV = UV->getNext()) -      if (UV->match(Var, Offset, IsIndirect)) +      if (UV->match(Var, Expr, Offset, IsIndirect))          return UV;    }    userValues.push_back( -      make_unique<UserValue>(Var, Offset, IsIndirect, DL, allocator)); +      make_unique<UserValue>(Var, Expr, Offset, IsIndirect, DL, allocator));    UserValue *UV = userValues.back().get();    Leader = UserValue::merge(Leader, UV);    return UV; @@ -452,7 +457,7 @@ UserValue *LDVImpl::lookupVirtReg(unsigned VirtReg) {  bool LDVImpl::handleDebugValue(MachineInstr *MI, SlotIndex Idx) {    // DBG_VALUE loc, offset, variable -  if (MI->getNumOperands() != 3 || +  if (MI->getNumOperands() != 4 ||        !(MI->getOperand(1).isReg() || MI->getOperand(1).isImm()) ||        !MI->getOperand(2).isMetadata()) {      DEBUG(dbgs() << "Can't handle " << *MI); @@ -462,9 +467,11 @@ bool LDVImpl::handleDebugValue(MachineInstr *MI, SlotIndex Idx) {    // Get or create the UserValue for (variable,offset).    bool IsIndirect = MI->isIndirectDebugValue();    unsigned Offset = IsIndirect ? MI->getOperand(1).getImm() : 0; -  const MDNode *Var = MI->getOperand(2).getMetadata(); +  const MDNode *Var = MI->getDebugVariable(); +  const MDNode *Expr = MI->getDebugExpression();    //here. -  UserValue *UV = getUserValue(Var, Offset, IsIndirect, MI->getDebugLoc()); +  UserValue *UV = +      getUserValue(Var, Expr, Offset, IsIndirect, MI->getDebugLoc());    UV->addDef(Idx, MI->getOperand(0));    return true;  } @@ -693,11 +700,11 @@ void LDVImpl::computeIntervals() {  }  bool LDVImpl::runOnMachineFunction(MachineFunction &mf) { +  clear();    MF = &mf;    LIS = &pass.getAnalysis<LiveIntervals>();    MDT = &pass.getAnalysis<MachineDominatorTree>(); -  TRI = mf.getTarget().getRegisterInfo(); -  clear(); +  TRI = mf.getSubtarget().getRegisterInfo();    LS.initialize(mf);    DEBUG(dbgs() << "********** COMPUTING LIVE DEBUG VARIABLES: "                 << mf.getName() << " **********\n"); @@ -709,9 +716,25 @@ bool LDVImpl::runOnMachineFunction(MachineFunction &mf) {    return Changed;  } +static void removeDebugValues(MachineFunction &mf) { +  for (MachineBasicBlock &MBB : mf) { +    for (auto MBBI = MBB.begin(), MBBE = MBB.end(); MBBI != MBBE; ) { +      if (!MBBI->isDebugValue()) { +        ++MBBI; +        continue; +      } +      MBBI = MBB.erase(MBBI); +    } +  } +} +  bool LiveDebugVariables::runOnMachineFunction(MachineFunction &mf) {    if (!EnableLDV)      return false; +  if (!FunctionDIs.count(mf.getFunction())) { +    removeDebugValues(mf); +    return false; +  }    if (!pImpl)      pImpl = new LDVImpl(this);    return static_cast<LDVImpl*>(pImpl)->runOnMachineFunction(mf); @@ -933,10 +956,13 @@ void UserValue::insertDebugValue(MachineBasicBlock *MBB, SlotIndex Idx,    if (Loc.isReg())      BuildMI(*MBB, I, findDebugLoc(), TII.get(TargetOpcode::DBG_VALUE), -            IsIndirect, Loc.getReg(), offset, variable); +            IsIndirect, Loc.getReg(), offset, Variable, Expression);    else      BuildMI(*MBB, I, findDebugLoc(), TII.get(TargetOpcode::DBG_VALUE)) -      .addOperand(Loc).addImm(offset).addMetadata(variable); +        .addOperand(Loc) +        .addImm(offset) +        .addMetadata(Variable) +        .addMetadata(Expression);  }  void UserValue::emitDebugValues(VirtRegMap *VRM, LiveIntervals &LIS, @@ -974,7 +1000,9 @@ void UserValue::emitDebugValues(VirtRegMap *VRM, LiveIntervals &LIS,  void LDVImpl::emitDebugValues(VirtRegMap *VRM) {    DEBUG(dbgs() << "********** EMITTING LIVE DEBUG VARIABLES **********\n"); -  const TargetInstrInfo *TII = MF->getTarget().getInstrInfo(); +  if (!MF) +    return; +  const TargetInstrInfo *TII = MF->getSubtarget().getInstrInfo();    for (unsigned i = 0, e = userValues.size(); i != e; ++i) {      DEBUG(userValues[i]->print(dbgs(), &MF->getTarget()));      userValues[i]->rewriteLocations(*VRM, *TRI); @@ -988,6 +1016,10 @@ void LiveDebugVariables::emitDebugValues(VirtRegMap *VRM) {      static_cast<LDVImpl*>(pImpl)->emitDebugValues(VRM);  } +bool LiveDebugVariables::doInitialization(Module &M) { +  FunctionDIs = makeSubprogramMap(M); +  return Pass::doInitialization(M); +}  #ifndef NDEBUG  void LiveDebugVariables::dump() {  | 
