1bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen//===- LiveDebugVariables.h - Tracking debug info variables ----*- c++ -*--===// 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 provides the interface to the LiveDebugVariables analysis. 11bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen// 12bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen// The analysis removes DBG_VALUE instructions for virtual registers and tracks 13bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen// live user variables in a data structure that can be updated during register 14bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen// allocation. 15bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen// 16bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen// After register allocation new DBG_VALUE instructions are emitted to reflect 17bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen// the new locations of user variables. 18bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen// 19bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen//===----------------------------------------------------------------------===// 20bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen 21bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen#ifndef LLVM_CODEGEN_LIVEDEBUGVARIABLES_H 22bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen#define LLVM_CODEGEN_LIVEDEBUGVARIABLES_H 23bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen 24f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen#include "llvm/ADT/ArrayRef.h" 25cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines#include "llvm/IR/DebugInfo.h" 26bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen#include "llvm/CodeGen/MachineFunctionPass.h" 27bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen 28bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesennamespace llvm { 29bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen 30f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesenclass LiveInterval; 311feb5854aeeda897e9318c8193d187673c8576b8Mark Laceyclass LiveIntervals; 3242acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesenclass VirtRegMap; 3342acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen 3455c06ae7afa3f862a6bb4a4441fe485c135f5b5eBenjamin Kramerclass LiveDebugVariables : public MachineFunctionPass { 35bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen void *pImpl; 36cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines DenseMap<const Function*, DISubprogram> FunctionDIs; 37bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesenpublic: 38bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen static char ID; // Pass identification, replacement for typeid 39bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen 40bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen LiveDebugVariables(); 410613516b16466a92c68d60734801221506c85e86Jakob Stoklund Olesen ~LiveDebugVariables(); 42bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen 43bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen /// renameRegister - Move any user variables in OldReg to NewReg:SubIdx. 44bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen /// @param OldReg Old virtual register that is going away. 45bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen /// @param NewReg New register holding the user variables. 46bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen /// @param SubIdx If NewReg is a virtual register, SubIdx may indicate a sub- 47bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen /// register. 48bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen void renameRegister(unsigned OldReg, unsigned NewReg, unsigned SubIdx); 49bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen 50f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen /// splitRegister - Move any user variables in OldReg to the live ranges in 51f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen /// NewRegs where they are live. Mark the values as unavailable where no new 52f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen /// register is live. 531feb5854aeeda897e9318c8193d187673c8576b8Mark Lacey void splitRegister(unsigned OldReg, ArrayRef<unsigned> NewRegs, 541feb5854aeeda897e9318c8193d187673c8576b8Mark Lacey LiveIntervals &LIS); 55f42b66169d75301346e3685fd2b3e45e47806367Jakob Stoklund Olesen 56bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen /// emitDebugValues - Emit new DBG_VALUE instructions reflecting the changes 57bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen /// that happened during register allocation. 5842acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen /// @param VRM Rename virtual registers according to map. 5942acf069c9e46395a2fa230ed6b89b402828e3d5Jakob Stoklund Olesen void emitDebugValues(VirtRegMap *VRM); 60bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen 6130e2128a731e5a0bcac45a6a79a03bdedce68a0aJakob Stoklund Olesen /// dump - Print data structures to dbgs(). 6230e2128a731e5a0bcac45a6a79a03bdedce68a0aJakob Stoklund Olesen void dump(); 6330e2128a731e5a0bcac45a6a79a03bdedce68a0aJakob Stoklund Olesen 64bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesenprivate: 65bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen 6636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool runOnMachineFunction(MachineFunction &) override; 6736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void releaseMemory() override; 6836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void getAnalysisUsage(AnalysisUsage &) const override; 69cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines bool doInitialization(Module &) override; 70bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen 71bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen}; 72bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen 73bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen} // namespace llvm 74bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen 75bb7b23f5b79a7ca2aa62faa1a6078428af597234Jakob Stoklund Olesen#endif // LLVM_CODEGEN_LIVEDEBUGVARIABLES_H 76