//===-- 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/Annotation.h" #include "Support/NonCopyable.h" #include "Support/HashExtras.h" #include class Value; class Function; class Constant; class Type; class TargetMachine; class Pass; Pass *createMachineCodeConstructionPass(TargetMachine &Target); Pass *createMachineCodeDestructionPass(); class MachineFunction : private Annotation { hash_set constantsForConstPool; hash_map offsets; const Function* method; unsigned staticStackSize; unsigned automaticVarsSize; unsigned regSpillsSize; unsigned maxOptionalArgsSize; unsigned maxOptionalNumArgs; unsigned currentTmpValuesSize; unsigned maxTmpValuesSize; bool compiledAsLeaf; bool spillsAreaFrozen; bool automaticVarsAreaFrozen; public: /*ctor*/ MachineFunction(const Function* function, const TargetMachine& target); // The next two methods are used to construct and to 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. // static MachineFunction& construct(const Function *method, const TargetMachine &target); static void destruct(const Function *F); static MachineFunction& get(const Function* function); // // 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& 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; // int getOffsetFromFP (const Value* val) const; void dump () 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