mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-24 03:33:20 +01:00
a5ba3d9b3d
llvm-svn: 5137
207 lines
7.9 KiB
C++
207 lines
7.9 KiB
C++
//===-- llvm/CodeGen/MachineFunction.h --------------------------*- C++ -*-===//
|
|
//
|
|
// Collect native machine code information for a method. This allows
|
|
// target-specific information about the generated code to be stored with each
|
|
// method.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef LLVM_CODEGEN_MACHINEFUNCTION_H
|
|
#define LLVM_CODEGEN_MACHINEFUNCTION_H
|
|
|
|
#include "llvm/CodeGen/MachineBasicBlock.h"
|
|
#include "llvm/Annotation.h"
|
|
#include "Support/HashExtras.h"
|
|
#include "Support/hash_set"
|
|
#include "Support/ilist"
|
|
|
|
class Value;
|
|
class Function;
|
|
class Constant;
|
|
class Type;
|
|
class TargetMachine;
|
|
class Pass;
|
|
class SSARegMap;
|
|
|
|
Pass *createMachineCodeConstructionPass(TargetMachine &Target);
|
|
Pass *createMachineCodeDestructionPass();
|
|
Pass *createMachineFunctionPrinterPass();
|
|
|
|
class MachineFunction : private Annotation {
|
|
const Function *Fn;
|
|
const TargetMachine &Target;
|
|
|
|
// List of machine basic blocks in function
|
|
iplist<MachineBasicBlock> BasicBlocks;
|
|
|
|
// Keeping track of mapping from SSA values to registers
|
|
SSARegMap *SSARegMapping;
|
|
|
|
// FIXME: State should be held elsewhere...
|
|
hash_set<const Constant*> constantsForConstPool;
|
|
hash_map<const Value*, int> offsets;
|
|
unsigned staticStackSize;
|
|
unsigned automaticVarsSize;
|
|
unsigned regSpillsSize;
|
|
unsigned maxOptionalArgsSize;
|
|
unsigned maxOptionalNumArgs;
|
|
unsigned currentTmpValuesSize;
|
|
unsigned maxTmpValuesSize;
|
|
bool compiledAsLeaf;
|
|
bool spillsAreaFrozen;
|
|
bool automaticVarsAreaFrozen;
|
|
|
|
public:
|
|
MachineFunction(const Function *Fn, const TargetMachine& target);
|
|
~MachineFunction();
|
|
|
|
/// 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; }
|
|
|
|
/// 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.
|
|
//
|
|
// 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.
|
|
// destruct() -- Destroy the MachineFunction object
|
|
//
|
|
static MachineFunction& construct(const Function *Fn,
|
|
const TargetMachine &target);
|
|
static void destruct(const Function *F);
|
|
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(); }
|
|
|
|
unsigned size() const { return BasicBlocks.size(); }
|
|
bool empty() const { return BasicBlocks.empty(); }
|
|
const MachineBasicBlock &front() const { return BasicBlocks.front(); }
|
|
MachineBasicBlock &front() { return BasicBlocks.front(); }
|
|
const MachineBasicBlock & back() const { return BasicBlocks.back(); }
|
|
MachineBasicBlock & back() { return BasicBlocks.back(); }
|
|
|
|
//===--------------------------------------------------------------------===//
|
|
// 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();
|
|
|
|
|
|
//===--------------------------------------------------------------------===//
|
|
//
|
|
// FIXME: Most of the following state should be moved into another class!
|
|
//
|
|
|
|
/// CalculateArgSize - Call this method to fill in the maxOptionalArgsSize &
|
|
/// staticStackSize fields...
|
|
///
|
|
void CalculateArgSize();
|
|
|
|
//
|
|
// Accessors for global information about generated code for a method.
|
|
//
|
|
inline bool isCompiledAsLeafMethod() const { return compiledAsLeaf; }
|
|
inline unsigned getStaticStackSize() const { return staticStackSize; }
|
|
inline unsigned getAutomaticVarsSize() const { return automaticVarsSize; }
|
|
inline unsigned getRegSpillsSize() const { return regSpillsSize; }
|
|
inline unsigned getMaxOptionalArgsSize() const { return maxOptionalArgsSize;}
|
|
inline unsigned getMaxOptionalNumArgs() const { return maxOptionalNumArgs;}
|
|
inline const hash_set<const Constant*>&
|
|
getConstantPoolValues() const {return constantsForConstPool;}
|
|
|
|
//
|
|
// Modifiers used during code generation
|
|
//
|
|
void initializeFrameLayout (const TargetMachine& target);
|
|
|
|
void addToConstantPool (const Constant* constVal)
|
|
{ constantsForConstPool.insert(constVal); }
|
|
|
|
inline void markAsLeafMethod() { compiledAsLeaf = true; }
|
|
|
|
int computeOffsetforLocalVar (const TargetMachine& target,
|
|
const Value* local,
|
|
unsigned int& getPaddedSize,
|
|
unsigned int sizeToUse = 0);
|
|
int allocateLocalVar (const TargetMachine& target,
|
|
const Value* local,
|
|
unsigned int sizeToUse = 0);
|
|
|
|
int allocateSpilledValue (const TargetMachine& target,
|
|
const Type* type);
|
|
|
|
int pushTempValue (const TargetMachine& target,
|
|
unsigned int size);
|
|
|
|
void popAllTempValues (const TargetMachine& target);
|
|
|
|
void freezeSpillsArea () { spillsAreaFrozen = true; }
|
|
void freezeAutomaticVarsArea () { automaticVarsAreaFrozen=true; }
|
|
|
|
int getOffset (const Value* val) const;
|
|
|
|
private:
|
|
inline void incrementAutomaticVarsSize(int incr) {
|
|
automaticVarsSize+= incr;
|
|
staticStackSize += incr;
|
|
}
|
|
inline void incrementRegSpillsSize(int incr) {
|
|
regSpillsSize+= incr;
|
|
staticStackSize += incr;
|
|
}
|
|
inline void incrementTmpAreaSize(int incr) {
|
|
currentTmpValuesSize += incr;
|
|
if (maxTmpValuesSize < currentTmpValuesSize)
|
|
{
|
|
staticStackSize += currentTmpValuesSize - maxTmpValuesSize;
|
|
maxTmpValuesSize = currentTmpValuesSize;
|
|
}
|
|
}
|
|
inline void resetTmpAreaSize() {
|
|
currentTmpValuesSize = 0;
|
|
}
|
|
int allocateOptionalArg (const TargetMachine& target,
|
|
const Type* type);
|
|
};
|
|
|
|
#endif
|