File: | llvm/lib/CodeGen/LiveDebugVariables.cpp |
Warning: | line 519, column 5 1st function call argument is an uninitialized value |
Press '?' to see keyboard shortcuts
Keyboard shortcuts:
1 | //===- LiveDebugVariables.cpp - Tracking debug info variables -------------===// | |||
2 | // | |||
3 | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | |||
4 | // See https://llvm.org/LICENSE.txt for license information. | |||
5 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | |||
6 | // | |||
7 | //===----------------------------------------------------------------------===// | |||
8 | // | |||
9 | // This file implements the LiveDebugVariables analysis. | |||
10 | // | |||
11 | // Remove all DBG_VALUE instructions referencing virtual registers and replace | |||
12 | // them with a data structure tracking where live user variables are kept - in a | |||
13 | // virtual register or in a stack slot. | |||
14 | // | |||
15 | // Allow the data structure to be updated during register allocation when values | |||
16 | // are moved between registers and stack slots. Finally emit new DBG_VALUE | |||
17 | // instructions after register allocation is complete. | |||
18 | // | |||
19 | //===----------------------------------------------------------------------===// | |||
20 | ||||
21 | #include "LiveDebugVariables.h" | |||
22 | #include "llvm/ADT/ArrayRef.h" | |||
23 | #include "llvm/ADT/DenseMap.h" | |||
24 | #include "llvm/ADT/IntervalMap.h" | |||
25 | #include "llvm/ADT/MapVector.h" | |||
26 | #include "llvm/ADT/STLExtras.h" | |||
27 | #include "llvm/ADT/SmallSet.h" | |||
28 | #include "llvm/ADT/SmallVector.h" | |||
29 | #include "llvm/ADT/Statistic.h" | |||
30 | #include "llvm/ADT/StringRef.h" | |||
31 | #include "llvm/CodeGen/LexicalScopes.h" | |||
32 | #include "llvm/CodeGen/LiveInterval.h" | |||
33 | #include "llvm/CodeGen/LiveIntervals.h" | |||
34 | #include "llvm/CodeGen/MachineBasicBlock.h" | |||
35 | #include "llvm/CodeGen/MachineDominators.h" | |||
36 | #include "llvm/CodeGen/MachineFunction.h" | |||
37 | #include "llvm/CodeGen/MachineInstr.h" | |||
38 | #include "llvm/CodeGen/MachineInstrBuilder.h" | |||
39 | #include "llvm/CodeGen/MachineOperand.h" | |||
40 | #include "llvm/CodeGen/MachineRegisterInfo.h" | |||
41 | #include "llvm/CodeGen/SlotIndexes.h" | |||
42 | #include "llvm/CodeGen/TargetInstrInfo.h" | |||
43 | #include "llvm/CodeGen/TargetOpcodes.h" | |||
44 | #include "llvm/CodeGen/TargetRegisterInfo.h" | |||
45 | #include "llvm/CodeGen/TargetSubtargetInfo.h" | |||
46 | #include "llvm/CodeGen/VirtRegMap.h" | |||
47 | #include "llvm/Config/llvm-config.h" | |||
48 | #include "llvm/IR/DebugInfoMetadata.h" | |||
49 | #include "llvm/IR/DebugLoc.h" | |||
50 | #include "llvm/IR/Function.h" | |||
51 | #include "llvm/IR/Metadata.h" | |||
52 | #include "llvm/InitializePasses.h" | |||
53 | #include "llvm/MC/MCRegisterInfo.h" | |||
54 | #include "llvm/Pass.h" | |||
55 | #include "llvm/Support/Casting.h" | |||
56 | #include "llvm/Support/CommandLine.h" | |||
57 | #include "llvm/Support/Compiler.h" | |||
58 | #include "llvm/Support/Debug.h" | |||
59 | #include "llvm/Support/raw_ostream.h" | |||
60 | #include <algorithm> | |||
61 | #include <cassert> | |||
62 | #include <iterator> | |||
63 | #include <memory> | |||
64 | #include <utility> | |||
65 | ||||
66 | using namespace llvm; | |||
67 | ||||
68 | #define DEBUG_TYPE"livedebugvars" "livedebugvars" | |||
69 | ||||
70 | static cl::opt<bool> | |||
71 | EnableLDV("live-debug-variables", cl::init(true), | |||
72 | cl::desc("Enable the live debug variables pass"), cl::Hidden); | |||
73 | ||||
74 | STATISTIC(NumInsertedDebugValues, "Number of DBG_VALUEs inserted")static llvm::Statistic NumInsertedDebugValues = {"livedebugvars" , "NumInsertedDebugValues", "Number of DBG_VALUEs inserted"}; | |||
75 | STATISTIC(NumInsertedDebugLabels, "Number of DBG_LABELs inserted")static llvm::Statistic NumInsertedDebugLabels = {"livedebugvars" , "NumInsertedDebugLabels", "Number of DBG_LABELs inserted"}; | |||
76 | ||||
77 | char LiveDebugVariables::ID = 0; | |||
78 | ||||
79 | INITIALIZE_PASS_BEGIN(LiveDebugVariables, DEBUG_TYPE,static void *initializeLiveDebugVariablesPassOnce(PassRegistry &Registry) { | |||
80 | "Debug Variable Analysis", false, false)static void *initializeLiveDebugVariablesPassOnce(PassRegistry &Registry) { | |||
81 | INITIALIZE_PASS_DEPENDENCY(MachineDominatorTree)initializeMachineDominatorTreePass(Registry); | |||
82 | INITIALIZE_PASS_DEPENDENCY(LiveIntervals)initializeLiveIntervalsPass(Registry); | |||
83 | INITIALIZE_PASS_END(LiveDebugVariables, DEBUG_TYPE,PassInfo *PI = new PassInfo( "Debug Variable Analysis", "livedebugvars" , &LiveDebugVariables::ID, PassInfo::NormalCtor_t(callDefaultCtor <LiveDebugVariables>), false, false); Registry.registerPass (*PI, true); return PI; } static llvm::once_flag InitializeLiveDebugVariablesPassFlag ; void llvm::initializeLiveDebugVariablesPass(PassRegistry & Registry) { llvm::call_once(InitializeLiveDebugVariablesPassFlag , initializeLiveDebugVariablesPassOnce, std::ref(Registry)); } | |||
84 | "Debug Variable Analysis", false, false)PassInfo *PI = new PassInfo( "Debug Variable Analysis", "livedebugvars" , &LiveDebugVariables::ID, PassInfo::NormalCtor_t(callDefaultCtor <LiveDebugVariables>), false, false); Registry.registerPass (*PI, true); return PI; } static llvm::once_flag InitializeLiveDebugVariablesPassFlag ; void llvm::initializeLiveDebugVariablesPass(PassRegistry & Registry) { llvm::call_once(InitializeLiveDebugVariablesPassFlag , initializeLiveDebugVariablesPassOnce, std::ref(Registry)); } | |||
85 | ||||
86 | void LiveDebugVariables::getAnalysisUsage(AnalysisUsage &AU) const { | |||
87 | AU.addRequired<MachineDominatorTree>(); | |||
88 | AU.addRequiredTransitive<LiveIntervals>(); | |||
89 | AU.setPreservesAll(); | |||
90 | MachineFunctionPass::getAnalysisUsage(AU); | |||
91 | } | |||
92 | ||||
93 | LiveDebugVariables::LiveDebugVariables() : MachineFunctionPass(ID) { | |||
94 | initializeLiveDebugVariablesPass(*PassRegistry::getPassRegistry()); | |||
95 | } | |||
96 | ||||
97 | enum : unsigned { UndefLocNo = ~0U }; | |||
98 | ||||
99 | /// Describes a location by number along with some flags about the original | |||
100 | /// usage of the location. | |||
101 | class DbgValueLocation { | |||
102 | public: | |||
103 | DbgValueLocation(unsigned LocNo) | |||
104 | : LocNo(LocNo) { | |||
105 | static_assert(sizeof(*this) == sizeof(unsigned), "bad bitfield packing"); | |||
106 | assert(locNo() == LocNo && "location truncation")((locNo() == LocNo && "location truncation") ? static_cast <void> (0) : __assert_fail ("locNo() == LocNo && \"location truncation\"" , "/build/llvm-toolchain-snapshot-10~++20200106111110+0efc9e5a8cc/llvm/lib/CodeGen/LiveDebugVariables.cpp" , 106, __PRETTY_FUNCTION__)); | |||
107 | } | |||
108 | ||||
109 | DbgValueLocation() : LocNo(0) {} | |||
110 | ||||
111 | unsigned locNo() const { | |||
112 | // Fix up the undef location number, which gets truncated. | |||
113 | return LocNo == INT_MAX2147483647 ? UndefLocNo : LocNo; | |||
114 | } | |||
115 | bool isUndef() const { return locNo() == UndefLocNo; } | |||
116 | ||||
117 | DbgValueLocation changeLocNo(unsigned NewLocNo) const { | |||
118 | return DbgValueLocation(NewLocNo); | |||
119 | } | |||
120 | ||||
121 | friend inline bool operator==(const DbgValueLocation &LHS, | |||
122 | const DbgValueLocation &RHS) { | |||
123 | return LHS.LocNo == RHS.LocNo; | |||
124 | } | |||
125 | ||||
126 | friend inline bool operator!=(const DbgValueLocation &LHS, | |||
127 | const DbgValueLocation &RHS) { | |||
128 | return !(LHS == RHS); | |||
129 | } | |||
130 | ||||
131 | private: | |||
132 | unsigned LocNo; | |||
133 | }; | |||
134 | ||||
135 | /// Map of where a user value is live, and its location. | |||
136 | using LocMap = IntervalMap<SlotIndex, DbgValueLocation, 4>; | |||
137 | ||||
138 | /// Map of stack slot offsets for spilled locations. | |||
139 | /// Non-spilled locations are not added to the map. | |||
140 | using SpillOffsetMap = DenseMap<unsigned, unsigned>; | |||
141 | ||||
142 | namespace { | |||
143 | ||||
144 | class LDVImpl; | |||
145 | ||||
146 | /// A user value is a part of a debug info user variable. | |||
147 | /// | |||
148 | /// A DBG_VALUE instruction notes that (a sub-register of) a virtual register | |||
149 | /// holds part of a user variable. The part is identified by a byte offset. | |||
150 | /// | |||
151 | /// UserValues are grouped into equivalence classes for easier searching. Two | |||
152 | /// user values are related if they refer to the same variable, or if they are | |||
153 | /// held by the same virtual register. The equivalence class is the transitive | |||
154 | /// closure of that relation. | |||
155 | class UserValue { | |||
156 | const DILocalVariable *Variable; ///< The debug info variable we are part of. | |||
157 | const DIExpression *Expression; ///< Any complex address expression. | |||
158 | DebugLoc dl; ///< The debug location for the variable. This is | |||
159 | ///< used by dwarf writer to find lexical scope. | |||
160 | UserValue *leader; ///< Equivalence class leader. | |||
161 | UserValue *next = nullptr; ///< Next value in equivalence class, or null. | |||
162 | ||||
163 | /// Numbered locations referenced by locmap. | |||
164 | SmallVector<MachineOperand, 4> locations; | |||
165 | ||||
166 | /// Map of slot indices where this value is live. | |||
167 | LocMap locInts; | |||
168 | ||||
169 | /// Insert a DBG_VALUE into MBB at Idx for LocNo. | |||
170 | void insertDebugValue(MachineBasicBlock *MBB, SlotIndex StartIdx, | |||
171 | SlotIndex StopIdx, DbgValueLocation Loc, bool Spilled, | |||
172 | unsigned SpillOffset, LiveIntervals &LIS, | |||
173 | const TargetInstrInfo &TII, | |||
174 | const TargetRegisterInfo &TRI); | |||
175 | ||||
176 | /// Replace OldLocNo ranges with NewRegs ranges where NewRegs | |||
177 | /// is live. Returns true if any changes were made. | |||
178 | bool splitLocation(unsigned OldLocNo, ArrayRef<unsigned> NewRegs, | |||
179 | LiveIntervals &LIS); | |||
180 | ||||
181 | public: | |||
182 | /// Create a new UserValue. | |||
183 | UserValue(const DILocalVariable *var, const DIExpression *expr, DebugLoc L, | |||
184 | LocMap::Allocator &alloc) | |||
185 | : Variable(var), Expression(expr), dl(std::move(L)), leader(this), | |||
186 | locInts(alloc) {} | |||
187 | ||||
188 | /// Get the leader of this value's equivalence class. | |||
189 | UserValue *getLeader() { | |||
190 | UserValue *l = leader; | |||
191 | while (l != l->leader) | |||
192 | l = l->leader; | |||
193 | return leader = l; | |||
194 | } | |||
195 | ||||
196 | /// Return the next UserValue in the equivalence class. | |||
197 | UserValue *getNext() const { return next; } | |||
198 | ||||
199 | /// Does this UserValue match the parameters? | |||
200 | bool match(const DILocalVariable *Var, const DIExpression *Expr, | |||
201 | const DILocation *IA) const { | |||
202 | // FIXME: The fragment should be part of the equivalence class, but not | |||
203 | // other things in the expression like stack values. | |||
204 | return Var == Variable && Expr == Expression && dl->getInlinedAt() == IA; | |||
205 | } | |||
206 | ||||
207 | /// Merge equivalence classes. | |||
208 | static UserValue *merge(UserValue *L1, UserValue *L2) { | |||
209 | L2 = L2->getLeader(); | |||
210 | if (!L1) | |||
211 | return L2; | |||
212 | L1 = L1->getLeader(); | |||
213 | if (L1 == L2) | |||
214 | return L1; | |||
215 | // Splice L2 before L1's members. | |||
216 | UserValue *End = L2; | |||
217 | while (End->next) { | |||
218 | End->leader = L1; | |||
219 | End = End->next; | |||
220 | } | |||
221 | End->leader = L1; | |||
222 | End->next = L1->next; | |||
223 | L1->next = L2; | |||
224 | return L1; | |||
225 | } | |||
226 | ||||
227 | /// Return the location number that matches Loc. | |||
228 | /// | |||
229 | /// For undef values we always return location number UndefLocNo without | |||
230 | /// inserting anything in locations. Since locations is a vector and the | |||
231 | /// location number is the position in the vector and UndefLocNo is ~0, | |||
232 | /// we would need a very big vector to put the value at the right position. | |||
233 | unsigned getLocationNo(const MachineOperand &LocMO) { | |||
234 | if (LocMO.isReg()) { | |||
235 | if (LocMO.getReg() == 0) | |||
236 | return UndefLocNo; | |||
237 | // For register locations we dont care about use/def and other flags. | |||
238 | for (unsigned i = 0, e = locations.size(); i != e; ++i) | |||
239 | if (locations[i].isReg() && | |||
240 | locations[i].getReg() == LocMO.getReg() && | |||
241 | locations[i].getSubReg() == LocMO.getSubReg()) | |||
242 | return i; | |||
243 | } else | |||
244 | for (unsigned i = 0, e = locations.size(); i != e; ++i) | |||
245 | if (LocMO.isIdenticalTo(locations[i])) | |||
246 | return i; | |||
247 | locations.push_back(LocMO); | |||
248 | // We are storing a MachineOperand outside a MachineInstr. | |||
249 | locations.back().clearParent(); | |||
250 | // Don't store def operands. | |||
251 | if (locations.back().isReg()) { | |||
252 | if (locations.back().isDef()) | |||
253 | locations.back().setIsDead(false); | |||
254 | locations.back().setIsUse(); | |||
255 | } | |||
256 | return locations.size() - 1; | |||
257 | } | |||
258 | ||||
259 | /// Remove (recycle) a location number. If \p LocNo still is used by the | |||
260 | /// locInts nothing is done. | |||
261 | void removeLocationIfUnused(unsigned LocNo) { | |||
262 | // Bail out if LocNo still is used. | |||
263 | for (LocMap::const_iterator I = locInts.begin(); I.valid(); ++I) { | |||
264 | DbgValueLocation Loc = I.value(); | |||
265 | if (Loc.locNo() == LocNo) | |||
266 | return; | |||
267 | } | |||
268 | // Remove the entry in the locations vector, and adjust all references to | |||
269 | // location numbers above the removed entry. | |||
270 | locations.erase(locations.begin() + LocNo); | |||
271 | for (LocMap::iterator I = locInts.begin(); I.valid(); ++I) { | |||
272 | DbgValueLocation Loc = I.value(); | |||
273 | if (!Loc.isUndef() && Loc.locNo() > LocNo) | |||
274 | I.setValueUnchecked(Loc.changeLocNo(Loc.locNo() - 1)); | |||
275 | } | |||
276 | } | |||
277 | ||||
278 | /// Ensure that all virtual register locations are mapped. | |||
279 | void mapVirtRegs(LDVImpl *LDV); | |||
280 | ||||
281 | /// Add a definition point to this value. | |||
282 | void addDef(SlotIndex Idx, const MachineOperand &LocMO) { | |||
283 | DbgValueLocation Loc(getLocationNo(LocMO)); | |||
284 | // Add a singular (Idx,Idx) -> Loc mapping. | |||
285 | LocMap::iterator I = locInts.find(Idx); | |||
286 | if (!I.valid() || I.start() != Idx) | |||
287 | I.insert(Idx, Idx.getNextSlot(), Loc); | |||
288 | else | |||
289 | // A later DBG_VALUE at the same SlotIndex overrides the old location. | |||
290 | I.setValue(Loc); | |||
291 | } | |||
292 | ||||
293 | /// Extend the current definition as far as possible down. | |||
294 | /// | |||
295 | /// Stop when meeting an existing def or when leaving the live | |||
296 | /// range of VNI. End points where VNI is no longer live are added to Kills. | |||
297 | /// | |||
298 | /// We only propagate DBG_VALUES locally here. LiveDebugValues performs a | |||
299 | /// data-flow analysis to propagate them beyond basic block boundaries. | |||
300 | /// | |||
301 | /// \param Idx Starting point for the definition. | |||
302 | /// \param Loc Location number to propagate. | |||
303 | /// \param LR Restrict liveness to where LR has the value VNI. May be null. | |||
304 | /// \param VNI When LR is not null, this is the value to restrict to. | |||
305 | /// \param [out] Kills Append end points of VNI's live range to Kills. | |||
306 | /// \param LIS Live intervals analysis. | |||
307 | void extendDef(SlotIndex Idx, DbgValueLocation Loc, | |||
308 | LiveRange *LR, const VNInfo *VNI, | |||
309 | SmallVectorImpl<SlotIndex> *Kills, | |||
310 | LiveIntervals &LIS); | |||
311 | ||||
312 | /// The value in LI/LocNo may be copies to other registers. Determine if | |||
313 | /// any of the copies are available at the kill points, and add defs if | |||
314 | /// possible. | |||
315 | /// | |||
316 | /// \param LI Scan for copies of the value in LI->reg. | |||
317 | /// \param LocNo Location number of LI->reg. | |||
318 | /// \param Kills Points where the range of LocNo could be extended. | |||
319 | /// \param [in,out] NewDefs Append (Idx, LocNo) of inserted defs here. | |||
320 | void addDefsFromCopies( | |||
321 | LiveInterval *LI, unsigned LocNo, | |||
322 | const SmallVectorImpl<SlotIndex> &Kills, | |||
323 | SmallVectorImpl<std::pair<SlotIndex, DbgValueLocation>> &NewDefs, | |||
324 | MachineRegisterInfo &MRI, LiveIntervals &LIS); | |||
325 | ||||
326 | /// Compute the live intervals of all locations after collecting all their | |||
327 | /// def points. | |||
328 | void computeIntervals(MachineRegisterInfo &MRI, const TargetRegisterInfo &TRI, | |||
329 | LiveIntervals &LIS, LexicalScopes &LS); | |||
330 | ||||
331 | /// Replace OldReg ranges with NewRegs ranges where NewRegs is | |||
332 | /// live. Returns true if any changes were made. | |||
333 | bool splitRegister(unsigned OldReg, ArrayRef<unsigned> NewRegs, | |||
334 | LiveIntervals &LIS); | |||
335 | ||||
336 | /// Rewrite virtual register locations according to the provided virtual | |||
337 | /// register map. Record the stack slot offsets for the locations that | |||
338 | /// were spilled. | |||
339 | void rewriteLocations(VirtRegMap &VRM, const MachineFunction &MF, | |||
340 | const TargetInstrInfo &TII, | |||
341 | const TargetRegisterInfo &TRI, | |||
342 | SpillOffsetMap &SpillOffsets); | |||
343 | ||||
344 | /// Recreate DBG_VALUE instruction from data structures. | |||
345 | void emitDebugValues(VirtRegMap *VRM, LiveIntervals &LIS, | |||
346 | const TargetInstrInfo &TII, | |||
347 | const TargetRegisterInfo &TRI, | |||
348 | const SpillOffsetMap &SpillOffsets); | |||
349 | ||||
350 | /// Return DebugLoc of this UserValue. | |||
351 | DebugLoc getDebugLoc() { return dl;} | |||
352 | ||||
353 | void print(raw_ostream &, const TargetRegisterInfo *); | |||
354 | }; | |||
355 | ||||
356 | /// A user label is a part of a debug info user label. | |||
357 | class UserLabel { | |||
358 | const DILabel *Label; ///< The debug info label we are part of. | |||
359 | DebugLoc dl; ///< The debug location for the label. This is | |||
360 | ///< used by dwarf writer to find lexical scope. | |||
361 | SlotIndex loc; ///< Slot used by the debug label. | |||
362 | ||||
363 | /// Insert a DBG_LABEL into MBB at Idx. | |||
364 | void insertDebugLabel(MachineBasicBlock *MBB, SlotIndex Idx, | |||
365 | LiveIntervals &LIS, const TargetInstrInfo &TII); | |||
366 | ||||
367 | public: | |||
368 | /// Create a new UserLabel. | |||
369 | UserLabel(const DILabel *label, DebugLoc L, SlotIndex Idx) | |||
370 | : Label(label), dl(std::move(L)), loc(Idx) {} | |||
371 | ||||
372 | /// Does this UserLabel match the parameters? | |||
373 | bool match(const DILabel *L, const DILocation *IA, | |||
374 | const SlotIndex Index) const { | |||
375 | return Label == L && dl->getInlinedAt() == IA && loc == Index; | |||
376 | } | |||
377 | ||||
378 | /// Recreate DBG_LABEL instruction from data structures. | |||
379 | void emitDebugLabel(LiveIntervals &LIS, const TargetInstrInfo &TII); | |||
380 | ||||
381 | /// Return DebugLoc of this UserLabel. | |||
382 | DebugLoc getDebugLoc() { return dl; } | |||
383 | ||||
384 | void print(raw_ostream &, const TargetRegisterInfo *); | |||
385 | }; | |||
386 | ||||
387 | /// Implementation of the LiveDebugVariables pass. | |||
388 | class LDVImpl { | |||
389 | LiveDebugVariables &pass; | |||
390 | LocMap::Allocator allocator; | |||
391 | MachineFunction *MF = nullptr; | |||
392 | LiveIntervals *LIS; | |||
393 | const TargetRegisterInfo *TRI; | |||
394 | ||||
395 | /// Whether emitDebugValues is called. | |||
396 | bool EmitDone = false; | |||
397 | ||||
398 | /// Whether the machine function is modified during the pass. | |||
399 | bool ModifiedMF = false; | |||
400 | ||||
401 | /// All allocated UserValue instances. | |||
402 | SmallVector<std::unique_ptr<UserValue>, 8> userValues; | |||
403 | ||||
404 | /// All allocated UserLabel instances. | |||
405 | SmallVector<std::unique_ptr<UserLabel>, 2> userLabels; | |||
406 | ||||
407 | /// Map virtual register to eq class leader. | |||
408 | using VRMap = DenseMap<unsigned, UserValue *>; | |||
409 | VRMap virtRegToEqClass; | |||
410 | ||||
411 | /// Map user variable to eq class leader. | |||
412 | using UVMap = DenseMap<const DILocalVariable *, UserValue *>; | |||
413 | UVMap userVarMap; | |||
414 | ||||
415 | /// Find or create a UserValue. | |||
416 | UserValue *getUserValue(const DILocalVariable *Var, const DIExpression *Expr, | |||
417 | const DebugLoc &DL); | |||
418 | ||||
419 | /// Find the EC leader for VirtReg or null. | |||
420 | UserValue *lookupVirtReg(unsigned VirtReg); | |||
421 | ||||
422 | /// Add DBG_VALUE instruction to our maps. | |||
423 | /// | |||
424 | /// \param MI DBG_VALUE instruction | |||
425 | /// \param Idx Last valid SLotIndex before instruction. | |||
426 | /// | |||
427 | /// \returns True if the DBG_VALUE instruction should be deleted. | |||
428 | bool handleDebugValue(MachineInstr &MI, SlotIndex Idx); | |||
429 | ||||
430 | /// Add DBG_LABEL instruction to UserLabel. | |||
431 | /// | |||
432 | /// \param MI DBG_LABEL instruction | |||
433 | /// \param Idx Last valid SlotIndex before instruction. | |||
434 | /// | |||
435 | /// \returns True if the DBG_LABEL instruction should be deleted. | |||
436 | bool handleDebugLabel(MachineInstr &MI, SlotIndex Idx); | |||
437 | ||||
438 | /// Collect and erase all DBG_VALUE instructions, adding a UserValue def | |||
439 | /// for each instruction. | |||
440 | /// | |||
441 | /// \param mf MachineFunction to be scanned. | |||
442 | /// | |||
443 | /// \returns True if any debug values were found. | |||
444 | bool collectDebugValues(MachineFunction &mf); | |||
445 | ||||
446 | /// Compute the live intervals of all user values after collecting all | |||
447 | /// their def points. | |||
448 | void computeIntervals(); | |||
449 | ||||
450 | public: | |||
451 | LDVImpl(LiveDebugVariables *ps) : pass(*ps) {} | |||
452 | ||||
453 | bool runOnMachineFunction(MachineFunction &mf); | |||
454 | ||||
455 | /// Release all memory. | |||
456 | void clear() { | |||
457 | MF = nullptr; | |||
458 | userValues.clear(); | |||
459 | userLabels.clear(); | |||
460 | virtRegToEqClass.clear(); | |||
461 | userVarMap.clear(); | |||
462 | // Make sure we call emitDebugValues if the machine function was modified. | |||
463 | assert((!ModifiedMF || EmitDone) &&(((!ModifiedMF || EmitDone) && "Dbg values are not emitted in LDV" ) ? static_cast<void> (0) : __assert_fail ("(!ModifiedMF || EmitDone) && \"Dbg values are not emitted in LDV\"" , "/build/llvm-toolchain-snapshot-10~++20200106111110+0efc9e5a8cc/llvm/lib/CodeGen/LiveDebugVariables.cpp" , 464, __PRETTY_FUNCTION__)) | |||
464 | "Dbg values are not emitted in LDV")(((!ModifiedMF || EmitDone) && "Dbg values are not emitted in LDV" ) ? static_cast<void> (0) : __assert_fail ("(!ModifiedMF || EmitDone) && \"Dbg values are not emitted in LDV\"" , "/build/llvm-toolchain-snapshot-10~++20200106111110+0efc9e5a8cc/llvm/lib/CodeGen/LiveDebugVariables.cpp" , 464, __PRETTY_FUNCTION__)); | |||
465 | EmitDone = false; | |||
466 | ModifiedMF = false; | |||
467 | } | |||
468 | ||||
469 | /// Map virtual register to an equivalence class. | |||
470 | void mapVirtReg(unsigned VirtReg, UserValue *EC); | |||
471 | ||||
472 | /// Replace all references to OldReg with NewRegs. | |||
473 | void splitRegister(unsigned OldReg, ArrayRef<unsigned> NewRegs); | |||
474 | ||||
475 | /// Recreate DBG_VALUE instruction from data structures. | |||
476 | void emitDebugValues(VirtRegMap *VRM); | |||
477 | ||||
478 | void print(raw_ostream&); | |||
479 | }; | |||
480 | ||||
481 | } // end anonymous namespace | |||
482 | ||||
483 | #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP) | |||
484 | static void printDebugLoc(const DebugLoc &DL, raw_ostream &CommentOS, | |||
485 | const LLVMContext &Ctx) { | |||
486 | if (!DL) | |||
487 | return; | |||
488 | ||||
489 | auto *Scope = cast<DIScope>(DL.getScope()); | |||
490 | // Omit the directory, because it's likely to be long and uninteresting. | |||
491 | CommentOS << Scope->getFilename(); | |||
492 | CommentOS << ':' << DL.getLine(); | |||
493 | if (DL.getCol() != 0) | |||
494 | CommentOS << ':' << DL.getCol(); | |||
495 | ||||
496 | DebugLoc InlinedAtDL = DL.getInlinedAt(); | |||
497 | if (!InlinedAtDL) | |||
498 | return; | |||
499 | ||||
500 | CommentOS << " @[ "; | |||
501 | printDebugLoc(InlinedAtDL, CommentOS, Ctx); | |||
502 | CommentOS << " ]"; | |||
503 | } | |||
504 | ||||
505 | static void printExtendedName(raw_ostream &OS, const DINode *Node, | |||
506 | const DILocation *DL) { | |||
507 | const LLVMContext &Ctx = Node->getContext(); | |||
508 | StringRef Res; | |||
509 | unsigned Line; | |||
510 | if (const auto *V
| |||
511 | Res = V->getName(); | |||
512 | Line = V->getLine(); | |||
513 | } else if (const auto *L
| |||
514 | Res = L->getName(); | |||
515 | Line = L->getLine(); | |||
516 | } | |||
517 | ||||
518 | if (!Res.empty()) | |||
519 | OS << Res << "," << Line; | |||
| ||||
520 | auto *InlinedAt = DL ? DL->getInlinedAt() : nullptr; | |||
521 | if (InlinedAt) { | |||
522 | if (DebugLoc InlinedAtDL = InlinedAt) { | |||
523 | OS << " @["; | |||
524 | printDebugLoc(InlinedAtDL, OS, Ctx); | |||
525 | OS << "]"; | |||
526 | } | |||
527 | } | |||
528 | } | |||
529 | ||||
530 | void UserValue::print(raw_ostream &OS, const TargetRegisterInfo *TRI) { | |||
531 | OS << "!\""; | |||
532 | printExtendedName(OS, Variable, dl); | |||
533 | ||||
534 | OS << "\"\t"; | |||
535 | for (LocMap::const_iterator I = locInts.begin(); I.valid(); ++I) { | |||
536 | OS << " [" << I.start() << ';' << I.stop() << "):"; | |||
537 | if (I.value().isUndef()) | |||
538 | OS << "undef"; | |||
539 | else { | |||
540 | OS << I.value().locNo(); | |||
541 | } | |||
542 | } | |||
543 | for (unsigned i = 0, e = locations.size(); i != e; ++i) { | |||
544 | OS << " Loc" << i << '='; | |||
545 | locations[i].print(OS, TRI); | |||
546 | } | |||
547 | OS << '\n'; | |||
548 | } | |||
549 | ||||
550 | void UserLabel::print(raw_ostream &OS, const TargetRegisterInfo *TRI) { | |||
551 | OS << "!\""; | |||
552 | printExtendedName(OS, Label, dl); | |||
553 | ||||
554 | OS << "\"\t"; | |||
555 | OS << loc; | |||
556 | OS << '\n'; | |||
557 | } | |||
558 | ||||
559 | void LDVImpl::print(raw_ostream &OS) { | |||
560 | OS << "********** DEBUG VARIABLES **********\n"; | |||
561 | for (auto &userValue : userValues) | |||
562 | userValue->print(OS, TRI); | |||
563 | OS << "********** DEBUG LABELS **********\n"; | |||
564 | for (auto &userLabel : userLabels) | |||
565 | userLabel->print(OS, TRI); | |||
566 | } | |||
567 | #endif | |||
568 | ||||
569 | void UserValue::mapVirtRegs(LDVImpl *LDV) { | |||
570 | for (unsigned i = 0, e = locations.size(); i != e; ++i) | |||
571 | if (locations[i].isReg() && | |||
572 | Register::isVirtualRegister(locations[i].getReg())) | |||
573 | LDV->mapVirtReg(locations[i].getReg(), this); | |||
574 | } | |||
575 | ||||
576 | UserValue *LDVImpl::getUserValue(const DILocalVariable *Var, | |||
577 | const DIExpression *Expr, const DebugLoc &DL) { | |||
578 | UserValue *&Leader = userVarMap[Var]; | |||
579 | if (Leader) { | |||
580 | UserValue *UV = Leader->getLeader(); | |||
581 | Leader = UV; | |||
582 | for (; UV; UV = UV->getNext()) | |||
583 | if (UV->match(Var, Expr, DL->getInlinedAt())) | |||
584 | return UV; | |||
585 | } | |||
586 | ||||
587 | userValues.push_back( | |||
588 | std::make_unique<UserValue>(Var, Expr, DL, allocator)); | |||
589 | UserValue *UV = userValues.back().get(); | |||
590 | Leader = UserValue::merge(Leader, UV); | |||
591 | return UV; | |||
592 | } | |||
593 | ||||
594 | void LDVImpl::mapVirtReg(unsigned VirtReg, UserValue *EC) { | |||
595 | assert(Register::isVirtualRegister(VirtReg) && "Only map VirtRegs")((Register::isVirtualRegister(VirtReg) && "Only map VirtRegs" ) ? static_cast<void> (0) : __assert_fail ("Register::isVirtualRegister(VirtReg) && \"Only map VirtRegs\"" , "/build/llvm-toolchain-snapshot-10~++20200106111110+0efc9e5a8cc/llvm/lib/CodeGen/LiveDebugVariables.cpp" , 595, __PRETTY_FUNCTION__)); | |||
596 | UserValue *&Leader = virtRegToEqClass[VirtReg]; | |||
597 | Leader = UserValue::merge(Leader, EC); | |||
598 | } | |||
599 | ||||
600 | UserValue *LDVImpl::lookupVirtReg(unsigned VirtReg) { | |||
601 | if (UserValue *UV = virtRegToEqClass.lookup(VirtReg)) | |||
602 | return UV->getLeader(); | |||
603 | return nullptr; | |||
604 | } | |||
605 | ||||
606 | bool LDVImpl::handleDebugValue(MachineInstr &MI, SlotIndex Idx) { | |||
607 | // DBG_VALUE loc, offset, variable | |||
608 | if (MI.getNumOperands() != 4 || | |||
609 | !(MI.getOperand(1).isReg() || MI.getOperand(1).isImm()) || | |||
610 | !MI.getOperand(2).isMetadata()) { | |||
611 | LLVM_DEBUG(dbgs() << "Can't handle " << MI)do { if (::llvm::DebugFlag && ::llvm::isCurrentDebugType ("livedebugvars")) { dbgs() << "Can't handle " << MI; } } while (false); | |||
612 | return false; | |||
613 | } | |||
614 | ||||
615 | // Detect invalid DBG_VALUE instructions, with a debug-use of a virtual | |||
616 | // register that hasn't been defined yet. If we do not remove those here, then | |||
617 | // the re-insertion of the DBG_VALUE instruction after register allocation | |||
618 | // will be incorrect. | |||
619 | // TODO: If earlier passes are corrected to generate sane debug information | |||
620 | // (and if the machine verifier is improved to catch this), then these checks | |||
621 | // could be removed or replaced by asserts. | |||
622 | bool Discard = false; | |||
623 | if (MI.getOperand(0).isReg() && | |||
624 | Register::isVirtualRegister(MI.getOperand(0).getReg())) { | |||
625 | const Register Reg = MI.getOperand(0).getReg(); | |||
626 | if (!LIS->hasInterval(Reg)) { | |||
627 | // The DBG_VALUE is described by a virtual register that does not have a | |||
628 | // live interval. Discard the DBG_VALUE. | |||
629 | Discard = true; | |||
630 | LLVM_DEBUG(dbgs() << "Discarding debug info (no LIS interval): " << Idxdo { if (::llvm::DebugFlag && ::llvm::isCurrentDebugType ("livedebugvars")) { dbgs() << "Discarding debug info (no LIS interval): " << Idx << " " << MI; } } while (false) | |||
631 | << " " << MI)do { if (::llvm::DebugFlag && ::llvm::isCurrentDebugType ("livedebugvars")) { dbgs() << "Discarding debug info (no LIS interval): " << Idx << " " << MI; } } while (false); | |||
632 | } else { | |||
633 | // The DBG_VALUE is only valid if either Reg is live out from Idx, or Reg | |||
634 | // is defined dead at Idx (where Idx is the slot index for the instruction | |||
635 | // preceding the DBG_VALUE). | |||
636 | const LiveInterval &LI = LIS->getInterval(Reg); | |||
637 | LiveQueryResult LRQ = LI.Query(Idx); | |||
638 | if (!LRQ.valueOutOrDead()) { | |||
639 | // We have found a DBG_VALUE with the value in a virtual register that | |||
640 | // is not live. Discard the DBG_VALUE. | |||
641 | Discard = true; | |||
642 | LLVM_DEBUG(dbgs() << "Discarding debug info (reg not live): " << Idxdo { if (::llvm::DebugFlag && ::llvm::isCurrentDebugType ("livedebugvars")) { dbgs() << "Discarding debug info (reg not live): " << Idx << " " << MI; } } while (false) | |||
643 | << " " << MI)do { if (::llvm::DebugFlag && ::llvm::isCurrentDebugType ("livedebugvars")) { dbgs() << "Discarding debug info (reg not live): " << Idx << " " << MI; } } while (false); | |||
644 | } | |||
645 | } | |||
646 | } | |||
647 | ||||
648 | // Get or create the UserValue for (variable,offset) here. | |||
649 | assert(!MI.getOperand(1).isImm() && "DBG_VALUE with indirect flag before "((!MI.getOperand(1).isImm() && "DBG_VALUE with indirect flag before " "LiveDebugVariables") ? static_cast<void> (0) : __assert_fail ("!MI.getOperand(1).isImm() && \"DBG_VALUE with indirect flag before \" \"LiveDebugVariables\"" , "/build/llvm-toolchain-snapshot-10~++20200106111110+0efc9e5a8cc/llvm/lib/CodeGen/LiveDebugVariables.cpp" , 650, __PRETTY_FUNCTION__)) | |||
650 | "LiveDebugVariables")((!MI.getOperand(1).isImm() && "DBG_VALUE with indirect flag before " "LiveDebugVariables") ? static_cast<void> (0) : __assert_fail ("!MI.getOperand(1).isImm() && \"DBG_VALUE with indirect flag before \" \"LiveDebugVariables\"" , "/build/llvm-toolchain-snapshot-10~++20200106111110+0efc9e5a8cc/llvm/lib/CodeGen/LiveDebugVariables.cpp" , 650, __PRETTY_FUNCTION__)); | |||
651 | const DILocalVariable *Var = MI.getDebugVariable(); | |||
652 | const DIExpression *Expr = MI.getDebugExpression(); | |||
653 | UserValue *UV = | |||
654 | getUserValue(Var, Expr, MI.getDebugLoc()); | |||
655 | if (!Discard) | |||
656 | UV->addDef(Idx, MI.getOperand(0)); | |||
657 | else { | |||
658 | MachineOperand MO = MachineOperand::CreateReg(0U, false); | |||
659 | MO.setIsDebug(); | |||
660 | UV->addDef(Idx, MO); | |||
661 | } | |||
662 | return true; | |||
663 | } | |||
664 | ||||
665 | bool LDVImpl::handleDebugLabel(MachineInstr &MI, SlotIndex Idx) { | |||
666 | // DBG_LABEL label | |||
667 | if (MI.getNumOperands() != 1 || !MI.getOperand(0).isMetadata()) { | |||
668 | LLVM_DEBUG(dbgs() << "Can't handle " << MI)do { if (::llvm::DebugFlag && ::llvm::isCurrentDebugType ("livedebugvars")) { dbgs() << "Can't handle " << MI; } } while (false); | |||
669 | return false; | |||
670 | } | |||
671 | ||||
672 | // Get or create the UserLabel for label here. | |||
673 | const DILabel *Label = MI.getDebugLabel(); | |||
674 | const DebugLoc &DL = MI.getDebugLoc(); | |||
675 | bool Found = false; | |||
676 | for (auto const &L : userLabels) { | |||
677 | if (L->match(Label, DL->getInlinedAt(), Idx)) { | |||
678 | Found = true; | |||
679 | break; | |||
680 | } | |||
681 | } | |||
682 | if (!Found) | |||
683 | userLabels.push_back(std::make_unique<UserLabel>(Label, DL, Idx)); | |||
684 | ||||
685 | return true; | |||
686 | } | |||
687 | ||||
688 | bool LDVImpl::collectDebugValues(MachineFunction &mf) { | |||
689 | bool Changed = false; | |||
690 | for (MachineFunction::iterator MFI = mf.begin(), MFE = mf.end(); MFI != MFE; | |||
691 | ++MFI) { | |||
692 | MachineBasicBlock *MBB = &*MFI; | |||
693 | for (MachineBasicBlock::iterator MBBI = MBB->begin(), MBBE = MBB->end(); | |||
694 | MBBI != MBBE;) { | |||
695 | // Use the first debug instruction in the sequence to get a SlotIndex | |||
696 | // for following consecutive debug instructions. | |||
697 | if (!MBBI->isDebugInstr()) { | |||
698 | ++MBBI; | |||
699 | continue; | |||
700 | } | |||
701 | // Debug instructions has no slot index. Use the previous | |||
702 | // non-debug instruction's SlotIndex as its SlotIndex. | |||
703 | SlotIndex Idx = | |||
704 | MBBI == MBB->begin() | |||
705 | ? LIS->getMBBStartIdx(MBB) | |||
706 | : LIS->getInstructionIndex(*std::prev(MBBI)).getRegSlot(); | |||
707 | // Handle consecutive debug instructions with the same slot index. | |||
708 | do { | |||
709 | // Only handle DBG_VALUE in handleDebugValue(). Skip all other | |||
710 | // kinds of debug instructions. | |||
711 | if ((MBBI->isDebugValue() && handleDebugValue(*MBBI, Idx)) || | |||
712 | (MBBI->isDebugLabel() && handleDebugLabel(*MBBI, Idx))) { | |||
713 | MBBI = MBB->erase(MBBI); | |||
714 | Changed = true; | |||
715 | } else | |||
716 | ++MBBI; | |||
717 | } while (MBBI != MBBE && MBBI->isDebugInstr()); | |||
718 | } | |||
719 | } | |||
720 | return Changed; | |||
721 | } | |||
722 | ||||
723 | void UserValue::extendDef(SlotIndex Idx, DbgValueLocation Loc, LiveRange *LR, | |||
724 | const VNInfo *VNI, SmallVectorImpl<SlotIndex> *Kills, | |||
725 | LiveIntervals &LIS) { | |||
726 | SlotIndex Start = Idx; | |||
727 | MachineBasicBlock *MBB = LIS.getMBBFromIndex(Start); | |||
728 | SlotIndex Stop = LIS.getMBBEndIdx(MBB); | |||
729 | LocMap::iterator I = locInts.find(Start); | |||
730 | ||||
731 | // Limit to VNI's live range. | |||
732 | bool ToEnd = true; | |||
733 | if (LR && VNI) { | |||
734 | LiveInterval::Segment *Segment = LR->getSegmentContaining(Start); | |||
735 | if (!Segment || Segment->valno != VNI) { | |||
736 | if (Kills) | |||
737 | Kills->push_back(Start); | |||
738 | return; | |||
739 | } | |||
740 | if (Segment->end < Stop) { | |||
741 | Stop = Segment->end; | |||
742 | ToEnd = false; | |||
743 | } | |||
744 | } | |||
745 | ||||
746 | // There could already be a short def at Start. | |||
747 | if (I.valid() && I.start() <= Start) { | |||
748 | // Stop when meeting a different location or an already extended interval. | |||
749 | Start = Start.getNextSlot(); | |||
750 | if (I.value() != Loc || I.stop() != Start) | |||
751 | return; | |||
752 | // This is a one-slot placeholder. Just skip it. | |||
753 | ++I; | |||
754 | } | |||
755 | ||||
756 | // Limited by the next def. | |||
757 | if (I.valid() && I.start() < Stop) | |||
758 | Stop = I.start(); | |||
759 | // Limited by VNI's live range. | |||
760 | else if (!ToEnd && Kills) | |||
761 | Kills->push_back(Stop); | |||
762 | ||||
763 | if (Start < Stop) | |||
764 | I.insert(Start, Stop, Loc); | |||
765 | } | |||
766 | ||||
767 | void UserValue::addDefsFromCopies( | |||
768 | LiveInterval *LI, unsigned LocNo, | |||
769 | const SmallVectorImpl<SlotIndex> &Kills, | |||
770 | SmallVectorImpl<std::pair<SlotIndex, DbgValueLocation>> &NewDefs, | |||
771 | MachineRegisterInfo &MRI, LiveIntervals &LIS) { | |||
772 | if (Kills.empty()) | |||
773 | return; | |||
774 | // Don't track copies from physregs, there are too many uses. | |||
775 | if (!Register::isVirtualRegister(LI->reg)) | |||
776 | return; | |||
777 | ||||
778 | // Collect all the (vreg, valno) pairs that are copies of LI. | |||
779 | SmallVector<std::pair<LiveInterval*, const VNInfo*>, 8> CopyValues; | |||
780 | for (MachineOperand &MO : MRI.use_nodbg_operands(LI->reg)) { | |||
781 | MachineInstr *MI = MO.getParent(); | |||
782 | // Copies of the full value. | |||
783 | if (MO.getSubReg() || !MI->isCopy()) | |||
784 | continue; | |||
785 | Register DstReg = MI->getOperand(0).getReg(); | |||
786 | ||||
787 | // Don't follow copies to physregs. These are usually setting up call | |||
788 | // arguments, and the argument registers are always call clobbered. We are | |||
789 | // better off in the source register which could be a callee-saved register, | |||
790 | // or it could be spilled. | |||
791 | if (!Register::isVirtualRegister(DstReg)) | |||
792 | continue; | |||
793 | ||||
794 | // Is LocNo extended to reach this copy? If not, another def may be blocking | |||
795 | // it, or we are looking at a wrong value of LI. | |||
796 | SlotIndex Idx = LIS.getInstructionIndex(*MI); | |||
797 | LocMap::iterator I = locInts.find(Idx.getRegSlot(true)); | |||
798 | if (!I.valid() || I.value().locNo() != LocNo) | |||
799 | continue; | |||
800 | ||||
801 | if (!LIS.hasInterval(DstReg)) | |||
802 | continue; | |||
803 | LiveInterval *DstLI = &LIS.getInterval(DstReg); | |||
804 | const VNInfo *DstVNI = DstLI->getVNInfoAt(Idx.getRegSlot()); | |||
805 | assert(DstVNI && DstVNI->def == Idx.getRegSlot() && "Bad copy value")((DstVNI && DstVNI->def == Idx.getRegSlot() && "Bad copy value") ? static_cast<void> (0) : __assert_fail ("DstVNI && DstVNI->def == Idx.getRegSlot() && \"Bad copy value\"" , "/build/llvm-toolchain-snapshot-10~++20200106111110+0efc9e5a8cc/llvm/lib/CodeGen/LiveDebugVariables.cpp" , 805, __PRETTY_FUNCTION__)); | |||
806 | CopyValues.push_back(std::make_pair(DstLI, DstVNI)); | |||
807 | } | |||
808 | ||||
809 | if (CopyValues.empty()) | |||
810 | return; | |||
811 | ||||
812 | LLVM_DEBUG(dbgs() << "Got " << CopyValues.size() << " copies of " << *LIdo { if (::llvm::DebugFlag && ::llvm::isCurrentDebugType ("livedebugvars")) { dbgs() << "Got " << CopyValues .size() << " copies of " << *LI << '\n'; } } while (false) | |||
813 | << '\n')do { if (::llvm::DebugFlag && ::llvm::isCurrentDebugType ("livedebugvars")) { dbgs() << "Got " << CopyValues .size() << " copies of " << *LI << '\n'; } } while (false); | |||
814 | ||||
815 | // Try to add defs of the copied values for each kill point. | |||
816 | for (unsigned i = 0, e = Kills.size(); i != e; ++i) { | |||
817 | SlotIndex Idx = Kills[i]; | |||
818 | for (unsigned j = 0, e = CopyValues.size(); j != e; ++j) { | |||
819 | LiveInterval *DstLI = CopyValues[j].first; | |||
820 | const VNInfo *DstVNI = CopyValues[j].second; | |||
821 | if (DstLI->getVNInfoAt(Idx) != DstVNI) | |||
822 | continue; | |||
823 | // Check that there isn't already a def at Idx | |||
824 | LocMap::iterator I = locInts.find(Idx); | |||
825 | if (I.valid() && I.start() <= Idx) | |||
826 | continue; | |||
827 | LLVM_DEBUG(dbgs() << "Kill at " << Idx << " covered by valno #"do { if (::llvm::DebugFlag && ::llvm::isCurrentDebugType ("livedebugvars")) { dbgs() << "Kill at " << Idx << " covered by valno #" << DstVNI->id << " in " << *DstLI << '\n'; } } while (false) | |||
828 | << DstVNI->id << " in " << *DstLI << '\n')do { if (::llvm::DebugFlag && ::llvm::isCurrentDebugType ("livedebugvars")) { dbgs() << "Kill at " << Idx << " covered by valno #" << DstVNI->id << " in " << *DstLI << '\n'; } } while (false); | |||
829 | MachineInstr *CopyMI = LIS.getInstructionFromIndex(DstVNI->def); | |||
830 | assert(CopyMI && CopyMI->isCopy() && "Bad copy value")((CopyMI && CopyMI->isCopy() && "Bad copy value" ) ? static_cast<void> (0) : __assert_fail ("CopyMI && CopyMI->isCopy() && \"Bad copy value\"" , "/build/llvm-toolchain-snapshot-10~++20200106111110+0efc9e5a8cc/llvm/lib/CodeGen/LiveDebugVariables.cpp" , 830, __PRETTY_FUNCTION__)); | |||
831 | unsigned LocNo = getLocationNo(CopyMI->getOperand(0)); | |||
832 | DbgValueLocation NewLoc(LocNo); | |||
833 | I.insert(Idx, Idx.getNextSlot(), NewLoc); | |||
834 | NewDefs.push_back(std::make_pair(Idx, NewLoc)); | |||
835 | break; | |||
836 | } | |||
837 | } | |||
838 | } | |||
839 | ||||
840 | void UserValue::computeIntervals(MachineRegisterInfo &MRI, | |||
841 | const TargetRegisterInfo &TRI, | |||
842 | LiveIntervals &LIS, LexicalScopes &LS) { | |||
843 | SmallVector<std::pair<SlotIndex, DbgValueLocation>, 16> Defs; | |||
844 | ||||
845 | // Collect all defs to be extended (Skipping undefs). | |||
846 | for (LocMap::const_iterator I = locInts.begin(); I.valid(); ++I) | |||
847 | if (!I.value().isUndef()) | |||
848 | Defs.push_back(std::make_pair(I.start(), I.value())); | |||
849 | ||||
850 | // Extend all defs, and possibly add new ones along the way. | |||
851 | for (unsigned i = 0; i != Defs.size(); ++i) { | |||
852 | SlotIndex Idx = Defs[i].first; | |||
853 | DbgValueLocation Loc = Defs[i].second; | |||
854 | const MachineOperand &LocMO = locations[Loc.locNo()]; | |||
855 | ||||
856 | if (!LocMO.isReg()) { | |||
857 | extendDef(Idx, Loc, nullptr, nullptr, nullptr, LIS); | |||
858 | continue; | |||
859 | } | |||
860 | ||||
861 | // Register locations are constrained to where the register value is live. | |||
862 | if (Register::isVirtualRegister(LocMO.getReg())) { | |||
863 | LiveInterval *LI = nullptr; | |||
864 | const VNInfo *VNI = nullptr; | |||
865 | if (LIS.hasInterval(LocMO.getReg())) { | |||
866 | LI = &LIS.getInterval(LocMO.getReg()); | |||
867 | VNI = LI->getVNInfoAt(Idx); | |||
868 | } | |||
869 | SmallVector<SlotIndex, 16> Kills; | |||
870 | extendDef(Idx, Loc, LI, VNI, &Kills, LIS); | |||
871 | // FIXME: Handle sub-registers in addDefsFromCopies. The problem is that | |||
872 | // if the original location for example is %vreg0:sub_hi, and we find a | |||
873 | // full register copy in addDefsFromCopies (at the moment it only handles | |||
874 | // full register copies), then we must add the sub1 sub-register index to | |||
875 | // the new location. However, that is only possible if the new virtual | |||
876 | // register is of the same regclass (or if there is an equivalent | |||
877 | // sub-register in that regclass). For now, simply skip handling copies if | |||
878 | // a sub-register is involved. | |||
879 | if (LI && !LocMO.getSubReg()) | |||
880 | addDefsFromCopies(LI, Loc.locNo(), Kills, Defs, MRI, LIS); | |||
881 | continue; | |||
882 | } | |||
883 | ||||
884 | // For physregs, we only mark the start slot idx. DwarfDebug will see it | |||
885 | // as if the DBG_VALUE is valid up until the end of the basic block, or | |||
886 | // the next def of the physical register. So we do not need to extend the | |||
887 | // range. It might actually happen that the DBG_VALUE is the last use of | |||
888 | // the physical register (e.g. if this is an unused input argument to a | |||
889 | // function). | |||
890 | } | |||
891 | ||||
892 | // The computed intervals may extend beyond the range of the debug | |||
893 | // location's lexical scope. In this case, splitting of an interval | |||
894 | // can result in an interval outside of the scope being created, | |||
895 | // causing extra unnecessary DBG_VALUEs to be emitted. To prevent | |||
896 | // this, trim the intervals to the lexical scope. | |||
897 | ||||
898 | LexicalScope *Scope = LS.findLexicalScope(dl); | |||
899 | if (!Scope) | |||
900 | return; | |||
901 | ||||
902 | SlotIndex PrevEnd; | |||
903 | LocMap::iterator I = locInts.begin(); | |||
904 | ||||
905 | // Iterate over the lexical scope ranges. Each time round the loop | |||
906 | // we check the intervals for overlap with the end of the previous | |||
907 | // range and the start of the next. The first range is handled as | |||
908 | // a special case where there is no PrevEnd. | |||
909 | for (const InsnRange &Range : Scope->getRanges()) { | |||
910 | SlotIndex RStart = LIS.getInstructionIndex(*Range.first); | |||
911 | SlotIndex REnd = LIS.getInstructionIndex(*Range.second); | |||
912 | ||||
913 | // At the start of each iteration I has been advanced so that | |||
914 | // I.stop() >= PrevEnd. Check for overlap. | |||
915 | if (PrevEnd && I.start() < PrevEnd) { | |||
916 | SlotIndex IStop = I.stop(); | |||
917 | DbgValueLocation Loc = I.value(); | |||
918 | ||||
919 | // Stop overlaps previous end - trim the end of the interval to | |||
920 | // the scope range. | |||
921 | I.setStopUnchecked(PrevEnd); | |||
922 | ++I; | |||
923 | ||||
924 | // If the interval also overlaps the start of the "next" (i.e. | |||
925 | // current) range create a new interval for the remainder | |||
926 | if (RStart < IStop) | |||
927 | I.insert(RStart, IStop, Loc); | |||
928 | } | |||
929 | ||||
930 | // Advance I so that I.stop() >= RStart, and check for overlap. | |||
931 | I.advanceTo(RStart); | |||
932 | if (!I.valid()) | |||
933 | return; | |||
934 | ||||
935 | // The end of a lexical scope range is the last instruction in the | |||
936 | // range. To convert to an interval we need the index of the | |||
937 | // instruction after it. | |||
938 | REnd = REnd.getNextIndex(); | |||
939 | ||||
940 | // Advance I to first interval outside current range. | |||
941 | I.advanceTo(REnd); | |||
942 | if (!I.valid()) | |||
943 | return; | |||
944 | ||||
945 | PrevEnd = REnd; | |||
946 | } | |||
947 | ||||
948 | // Check for overlap with end of final range. | |||
949 | if (PrevEnd && I.start() < PrevEnd) | |||
950 | I.setStopUnchecked(PrevEnd); | |||
951 | } | |||
952 | ||||
953 | void LDVImpl::computeIntervals() { | |||
954 | LexicalScopes LS; | |||
955 | LS.initialize(*MF); | |||
956 | ||||
957 | for (unsigned i = 0, e = userValues.size(); i != e; ++i) { | |||
958 | userValues[i]->computeIntervals(MF->getRegInfo(), *TRI, *LIS, LS); | |||
959 | userValues[i]->mapVirtRegs(this); | |||
960 | } | |||
961 | } | |||
962 | ||||
963 | bool LDVImpl::runOnMachineFunction(MachineFunction &mf) { | |||
964 | clear(); | |||
965 | MF = &mf; | |||
966 | LIS = &pass.getAnalysis<LiveIntervals>(); | |||
967 | TRI = mf.getSubtarget().getRegisterInfo(); | |||
968 | LLVM_DEBUG(dbgs() << "********** COMPUTING LIVE DEBUG VARIABLES: "do { if (::llvm::DebugFlag && ::llvm::isCurrentDebugType ("livedebugvars")) { dbgs() << "********** COMPUTING LIVE DEBUG VARIABLES: " << mf.getName() << " **********\n"; } } while (false ) | |||
969 | << mf.getName() << " **********\n")do { if (::llvm::DebugFlag && ::llvm::isCurrentDebugType ("livedebugvars")) { dbgs() << "********** COMPUTING LIVE DEBUG VARIABLES: " << mf.getName() << " **********\n"; } } while (false ); | |||
970 | ||||
971 | bool Changed = collectDebugValues(mf); | |||
972 | computeIntervals(); | |||
973 | LLVM_DEBUG(print(dbgs()))do { if (::llvm::DebugFlag && ::llvm::isCurrentDebugType ("livedebugvars")) { print(dbgs()); } } while (false); | |||
974 | ModifiedMF = Changed; | |||
975 | return Changed; | |||
976 | } | |||
977 | ||||
978 | static void removeDebugValues(MachineFunction &mf) { | |||
979 | for (MachineBasicBlock &MBB : mf) { | |||
980 | for (auto MBBI = MBB.begin(), MBBE = MBB.end(); MBBI != MBBE; ) { | |||
981 | if (!MBBI->isDebugValue()) { | |||
982 | ++MBBI; | |||
983 | continue; | |||
984 | } | |||
985 | MBBI = MBB.erase(MBBI); | |||
986 | } | |||
987 | } | |||
988 | } | |||
989 | ||||
990 | bool LiveDebugVariables::runOnMachineFunction(MachineFunction &mf) { | |||
991 | if (!EnableLDV) | |||
992 | return false; | |||
993 | if (!mf.getFunction().getSubprogram()) { | |||
994 | removeDebugValues(mf); | |||
995 | return false; | |||
996 | } | |||
997 | if (!pImpl) | |||
998 | pImpl = new LDVImpl(this); | |||
999 | return static_cast<LDVImpl*>(pImpl)->runOnMachineFunction(mf); | |||
1000 | } | |||
1001 | ||||
1002 | void LiveDebugVariables::releaseMemory() { | |||
1003 | if (pImpl) | |||
1004 | static_cast<LDVImpl*>(pImpl)->clear(); | |||
1005 | } | |||
1006 | ||||
1007 | LiveDebugVariables::~LiveDebugVariables() { | |||
1008 | if (pImpl) | |||
1009 | delete static_cast<LDVImpl*>(pImpl); | |||
1010 | } | |||
1011 | ||||
1012 | //===----------------------------------------------------------------------===// | |||
1013 | // Live Range Splitting | |||
1014 | //===----------------------------------------------------------------------===// | |||
1015 | ||||
1016 | bool | |||
1017 | UserValue::splitLocation(unsigned OldLocNo, ArrayRef<unsigned> NewRegs, | |||
1018 | LiveIntervals& LIS) { | |||
1019 | LLVM_DEBUG({do { if (::llvm::DebugFlag && ::llvm::isCurrentDebugType ("livedebugvars")) { { dbgs() << "Splitting Loc" << OldLocNo << '\t'; print(dbgs(), nullptr); }; } } while (false) | |||
1020 | dbgs() << "Splitting Loc" << OldLocNo << '\t';do { if (::llvm::DebugFlag && ::llvm::isCurrentDebugType ("livedebugvars")) { { dbgs() << "Splitting Loc" << OldLocNo << '\t'; print(dbgs(), nullptr); }; } } while (false) | |||
1021 | print(dbgs(), nullptr);do { if (::llvm::DebugFlag && ::llvm::isCurrentDebugType ("livedebugvars")) { { dbgs() << "Splitting Loc" << OldLocNo << '\t'; print(dbgs(), nullptr); }; } } while (false) | |||
1022 | })do { if (::llvm::DebugFlag && ::llvm::isCurrentDebugType ("livedebugvars")) { { dbgs() << "Splitting Loc" << OldLocNo << '\t'; print(dbgs(), nullptr); }; } } while (false); | |||
1023 | bool DidChange = false; | |||
1024 | LocMap::iterator LocMapI; | |||
1025 | LocMapI.setMap(locInts); | |||
1026 | for (unsigned i = 0; i != NewRegs.size(); ++i) { | |||
1027 | LiveInterval *LI = &LIS.getInterval(NewRegs[i]); | |||
1028 | if (LI->empty()) | |||
1029 | continue; | |||
1030 | ||||
1031 | // Don't allocate the new LocNo until it is needed. | |||
1032 | unsigned NewLocNo = UndefLocNo; | |||
1033 | ||||
1034 | // Iterate over the overlaps between locInts and LI. | |||
1035 | LocMapI.find(LI->beginIndex()); | |||
1036 | if (!LocMapI.valid()) | |||
1037 | continue; | |||
1038 | LiveInterval::iterator LII = LI->advanceTo(LI->begin(), LocMapI.start()); | |||
1039 | LiveInterval::iterator LIE = LI->end(); | |||
1040 | while (LocMapI.valid() && LII != LIE) { | |||
1041 | // At this point, we know that LocMapI.stop() > LII->start. | |||
1042 | LII = LI->advanceTo(LII, LocMapI.start()); | |||
1043 | if (LII == LIE) | |||
1044 | break; | |||
1045 | ||||
1046 | // Now LII->end > LocMapI.start(). Do we have an overlap? | |||
1047 | if (LocMapI.value().locNo() == OldLocNo && LII->start < LocMapI.stop()) { | |||
1048 | // Overlapping correct location. Allocate NewLocNo now. | |||
1049 | if (NewLocNo == UndefLocNo) { | |||
1050 | MachineOperand MO = MachineOperand::CreateReg(LI->reg, false); | |||
1051 | MO.setSubReg(locations[OldLocNo].getSubReg()); | |||
1052 | NewLocNo = getLocationNo(MO); | |||
1053 | DidChange = true; | |||
1054 | } | |||
1055 | ||||
1056 | SlotIndex LStart = LocMapI.start(); | |||
1057 | SlotIndex LStop = LocMapI.stop(); | |||
1058 | DbgValueLocation OldLoc = LocMapI.value(); | |||
1059 | ||||
1060 | // Trim LocMapI down to the LII overlap. | |||
1061 | if (LStart < LII->start) | |||
1062 | LocMapI.setStartUnchecked(LII->start); | |||
1063 | if (LStop > LII->end) | |||
1064 | LocMapI.setStopUnchecked(LII->end); | |||
1065 | ||||
1066 | // Change the value in the overlap. This may trigger coalescing. | |||
1067 | LocMapI.setValue(OldLoc.changeLocNo(NewLocNo)); | |||
1068 | ||||
1069 | // Re-insert any removed OldLocNo ranges. | |||
1070 | if (LStart < LocMapI.start()) { | |||
1071 | LocMapI.insert(LStart, LocMapI.start(), OldLoc); | |||
1072 | ++LocMapI; | |||
1073 | assert(LocMapI.valid() && "Unexpected coalescing")((LocMapI.valid() && "Unexpected coalescing") ? static_cast <void> (0) : __assert_fail ("LocMapI.valid() && \"Unexpected coalescing\"" , "/build/llvm-toolchain-snapshot-10~++20200106111110+0efc9e5a8cc/llvm/lib/CodeGen/LiveDebugVariables.cpp" , 1073, __PRETTY_FUNCTION__)); | |||
1074 | } | |||
1075 | if (LStop > LocMapI.stop()) { | |||
1076 | ++LocMapI; | |||
1077 | LocMapI.insert(LII->end, LStop, OldLoc); | |||
1078 | --LocMapI; | |||
1079 | } | |||
1080 | } | |||
1081 | ||||
1082 | // Advance to the next overlap. | |||
1083 | if (LII->end < LocMapI.stop()) { | |||
1084 | if (++LII == LIE) | |||
1085 | break; | |||
1086 | LocMapI.advanceTo(LII->start); | |||
1087 | } else { | |||
1088 | ++LocMapI; | |||
1089 | if (!LocMapI.valid()) | |||
1090 | break; | |||
1091 | LII = LI->advanceTo(LII, LocMapI.start()); | |||
1092 | } | |||
1093 | } | |||
1094 | } | |||
1095 | ||||
1096 | // Finally, remove OldLocNo unless it is still used by some interval in the | |||
1097 | // locInts map. One case when OldLocNo still is in use is when the register | |||
1098 | // has been spilled. In such situations the spilled register is kept as a | |||
1099 | // location until rewriteLocations is called (VirtRegMap is mapping the old | |||
1100 | // register to the spill slot). So for a while we can have locations that map | |||
1101 | // to virtual registers that have been removed from both the MachineFunction | |||
1102 | // and from LiveIntervals. | |||
1103 | removeLocationIfUnused(OldLocNo); | |||
1104 | ||||
1105 | LLVM_DEBUG({do { if (::llvm::DebugFlag && ::llvm::isCurrentDebugType ("livedebugvars")) { { dbgs() << "Split result: \t"; print (dbgs(), nullptr); }; } } while (false) | |||
1106 | dbgs() << "Split result: \t";do { if (::llvm::DebugFlag && ::llvm::isCurrentDebugType ("livedebugvars")) { { dbgs() << "Split result: \t"; print (dbgs(), nullptr); }; } } while (false) | |||
1107 | print(dbgs(), nullptr);do { if (::llvm::DebugFlag && ::llvm::isCurrentDebugType ("livedebugvars")) { { dbgs() << "Split result: \t"; print (dbgs(), nullptr); }; } } while (false) | |||
1108 | })do { if (::llvm::DebugFlag && ::llvm::isCurrentDebugType ("livedebugvars")) { { dbgs() << "Split result: \t"; print (dbgs(), nullptr); }; } } while (false); | |||
1109 | return DidChange; | |||
1110 | } | |||
1111 | ||||
1112 | bool | |||
1113 | UserValue::splitRegister(unsigned OldReg, ArrayRef<unsigned> NewRegs, | |||
1114 | LiveIntervals &LIS) { | |||
1115 | bool DidChange = false; | |||
1116 | // Split locations referring to OldReg. Iterate backwards so splitLocation can | |||
1117 | // safely erase unused locations. | |||
1118 | for (unsigned i = locations.size(); i ; --i) { | |||
1119 | unsigned LocNo = i-1; | |||
1120 | const MachineOperand *Loc = &locations[LocNo]; | |||
1121 | if (!Loc->isReg() || Loc->getReg() != OldReg) | |||
1122 | continue; | |||
1123 | DidChange |= splitLocation(LocNo, NewRegs, LIS); | |||
1124 | } | |||
1125 | return DidChange; | |||
1126 | } | |||
1127 | ||||
1128 | void LDVImpl::splitRegister(unsigned OldReg, ArrayRef<unsigned> NewRegs) { | |||
1129 | bool DidChange = false; | |||
1130 | for (UserValue *UV = lookupVirtReg(OldReg); UV; UV = UV->getNext()) | |||
1131 | DidChange |= UV->splitRegister(OldReg, NewRegs, *LIS); | |||
1132 | ||||
1133 | if (!DidChange) | |||
1134 | return; | |||
1135 | ||||
1136 | // Map all of the new virtual registers. | |||
1137 | UserValue *UV = lookupVirtReg(OldReg); | |||
1138 | for (unsigned i = 0; i != NewRegs.size(); ++i) | |||
1139 | mapVirtReg(NewRegs[i], UV); | |||
1140 | } | |||
1141 | ||||
1142 | void LiveDebugVariables:: | |||
1143 | splitRegister(unsigned OldReg, ArrayRef<unsigned> NewRegs, LiveIntervals &LIS) { | |||
1144 | if (pImpl) | |||
1145 | static_cast<LDVImpl*>(pImpl)->splitRegister(OldReg, NewRegs); | |||
1146 | } | |||
1147 | ||||
1148 | void UserValue::rewriteLocations(VirtRegMap &VRM, const MachineFunction &MF, | |||
1149 | const TargetInstrInfo &TII, | |||
1150 | const TargetRegisterInfo &TRI, | |||
1151 | SpillOffsetMap &SpillOffsets) { | |||
1152 | // Build a set of new locations with new numbers so we can coalesce our | |||
1153 | // IntervalMap if two vreg intervals collapse to the same physical location. | |||
1154 | // Use MapVector instead of SetVector because MapVector::insert returns the | |||
1155 | // position of the previously or newly inserted element. The boolean value | |||
1156 | // tracks if the location was produced by a spill. | |||
1157 | // FIXME: This will be problematic if we ever support direct and indirect | |||
1158 | // frame index locations, i.e. expressing both variables in memory and | |||
1159 | // 'int x, *px = &x'. The "spilled" bit must become part of the location. | |||
1160 | MapVector<MachineOperand, std::pair<bool, unsigned>> NewLocations; | |||
1161 | SmallVector<unsigned, 4> LocNoMap(locations.size()); | |||
1162 | for (unsigned I = 0, E = locations.size(); I != E; ++I) { | |||
1163 | bool Spilled = false; | |||
1164 | unsigned SpillOffset = 0; | |||
1165 | MachineOperand Loc = locations[I]; | |||
1166 | // Only virtual registers are rewritten. | |||
1167 | if (Loc.isReg() && Loc.getReg() && | |||
1168 | Register::isVirtualRegister(Loc.getReg())) { | |||
1169 | Register VirtReg = Loc.getReg(); | |||
1170 | if (VRM.isAssignedReg(VirtReg) && | |||
1171 | Register::isPhysicalRegister(VRM.getPhys(VirtReg))) { | |||
1172 | // This can create a %noreg operand in rare cases when the sub-register | |||
1173 | // index is no longer available. That means the user value is in a | |||
1174 | // non-existent sub-register, and %noreg is exactly what we want. | |||
1175 | Loc.substPhysReg(VRM.getPhys(VirtReg), TRI); | |||
1176 | } else if (VRM.getStackSlot(VirtReg) != VirtRegMap::NO_STACK_SLOT) { | |||
1177 | // Retrieve the stack slot offset. | |||
1178 | unsigned SpillSize; | |||
1179 | const MachineRegisterInfo &MRI = MF.getRegInfo(); | |||
1180 | const TargetRegisterClass *TRC = MRI.getRegClass(VirtReg); | |||
1181 | bool Success = TII.getStackSlotRange(TRC, Loc.getSubReg(), SpillSize, | |||
1182 | SpillOffset, MF); | |||
1183 | ||||
1184 | // FIXME: Invalidate the location if the offset couldn't be calculated. | |||
1185 | (void)Success; | |||
1186 | ||||
1187 | Loc = MachineOperand::CreateFI(VRM.getStackSlot(VirtReg)); | |||
1188 | Spilled = true; | |||
1189 | } else { | |||
1190 | Loc.setReg(0); | |||
1191 | Loc.setSubReg(0); | |||
1192 | } | |||
1193 | } | |||
1194 | ||||
1195 | // Insert this location if it doesn't already exist and record a mapping | |||
1196 | // from the old number to the new number. | |||
1197 | auto InsertResult = NewLocations.insert({Loc, {Spilled, SpillOffset}}); | |||
1198 | unsigned NewLocNo = std::distance(NewLocations.begin(), InsertResult.first); | |||
1199 | LocNoMap[I] = NewLocNo; | |||
1200 | } | |||
1201 | ||||
1202 | // Rewrite the locations and record the stack slot offsets for spills. | |||
1203 | locations.clear(); | |||
1204 | SpillOffsets.clear(); | |||
1205 | for (auto &Pair : NewLocations) { | |||
1206 | bool Spilled; | |||
1207 | unsigned SpillOffset; | |||
1208 | std::tie(Spilled, SpillOffset) = Pair.second; | |||
1209 | locations.push_back(Pair.first); | |||
1210 | if (Spilled) { | |||
1211 | unsigned NewLocNo = std::distance(&*NewLocations.begin(), &Pair); | |||
1212 | SpillOffsets[NewLocNo] = SpillOffset; | |||
1213 | } | |||
1214 | } | |||
1215 | ||||
1216 | // Update the interval map, but only coalesce left, since intervals to the | |||
1217 | // right use the old location numbers. This should merge two contiguous | |||
1218 | // DBG_VALUE intervals with different vregs that were allocated to the same | |||
1219 | // physical register. | |||
1220 | for (LocMap::iterator I = locInts.begin(); I.valid(); ++I) { | |||
1221 | DbgValueLocation Loc = I.value(); | |||
1222 | // Undef values don't exist in locations (and thus not in LocNoMap either) | |||
1223 | // so skip over them. See getLocationNo(). | |||
1224 | if (Loc.isUndef()) | |||
1225 | continue; | |||
1226 | unsigned NewLocNo = LocNoMap[Loc.locNo()]; | |||
1227 | I.setValueUnchecked(Loc.changeLocNo(NewLocNo)); | |||
1228 | I.setStart(I.start()); | |||
1229 | } | |||
1230 | } | |||
1231 | ||||
1232 | /// Find an iterator for inserting a DBG_VALUE instruction. | |||
1233 | static MachineBasicBlock::iterator | |||
1234 | findInsertLocation(MachineBasicBlock *MBB, SlotIndex Idx, | |||
1235 | LiveIntervals &LIS) { | |||
1236 | SlotIndex Start = LIS.getMBBStartIdx(MBB); | |||
1237 | Idx = Idx.getBaseIndex(); | |||
1238 | ||||
1239 | // Try to find an insert location by going backwards from Idx. | |||
1240 | MachineInstr *MI; | |||
1241 | while (!(MI = LIS.getInstructionFromIndex(Idx))) { | |||
1242 | // We've reached the beginning of MBB. | |||
1243 | if (Idx == Start) { | |||
1244 | MachineBasicBlock::iterator I = MBB->SkipPHIsLabelsAndDebug(MBB->begin()); | |||
1245 | return I; | |||
1246 | } | |||
1247 | Idx = Idx.getPrevIndex(); | |||
1248 | } | |||
1249 | ||||
1250 | // Don't insert anything after the first terminator, though. | |||
1251 | return MI->isTerminator() ? MBB->getFirstTerminator() : | |||
1252 | std::next(MachineBasicBlock::iterator(MI)); | |||
1253 | } | |||
1254 | ||||
1255 | /// Find an iterator for inserting the next DBG_VALUE instruction | |||
1256 | /// (or end if no more insert locations found). | |||
1257 | static MachineBasicBlock::iterator | |||
1258 | findNextInsertLocation(MachineBasicBlock *MBB, | |||
1259 | MachineBasicBlock::iterator I, | |||
1260 | SlotIndex StopIdx, MachineOperand &LocMO, | |||
1261 | LiveIntervals &LIS, | |||
1262 | const TargetRegisterInfo &TRI) { | |||
1263 | if (!LocMO.isReg()) | |||
1264 | return MBB->instr_end(); | |||
1265 | Register Reg = LocMO.getReg(); | |||
1266 | ||||
1267 | // Find the next instruction in the MBB that define the register Reg. | |||
1268 | while (I != MBB->end() && !I->isTerminator()) { | |||
1269 | if (!LIS.isNotInMIMap(*I) && | |||
1270 | SlotIndex::isEarlierEqualInstr(StopIdx, LIS.getInstructionIndex(*I))) | |||
1271 | break; | |||
1272 | if (I->definesRegister(Reg, &TRI)) | |||
1273 | // The insert location is directly after the instruction/bundle. | |||
1274 | return std::next(I); | |||
1275 | ++I; | |||
1276 | } | |||
1277 | return MBB->end(); | |||
1278 | } | |||
1279 | ||||
1280 | void UserValue::insertDebugValue(MachineBasicBlock *MBB, SlotIndex StartIdx, | |||
1281 | SlotIndex StopIdx, DbgValueLocation Loc, | |||
1282 | bool Spilled, unsigned SpillOffset, | |||
1283 | LiveIntervals &LIS, const TargetInstrInfo &TII, | |||
1284 | const TargetRegisterInfo &TRI) { | |||
1285 | SlotIndex MBBEndIdx = LIS.getMBBEndIdx(&*MBB); | |||
1286 | // Only search within the current MBB. | |||
1287 | StopIdx = (MBBEndIdx < StopIdx) ? MBBEndIdx : StopIdx; | |||
1288 | MachineBasicBlock::iterator I = findInsertLocation(MBB, StartIdx, LIS); | |||
1289 | // Undef values don't exist in locations so create new "noreg" register MOs | |||
1290 | // for them. See getLocationNo(). | |||
1291 | MachineOperand MO = !Loc.isUndef() ? | |||
1292 | locations[Loc.locNo()] : | |||
1293 | MachineOperand::CreateReg(/* Reg */ 0, /* isDef */ false, /* isImp */ false, | |||
1294 | /* isKill */ false, /* isDead */ false, | |||
1295 | /* isUndef */ false, /* isEarlyClobber */ false, | |||
1296 | /* SubReg */ 0, /* isDebug */ true); | |||
1297 | ||||
1298 | ++NumInsertedDebugValues; | |||
1299 | ||||
1300 | assert(cast<DILocalVariable>(Variable)((cast<DILocalVariable>(Variable) ->isValidLocationForIntrinsic (getDebugLoc()) && "Expected inlined-at fields to agree" ) ? static_cast<void> (0) : __assert_fail ("cast<DILocalVariable>(Variable) ->isValidLocationForIntrinsic(getDebugLoc()) && \"Expected inlined-at fields to agree\"" , "/build/llvm-toolchain-snapshot-10~++20200106111110+0efc9e5a8cc/llvm/lib/CodeGen/LiveDebugVariables.cpp" , 1302, __PRETTY_FUNCTION__)) | |||
1301 | ->isValidLocationForIntrinsic(getDebugLoc()) &&((cast<DILocalVariable>(Variable) ->isValidLocationForIntrinsic (getDebugLoc()) && "Expected inlined-at fields to agree" ) ? static_cast<void> (0) : __assert_fail ("cast<DILocalVariable>(Variable) ->isValidLocationForIntrinsic(getDebugLoc()) && \"Expected inlined-at fields to agree\"" , "/build/llvm-toolchain-snapshot-10~++20200106111110+0efc9e5a8cc/llvm/lib/CodeGen/LiveDebugVariables.cpp" , 1302, __PRETTY_FUNCTION__)) | |||
1302 | "Expected inlined-at fields to agree")((cast<DILocalVariable>(Variable) ->isValidLocationForIntrinsic (getDebugLoc()) && "Expected inlined-at fields to agree" ) ? static_cast<void> (0) : __assert_fail ("cast<DILocalVariable>(Variable) ->isValidLocationForIntrinsic(getDebugLoc()) && \"Expected inlined-at fields to agree\"" , "/build/llvm-toolchain-snapshot-10~++20200106111110+0efc9e5a8cc/llvm/lib/CodeGen/LiveDebugVariables.cpp" , 1302, __PRETTY_FUNCTION__)); | |||
1303 | ||||
1304 | // If the location was spilled, the new DBG_VALUE will be indirect. If the | |||
1305 | // original DBG_VALUE was indirect, we need to add DW_OP_deref to indicate | |||
1306 | // that the original virtual register was a pointer. Also, add the stack slot | |||
1307 | // offset for the spilled register to the expression. | |||
1308 | const DIExpression *Expr = Expression; | |||
1309 | if (Spilled) | |||
1310 | Expr = DIExpression::prepend(Expr, DIExpression::ApplyOffset, SpillOffset); | |||
1311 | ||||
1312 | assert((!Spilled || MO.isFI()) && "a spilled location must be a frame index")(((!Spilled || MO.isFI()) && "a spilled location must be a frame index" ) ? static_cast<void> (0) : __assert_fail ("(!Spilled || MO.isFI()) && \"a spilled location must be a frame index\"" , "/build/llvm-toolchain-snapshot-10~++20200106111110+0efc9e5a8cc/llvm/lib/CodeGen/LiveDebugVariables.cpp" , 1312, __PRETTY_FUNCTION__)); | |||
1313 | ||||
1314 | do { | |||
1315 | BuildMI(*MBB, I, getDebugLoc(), TII.get(TargetOpcode::DBG_VALUE), | |||
1316 | Spilled, MO, Variable, Expr); | |||
1317 | ||||
1318 | // Continue and insert DBG_VALUES after every redefinition of register | |||
1319 | // associated with the debug value within the range | |||
1320 | I = findNextInsertLocation(MBB, I, StopIdx, MO, LIS, TRI); | |||
1321 | } while (I != MBB->end()); | |||
1322 | } | |||
1323 | ||||
1324 | void UserLabel::insertDebugLabel(MachineBasicBlock *MBB, SlotIndex Idx, | |||
1325 | LiveIntervals &LIS, | |||
1326 | const TargetInstrInfo &TII) { | |||
1327 | MachineBasicBlock::iterator I = findInsertLocation(MBB, Idx, LIS); | |||
1328 | ++NumInsertedDebugLabels; | |||
1329 | BuildMI(*MBB, I, getDebugLoc(), TII.get(TargetOpcode::DBG_LABEL)) | |||
1330 | .addMetadata(Label); | |||
1331 | } | |||
1332 | ||||
1333 | void UserValue::emitDebugValues(VirtRegMap *VRM, LiveIntervals &LIS, | |||
1334 | const TargetInstrInfo &TII, | |||
1335 | const TargetRegisterInfo &TRI, | |||
1336 | const SpillOffsetMap &SpillOffsets) { | |||
1337 | MachineFunction::iterator MFEnd = VRM->getMachineFunction().end(); | |||
1338 | ||||
1339 | for (LocMap::const_iterator I = locInts.begin(); I.valid();) { | |||
1340 | SlotIndex Start = I.start(); | |||
1341 | SlotIndex Stop = I.stop(); | |||
1342 | DbgValueLocation Loc = I.value(); | |||
1343 | auto SpillIt = | |||
1344 | !Loc.isUndef() ? SpillOffsets.find(Loc.locNo()) : SpillOffsets.end(); | |||
1345 | bool Spilled = SpillIt != SpillOffsets.end(); | |||
1346 | unsigned SpillOffset = Spilled ? SpillIt->second : 0; | |||
1347 | ||||
1348 | LLVM_DEBUG(dbgs() << "\t[" << Start << ';' << Stop << "):" << Loc.locNo())do { if (::llvm::DebugFlag && ::llvm::isCurrentDebugType ("livedebugvars")) { dbgs() << "\t[" << Start << ';' << Stop << "):" << Loc.locNo(); } } while (false); | |||
1349 | MachineFunction::iterator MBB = LIS.getMBBFromIndex(Start)->getIterator(); | |||
1350 | SlotIndex MBBEnd = LIS.getMBBEndIdx(&*MBB); | |||
1351 | ||||
1352 | LLVM_DEBUG(dbgs() << ' ' << printMBBReference(*MBB) << '-' << MBBEnd)do { if (::llvm::DebugFlag && ::llvm::isCurrentDebugType ("livedebugvars")) { dbgs() << ' ' << printMBBReference (*MBB) << '-' << MBBEnd; } } while (false); | |||
1353 | insertDebugValue(&*MBB, Start, Stop, Loc, Spilled, SpillOffset, LIS, TII, | |||
1354 | TRI); | |||
1355 | // This interval may span multiple basic blocks. | |||
1356 | // Insert a DBG_VALUE into each one. | |||
1357 | while (Stop > MBBEnd) { | |||
1358 | // Move to the next block. | |||
1359 | Start = MBBEnd; | |||
1360 | if (++MBB == MFEnd) | |||
1361 | break; | |||
1362 | MBBEnd = LIS.getMBBEndIdx(&*MBB); | |||
1363 | LLVM_DEBUG(dbgs() << ' ' << printMBBReference(*MBB) << '-' << MBBEnd)do { if (::llvm::DebugFlag && ::llvm::isCurrentDebugType ("livedebugvars")) { dbgs() << ' ' << printMBBReference (*MBB) << '-' << MBBEnd; } } while (false); | |||
1364 | insertDebugValue(&*MBB, Start, Stop, Loc, Spilled, SpillOffset, LIS, TII, | |||
1365 | TRI); | |||
1366 | } | |||
1367 | LLVM_DEBUG(dbgs() << '\n')do { if (::llvm::DebugFlag && ::llvm::isCurrentDebugType ("livedebugvars")) { dbgs() << '\n'; } } while (false); | |||
1368 | if (MBB == MFEnd) | |||
1369 | break; | |||
1370 | ||||
1371 | ++I; | |||
1372 | } | |||
1373 | } | |||
1374 | ||||
1375 | void UserLabel::emitDebugLabel(LiveIntervals &LIS, const TargetInstrInfo &TII) { | |||
1376 | LLVM_DEBUG(dbgs() << "\t" << loc)do { if (::llvm::DebugFlag && ::llvm::isCurrentDebugType ("livedebugvars")) { dbgs() << "\t" << loc; } } while (false); | |||
1377 | MachineFunction::iterator MBB = LIS.getMBBFromIndex(loc)->getIterator(); | |||
1378 | ||||
1379 | LLVM_DEBUG(dbgs() << ' ' << printMBBReference(*MBB))do { if (::llvm::DebugFlag && ::llvm::isCurrentDebugType ("livedebugvars")) { dbgs() << ' ' << printMBBReference (*MBB); } } while (false); | |||
1380 | insertDebugLabel(&*MBB, loc, LIS, TII); | |||
1381 | ||||
1382 | LLVM_DEBUG(dbgs() << '\n')do { if (::llvm::DebugFlag && ::llvm::isCurrentDebugType ("livedebugvars")) { dbgs() << '\n'; } } while (false); | |||
1383 | } | |||
1384 | ||||
1385 | void LDVImpl::emitDebugValues(VirtRegMap *VRM) { | |||
1386 | LLVM_DEBUG(dbgs() << "********** EMITTING LIVE DEBUG VARIABLES **********\n")do { if (::llvm::DebugFlag && ::llvm::isCurrentDebugType ("livedebugvars")) { dbgs() << "********** EMITTING LIVE DEBUG VARIABLES **********\n" ; } } while (false); | |||
1387 | if (!MF) | |||
1388 | return; | |||
1389 | const TargetInstrInfo *TII = MF->getSubtarget().getInstrInfo(); | |||
1390 | SpillOffsetMap SpillOffsets; | |||
1391 | for (auto &userValue : userValues) { | |||
1392 | LLVM_DEBUG(userValue->print(dbgs(), TRI))do { if (::llvm::DebugFlag && ::llvm::isCurrentDebugType ("livedebugvars")) { userValue->print(dbgs(), TRI); } } while (false); | |||
1393 | userValue->rewriteLocations(*VRM, *MF, *TII, *TRI, SpillOffsets); | |||
1394 | userValue->emitDebugValues(VRM, *LIS, *TII, *TRI, SpillOffsets); | |||
1395 | } | |||
1396 | LLVM_DEBUG(dbgs() << "********** EMITTING LIVE DEBUG LABELS **********\n")do { if (::llvm::DebugFlag && ::llvm::isCurrentDebugType ("livedebugvars")) { dbgs() << "********** EMITTING LIVE DEBUG LABELS **********\n" ; } } while (false); | |||
1397 | for (auto &userLabel : userLabels) { | |||
1398 | LLVM_DEBUG(userLabel->print(dbgs(), TRI))do { if (::llvm::DebugFlag && ::llvm::isCurrentDebugType ("livedebugvars")) { userLabel->print(dbgs(), TRI); } } while (false); | |||
1399 | userLabel->emitDebugLabel(*LIS, *TII); | |||
1400 | } | |||
1401 | EmitDone = true; | |||
1402 | } | |||
1403 | ||||
1404 | void LiveDebugVariables::emitDebugValues(VirtRegMap *VRM) { | |||
1405 | if (pImpl) | |||
1406 | static_cast<LDVImpl*>(pImpl)->emitDebugValues(VRM); | |||
1407 | } | |||
1408 | ||||
1409 | bool LiveDebugVariables::doInitialization(Module &M) { | |||
1410 | return Pass::doInitialization(M); | |||
1411 | } | |||
1412 | ||||
1413 | #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP) | |||
1414 | LLVM_DUMP_METHOD__attribute__((noinline)) __attribute__((__used__)) void LiveDebugVariables::dump() const { | |||
1415 | if (pImpl) | |||
| ||||
1416 | static_cast<LDVImpl*>(pImpl)->print(dbgs()); | |||
1417 | } | |||
1418 | #endif |