2002-10-28 02:27:51 +01:00
|
|
|
//===-- llvm/CodeGen/MachineFunction.h --------------------------*- C++ -*-===//
|
2002-02-03 08:54:50 +01:00
|
|
|
//
|
2002-12-28 21:04:31 +01:00
|
|
|
// Collect native machine code for a function. This class contains a list of
|
|
|
|
// MachineBasicBlock instances that make up the current compiled function.
|
|
|
|
//
|
|
|
|
// This class also contains pointers to various classes which hold
|
|
|
|
// target-specific information about the generated code.
|
2002-10-28 01:28:31 +01:00
|
|
|
//
|
2002-02-03 08:54:50 +01:00
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
|
2002-10-28 01:28:31 +01:00
|
|
|
#ifndef LLVM_CODEGEN_MACHINEFUNCTION_H
|
|
|
|
#define LLVM_CODEGEN_MACHINEFUNCTION_H
|
2002-02-03 08:54:50 +01:00
|
|
|
|
2002-10-28 03:01:06 +01:00
|
|
|
#include "llvm/CodeGen/MachineBasicBlock.h"
|
2003-01-14 22:29:58 +01:00
|
|
|
#include "Support/Annotation.h"
|
2002-10-28 03:08:43 +01:00
|
|
|
#include "Support/ilist"
|
|
|
|
|
2002-03-23 23:51:58 +01:00
|
|
|
class Function;
|
2002-02-03 08:54:50 +01:00
|
|
|
class TargetMachine;
|
2003-08-13 20:18:15 +02:00
|
|
|
class FunctionPass;
|
2002-12-25 06:00:16 +01:00
|
|
|
class SSARegMap;
|
2002-12-28 21:04:31 +01:00
|
|
|
class MachineFunctionInfo;
|
2002-12-28 22:08:28 +01:00
|
|
|
class MachineFrameInfo;
|
2003-01-13 01:16:10 +01:00
|
|
|
class MachineConstantPool;
|
2002-02-03 08:54:50 +01:00
|
|
|
|
2003-08-13 20:18:15 +02:00
|
|
|
FunctionPass *createMachineCodeConstructionPass(TargetMachine &TM);
|
|
|
|
FunctionPass *createMachineCodeDestructionPass();
|
|
|
|
FunctionPass *createMachineFunctionPrinterPass();
|
2002-02-03 08:54:50 +01:00
|
|
|
|
2002-10-28 01:28:31 +01:00
|
|
|
class MachineFunction : private Annotation {
|
2002-10-28 06:58:46 +01:00
|
|
|
const Function *Fn;
|
|
|
|
const TargetMachine &Target;
|
2002-10-28 03:08:43 +01:00
|
|
|
|
|
|
|
// List of machine basic blocks in function
|
|
|
|
iplist<MachineBasicBlock> BasicBlocks;
|
2002-10-28 02:27:51 +01:00
|
|
|
|
2002-12-25 06:00:16 +01:00
|
|
|
// Keeping track of mapping from SSA values to registers
|
|
|
|
SSARegMap *SSARegMapping;
|
|
|
|
|
2002-12-28 21:04:31 +01:00
|
|
|
// Used to keep track of frame and constant area information for sparc be
|
|
|
|
MachineFunctionInfo *MFInfo;
|
|
|
|
|
|
|
|
// Keep track of objects allocated on the stack.
|
2002-12-28 22:08:28 +01:00
|
|
|
MachineFrameInfo *FrameInfo;
|
2002-11-20 01:53:10 +01:00
|
|
|
|
2003-01-13 01:16:10 +01:00
|
|
|
// Keep track of constants which are spilled to memory
|
|
|
|
MachineConstantPool *ConstantPool;
|
|
|
|
|
2002-02-03 08:54:50 +01:00
|
|
|
public:
|
2003-01-13 01:16:10 +01:00
|
|
|
MachineFunction(const Function *Fn, const TargetMachine &TM);
|
2002-12-25 06:00:16 +01:00
|
|
|
~MachineFunction();
|
2002-10-28 06:58:46 +01:00
|
|
|
|
|
|
|
/// getFunction - Return the LLVM function that this machine code represents
|
|
|
|
///
|
|
|
|
const Function *getFunction() const { return Fn; }
|
|
|
|
|
|
|
|
/// getTarget - Return the target machine this machine code is compiled with
|
|
|
|
///
|
|
|
|
const TargetMachine &getTarget() const { return Target; }
|
2002-10-30 01:46:31 +01:00
|
|
|
|
2002-12-28 21:04:31 +01:00
|
|
|
/// SSARegMap Interface... Keep track of information about each SSA virtual
|
|
|
|
/// register, such as which register class it belongs to.
|
|
|
|
///
|
|
|
|
SSARegMap *getSSARegMap() const { return SSARegMapping; }
|
|
|
|
void clearSSARegMap();
|
|
|
|
|
|
|
|
/// getFrameInfo - Return the frame info object for the current function.
|
|
|
|
/// This object contains information about objects allocated on the stack
|
|
|
|
/// frame of the current function in an abstract way.
|
|
|
|
///
|
2002-12-28 22:08:28 +01:00
|
|
|
MachineFrameInfo *getFrameInfo() const { return FrameInfo; }
|
2002-12-28 21:04:31 +01:00
|
|
|
|
2003-01-13 01:16:10 +01:00
|
|
|
/// getConstantPool - Return the constant pool object for the current
|
|
|
|
/// function.
|
|
|
|
MachineConstantPool *getConstantPool() const { return ConstantPool; }
|
|
|
|
|
2002-12-28 21:04:31 +01:00
|
|
|
/// MachineFunctionInfo - Keep track of various per-function pieces of
|
|
|
|
/// information for the sparc backend.
|
|
|
|
///
|
|
|
|
MachineFunctionInfo *getInfo() const { return MFInfo; }
|
|
|
|
|
|
|
|
|
2002-10-30 01:46:31 +01:00
|
|
|
/// print - Print out the MachineFunction in a format suitable for debugging
|
|
|
|
/// to the specified stream.
|
|
|
|
///
|
|
|
|
void print(std::ostream &OS) const;
|
|
|
|
|
|
|
|
/// dump - Print the current MachineFunction to cerr, useful for debugger use.
|
|
|
|
///
|
|
|
|
void dump() const;
|
|
|
|
|
|
|
|
// The next three methods are used to construct, destruct, and retrieve the
|
|
|
|
// MachineFunction object for the given method.
|
|
|
|
//
|
2002-02-03 08:54:50 +01:00
|
|
|
// construct() -- Allocates and initializes for a given method and target
|
|
|
|
// get() -- Returns a handle to the object.
|
|
|
|
// This should not be called before "construct()"
|
|
|
|
// for a given Method.
|
2002-10-30 01:46:31 +01:00
|
|
|
// destruct() -- Destroy the MachineFunction object
|
2002-02-03 08:54:50 +01:00
|
|
|
//
|
2003-01-13 01:16:10 +01:00
|
|
|
static MachineFunction& construct(const Function *F, const TargetMachine &TM);
|
2002-03-23 23:51:58 +01:00
|
|
|
static void destruct(const Function *F);
|
2002-10-28 06:30:46 +01:00
|
|
|
static MachineFunction& get(const Function *F);
|
|
|
|
|
|
|
|
// Provide accessors for the MachineBasicBlock list...
|
|
|
|
typedef iplist<MachineBasicBlock> BasicBlockListType;
|
|
|
|
typedef BasicBlockListType::iterator iterator;
|
|
|
|
typedef BasicBlockListType::const_iterator const_iterator;
|
|
|
|
typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
|
|
|
|
typedef std::reverse_iterator<iterator> reverse_iterator;
|
|
|
|
|
|
|
|
// Provide accessors for basic blocks...
|
|
|
|
const BasicBlockListType &getBasicBlockList() const { return BasicBlocks; }
|
|
|
|
BasicBlockListType &getBasicBlockList() { return BasicBlocks; }
|
|
|
|
|
|
|
|
//===--------------------------------------------------------------------===//
|
|
|
|
// BasicBlock iterator forwarding functions
|
|
|
|
//
|
|
|
|
iterator begin() { return BasicBlocks.begin(); }
|
|
|
|
const_iterator begin() const { return BasicBlocks.begin(); }
|
|
|
|
iterator end () { return BasicBlocks.end(); }
|
|
|
|
const_iterator end () const { return BasicBlocks.end(); }
|
|
|
|
|
|
|
|
reverse_iterator rbegin() { return BasicBlocks.rbegin(); }
|
|
|
|
const_reverse_iterator rbegin() const { return BasicBlocks.rbegin(); }
|
|
|
|
reverse_iterator rend () { return BasicBlocks.rend(); }
|
|
|
|
const_reverse_iterator rend () const { return BasicBlocks.rend(); }
|
2002-10-28 02:27:51 +01:00
|
|
|
|
2002-10-28 06:30:46 +01:00
|
|
|
unsigned size() const { return BasicBlocks.size(); }
|
|
|
|
bool empty() const { return BasicBlocks.empty(); }
|
|
|
|
const MachineBasicBlock &front() const { return BasicBlocks.front(); }
|
|
|
|
MachineBasicBlock &front() { return BasicBlocks.front(); }
|
2002-10-28 20:58:38 +01:00
|
|
|
const MachineBasicBlock & back() const { return BasicBlocks.back(); }
|
|
|
|
MachineBasicBlock & back() { return BasicBlocks.back(); }
|
2002-02-03 08:54:50 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
#endif
|