Home | History | Annotate | Download | only in AsmPrinter
      1 //===-- llvm/CodeGen/AsmPrinter/DbgValueHistoryCalculator.cpp -------------===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 
     10 #include "DbgValueHistoryCalculator.h"
     11 #include "llvm/ADT/BitVector.h"
     12 #include "llvm/ADT/SmallVector.h"
     13 #include "llvm/CodeGen/MachineBasicBlock.h"
     14 #include "llvm/CodeGen/MachineFunction.h"
     15 #include "llvm/IR/DebugInfo.h"
     16 #include "llvm/Support/Debug.h"
     17 #include "llvm/Support/raw_ostream.h"
     18 #include "llvm/Target/TargetLowering.h"
     19 #include "llvm/Target/TargetRegisterInfo.h"
     20 #include "llvm/Target/TargetSubtargetInfo.h"
     21 #include <algorithm>
     22 #include <map>
     23 using namespace llvm;
     24 
     25 #define DEBUG_TYPE "dwarfdebug"
     26 
     27 // \brief If @MI is a DBG_VALUE with debug value described by a
     28 // defined register, returns the number of this register.
     29 // In the other case, returns 0.
     30 static unsigned isDescribedByReg(const MachineInstr &MI) {
     31   assert(MI.isDebugValue());
     32   assert(MI.getNumOperands() == 4);
     33   // If location of variable is described using a register (directly or
     34   // indirecltly), this register is always a first operand.
     35   return MI.getOperand(0).isReg() ? MI.getOperand(0).getReg() : 0;
     36 }
     37 
     38 void DbgValueHistoryMap::startInstrRange(InlinedVariable Var,
     39                                          const MachineInstr &MI) {
     40   // Instruction range should start with a DBG_VALUE instruction for the
     41   // variable.
     42   assert(MI.isDebugValue() && "not a DBG_VALUE");
     43   auto &Ranges = VarInstrRanges[Var];
     44   if (!Ranges.empty() && Ranges.back().second == nullptr &&
     45       Ranges.back().first->isIdenticalTo(MI)) {
     46     DEBUG(dbgs() << "Coalescing identical DBG_VALUE entries:\n"
     47                  << "\t" << Ranges.back().first << "\t" << MI << "\n");
     48     return;
     49   }
     50   Ranges.push_back(std::make_pair(&MI, nullptr));
     51 }
     52 
     53 void DbgValueHistoryMap::endInstrRange(InlinedVariable Var,
     54                                        const MachineInstr &MI) {
     55   auto &Ranges = VarInstrRanges[Var];
     56   // Verify that the current instruction range is not yet closed.
     57   assert(!Ranges.empty() && Ranges.back().second == nullptr);
     58   // For now, instruction ranges are not allowed to cross basic block
     59   // boundaries.
     60   assert(Ranges.back().first->getParent() == MI.getParent());
     61   Ranges.back().second = &MI;
     62 }
     63 
     64 unsigned DbgValueHistoryMap::getRegisterForVar(InlinedVariable Var) const {
     65   const auto &I = VarInstrRanges.find(Var);
     66   if (I == VarInstrRanges.end())
     67     return 0;
     68   const auto &Ranges = I->second;
     69   if (Ranges.empty() || Ranges.back().second != nullptr)
     70     return 0;
     71   return isDescribedByReg(*Ranges.back().first);
     72 }
     73 
     74 namespace {
     75 // Maps physreg numbers to the variables they describe.
     76 typedef DbgValueHistoryMap::InlinedVariable InlinedVariable;
     77 typedef std::map<unsigned, SmallVector<InlinedVariable, 1>> RegDescribedVarsMap;
     78 }
     79 
     80 // \brief Claim that @Var is not described by @RegNo anymore.
     81 static void dropRegDescribedVar(RegDescribedVarsMap &RegVars, unsigned RegNo,
     82                                 InlinedVariable Var) {
     83   const auto &I = RegVars.find(RegNo);
     84   assert(RegNo != 0U && I != RegVars.end());
     85   auto &VarSet = I->second;
     86   const auto &VarPos = std::find(VarSet.begin(), VarSet.end(), Var);
     87   assert(VarPos != VarSet.end());
     88   VarSet.erase(VarPos);
     89   // Don't keep empty sets in a map to keep it as small as possible.
     90   if (VarSet.empty())
     91     RegVars.erase(I);
     92 }
     93 
     94 // \brief Claim that @Var is now described by @RegNo.
     95 static void addRegDescribedVar(RegDescribedVarsMap &RegVars, unsigned RegNo,
     96                                InlinedVariable Var) {
     97   assert(RegNo != 0U);
     98   auto &VarSet = RegVars[RegNo];
     99   assert(std::find(VarSet.begin(), VarSet.end(), Var) == VarSet.end());
    100   VarSet.push_back(Var);
    101 }
    102 
    103 // \brief Terminate the location range for variables described by register at
    104 // @I by inserting @ClobberingInstr to their history.
    105 static void clobberRegisterUses(RegDescribedVarsMap &RegVars,
    106                                 RegDescribedVarsMap::iterator I,
    107                                 DbgValueHistoryMap &HistMap,
    108                                 const MachineInstr &ClobberingInstr) {
    109   // Iterate over all variables described by this register and add this
    110   // instruction to their history, clobbering it.
    111   for (const auto &Var : I->second)
    112     HistMap.endInstrRange(Var, ClobberingInstr);
    113   RegVars.erase(I);
    114 }
    115 
    116 // \brief Terminate the location range for variables described by register
    117 // @RegNo by inserting @ClobberingInstr to their history.
    118 static void clobberRegisterUses(RegDescribedVarsMap &RegVars, unsigned RegNo,
    119                                 DbgValueHistoryMap &HistMap,
    120                                 const MachineInstr &ClobberingInstr) {
    121   const auto &I = RegVars.find(RegNo);
    122   if (I == RegVars.end())
    123     return;
    124   clobberRegisterUses(RegVars, I, HistMap, ClobberingInstr);
    125 }
    126 
    127 // \brief Returns the first instruction in @MBB which corresponds to
    128 // the function epilogue, or nullptr if @MBB doesn't contain an epilogue.
    129 static const MachineInstr *getFirstEpilogueInst(const MachineBasicBlock &MBB) {
    130   auto LastMI = MBB.getLastNonDebugInstr();
    131   if (LastMI == MBB.end() || !LastMI->isReturn())
    132     return nullptr;
    133   // Assume that epilogue starts with instruction having the same debug location
    134   // as the return instruction.
    135   DebugLoc LastLoc = LastMI->getDebugLoc();
    136   auto Res = LastMI;
    137   for (MachineBasicBlock::const_reverse_iterator I(std::next(LastMI)),
    138        E = MBB.rend();
    139        I != E; ++I) {
    140     if (I->getDebugLoc() != LastLoc)
    141       return &*Res;
    142     Res = &*I;
    143   }
    144   // If all instructions have the same debug location, assume whole MBB is
    145   // an epilogue.
    146   return &*MBB.begin();
    147 }
    148 
    149 // \brief Collect registers that are modified in the function body (their
    150 // contents is changed outside of the prologue and epilogue).
    151 static void collectChangingRegs(const MachineFunction *MF,
    152                                 const TargetRegisterInfo *TRI,
    153                                 BitVector &Regs) {
    154   for (const auto &MBB : *MF) {
    155     auto FirstEpilogueInst = getFirstEpilogueInst(MBB);
    156 
    157     for (const auto &MI : MBB) {
    158       // Avoid looking at prologue or epilogue instructions.
    159       if (&MI == FirstEpilogueInst)
    160         break;
    161       if (MI.getFlag(MachineInstr::FrameSetup))
    162         continue;
    163 
    164       // Look for register defs and register masks. Register masks are
    165       // typically on calls and they clobber everything not in the mask.
    166       for (const MachineOperand &MO : MI.operands()) {
    167         if (MO.isReg() && MO.isDef() && MO.getReg()) {
    168           for (MCRegAliasIterator AI(MO.getReg(), TRI, true); AI.isValid();
    169                ++AI)
    170             Regs.set(*AI);
    171         } else if (MO.isRegMask()) {
    172           Regs.setBitsNotInMask(MO.getRegMask());
    173         }
    174       }
    175     }
    176   }
    177 }
    178 
    179 void llvm::calculateDbgValueHistory(const MachineFunction *MF,
    180                                     const TargetRegisterInfo *TRI,
    181                                     DbgValueHistoryMap &Result) {
    182   BitVector ChangingRegs(TRI->getNumRegs());
    183   collectChangingRegs(MF, TRI, ChangingRegs);
    184 
    185   const TargetLowering *TLI = MF->getSubtarget().getTargetLowering();
    186   unsigned SP = TLI->getStackPointerRegisterToSaveRestore();
    187   RegDescribedVarsMap RegVars;
    188   for (const auto &MBB : *MF) {
    189     for (const auto &MI : MBB) {
    190       if (!MI.isDebugValue()) {
    191         // Not a DBG_VALUE instruction. It may clobber registers which describe
    192         // some variables.
    193         for (const MachineOperand &MO : MI.operands()) {
    194           if (MO.isReg() && MO.isDef() && MO.getReg()) {
    195             // If this is a register def operand, it may end a debug value
    196             // range.
    197             for (MCRegAliasIterator AI(MO.getReg(), TRI, true); AI.isValid();
    198                  ++AI)
    199               if (ChangingRegs.test(*AI))
    200                 clobberRegisterUses(RegVars, *AI, Result, MI);
    201           } else if (MO.isRegMask()) {
    202             // If this is a register mask operand, clobber all debug values in
    203             // non-CSRs.
    204             for (int I = ChangingRegs.find_first(); I != -1;
    205                  I = ChangingRegs.find_next(I)) {
    206               // Don't consider SP to be clobbered by register masks.
    207               if (unsigned(I) != SP && TRI->isPhysicalRegister(I) &&
    208                   MO.clobbersPhysReg(I)) {
    209                 clobberRegisterUses(RegVars, I, Result, MI);
    210               }
    211             }
    212           }
    213         }
    214         continue;
    215       }
    216 
    217       assert(MI.getNumOperands() > 1 && "Invalid DBG_VALUE instruction!");
    218       // Use the base variable (without any DW_OP_piece expressions)
    219       // as index into History. The full variables including the
    220       // piece expressions are attached to the MI.
    221       const DILocalVariable *RawVar = MI.getDebugVariable();
    222       assert(RawVar->isValidLocationForIntrinsic(MI.getDebugLoc()) &&
    223              "Expected inlined-at fields to agree");
    224       InlinedVariable Var(RawVar, MI.getDebugLoc()->getInlinedAt());
    225 
    226       if (unsigned PrevReg = Result.getRegisterForVar(Var))
    227         dropRegDescribedVar(RegVars, PrevReg, Var);
    228 
    229       Result.startInstrRange(Var, MI);
    230 
    231       if (unsigned NewReg = isDescribedByReg(MI))
    232         addRegDescribedVar(RegVars, NewReg, Var);
    233     }
    234 
    235     // Make sure locations for register-described variables are valid only
    236     // until the end of the basic block (unless it's the last basic block, in
    237     // which case let their liveness run off to the end of the function).
    238     if (!MBB.empty() && &MBB != &MF->back()) {
    239       for (auto I = RegVars.begin(), E = RegVars.end(); I != E;) {
    240         auto CurElem = I++; // CurElem can be erased below.
    241         if (ChangingRegs.test(CurElem->first))
    242           clobberRegisterUses(RegVars, CurElem, Result, MBB.back());
    243       }
    244     }
    245   }
    246 }
    247