2002-10-28 01:27:51 +00:00
|
|
|
//===-- llvm/CodeGen/MachineFunction.h --------------------------*- C++ -*-===//
|
2002-02-03 07:54:50 +00:00
|
|
|
//
|
2003-10-20 20:19:47 +00:00
|
|
|
// The LLVM Compiler Infrastructure
|
|
|
|
//
|
|
|
|
// This file was developed by the LLVM research group and is distributed under
|
|
|
|
// the University of Illinois Open Source License. See LICENSE.TXT for details.
|
|
|
|
//
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
//
|
2002-12-28 20:04:31 +00: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 00:28:31 +00:00
|
|
|
//
|
2002-02-03 07:54:50 +00:00
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
|
2002-10-28 00:28:31 +00:00
|
|
|
#ifndef LLVM_CODEGEN_MACHINEFUNCTION_H
|
|
|
|
#define LLVM_CODEGEN_MACHINEFUNCTION_H
|
2002-02-03 07:54:50 +00:00
|
|
|
|
2002-10-28 02:01:06 +00:00
|
|
|
#include "llvm/CodeGen/MachineBasicBlock.h"
|
2003-01-14 21:29:58 +00:00
|
|
|
#include "Support/Annotation.h"
|
2002-10-28 02:08:43 +00:00
|
|
|
|
2003-11-11 22:41:34 +00:00
|
|
|
namespace llvm {
|
|
|
|
|
2004-05-24 06:11:51 +00:00
|
|
|
// ilist_traits
|
|
|
|
template <>
|
|
|
|
class ilist_traits<MachineBasicBlock> {
|
|
|
|
// this is only set by the MachineFunction owning the ilist
|
|
|
|
friend class MachineFunction;
|
2004-05-24 07:14:35 +00:00
|
|
|
MachineFunction* Parent;
|
2004-05-24 06:11:51 +00:00
|
|
|
|
|
|
|
public:
|
2004-05-24 07:14:35 +00:00
|
|
|
ilist_traits<MachineBasicBlock>() : Parent(0) { }
|
2004-05-24 06:11:51 +00:00
|
|
|
|
|
|
|
static MachineBasicBlock* getPrev(MachineBasicBlock* N) { return N->Prev; }
|
|
|
|
static MachineBasicBlock* getNext(MachineBasicBlock* N) { return N->Next; }
|
|
|
|
|
|
|
|
static const MachineBasicBlock*
|
|
|
|
getPrev(const MachineBasicBlock* N) { return N->Prev; }
|
|
|
|
|
|
|
|
static const MachineBasicBlock*
|
|
|
|
getNext(const MachineBasicBlock* N) { return N->Next; }
|
|
|
|
|
|
|
|
static void setPrev(MachineBasicBlock* N, MachineBasicBlock* prev) { N->Prev = prev; }
|
|
|
|
static void setNext(MachineBasicBlock* N, MachineBasicBlock* next) { N->Next = next; }
|
|
|
|
|
|
|
|
static MachineBasicBlock* createNode();
|
|
|
|
void addNodeToList(MachineBasicBlock* N);
|
|
|
|
void removeNodeFromList(MachineBasicBlock* N);
|
|
|
|
void transferNodesFromList(
|
|
|
|
iplist<MachineBasicBlock, ilist_traits<MachineBasicBlock> >& toList,
|
|
|
|
ilist_iterator<MachineBasicBlock> first,
|
|
|
|
ilist_iterator<MachineBasicBlock> last);
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
2002-03-23 22:51:58 +00:00
|
|
|
class Function;
|
2002-02-03 07:54:50 +00:00
|
|
|
class TargetMachine;
|
2002-12-25 05:00:16 +00:00
|
|
|
class SSARegMap;
|
2002-12-28 20:04:31 +00:00
|
|
|
class MachineFunctionInfo;
|
2002-12-28 21:08:28 +00:00
|
|
|
class MachineFrameInfo;
|
2003-01-13 00:16:10 +00:00
|
|
|
class MachineConstantPool;
|
2002-02-03 07:54:50 +00:00
|
|
|
|
2002-10-28 00:28:31 +00:00
|
|
|
class MachineFunction : private Annotation {
|
2002-10-28 05:58:46 +00:00
|
|
|
const Function *Fn;
|
|
|
|
const TargetMachine &Target;
|
2002-10-28 02:08:43 +00:00
|
|
|
|
|
|
|
// List of machine basic blocks in function
|
2004-05-24 07:14:35 +00:00
|
|
|
ilist<MachineBasicBlock> BasicBlocks;
|
2002-10-28 01:27:51 +00:00
|
|
|
|
2002-12-25 05:00:16 +00:00
|
|
|
// Keeping track of mapping from SSA values to registers
|
|
|
|
SSARegMap *SSARegMapping;
|
|
|
|
|
2002-12-28 20:04:31 +00: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 21:08:28 +00:00
|
|
|
MachineFrameInfo *FrameInfo;
|
2002-11-20 00:53:10 +00:00
|
|
|
|
2003-01-13 00:16:10 +00:00
|
|
|
// Keep track of constants which are spilled to memory
|
|
|
|
MachineConstantPool *ConstantPool;
|
|
|
|
|
2004-05-12 21:35:21 +00:00
|
|
|
// Function-level unique numbering for MachineBasicBlocks
|
|
|
|
int NextMBBNumber;
|
|
|
|
|
2002-02-03 07:54:50 +00:00
|
|
|
public:
|
2003-01-13 00:16:10 +00:00
|
|
|
MachineFunction(const Function *Fn, const TargetMachine &TM);
|
2002-12-25 05:00:16 +00:00
|
|
|
~MachineFunction();
|
2002-10-28 05:58:46 +00: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 00:46:31 +00:00
|
|
|
|
2002-12-28 20:04:31 +00: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 21:08:28 +00:00
|
|
|
MachineFrameInfo *getFrameInfo() const { return FrameInfo; }
|
2002-12-28 20:04:31 +00:00
|
|
|
|
2003-01-13 00:16:10 +00:00
|
|
|
/// getConstantPool - Return the constant pool object for the current
|
|
|
|
/// function.
|
|
|
|
MachineConstantPool *getConstantPool() const { return ConstantPool; }
|
|
|
|
|
2002-12-28 20:04:31 +00:00
|
|
|
/// MachineFunctionInfo - Keep track of various per-function pieces of
|
|
|
|
/// information for the sparc backend.
|
|
|
|
///
|
|
|
|
MachineFunctionInfo *getInfo() const { return MFInfo; }
|
|
|
|
|
2004-05-12 21:35:21 +00:00
|
|
|
/// getNextMBBNumber - Returns the next unique number to be assigned
|
|
|
|
/// to a MachineBasicBlock in this MachineFunction.
|
|
|
|
///
|
|
|
|
int getNextMBBNumber() { return NextMBBNumber++; }
|
2002-12-28 20:04:31 +00:00
|
|
|
|
2002-10-30 00:46:31 +00: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 07:54:50 +00: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.
|
|
|
|
//
|
2003-01-13 00:16:10 +00:00
|
|
|
static MachineFunction& construct(const Function *F, const TargetMachine &TM);
|
2002-03-23 22:51:58 +00:00
|
|
|
static void destruct(const Function *F);
|
2002-10-28 05:30:46 +00:00
|
|
|
static MachineFunction& get(const Function *F);
|
|
|
|
|
|
|
|
// Provide accessors for the MachineBasicBlock list...
|
2004-05-24 07:14:35 +00:00
|
|
|
typedef ilist<MachineBasicBlock> BasicBlockListType;
|
2002-10-28 05:30:46 +00:00
|
|
|
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 01:27:51 +00:00
|
|
|
|
2002-10-28 05:30:46 +00: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 19:58:38 +00:00
|
|
|
const MachineBasicBlock & back() const { return BasicBlocks.back(); }
|
|
|
|
MachineBasicBlock & back() { return BasicBlocks.back(); }
|
2002-02-03 07:54:50 +00:00
|
|
|
};
|
|
|
|
|
2003-11-11 22:41:34 +00:00
|
|
|
} // End llvm namespace
|
|
|
|
|
2002-02-03 07:54:50 +00:00
|
|
|
#endif
|