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