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