diff options
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp | 97 | ||||
| -rw-r--r-- | llvm/lib/CodeGen/AsmPrinter/DwarfDebug.h | 12 | ||||
| -rw-r--r-- | llvm/lib/CodeGen/LiveDebugVariables.cpp | 17 | 
3 files changed, 49 insertions, 77 deletions
diff --git a/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp b/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp index c775c38f702..15330c28d2c 100644 --- a/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp +++ b/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp @@ -2424,7 +2424,8 @@ DwarfDebug::collectVariableInfo(const MachineFunction *MF,             ME = DbgValues.end(); MI != ME; ++MI) {        const MDNode *Var =          (*MI)->getOperand((*MI)->getNumOperands()-1).getMetadata(); -      if (Var == DV && !PrevMI->isIdenticalTo(*MI)) +      if (Var == DV &&  +          !PrevMI->isIdenticalTo(*MI))          MultipleValues.push_back(*MI);        PrevMI = *MI;      } @@ -2447,7 +2448,7 @@ DwarfDebug::collectVariableInfo(const MachineFunction *MF,        DbgVariableToDbgInstMap[AbsVar] = MInsn;        VarToAbstractVarMap[RegVar] = AbsVar;      } -    if (MultipleValues.size() <= 1 && !RegClobberInsn.count(MInsn)) { +    if (MultipleValues.size() <= 1) {        DbgVariableToDbgInstMap[RegVar] = MInsn;        continue;      } @@ -2457,11 +2458,16 @@ DwarfDebug::collectVariableInfo(const MachineFunction *MF,        RegVar->setDotDebugLocOffset(0);      else        RegVar->setDotDebugLocOffset(DotDebugLocEntries.size()); - +    const MachineInstr *Begin = NULL; +    const MachineInstr *End = NULL;      for (SmallVector<const MachineInstr *, 4>::iterator             MVI = MultipleValues.begin(), MVE = MultipleValues.end();           MVI != MVE; ++MVI) { -      const MachineInstr *Begin = *MVI; +      if (!Begin) { +        Begin = *MVI; +        continue; +      } +      End = *MVI;        MachineLocation MLoc;        if (Begin->getNumOperands() == 3) {          if (Begin->getOperand(0).isReg() && Begin->getOperand(1).isImm()) @@ -2469,25 +2475,25 @@ DwarfDebug::collectVariableInfo(const MachineFunction *MF,        } else          MLoc = Asm->getDebugValueLocation(Begin); -      if (!MLoc.getReg()) -        continue; - -      // Compute the range for a register location.        const MCSymbol *FLabel = getLabelBeforeInsn(Begin); -      const MCSymbol *SLabel = 0; +      const MCSymbol *SLabel = getLabelBeforeInsn(End); +      if (MLoc.getReg()) +        DotDebugLocEntries.push_back(DotDebugLocEntry(FLabel, SLabel, MLoc)); -      if (const MachineInstr *ClobberMI = RegClobberInsn.lookup(Begin)) -        // The register range starting at Begin may be clobbered. -        SLabel = getLabelAfterInsn(ClobberMI); -      else if (MVI + 1 == MVE) -        // If Begin is the last instruction then its value is valid +      Begin = End; +      if (MVI + 1 == MVE) { +        // If End is the last instruction then its value is valid          // until the end of the funtion. -        SLabel = FunctionEndSym; -      else -        // The value is valid until the next DBG_VALUE. -        SLabel = getLabelBeforeInsn(MVI[1]); - -      DotDebugLocEntries.push_back(DotDebugLocEntry(FLabel, SLabel, MLoc)); +        MachineLocation EMLoc; +        if (End->getNumOperands() == 3) { +          if (End->getOperand(0).isReg() && Begin->getOperand(1).isImm()) +          EMLoc.set(Begin->getOperand(0).getReg(), Begin->getOperand(1).getImm()); +        } else +          EMLoc = Asm->getDebugValueLocation(End); +        if (EMLoc.getReg())  +          DotDebugLocEntries. +            push_back(DotDebugLocEntry(SLabel, FunctionEndSym, EMLoc)); +      }      }      DotDebugLocEntries.push_back(DotDebugLocEntry());    } @@ -2562,7 +2568,7 @@ void DwarfDebug::beginInstruction(const MachineInstr *MI) {  /// endInstruction - Process end of an instruction.  void DwarfDebug::endInstruction(const MachineInstr *MI) { -  if (InsnsNeedsLabelAfter.count(MI) != 0) { +  if (InsnsEndScopeSet.count(MI) != 0) {      // Emit a label if this instruction ends a scope.      MCSymbol *Label = MMI->getContext().CreateTempSymbol();      Asm->OutStreamer.EmitLabel(Label); @@ -2827,7 +2833,7 @@ void DwarfDebug::identifyScopeMarkers() {             RE = Ranges.end(); RI != RE; ++RI) {        assert(RI->first && "DbgRange does not have first instruction!");        assert(RI->second && "DbgRange does not have second instruction!"); -      InsnsNeedsLabelAfter.insert(RI->second); +      InsnsEndScopeSet.insert(RI->second);      }    }  } @@ -2908,14 +2914,6 @@ void DwarfDebug::beginFunction(const MachineFunction *MF) {    /// ProcessedArgs - Collection of arguments already processed.    SmallPtrSet<const MDNode *, 8> ProcessedArgs; -  /// LastDbgValue - Refer back to the last DBG_VALUE instruction to mention MD. -  DenseMap<const MDNode*, const MachineInstr*> LastDbgValue; - -  const TargetRegisterInfo *TRI = Asm->TM.getRegisterInfo(); - -  /// LiveUserVar - Map physreg numbers to the MDNode they contain. -  std::vector<const MDNode*> LiveUserVar(TRI->getNumRegs()); -    DebugLoc PrevLoc;    for (MachineFunction::const_iterator I = MF->begin(), E = MF->end();         I != E; ++I) @@ -2925,15 +2923,7 @@ void DwarfDebug::beginFunction(const MachineFunction *MF) {        DebugLoc DL = MI->getDebugLoc();        if (MI->isDebugValue()) {          assert (MI->getNumOperands() > 1 && "Invalid machine instruction!"); - -        // Keep track of variables in registers. -        const MDNode *Var = -          MI->getOperand(MI->getNumOperands() - 1).getMetadata(); -        LastDbgValue[Var] = MI; -        if (isDbgValueInDefinedReg(MI)) -          LiveUserVar[MI->getOperand(0).getReg()] = Var; - -        DIVariable DV(Var); +        DIVariable DV(MI->getOperand(MI->getNumOperands() - 1).getMetadata());          if (!DV.Verify()) continue;          // If DBG_VALUE is for a local variable then it needs a label.          if (DV.getTag() != dwarf::DW_TAG_arg_variable) @@ -2954,32 +2944,6 @@ void DwarfDebug::beginFunction(const MachineFunction *MF) {          } else if (DL != PrevLoc)            // Otherwise, instruction needs a location only if it is new location.            InsnNeedsLabel.insert(MI); - -        // Check if the instruction clobbers any registers with debug vars. -        for (MachineInstr::const_mop_iterator MOI = MI->operands_begin(), -               MOE = MI->operands_end(); MOI != MOE; ++MOI) { -          if (!MOI->isReg() || !MOI->isDef() || !MOI->getReg()) -            continue; -          for (const unsigned *AI = TRI->getOverlaps(MOI->getReg()); -               unsigned Reg = *AI; ++AI) { -            const MDNode *Var = LiveUserVar[Reg]; -            if (!Var) -              continue; -            // Reg is now clobbered. -            LiveUserVar[Reg] = 0; - -            // Was MD last defined by a DBG_VALUE referring to Reg? -            const MachineInstr *Last = LastDbgValue.lookup(Var); -            if (!Last || Last->getParent() != MI->getParent()) -              continue; -            if (!isDbgValueInDefinedReg(Last) || -                Last->getOperand(0).getReg() != Reg) -              continue; -            // MD is clobbered. Make sure the next instruction gets a label. -            InsnsNeedsLabelAfter.insert(MI); -            RegClobberInsn[Last] = MI; -          } -        }        }        if (!DL.isUnknown() || UnknownLocations) @@ -3049,8 +3013,7 @@ void DwarfDebug::endFunction(const MachineFunction *MF) {    VarToAbstractVarMap.clear();    DbgVariableToDbgInstMap.clear();    DeleteContainerSeconds(DbgScopeMap); -  InsnsNeedsLabelAfter.clear(); -  RegClobberInsn.clear(); +  InsnsEndScopeSet.clear();    ConcreteScopes.clear();    DeleteContainerSeconds(AbstractScopes);    AbstractScopesList.clear(); diff --git a/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.h b/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.h index e59ab5bd821..2863ea38060 100644 --- a/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.h +++ b/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.h @@ -200,6 +200,8 @@ class DwarfDebug {    typedef SmallVector<DbgScope *, 2> ScopeVector; +  SmallPtrSet<const MachineInstr *, 8> InsnsEndScopeSet; +    /// InlineInfo - Keep track of inlined functions and their location.  This    /// information is used to populate debug_inlined section.    typedef std::pair<const MCSymbol *, DIE *> InlineInfoLabels; @@ -222,16 +224,6 @@ class DwarfDebug {    /// a debuggging information entity.    SmallPtrSet<const MachineInstr *, 8> InsnNeedsLabel; -  /// InsnsNeedsLabelAfter - Collection of instructions that need a label after -  /// the instruction because they end a scope of clobber a register. -  SmallPtrSet<const MachineInstr *, 8> InsnsNeedsLabelAfter; - -  /// RegClobberInsn - For each DBG_VALUE instruction referring to a register -  /// that is clobbered before the variable gets a new DBG_VALUE, map the -  /// instruction that clobbered the register. This instruction will also be in -  /// InsnsNeedsLabelAfter. -  DenseMap<const MachineInstr *, const MachineInstr *> RegClobberInsn; -    SmallVector<const MCSymbol *, 8> DebugRangeSymbols;    /// Previous instruction's location information. This is used to determine diff --git a/llvm/lib/CodeGen/LiveDebugVariables.cpp b/llvm/lib/CodeGen/LiveDebugVariables.cpp index 900dc013278..20e997ae377 100644 --- a/llvm/lib/CodeGen/LiveDebugVariables.cpp +++ b/llvm/lib/CodeGen/LiveDebugVariables.cpp @@ -101,6 +101,10 @@ class UserValue {    void insertDebugValue(MachineBasicBlock *MBB, SlotIndex Idx, unsigned LocNo,                          LiveIntervals &LIS, const TargetInstrInfo &TII); +  /// insertDebugKill - Insert an undef DBG_VALUE into MBB at Idx. +  void insertDebugKill(MachineBasicBlock *MBB, SlotIndex Idx, +                       LiveIntervals &LIS, const TargetInstrInfo &TII); +  public:    /// UserValue - Create a new UserValue.    UserValue(const MDNode *var, unsigned o, DebugLoc L,  @@ -748,6 +752,13 @@ void UserValue::insertDebugValue(MachineBasicBlock *MBB, SlotIndex Idx,      .addOperand(Loc).addImm(offset).addMetadata(variable);  } +void UserValue::insertDebugKill(MachineBasicBlock *MBB, SlotIndex Idx, +                               LiveIntervals &LIS, const TargetInstrInfo &TII) { +  MachineBasicBlock::iterator I = findInsertLocation(MBB, Idx, LIS); +  BuildMI(*MBB, I, findDebugLoc(), TII.get(TargetOpcode::DBG_VALUE)).addReg(0) +    .addImm(offset).addMetadata(variable); +} +  void UserValue::emitDebugValues(VirtRegMap *VRM, LiveIntervals &LIS,                                  const TargetInstrInfo &TII) {    MachineFunction::iterator MFEnd = VRM->getMachineFunction().end(); @@ -779,6 +790,12 @@ void UserValue::emitDebugValues(VirtRegMap *VRM, LiveIntervals &LIS,        break;      ++I; +    if (Stop == MBBEnd) +      continue; +    // The current interval ends before MBB. +    // Insert a kill if there is a gap. +    if (!I.valid() || I.start() > Stop) +      insertDebugKill(MBB, Stop, LIS, TII);    }  }  | 

