LiveDebugVariables.cpp revision 0804ead404d694b35e9c55ccbf43f99cd394e487
1bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen//===- LiveDebugVariables.cpp - Tracking debug info variables -------------===// 2bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen// 3bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen// The LLVM Compiler Infrastructure 4bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen// 5bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen// This file is distributed under the University of Illinois Open Source 6bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen// License. See LICENSE.TXT for details. 7bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen// 8bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen//===----------------------------------------------------------------------===// 9bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen// 10bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen// This file implements the LiveDebugVariables analysis. 11bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen// 12bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen// Remove all DBG_VALUE instructions referencing virtual registers and replace 13bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen// them with a data structure tracking where live user variables are kept - in a 14bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen// virtual register or in a stack slot. 15bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen// 16bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen// Allow the data structure to be updated during register allocation when values 17bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen// are moved between registers and stack slots. Finally emit new DBG_VALUE 18bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen// instructions after register allocation is complete. 19bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen// 20bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen//===----------------------------------------------------------------------===// 21bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen 220613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen#define DEBUG_TYPE "livedebug" 23bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen#include "LiveDebugVariables.h" 2442acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen#include "VirtRegMap.h" 250613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen#include "llvm/Constants.h" 260613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen#include "llvm/Metadata.h" 270613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen#include "llvm/Value.h" 280613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen#include "llvm/ADT/IntervalMap.h" 29bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen#include "llvm/CodeGen/LiveIntervalAnalysis.h" 300613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen#include "llvm/CodeGen/MachineDominators.h" 3142acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen#include "llvm/CodeGen/MachineFunction.h" 3242acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen#include "llvm/CodeGen/MachineInstrBuilder.h" 33bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen#include "llvm/CodeGen/Passes.h" 340613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen#include "llvm/Support/CommandLine.h" 350613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen#include "llvm/Support/Debug.h" 3642acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen#include "llvm/Target/TargetInstrInfo.h" 37bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen#include "llvm/Target/TargetMachine.h" 380613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen#include "llvm/Target/TargetRegisterInfo.h" 39bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen 40bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesenusing namespace llvm; 41bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen 4251a666f0e50a34b74212db9c5814153c885153a5Devang Patelstatic cl::opt<bool> 4351a666f0e50a34b74212db9c5814153c885153a5Devang PatelEnableLDV("live-debug-variables", 4451a666f0e50a34b74212db9c5814153c885153a5Devang Patel cl::desc("Enable the live debug variables pass"), cl::Hidden); 4551a666f0e50a34b74212db9c5814153c885153a5Devang Patel 46bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesenchar LiveDebugVariables::ID = 0; 47bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen 48bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund OlesenINITIALIZE_PASS_BEGIN(LiveDebugVariables, "livedebugvars", 49bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen "Debug Variable Analysis", false, false) 500613516b16466a92c68d60734801221506c85e86Jakob Stoklund OlesenINITIALIZE_PASS_DEPENDENCY(MachineDominatorTree) 51bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund OlesenINITIALIZE_PASS_DEPENDENCY(LiveIntervals) 52bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund OlesenINITIALIZE_PASS_END(LiveDebugVariables, "livedebugvars", 53bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen "Debug Variable Analysis", false, false) 54bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen 55bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesenvoid LiveDebugVariables::getAnalysisUsage(AnalysisUsage &AU) const { 560613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen AU.addRequired<MachineDominatorTree>(); 57bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen AU.addRequiredTransitive<LiveIntervals>(); 58bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen AU.setPreservesAll(); 59bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen MachineFunctionPass::getAnalysisUsage(AU); 60bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen} 61bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen 620613516b16466a92c68d60734801221506c85e86Jakob Stoklund OlesenLiveDebugVariables::LiveDebugVariables() : MachineFunctionPass(ID), pImpl(0) { 63bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen initializeLiveDebugVariablesPass(*PassRegistry::getPassRegistry()); 64bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen} 65bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen 660613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen/// LocMap - Map of where a user value is live, and its location. 670613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesentypedef IntervalMap<SlotIndex, unsigned, 4> LocMap; 680613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen 690613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen/// UserValue - A user value is a part of a debug info user variable. 700613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen/// 710613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen/// A DBG_VALUE instruction notes that (a sub-register of) a virtual register 720613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen/// holds part of a user variable. The part is identified by a byte offset. 730613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen/// 740613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen/// UserValues are grouped into equivalence classes for easier searching. Two 750613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen/// user values are related if they refer to the same variable, or if they are 760613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen/// held by the same virtual register. The equivalence class is the transitive 770613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen/// closure of that relation. 780613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesennamespace { 790613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesenclass UserValue { 800613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen const MDNode *variable; ///< The debug info variable we are part of. 810613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen unsigned offset; ///< Byte offset into variable. 820613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen 830613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen UserValue *leader; ///< Equivalence class leader. 840613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen UserValue *next; ///< Next value in equivalence class, or null. 850613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen 860613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen /// Numbered locations referenced by locmap. 870804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen SmallVector<MachineOperand, 4> locations; 880613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen 890613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen /// Map of slot indices where this value is live. 900613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen LocMap locInts; 910613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen 925daec2215bdb6f484956362d81e5923bb2bffd58Jakob Stoklund Olesen /// coalesceLocation - After LocNo was changed, check if it has become 935daec2215bdb6f484956362d81e5923bb2bffd58Jakob Stoklund Olesen /// identical to another location, and coalesce them. This may cause LocNo or 945daec2215bdb6f484956362d81e5923bb2bffd58Jakob Stoklund Olesen /// a later location to be erased, but no earlier location will be erased. 955daec2215bdb6f484956362d81e5923bb2bffd58Jakob Stoklund Olesen void coalesceLocation(unsigned LocNo); 965daec2215bdb6f484956362d81e5923bb2bffd58Jakob Stoklund Olesen 9742acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen /// insertDebugValue - Insert a DBG_VALUE into MBB at Idx for LocNo. 9842acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen void insertDebugValue(MachineBasicBlock *MBB, SlotIndex Idx, unsigned LocNo, 9942acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen LiveIntervals &LIS, const TargetInstrInfo &TII); 10042acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen 10142acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen /// insertDebugKill - Insert an undef DBG_VALUE into MBB at Idx. 10242acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen void insertDebugKill(MachineBasicBlock *MBB, SlotIndex Idx, 10342acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen LiveIntervals &LIS, const TargetInstrInfo &TII); 10442acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen 1050613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesenpublic: 1060613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen /// UserValue - Create a new UserValue. 1070613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen UserValue(const MDNode *var, unsigned o, LocMap::Allocator &alloc) 1080613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen : variable(var), offset(o), leader(this), next(0), locInts(alloc) 1090613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen {} 1100613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen 1110613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen /// getLeader - Get the leader of this value's equivalence class. 1120613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen UserValue *getLeader() { 1130613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen UserValue *l = leader; 1140613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen while (l != l->leader) 1150613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen l = l->leader; 1160613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen return leader = l; 1170613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen } 1180613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen 1190613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen /// getNext - Return the next UserValue in the equivalence class. 1200613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen UserValue *getNext() const { return next; } 1210613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen 1220613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen /// match - Does this UserValue match the aprameters? 1230613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen bool match(const MDNode *Var, unsigned Offset) const { 1240613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen return Var == variable && Offset == offset; 1250613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen } 1260613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen 1270613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen /// merge - Merge equivalence classes. 1280613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen static UserValue *merge(UserValue *L1, UserValue *L2) { 1290613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen L2 = L2->getLeader(); 1300613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen if (!L1) 1310613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen return L2; 1320613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen L1 = L1->getLeader(); 1330613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen if (L1 == L2) 1340613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen return L1; 1350613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen // Splice L2 before L1's members. 1360613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen UserValue *End = L2; 1370613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen while (End->next) 1380613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen End->leader = L1, End = End->next; 1390613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen End->leader = L1; 1400613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen End->next = L1->next; 1410613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen L1->next = L2; 1420613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen return L1; 1430613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen } 1440613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen 1450613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen /// getLocationNo - Return the location number that matches Loc. 1460804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen unsigned getLocationNo(const MachineOperand &LocMO) { 1470804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen if (LocMO.isReg() && LocMO.getReg() == 0) 1480613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen return ~0u; 1490804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen for (unsigned i = 0, e = locations.size(); i != e; ++i) 1500804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen if (LocMO.isIdenticalTo(locations[i])) 1510804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen return i; 1520804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen locations.push_back(LocMO); 1530804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen // We are storing a MachineOperand outside a MachineInstr. 1540804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen locations.back().clearParent(); 1550804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen return locations.size() - 1; 1560613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen } 1570613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen 1580613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen /// addDef - Add a definition point to this value. 1590613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen void addDef(SlotIndex Idx, const MachineOperand &LocMO) { 1600613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen // Add a singular (Idx,Idx) -> Loc mapping. 1610613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen LocMap::iterator I = locInts.find(Idx); 1620613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen if (!I.valid() || I.start() != Idx) 1630613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen I.insert(Idx, Idx.getNextSlot(), getLocationNo(LocMO)); 1640613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen } 1650613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen 1660613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen /// extendDef - Extend the current definition as far as possible down the 1670613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen /// dominator tree. Stop when meeting an existing def or when leaving the live 1680613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen /// range of VNI. 1690613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen /// @param Idx Starting point for the definition. 1700613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen /// @param LocNo Location number to propagate. 1710613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen /// @param LI Restrict liveness to where LI has the value VNI. May be null. 1720613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen /// @param VNI When LI is not null, this is the value to restrict to. 1730613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen /// @param LIS Live intervals analysis. 1740613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen /// @param MDT Dominator tree. 1750613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen void extendDef(SlotIndex Idx, unsigned LocNo, 1760613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen LiveInterval *LI, const VNInfo *VNI, 1770613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen LiveIntervals &LIS, MachineDominatorTree &MDT); 1780613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen 1790613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen /// computeIntervals - Compute the live intervals of all locations after 1800613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen /// collecting all their def points. 1810613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen void computeIntervals(LiveIntervals &LIS, MachineDominatorTree &MDT); 1820613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen 18330e2128a731e5a0bcac45a6a79a03bdedce68a0aJakob Stoklund Olesen /// renameRegister - Update locations to rewrite OldReg as NewReg:SubIdx. 18430e2128a731e5a0bcac45a6a79a03bdedce68a0aJakob Stoklund Olesen void renameRegister(unsigned OldReg, unsigned NewReg, unsigned SubIdx, 18530e2128a731e5a0bcac45a6a79a03bdedce68a0aJakob Stoklund Olesen const TargetRegisterInfo *TRI); 18630e2128a731e5a0bcac45a6a79a03bdedce68a0aJakob Stoklund Olesen 18742acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen /// rewriteLocations - Rewrite virtual register locations according to the 18842acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen /// provided virtual register map. 18942acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen void rewriteLocations(VirtRegMap &VRM, const TargetRegisterInfo &TRI); 19042acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen 19142acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen /// emitDebugVariables - Recreate DBG_VALUE instruction from data structures. 19242acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen void emitDebugValues(VirtRegMap *VRM, 19342acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen LiveIntervals &LIS, const TargetInstrInfo &TRI); 19442acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen 1950613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen void print(raw_ostream&, const TargetRegisterInfo*); 1960613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen}; 1970613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen} // namespace 1980613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen 1990613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen/// LDVImpl - Implementation of the LiveDebugVariables pass. 2000613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesennamespace { 2010613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesenclass LDVImpl { 2020613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen LiveDebugVariables &pass; 2030613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen LocMap::Allocator allocator; 2040613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen MachineFunction *MF; 2050613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen LiveIntervals *LIS; 2060613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen MachineDominatorTree *MDT; 2070613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen const TargetRegisterInfo *TRI; 2080613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen 2090613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen /// userValues - All allocated UserValue instances. 2100613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen SmallVector<UserValue*, 8> userValues; 2110613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen 2120613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen /// Map virtual register to eq class leader. 2130613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen typedef DenseMap<unsigned, UserValue*> VRMap; 2146ed4c6af97db8b2bbfd6b54dd2a58f16cf0c592bJakob Stoklund Olesen VRMap virtRegToEqClass; 2150613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen 2160613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen /// Map user variable to eq class leader. 2170613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen typedef DenseMap<const MDNode *, UserValue*> UVMap; 2180613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen UVMap userVarMap; 2190613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen 2200613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen /// getUserValue - Find or create a UserValue. 2210613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen UserValue *getUserValue(const MDNode *Var, unsigned Offset); 2220613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen 22330e2128a731e5a0bcac45a6a79a03bdedce68a0aJakob Stoklund Olesen /// lookupVirtReg - Find the EC leader for VirtReg or null. 22430e2128a731e5a0bcac45a6a79a03bdedce68a0aJakob Stoklund Olesen UserValue *lookupVirtReg(unsigned VirtReg); 22530e2128a731e5a0bcac45a6a79a03bdedce68a0aJakob Stoklund Olesen 2260613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen /// mapVirtReg - Map virtual register to an equivalence class. 2270613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen void mapVirtReg(unsigned VirtReg, UserValue *EC); 2280613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen 2290613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen /// handleDebugValue - Add DBG_VALUE instruction to our maps. 2300613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen /// @param MI DBG_VALUE instruction 2310613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen /// @param Idx Last valid SLotIndex before instruction. 2320613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen /// @return True if the DBG_VALUE instruction should be deleted. 2330613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen bool handleDebugValue(MachineInstr *MI, SlotIndex Idx); 2340613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen 2350613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen /// collectDebugValues - Collect and erase all DBG_VALUE instructions, adding 2360613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen /// a UserValue def for each instruction. 2370613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen /// @param mf MachineFunction to be scanned. 2380613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen /// @return True if any debug values were found. 2390613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen bool collectDebugValues(MachineFunction &mf); 2400613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen 2410613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen /// computeIntervals - Compute the live intervals of all user values after 2420613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen /// collecting all their def points. 2430613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen void computeIntervals(); 2440613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen 2450613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesenpublic: 2460613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen LDVImpl(LiveDebugVariables *ps) : pass(*ps) {} 2470613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen bool runOnMachineFunction(MachineFunction &mf); 2480613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen 2490613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen /// clear - Relase all memory. 2500613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen void clear() { 2510613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen DeleteContainerPointers(userValues); 2520613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen userValues.clear(); 2536ed4c6af97db8b2bbfd6b54dd2a58f16cf0c592bJakob Stoklund Olesen virtRegToEqClass.clear(); 2540613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen userVarMap.clear(); 2550613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen } 2560613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen 25730e2128a731e5a0bcac45a6a79a03bdedce68a0aJakob Stoklund Olesen /// renameRegister - Replace all references to OldReg wiht NewReg:SubIdx. 25830e2128a731e5a0bcac45a6a79a03bdedce68a0aJakob Stoklund Olesen void renameRegister(unsigned OldReg, unsigned NewReg, unsigned SubIdx); 25930e2128a731e5a0bcac45a6a79a03bdedce68a0aJakob Stoklund Olesen 26042acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen /// emitDebugVariables - Recreate DBG_VALUE instruction from data structures. 26142acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen void emitDebugValues(VirtRegMap *VRM); 26242acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen 2630613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen void print(raw_ostream&); 2640613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen}; 2650613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen} // namespace 2660613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen 2670613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesenvoid UserValue::print(raw_ostream &OS, const TargetRegisterInfo *TRI) { 2680613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen if (const MDString *MDS = dyn_cast<MDString>(variable->getOperand(2))) 2690613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen OS << "!\"" << MDS->getString() << "\"\t"; 2700613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen if (offset) 2710613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen OS << '+' << offset; 2720613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen for (LocMap::const_iterator I = locInts.begin(); I.valid(); ++I) { 2730613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen OS << " [" << I.start() << ';' << I.stop() << "):"; 2740613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen if (I.value() == ~0u) 2750613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen OS << "undef"; 2760613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen else 2770613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen OS << I.value(); 2780613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen } 2790804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen for (unsigned i = 0, e = locations.size(); i != e; ++i) 2800804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen OS << " Loc" << i << '=' << locations[i]; 2810613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen OS << '\n'; 2820613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen} 2830613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen 2840613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesenvoid LDVImpl::print(raw_ostream &OS) { 2850613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen OS << "********** DEBUG VARIABLES **********\n"; 2860613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen for (unsigned i = 0, e = userValues.size(); i != e; ++i) 2870613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen userValues[i]->print(OS, TRI); 2880613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen} 2890613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen 2905daec2215bdb6f484956362d81e5923bb2bffd58Jakob Stoklund Olesenvoid UserValue::coalesceLocation(unsigned LocNo) { 2910804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen unsigned KeepLoc = 0; 2920804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen for (unsigned e = locations.size(); KeepLoc != e; ++KeepLoc) { 2930804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen if (KeepLoc == LocNo) 2940804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen continue; 2950804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen if (locations[KeepLoc].isIdenticalTo(locations[LocNo])) 2960804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen break; 2975daec2215bdb6f484956362d81e5923bb2bffd58Jakob Stoklund Olesen } 2980804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen // No matches. 2990804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen if (KeepLoc == locations.size()) 3000804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen return; 3010804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen 3020804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen // Keep the smaller location, erase the larger one. 3030804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen unsigned EraseLoc = LocNo; 3040804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen if (KeepLoc > EraseLoc) 3050804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen std::swap(KeepLoc, EraseLoc); 3065daec2215bdb6f484956362d81e5923bb2bffd58Jakob Stoklund Olesen locations.erase(locations.begin() + EraseLoc); 3075daec2215bdb6f484956362d81e5923bb2bffd58Jakob Stoklund Olesen 3085daec2215bdb6f484956362d81e5923bb2bffd58Jakob Stoklund Olesen // Rewrite values. 3095daec2215bdb6f484956362d81e5923bb2bffd58Jakob Stoklund Olesen for (LocMap::iterator I = locInts.begin(); I.valid(); ++I) { 3105daec2215bdb6f484956362d81e5923bb2bffd58Jakob Stoklund Olesen unsigned v = I.value(); 3115daec2215bdb6f484956362d81e5923bb2bffd58Jakob Stoklund Olesen if (v == EraseLoc) 3125daec2215bdb6f484956362d81e5923bb2bffd58Jakob Stoklund Olesen I.setValue(KeepLoc); // Coalesce when possible. 3135daec2215bdb6f484956362d81e5923bb2bffd58Jakob Stoklund Olesen else if (v > EraseLoc) 3145daec2215bdb6f484956362d81e5923bb2bffd58Jakob Stoklund Olesen I.setValueUnchecked(v-1); // Avoid coalescing with untransformed values. 3155daec2215bdb6f484956362d81e5923bb2bffd58Jakob Stoklund Olesen } 3165daec2215bdb6f484956362d81e5923bb2bffd58Jakob Stoklund Olesen} 3175daec2215bdb6f484956362d81e5923bb2bffd58Jakob Stoklund Olesen 3180613516b16466a92c68d60734801221506c85e86Jakob Stoklund OlesenUserValue *LDVImpl::getUserValue(const MDNode *Var, unsigned Offset) { 3190613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen UserValue *&Leader = userVarMap[Var]; 3200613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen if (Leader) { 3210613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen UserValue *UV = Leader->getLeader(); 3220613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen Leader = UV; 3230613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen for (; UV; UV = UV->getNext()) 3240613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen if (UV->match(Var, Offset)) 3250613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen return UV; 3260613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen } 3270613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen 3280613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen UserValue *UV = new UserValue(Var, Offset, allocator); 3290613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen userValues.push_back(UV); 3300613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen Leader = UserValue::merge(Leader, UV); 3310613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen return UV; 3320613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen} 3330613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen 3340613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesenvoid LDVImpl::mapVirtReg(unsigned VirtReg, UserValue *EC) { 3350613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen assert(TargetRegisterInfo::isVirtualRegister(VirtReg) && "Only map VirtRegs"); 3366ed4c6af97db8b2bbfd6b54dd2a58f16cf0c592bJakob Stoklund Olesen UserValue *&Leader = virtRegToEqClass[VirtReg]; 3370613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen Leader = UserValue::merge(Leader, EC); 3380613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen} 3390613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen 34030e2128a731e5a0bcac45a6a79a03bdedce68a0aJakob Stoklund OlesenUserValue *LDVImpl::lookupVirtReg(unsigned VirtReg) { 3416ed4c6af97db8b2bbfd6b54dd2a58f16cf0c592bJakob Stoklund Olesen if (UserValue *UV = virtRegToEqClass.lookup(VirtReg)) 34230e2128a731e5a0bcac45a6a79a03bdedce68a0aJakob Stoklund Olesen return UV->getLeader(); 34330e2128a731e5a0bcac45a6a79a03bdedce68a0aJakob Stoklund Olesen return 0; 34430e2128a731e5a0bcac45a6a79a03bdedce68a0aJakob Stoklund Olesen} 34530e2128a731e5a0bcac45a6a79a03bdedce68a0aJakob Stoklund Olesen 3460613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesenbool LDVImpl::handleDebugValue(MachineInstr *MI, SlotIndex Idx) { 3470613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen // DBG_VALUE loc, offset, variable 3480613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen if (MI->getNumOperands() != 3 || 3490613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen !MI->getOperand(1).isImm() || !MI->getOperand(2).isMetadata()) { 3500613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen DEBUG(dbgs() << "Can't handle " << *MI); 3510613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen return false; 3520613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen } 3530613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen 3540613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen // Get or create the UserValue for (variable,offset). 3550613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen unsigned Offset = MI->getOperand(1).getImm(); 3560613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen const MDNode *Var = MI->getOperand(2).getMetadata(); 3570613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen UserValue *UV = getUserValue(Var, Offset); 3580613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen 3590613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen // If the location is a virtual register, make sure it is mapped. 3600613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen if (MI->getOperand(0).isReg()) { 3610613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen unsigned Reg = MI->getOperand(0).getReg(); 3620613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen if (Reg && TargetRegisterInfo::isVirtualRegister(Reg)) 3630613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen mapVirtReg(Reg, UV); 3640613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen } 3650613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen 3660613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen UV->addDef(Idx, MI->getOperand(0)); 3670613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen return true; 3680613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen} 3690613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen 3700613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesenbool LDVImpl::collectDebugValues(MachineFunction &mf) { 3710613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen bool Changed = false; 3720613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen for (MachineFunction::iterator MFI = mf.begin(), MFE = mf.end(); MFI != MFE; 3730613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen ++MFI) { 3740613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen MachineBasicBlock *MBB = MFI; 3750613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen for (MachineBasicBlock::iterator MBBI = MBB->begin(), MBBE = MBB->end(); 3760613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen MBBI != MBBE;) { 3770613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen if (!MBBI->isDebugValue()) { 3780613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen ++MBBI; 3790613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen continue; 3800613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen } 3810613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen // DBG_VALUE has no slot index, use the previous instruction instead. 3820613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen SlotIndex Idx = MBBI == MBB->begin() ? 3830613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen LIS->getMBBStartIdx(MBB) : 3840613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen LIS->getInstructionIndex(llvm::prior(MBBI)).getDefIndex(); 3850613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen // Handle consecutive DBG_VALUE instructions with the same slot index. 3860613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen do { 3870613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen if (handleDebugValue(MBBI, Idx)) { 3880613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen MBBI = MBB->erase(MBBI); 3890613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen Changed = true; 3900613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen } else 3910613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen ++MBBI; 3920613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen } while (MBBI != MBBE && MBBI->isDebugValue()); 3930613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen } 3940613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen } 3950613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen return Changed; 3960613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen} 3970613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen 3980613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesenvoid UserValue::extendDef(SlotIndex Idx, unsigned LocNo, 3990613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen LiveInterval *LI, const VNInfo *VNI, 4000613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen LiveIntervals &LIS, MachineDominatorTree &MDT) { 4010613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen SmallVector<SlotIndex, 16> Todo; 4020613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen Todo.push_back(Idx); 4030613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen 4040613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen do { 4050613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen SlotIndex Start = Todo.pop_back_val(); 4060613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen MachineBasicBlock *MBB = LIS.getMBBFromIndex(Start); 4070613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen SlotIndex Stop = LIS.getMBBEndIdx(MBB); 4080613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen LocMap::iterator I = locInts.find(Idx); 4090613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen 4100613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen // Limit to VNI's live range. 4110613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen bool ToEnd = true; 4120613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen if (LI && VNI) { 4130613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen LiveRange *Range = LI->getLiveRangeContaining(Start); 4140613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen if (!Range || Range->valno != VNI) 4150613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen continue; 4160613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen if (Range->end < Stop) 4170613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen Stop = Range->end, ToEnd = false; 4180613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen } 4190613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen 4200613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen // There could already be a short def at Start. 4210613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen if (I.valid() && I.start() <= Start) { 4220613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen // Stop when meeting a different location or an already extended interval. 4230613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen Start = Start.getNextSlot(); 4240613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen if (I.value() != LocNo || I.stop() != Start) 4250613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen continue; 4260613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen // This is a one-slot placeholder. Just skip it. 4270613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen ++I; 4280613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen } 4290613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen 4300613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen // Limited by the next def. 4310613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen if (I.valid() && I.start() < Stop) 4320613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen Stop = I.start(), ToEnd = false; 4330613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen 4340613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen if (Start >= Stop) 4350613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen continue; 4360613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen 4370613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen I.insert(Start, Stop, LocNo); 4380613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen 4390613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen // If we extended to the MBB end, propagate down the dominator tree. 4400613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen if (!ToEnd) 4410613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen continue; 4420613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen const std::vector<MachineDomTreeNode*> &Children = 4430613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen MDT.getNode(MBB)->getChildren(); 4440613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen for (unsigned i = 0, e = Children.size(); i != e; ++i) 4450613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen Todo.push_back(LIS.getMBBStartIdx(Children[i]->getBlock())); 4460613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen } while (!Todo.empty()); 4470613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen} 4480613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen 4490613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesenvoid 4500613516b16466a92c68d60734801221506c85e86Jakob Stoklund OlesenUserValue::computeIntervals(LiveIntervals &LIS, MachineDominatorTree &MDT) { 4510613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen SmallVector<std::pair<SlotIndex, unsigned>, 16> Defs; 4520613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen 4530613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen // Collect all defs to be extended (Skipping undefs). 4540613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen for (LocMap::const_iterator I = locInts.begin(); I.valid(); ++I) 4550613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen if (I.value() != ~0u) 4560613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen Defs.push_back(std::make_pair(I.start(), I.value())); 4570613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen 4580613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen for (unsigned i = 0, e = Defs.size(); i != e; ++i) { 4590613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen SlotIndex Idx = Defs[i].first; 4600613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen unsigned LocNo = Defs[i].second; 4610804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen const MachineOperand &Loc = locations[LocNo]; 4620613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen 4630613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen // Register locations are constrained to where the register value is live. 4640804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen if (Loc.isReg() && LIS.hasInterval(Loc.getReg())) { 4650804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen LiveInterval *LI = &LIS.getInterval(Loc.getReg()); 4660613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen const VNInfo *VNI = LI->getVNInfoAt(Idx); 4670613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen extendDef(Idx, LocNo, LI, VNI, LIS, MDT); 4680613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen } else 4690613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen extendDef(Idx, LocNo, 0, 0, LIS, MDT); 4700613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen } 4710613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen 4720613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen // Finally, erase all the undefs. 4730613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen for (LocMap::iterator I = locInts.begin(); I.valid();) 4740613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen if (I.value() == ~0u) 4750613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen I.erase(); 4760613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen else 4770613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen ++I; 4780613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen} 4790613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen 4800613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesenvoid LDVImpl::computeIntervals() { 4810613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen for (unsigned i = 0, e = userValues.size(); i != e; ++i) 4820613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen userValues[i]->computeIntervals(*LIS, *MDT); 4830613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen} 4840613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen 4850613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesenbool LDVImpl::runOnMachineFunction(MachineFunction &mf) { 4860613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen MF = &mf; 4870613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen LIS = &pass.getAnalysis<LiveIntervals>(); 4880613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen MDT = &pass.getAnalysis<MachineDominatorTree>(); 4890613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen TRI = mf.getTarget().getRegisterInfo(); 4900613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen clear(); 4910613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen DEBUG(dbgs() << "********** COMPUTING LIVE DEBUG VARIABLES: " 4920613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen << ((Value*)mf.getFunction())->getName() 4930613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen << " **********\n"); 4940613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen 4950613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen bool Changed = collectDebugValues(mf); 4960613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen computeIntervals(); 4970613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen DEBUG(print(dbgs())); 4980613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen return Changed; 4990613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen} 5000613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen 501bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesenbool LiveDebugVariables::runOnMachineFunction(MachineFunction &mf) { 50251a666f0e50a34b74212db9c5814153c885153a5Devang Patel if (!EnableLDV) 50351a666f0e50a34b74212db9c5814153c885153a5Devang Patel return false; 5040613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen if (!pImpl) 5050613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen pImpl = new LDVImpl(this); 5060613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen return static_cast<LDVImpl*>(pImpl)->runOnMachineFunction(mf); 5070613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen} 5080613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen 5090613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesenvoid LiveDebugVariables::releaseMemory() { 5100613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen if (pImpl) 5110613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen static_cast<LDVImpl*>(pImpl)->clear(); 5120613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen} 5130613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen 5140613516b16466a92c68d60734801221506c85e86Jakob Stoklund OlesenLiveDebugVariables::~LiveDebugVariables() { 5150613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen if (pImpl) 5160613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen delete static_cast<LDVImpl*>(pImpl); 517bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen} 51830e2128a731e5a0bcac45a6a79a03bdedce68a0aJakob Stoklund Olesen 51930e2128a731e5a0bcac45a6a79a03bdedce68a0aJakob Stoklund Olesenvoid UserValue:: 52030e2128a731e5a0bcac45a6a79a03bdedce68a0aJakob Stoklund OlesenrenameRegister(unsigned OldReg, unsigned NewReg, unsigned SubIdx, 52130e2128a731e5a0bcac45a6a79a03bdedce68a0aJakob Stoklund Olesen const TargetRegisterInfo *TRI) { 5225daec2215bdb6f484956362d81e5923bb2bffd58Jakob Stoklund Olesen for (unsigned i = locations.size(); i; --i) { 5235daec2215bdb6f484956362d81e5923bb2bffd58Jakob Stoklund Olesen unsigned LocNo = i - 1; 5240804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen MachineOperand &Loc = locations[LocNo]; 5250804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen if (!Loc.isReg() || Loc.getReg() != OldReg) 52630e2128a731e5a0bcac45a6a79a03bdedce68a0aJakob Stoklund Olesen continue; 5270804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen if (TargetRegisterInfo::isPhysicalRegister(NewReg)) 5280804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen Loc.substPhysReg(NewReg, *TRI); 5290804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen else 5300804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen Loc.substVirtReg(NewReg, SubIdx, *TRI); 5315daec2215bdb6f484956362d81e5923bb2bffd58Jakob Stoklund Olesen coalesceLocation(LocNo); 53230e2128a731e5a0bcac45a6a79a03bdedce68a0aJakob Stoklund Olesen } 53330e2128a731e5a0bcac45a6a79a03bdedce68a0aJakob Stoklund Olesen} 53430e2128a731e5a0bcac45a6a79a03bdedce68a0aJakob Stoklund Olesen 53530e2128a731e5a0bcac45a6a79a03bdedce68a0aJakob Stoklund Olesenvoid LDVImpl:: 53630e2128a731e5a0bcac45a6a79a03bdedce68a0aJakob Stoklund OlesenrenameRegister(unsigned OldReg, unsigned NewReg, unsigned SubIdx) { 5378d2584a1d9ab56d35884d035e4da6146b4d7391fJakob Stoklund Olesen UserValue *UV = lookupVirtReg(OldReg); 5388d2584a1d9ab56d35884d035e4da6146b4d7391fJakob Stoklund Olesen if (!UV) 5398d2584a1d9ab56d35884d035e4da6146b4d7391fJakob Stoklund Olesen return; 5408d2584a1d9ab56d35884d035e4da6146b4d7391fJakob Stoklund Olesen 5418d2584a1d9ab56d35884d035e4da6146b4d7391fJakob Stoklund Olesen if (TargetRegisterInfo::isVirtualRegister(NewReg)) 5428d2584a1d9ab56d35884d035e4da6146b4d7391fJakob Stoklund Olesen mapVirtReg(NewReg, UV); 5436ed4c6af97db8b2bbfd6b54dd2a58f16cf0c592bJakob Stoklund Olesen virtRegToEqClass.erase(OldReg); 5448d2584a1d9ab56d35884d035e4da6146b4d7391fJakob Stoklund Olesen 5458d2584a1d9ab56d35884d035e4da6146b4d7391fJakob Stoklund Olesen do { 54630e2128a731e5a0bcac45a6a79a03bdedce68a0aJakob Stoklund Olesen UV->renameRegister(OldReg, NewReg, SubIdx, TRI); 5478d2584a1d9ab56d35884d035e4da6146b4d7391fJakob Stoklund Olesen UV = UV->getNext(); 5488d2584a1d9ab56d35884d035e4da6146b4d7391fJakob Stoklund Olesen } while (UV); 54930e2128a731e5a0bcac45a6a79a03bdedce68a0aJakob Stoklund Olesen} 55030e2128a731e5a0bcac45a6a79a03bdedce68a0aJakob Stoklund Olesen 55130e2128a731e5a0bcac45a6a79a03bdedce68a0aJakob Stoklund Olesenvoid LiveDebugVariables:: 55230e2128a731e5a0bcac45a6a79a03bdedce68a0aJakob Stoklund OlesenrenameRegister(unsigned OldReg, unsigned NewReg, unsigned SubIdx) { 55330e2128a731e5a0bcac45a6a79a03bdedce68a0aJakob Stoklund Olesen if (pImpl) 55430e2128a731e5a0bcac45a6a79a03bdedce68a0aJakob Stoklund Olesen static_cast<LDVImpl*>(pImpl)->renameRegister(OldReg, NewReg, SubIdx); 55530e2128a731e5a0bcac45a6a79a03bdedce68a0aJakob Stoklund Olesen} 55630e2128a731e5a0bcac45a6a79a03bdedce68a0aJakob Stoklund Olesen 55742acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesenvoid 55842acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund OlesenUserValue::rewriteLocations(VirtRegMap &VRM, const TargetRegisterInfo &TRI) { 55942acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen // Iterate over locations in reverse makes it easier to handle coalescing. 56042acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen for (unsigned i = locations.size(); i ; --i) { 56142acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen unsigned LocNo = i-1; 5620804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen MachineOperand &Loc = locations[LocNo]; 56342acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen // Only virtual registers are rewritten. 5640804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen if (!Loc.isReg() || !Loc.getReg() || 5650804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen !TargetRegisterInfo::isVirtualRegister(Loc.getReg())) 56642acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen continue; 5670804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen unsigned VirtReg = Loc.getReg(); 56842acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen if (VRM.isAssignedReg(VirtReg)) { 5690804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen Loc.substPhysReg(VRM.getPhys(VirtReg), TRI); 57042acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen } else if (VRM.getStackSlot(VirtReg) != VirtRegMap::NO_STACK_SLOT) { 57142acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen // FIXME: Translate SubIdx to a stackslot offset. 5720804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen Loc = MachineOperand::CreateFI(VRM.getStackSlot(VirtReg)); 57342acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen } else { 5740804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen Loc.setReg(0); 5750804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen Loc.setSubReg(0); 57642acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen } 5775daec2215bdb6f484956362d81e5923bb2bffd58Jakob Stoklund Olesen coalesceLocation(LocNo); 57842acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen } 57942acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen DEBUG(print(dbgs(), &TRI)); 58042acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen} 58142acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen 58242acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen/// findInsertLocation - Find an iterator and DebugLoc for inserting a DBG_VALUE 58342acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen/// instruction. 58442acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesenstatic MachineBasicBlock::iterator 58542acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund OlesenfindInsertLocation(MachineBasicBlock *MBB, SlotIndex Idx, DebugLoc &DL, 58642acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen LiveIntervals &LIS) { 58742acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen SlotIndex Start = LIS.getMBBStartIdx(MBB); 58842acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen Idx = Idx.getBaseIndex(); 58942acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen 59042acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen // Try to find an insert location by going backwards from Idx. 59142acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen MachineInstr *MI; 59242acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen while (!(MI = LIS.getInstructionFromIndex(Idx))) { 59342acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen // We've reached the beginning of MBB. 59442acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen if (Idx == Start) { 59542acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen MachineBasicBlock::iterator I = MBB->SkipPHIsAndLabels(MBB->begin()); 59642acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen if (I != MBB->end()) 59742acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen DL = I->getDebugLoc(); 59842acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen return I; 59942acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen } 60042acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen Idx = Idx.getPrevIndex(); 60142acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen } 60242acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen // We found an instruction. The insert point is after the instr. 60342acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen DL = MI->getDebugLoc(); 60442acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen return llvm::next(MachineBasicBlock::iterator(MI)); 60542acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen} 60642acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen 60742acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesenvoid UserValue::insertDebugValue(MachineBasicBlock *MBB, SlotIndex Idx, 60842acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen unsigned LocNo, 60942acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen LiveIntervals &LIS, 61042acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen const TargetInstrInfo &TII) { 61142acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen DebugLoc DL; 61242acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen MachineBasicBlock::iterator I = findInsertLocation(MBB, Idx, DL, LIS); 6130804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen MachineOperand &Loc = locations[LocNo]; 61442acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen 61542acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen // Frame index locations may require a target callback. 6160804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen if (Loc.isFI()) { 61742acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen MachineInstr *MI = TII.emitFrameIndexDebugValue(*MBB->getParent(), 6180804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen Loc.getIndex(), offset, variable, DL); 61942acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen if (MI) { 62042acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen MBB->insert(I, MI); 62142acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen return; 62242acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen } 62342acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen } 62442acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen // This is not a frame index, or the target is happy with a standard FI. 6250804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen BuildMI(*MBB, I, DL, TII.get(TargetOpcode::DBG_VALUE)) 6260804ead404d694b35e9c55ccbf43f99cd394e487Jakob Stoklund Olesen .addOperand(Loc).addImm(offset).addMetadata(variable); 62742acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen} 62842acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen 62942acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesenvoid UserValue::insertDebugKill(MachineBasicBlock *MBB, SlotIndex Idx, 63042acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen LiveIntervals &LIS, const TargetInstrInfo &TII) { 63142acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen DebugLoc DL; 63242acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen MachineBasicBlock::iterator I = findInsertLocation(MBB, Idx, DL, LIS); 63342acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen BuildMI(*MBB, I, DL, TII.get(TargetOpcode::DBG_VALUE)).addReg(0) 63442acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen .addImm(offset).addMetadata(variable); 63542acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen} 63642acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen 63742acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesenvoid UserValue::emitDebugValues(VirtRegMap *VRM, LiveIntervals &LIS, 63842acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen const TargetInstrInfo &TII) { 63942acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen MachineFunction::iterator MFEnd = VRM->getMachineFunction().end(); 64042acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen 64142acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen for (LocMap::const_iterator I = locInts.begin(); I.valid();) { 64242acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen SlotIndex Start = I.start(); 64342acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen SlotIndex Stop = I.stop(); 64442acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen unsigned LocNo = I.value(); 64542acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen DEBUG(dbgs() << "\t[" << Start << ';' << Stop << "):" << LocNo); 64642acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen MachineFunction::iterator MBB = LIS.getMBBFromIndex(Start); 64742acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen SlotIndex MBBEnd = LIS.getMBBEndIdx(MBB); 64842acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen 64942acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen DEBUG(dbgs() << " BB#" << MBB->getNumber() << '-' << MBBEnd); 65042acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen insertDebugValue(MBB, Start, LocNo, LIS, TII); 65142acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen 65242acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen // This interval may span multiple basic blocks. 65342acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen // Insert a DBG_VALUE into each one. 65442acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen while(Stop > MBBEnd) { 65542acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen // Move to the next block. 65642acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen Start = MBBEnd; 65742acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen if (++MBB == MFEnd) 65842acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen break; 65942acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen MBBEnd = LIS.getMBBEndIdx(MBB); 66042acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen DEBUG(dbgs() << " BB#" << MBB->getNumber() << '-' << MBBEnd); 66142acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen insertDebugValue(MBB, Start, LocNo, LIS, TII); 66242acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen } 66342acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen DEBUG(dbgs() << '\n'); 66442acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen if (MBB == MFEnd) 66542acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen break; 66642acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen 66742acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen ++I; 66842acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen if (Stop == MBBEnd) 66942acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen continue; 67042acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen // The current interval ends before MBB. 67142acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen // Insert a kill if there is a gap. 67242acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen if (!I.valid() || I.start() > Stop) 67342acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen insertDebugKill(MBB, Stop, LIS, TII); 67442acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen } 67542acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen} 67642acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen 67742acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesenvoid LDVImpl::emitDebugValues(VirtRegMap *VRM) { 67842acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen DEBUG(dbgs() << "********** EMITTING LIVE DEBUG VARIABLES **********\n"); 67942acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen const TargetInstrInfo *TII = MF->getTarget().getInstrInfo(); 68042acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen for (unsigned i = 0, e = userValues.size(); i != e; ++i) { 68142acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen userValues[i]->rewriteLocations(*VRM, *TRI); 68242acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen userValues[i]->emitDebugValues(VRM, *LIS, *TII); 68342acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen } 68442acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen} 68542acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen 68642acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesenvoid LiveDebugVariables::emitDebugValues(VirtRegMap *VRM) { 68742acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen if (pImpl) 68842acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen static_cast<LDVImpl*>(pImpl)->emitDebugValues(VRM); 68942acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen} 69042acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen 69142acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen 69230e2128a731e5a0bcac45a6a79a03bdedce68a0aJakob Stoklund Olesen#ifndef NDEBUG 69330e2128a731e5a0bcac45a6a79a03bdedce68a0aJakob Stoklund Olesenvoid LiveDebugVariables::dump() { 69430e2128a731e5a0bcac45a6a79a03bdedce68a0aJakob Stoklund Olesen if (pImpl) 69530e2128a731e5a0bcac45a6a79a03bdedce68a0aJakob Stoklund Olesen static_cast<LDVImpl*>(pImpl)->print(dbgs()); 69630e2128a731e5a0bcac45a6a79a03bdedce68a0aJakob Stoklund Olesen} 69730e2128a731e5a0bcac45a6a79a03bdedce68a0aJakob Stoklund Olesen#endif 69830e2128a731e5a0bcac45a6a79a03bdedce68a0aJakob Stoklund Olesen 699