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