MachineFunction.h revision aa09b75d2257545c4583265c7ce10f2d0e3be72b
19c6342d0cc919711ea1024b98b1b387573995922Chris Lattner//===-- llvm/CodeGen/MachineFunction.h --------------------------*- C++ -*-===//
2f2868ce228ca20f72d1c6fbe241de01975cfe609Chris Lattner//
3cd0d1d1f0f44773b5c4bb57f557e6187891ff1d5Chris Lattner// Collect native machine code for a function.  This class contains a list of
4cd0d1d1f0f44773b5c4bb57f557e6187891ff1d5Chris Lattner// MachineBasicBlock instances that make up the current compiled function.
5cd0d1d1f0f44773b5c4bb57f557e6187891ff1d5Chris Lattner//
6cd0d1d1f0f44773b5c4bb57f557e6187891ff1d5Chris Lattner// This class also contains pointers to various classes which hold
7cd0d1d1f0f44773b5c4bb57f557e6187891ff1d5Chris Lattner// target-specific information about the generated code.
8fce1143bcfa73f61845002fa50473d1a01384202Misha Brukman//
9f2868ce228ca20f72d1c6fbe241de01975cfe609Chris Lattner//===----------------------------------------------------------------------===//
10f2868ce228ca20f72d1c6fbe241de01975cfe609Chris Lattner
11fce1143bcfa73f61845002fa50473d1a01384202Misha Brukman#ifndef LLVM_CODEGEN_MACHINEFUNCTION_H
12fce1143bcfa73f61845002fa50473d1a01384202Misha Brukman#define LLVM_CODEGEN_MACHINEFUNCTION_H
13f2868ce228ca20f72d1c6fbe241de01975cfe609Chris Lattner
140551f542ab4c99420c6fbe471987f41d640ef170Chris Lattner#include "llvm/CodeGen/MachineBasicBlock.h"
15d0aa0cdbc6fee00f2b2019633a9b9d00d301ac68Chris Lattner#include "llvm/Annotation.h"
168e7ae9860bd1f29c95e4e10fe151a22aaafafef9Chris Lattner#include "Support/ilist"
178e7ae9860bd1f29c95e4e10fe151a22aaafafef9Chris Lattner
18e7506a366e8bd56c97d10beb68e4db953aebaecaChris Lattnerclass Function;
19f2868ce228ca20f72d1c6fbe241de01975cfe609Chris Lattnerclass TargetMachine;
20e42a84f64fc93e984650f3af5ab58dd6ba68b129Chris Lattnerclass Pass;
2103ab7af4dec01a3003e469c458e37bbf4ce4f2f3Chris Lattnerclass SSARegMap;
22cd0d1d1f0f44773b5c4bb57f557e6187891ff1d5Chris Lattnerclass MachineFunctionInfo;
23aa09b75d2257545c4583265c7ce10f2d0e3be72bChris Lattnerclass MachineFrameInfo;
24f2868ce228ca20f72d1c6fbe241de01975cfe609Chris Lattner
25e42a84f64fc93e984650f3af5ab58dd6ba68b129Chris LattnerPass *createMachineCodeConstructionPass(TargetMachine &Target);
26e42a84f64fc93e984650f3af5ab58dd6ba68b129Chris LattnerPass *createMachineCodeDestructionPass();
27dea73839f69b004314d223f75d136551132108ccChris LattnerPass *createMachineFunctionPrinterPass();
28f2868ce228ca20f72d1c6fbe241de01975cfe609Chris Lattner
29fce1143bcfa73f61845002fa50473d1a01384202Misha Brukmanclass MachineFunction : private Annotation {
30335d5c399b52c2507ad11048310edc51462f4811Chris Lattner  const Function *Fn;
31335d5c399b52c2507ad11048310edc51462f4811Chris Lattner  const TargetMachine &Target;
328e7ae9860bd1f29c95e4e10fe151a22aaafafef9Chris Lattner
338e7ae9860bd1f29c95e4e10fe151a22aaafafef9Chris Lattner  // List of machine basic blocks in function
348e7ae9860bd1f29c95e4e10fe151a22aaafafef9Chris Lattner  iplist<MachineBasicBlock> BasicBlocks;
359c6342d0cc919711ea1024b98b1b387573995922Chris Lattner
3603ab7af4dec01a3003e469c458e37bbf4ce4f2f3Chris Lattner  // Keeping track of mapping from SSA values to registers
3703ab7af4dec01a3003e469c458e37bbf4ce4f2f3Chris Lattner  SSARegMap *SSARegMapping;
3803ab7af4dec01a3003e469c458e37bbf4ce4f2f3Chris Lattner
39cd0d1d1f0f44773b5c4bb57f557e6187891ff1d5Chris Lattner  // Used to keep track of frame and constant area information for sparc be
40cd0d1d1f0f44773b5c4bb57f557e6187891ff1d5Chris Lattner  MachineFunctionInfo *MFInfo;
41cd0d1d1f0f44773b5c4bb57f557e6187891ff1d5Chris Lattner
42cd0d1d1f0f44773b5c4bb57f557e6187891ff1d5Chris Lattner  // Keep track of objects allocated on the stack.
43aa09b75d2257545c4583265c7ce10f2d0e3be72bChris Lattner  MachineFrameInfo *FrameInfo;
441617e6c9974813030c8294243bf9e152f89ffd9bMisha Brukman
45f2868ce228ca20f72d1c6fbe241de01975cfe609Chris Lattnerpublic:
46335d5c399b52c2507ad11048310edc51462f4811Chris Lattner  MachineFunction(const Function *Fn, const TargetMachine& target);
4703ab7af4dec01a3003e469c458e37bbf4ce4f2f3Chris Lattner  ~MachineFunction();
48335d5c399b52c2507ad11048310edc51462f4811Chris Lattner
49335d5c399b52c2507ad11048310edc51462f4811Chris Lattner  /// getFunction - Return the LLVM function that this machine code represents
50335d5c399b52c2507ad11048310edc51462f4811Chris Lattner  ///
51335d5c399b52c2507ad11048310edc51462f4811Chris Lattner  const Function *getFunction() const { return Fn; }
52335d5c399b52c2507ad11048310edc51462f4811Chris Lattner
53335d5c399b52c2507ad11048310edc51462f4811Chris Lattner  /// getTarget - Return the target machine this machine code is compiled with
54335d5c399b52c2507ad11048310edc51462f4811Chris Lattner  ///
55335d5c399b52c2507ad11048310edc51462f4811Chris Lattner  const TargetMachine &getTarget() const { return Target; }
56dea73839f69b004314d223f75d136551132108ccChris Lattner
57cd0d1d1f0f44773b5c4bb57f557e6187891ff1d5Chris Lattner  /// SSARegMap Interface... Keep track of information about each SSA virtual
58cd0d1d1f0f44773b5c4bb57f557e6187891ff1d5Chris Lattner  /// register, such as which register class it belongs to.
59cd0d1d1f0f44773b5c4bb57f557e6187891ff1d5Chris Lattner  ///
60cd0d1d1f0f44773b5c4bb57f557e6187891ff1d5Chris Lattner  SSARegMap *getSSARegMap() const { return SSARegMapping; }
61cd0d1d1f0f44773b5c4bb57f557e6187891ff1d5Chris Lattner  void clearSSARegMap();
62cd0d1d1f0f44773b5c4bb57f557e6187891ff1d5Chris Lattner
63cd0d1d1f0f44773b5c4bb57f557e6187891ff1d5Chris Lattner  /// getFrameInfo - Return the frame info object for the current function.
64cd0d1d1f0f44773b5c4bb57f557e6187891ff1d5Chris Lattner  /// This object contains information about objects allocated on the stack
65cd0d1d1f0f44773b5c4bb57f557e6187891ff1d5Chris Lattner  /// frame of the current function in an abstract way.
66cd0d1d1f0f44773b5c4bb57f557e6187891ff1d5Chris Lattner  ///
67aa09b75d2257545c4583265c7ce10f2d0e3be72bChris Lattner  MachineFrameInfo *getFrameInfo() const { return FrameInfo; }
68cd0d1d1f0f44773b5c4bb57f557e6187891ff1d5Chris Lattner
69cd0d1d1f0f44773b5c4bb57f557e6187891ff1d5Chris Lattner  /// MachineFunctionInfo - Keep track of various per-function pieces of
70cd0d1d1f0f44773b5c4bb57f557e6187891ff1d5Chris Lattner  /// information for the sparc backend.
71cd0d1d1f0f44773b5c4bb57f557e6187891ff1d5Chris Lattner  ///
72cd0d1d1f0f44773b5c4bb57f557e6187891ff1d5Chris Lattner  MachineFunctionInfo *getInfo() const { return MFInfo; }
73cd0d1d1f0f44773b5c4bb57f557e6187891ff1d5Chris Lattner
74cd0d1d1f0f44773b5c4bb57f557e6187891ff1d5Chris Lattner
75dea73839f69b004314d223f75d136551132108ccChris Lattner  /// print - Print out the MachineFunction in a format suitable for debugging
76dea73839f69b004314d223f75d136551132108ccChris Lattner  /// to the specified stream.
77dea73839f69b004314d223f75d136551132108ccChris Lattner  ///
78dea73839f69b004314d223f75d136551132108ccChris Lattner  void print(std::ostream &OS) const;
79dea73839f69b004314d223f75d136551132108ccChris Lattner
80dea73839f69b004314d223f75d136551132108ccChris Lattner  /// dump - Print the current MachineFunction to cerr, useful for debugger use.
81dea73839f69b004314d223f75d136551132108ccChris Lattner  ///
82dea73839f69b004314d223f75d136551132108ccChris Lattner  void dump() const;
83dea73839f69b004314d223f75d136551132108ccChris Lattner
84dea73839f69b004314d223f75d136551132108ccChris Lattner  // The next three methods are used to construct, destruct, and retrieve the
85dea73839f69b004314d223f75d136551132108ccChris Lattner  // MachineFunction object for the given method.
86dea73839f69b004314d223f75d136551132108ccChris Lattner  //
87f2868ce228ca20f72d1c6fbe241de01975cfe609Chris Lattner  // construct() -- Allocates and initializes for a given method and target
88f2868ce228ca20f72d1c6fbe241de01975cfe609Chris Lattner  // get()       -- Returns a handle to the object.
89f2868ce228ca20f72d1c6fbe241de01975cfe609Chris Lattner  //                This should not be called before "construct()"
90f2868ce228ca20f72d1c6fbe241de01975cfe609Chris Lattner  //                for a given Method.
91dea73839f69b004314d223f75d136551132108ccChris Lattner  // destruct()  -- Destroy the MachineFunction object
92f2868ce228ca20f72d1c6fbe241de01975cfe609Chris Lattner  //
93335d5c399b52c2507ad11048310edc51462f4811Chris Lattner  static MachineFunction& construct(const Function *Fn,
94335d5c399b52c2507ad11048310edc51462f4811Chris Lattner                                    const TargetMachine &target);
95e7506a366e8bd56c97d10beb68e4db953aebaecaChris Lattner  static void destruct(const Function *F);
96d0aa0cdbc6fee00f2b2019633a9b9d00d301ac68Chris Lattner  static MachineFunction& get(const Function *F);
97d0aa0cdbc6fee00f2b2019633a9b9d00d301ac68Chris Lattner
98d0aa0cdbc6fee00f2b2019633a9b9d00d301ac68Chris Lattner  // Provide accessors for the MachineBasicBlock list...
99d0aa0cdbc6fee00f2b2019633a9b9d00d301ac68Chris Lattner  typedef iplist<MachineBasicBlock> BasicBlockListType;
100d0aa0cdbc6fee00f2b2019633a9b9d00d301ac68Chris Lattner  typedef BasicBlockListType::iterator iterator;
101d0aa0cdbc6fee00f2b2019633a9b9d00d301ac68Chris Lattner  typedef BasicBlockListType::const_iterator const_iterator;
102d0aa0cdbc6fee00f2b2019633a9b9d00d301ac68Chris Lattner  typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
103d0aa0cdbc6fee00f2b2019633a9b9d00d301ac68Chris Lattner  typedef std::reverse_iterator<iterator>             reverse_iterator;
104d0aa0cdbc6fee00f2b2019633a9b9d00d301ac68Chris Lattner
105d0aa0cdbc6fee00f2b2019633a9b9d00d301ac68Chris Lattner  // Provide accessors for basic blocks...
106d0aa0cdbc6fee00f2b2019633a9b9d00d301ac68Chris Lattner  const BasicBlockListType &getBasicBlockList() const { return BasicBlocks; }
107d0aa0cdbc6fee00f2b2019633a9b9d00d301ac68Chris Lattner        BasicBlockListType &getBasicBlockList()       { return BasicBlocks; }
108d0aa0cdbc6fee00f2b2019633a9b9d00d301ac68Chris Lattner
109d0aa0cdbc6fee00f2b2019633a9b9d00d301ac68Chris Lattner  //===--------------------------------------------------------------------===//
110d0aa0cdbc6fee00f2b2019633a9b9d00d301ac68Chris Lattner  // BasicBlock iterator forwarding functions
111d0aa0cdbc6fee00f2b2019633a9b9d00d301ac68Chris Lattner  //
112d0aa0cdbc6fee00f2b2019633a9b9d00d301ac68Chris Lattner  iterator                 begin()       { return BasicBlocks.begin(); }
113d0aa0cdbc6fee00f2b2019633a9b9d00d301ac68Chris Lattner  const_iterator           begin() const { return BasicBlocks.begin(); }
114d0aa0cdbc6fee00f2b2019633a9b9d00d301ac68Chris Lattner  iterator                 end  ()       { return BasicBlocks.end();   }
115d0aa0cdbc6fee00f2b2019633a9b9d00d301ac68Chris Lattner  const_iterator           end  () const { return BasicBlocks.end();   }
116d0aa0cdbc6fee00f2b2019633a9b9d00d301ac68Chris Lattner
117d0aa0cdbc6fee00f2b2019633a9b9d00d301ac68Chris Lattner  reverse_iterator        rbegin()       { return BasicBlocks.rbegin(); }
118d0aa0cdbc6fee00f2b2019633a9b9d00d301ac68Chris Lattner  const_reverse_iterator  rbegin() const { return BasicBlocks.rbegin(); }
119d0aa0cdbc6fee00f2b2019633a9b9d00d301ac68Chris Lattner  reverse_iterator        rend  ()       { return BasicBlocks.rend();   }
120d0aa0cdbc6fee00f2b2019633a9b9d00d301ac68Chris Lattner  const_reverse_iterator  rend  () const { return BasicBlocks.rend();   }
1219c6342d0cc919711ea1024b98b1b387573995922Chris Lattner
122d0aa0cdbc6fee00f2b2019633a9b9d00d301ac68Chris Lattner  unsigned                  size() const { return BasicBlocks.size(); }
123d0aa0cdbc6fee00f2b2019633a9b9d00d301ac68Chris Lattner  bool                     empty() const { return BasicBlocks.empty(); }
124d0aa0cdbc6fee00f2b2019633a9b9d00d301ac68Chris Lattner  const MachineBasicBlock &front() const { return BasicBlocks.front(); }
125d0aa0cdbc6fee00f2b2019633a9b9d00d301ac68Chris Lattner        MachineBasicBlock &front()       { return BasicBlocks.front(); }
126d5806ffb40899aca4f3c23442645ed0ef4fa390fMisha Brukman  const MachineBasicBlock & back() const { return BasicBlocks.back(); }
127d5806ffb40899aca4f3c23442645ed0ef4fa390fMisha Brukman        MachineBasicBlock & back()       { return BasicBlocks.back(); }
128f2868ce228ca20f72d1c6fbe241de01975cfe609Chris Lattner};
129f2868ce228ca20f72d1c6fbe241de01975cfe609Chris Lattner
130f2868ce228ca20f72d1c6fbe241de01975cfe609Chris Lattner#endif
131