Optional args are no longer allocated as they are discovered.
(This can be improved to avoid making the initial pass over the method.) Also, ensure automatic vars and reg. spills areas are not extended if their sizes are used for computing some other offset. llvm-svn: 2319
This commit is contained in:
		
							parent
							
								
									40221aa74c
								
							
						
					
					
						commit
						f0a992f0de
					
				| 
						 | 
				
			
			@ -21,17 +21,19 @@ class TargetMachine;
 | 
			
		|||
 | 
			
		||||
 | 
			
		||||
class MachineCodeForMethod : private Annotation {
 | 
			
		||||
  const Function* method;
 | 
			
		||||
  bool          compiledAsLeaf;
 | 
			
		||||
  std::hash_set<const Constant*> constantsForConstPool;
 | 
			
		||||
  std::hash_map<const Value*, int> offsets;
 | 
			
		||||
  const         Function* method;
 | 
			
		||||
  unsigned	staticStackSize;
 | 
			
		||||
  unsigned	automaticVarsSize;
 | 
			
		||||
  unsigned	regSpillsSize;
 | 
			
		||||
  unsigned	currentOptionalArgsSize;
 | 
			
		||||
  unsigned	maxOptionalArgsSize;
 | 
			
		||||
  unsigned	maxOptionalNumArgs;
 | 
			
		||||
  unsigned	currentTmpValuesSize;
 | 
			
		||||
  unsigned	maxTmpValuesSize;
 | 
			
		||||
  std::hash_set<const Constant*> constantsForConstPool;
 | 
			
		||||
  std::hash_map<const Value*, int> offsets;
 | 
			
		||||
  bool          compiledAsLeaf;
 | 
			
		||||
  bool          spillsAreaFrozen;
 | 
			
		||||
  bool          automaticVarsAreaFrozen;
 | 
			
		||||
  
 | 
			
		||||
public:
 | 
			
		||||
  /*ctor*/      MachineCodeForMethod(const Function* function,
 | 
			
		||||
| 
						 | 
				
			
			@ -57,8 +59,7 @@ public:
 | 
			
		|||
  inline unsigned getAutomaticVarsSize()   const { return automaticVarsSize; }
 | 
			
		||||
  inline unsigned getRegSpillsSize()       const { return regSpillsSize; }
 | 
			
		||||
  inline unsigned getMaxOptionalArgsSize() const { return maxOptionalArgsSize;}
 | 
			
		||||
  inline unsigned getCurrentOptionalArgsSize() const
 | 
			
		||||
                                             { return currentOptionalArgsSize;}
 | 
			
		||||
  inline unsigned getMaxOptionalNumArgs()  const { return maxOptionalNumArgs;}
 | 
			
		||||
  inline const std::hash_set<const Constant*>&
 | 
			
		||||
                  getConstantPoolValues() const {return constantsForConstPool;}
 | 
			
		||||
  
 | 
			
		||||
| 
						 | 
				
			
			@ -73,10 +74,9 @@ public:
 | 
			
		|||
  inline void     markAsLeafMethod()              { compiledAsLeaf = true; }
 | 
			
		||||
  
 | 
			
		||||
  int             computeOffsetforLocalVar (const TargetMachine& target,
 | 
			
		||||
                                            const Value* local,
 | 
			
		||||
                                            const Value*  local,
 | 
			
		||||
                                            unsigned int& getPaddedSize,
 | 
			
		||||
                                            unsigned int  sizeToUse = 0);
 | 
			
		||||
  
 | 
			
		||||
  int             allocateLocalVar         (const TargetMachine& target,
 | 
			
		||||
                                            const Value* local,
 | 
			
		||||
                                            unsigned int sizeToUse = 0);
 | 
			
		||||
| 
						 | 
				
			
			@ -84,16 +84,14 @@ public:
 | 
			
		|||
  int             allocateSpilledValue     (const TargetMachine& target,
 | 
			
		||||
                                            const Type* type);
 | 
			
		||||
  
 | 
			
		||||
  int             allocateOptionalArg      (const TargetMachine& target,
 | 
			
		||||
                                            const Type* type);
 | 
			
		||||
  
 | 
			
		||||
  void            resetOptionalArgs        (const TargetMachine& target);
 | 
			
		||||
  
 | 
			
		||||
  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;
 | 
			
		||||
| 
						 | 
				
			
			@ -120,9 +118,8 @@ private:
 | 
			
		|||
  inline void     resetTmpAreaSize() {
 | 
			
		||||
    currentTmpValuesSize = 0;
 | 
			
		||||
  }
 | 
			
		||||
  inline void     incrementCurrentOptionalArgsSize(int incr) {
 | 
			
		||||
    currentOptionalArgsSize+= incr;     // stack size already includes this!
 | 
			
		||||
  }
 | 
			
		||||
  int             allocateOptionalArg      (const TargetMachine& target,
 | 
			
		||||
                                            const Type* type);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -21,17 +21,19 @@ class TargetMachine;
 | 
			
		|||
 | 
			
		||||
 | 
			
		||||
class MachineCodeForMethod : private Annotation {
 | 
			
		||||
  const Function* method;
 | 
			
		||||
  bool          compiledAsLeaf;
 | 
			
		||||
  std::hash_set<const Constant*> constantsForConstPool;
 | 
			
		||||
  std::hash_map<const Value*, int> offsets;
 | 
			
		||||
  const         Function* method;
 | 
			
		||||
  unsigned	staticStackSize;
 | 
			
		||||
  unsigned	automaticVarsSize;
 | 
			
		||||
  unsigned	regSpillsSize;
 | 
			
		||||
  unsigned	currentOptionalArgsSize;
 | 
			
		||||
  unsigned	maxOptionalArgsSize;
 | 
			
		||||
  unsigned	maxOptionalNumArgs;
 | 
			
		||||
  unsigned	currentTmpValuesSize;
 | 
			
		||||
  unsigned	maxTmpValuesSize;
 | 
			
		||||
  std::hash_set<const Constant*> constantsForConstPool;
 | 
			
		||||
  std::hash_map<const Value*, int> offsets;
 | 
			
		||||
  bool          compiledAsLeaf;
 | 
			
		||||
  bool          spillsAreaFrozen;
 | 
			
		||||
  bool          automaticVarsAreaFrozen;
 | 
			
		||||
  
 | 
			
		||||
public:
 | 
			
		||||
  /*ctor*/      MachineCodeForMethod(const Function* function,
 | 
			
		||||
| 
						 | 
				
			
			@ -57,8 +59,7 @@ public:
 | 
			
		|||
  inline unsigned getAutomaticVarsSize()   const { return automaticVarsSize; }
 | 
			
		||||
  inline unsigned getRegSpillsSize()       const { return regSpillsSize; }
 | 
			
		||||
  inline unsigned getMaxOptionalArgsSize() const { return maxOptionalArgsSize;}
 | 
			
		||||
  inline unsigned getCurrentOptionalArgsSize() const
 | 
			
		||||
                                             { return currentOptionalArgsSize;}
 | 
			
		||||
  inline unsigned getMaxOptionalNumArgs()  const { return maxOptionalNumArgs;}
 | 
			
		||||
  inline const std::hash_set<const Constant*>&
 | 
			
		||||
                  getConstantPoolValues() const {return constantsForConstPool;}
 | 
			
		||||
  
 | 
			
		||||
| 
						 | 
				
			
			@ -73,10 +74,9 @@ public:
 | 
			
		|||
  inline void     markAsLeafMethod()              { compiledAsLeaf = true; }
 | 
			
		||||
  
 | 
			
		||||
  int             computeOffsetforLocalVar (const TargetMachine& target,
 | 
			
		||||
                                            const Value* local,
 | 
			
		||||
                                            const Value*  local,
 | 
			
		||||
                                            unsigned int& getPaddedSize,
 | 
			
		||||
                                            unsigned int  sizeToUse = 0);
 | 
			
		||||
  
 | 
			
		||||
  int             allocateLocalVar         (const TargetMachine& target,
 | 
			
		||||
                                            const Value* local,
 | 
			
		||||
                                            unsigned int sizeToUse = 0);
 | 
			
		||||
| 
						 | 
				
			
			@ -84,16 +84,14 @@ public:
 | 
			
		|||
  int             allocateSpilledValue     (const TargetMachine& target,
 | 
			
		||||
                                            const Type* type);
 | 
			
		||||
  
 | 
			
		||||
  int             allocateOptionalArg      (const TargetMachine& target,
 | 
			
		||||
                                            const Type* type);
 | 
			
		||||
  
 | 
			
		||||
  void            resetOptionalArgs        (const TargetMachine& target);
 | 
			
		||||
  
 | 
			
		||||
  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;
 | 
			
		||||
| 
						 | 
				
			
			@ -120,9 +118,8 @@ private:
 | 
			
		|||
  inline void     resetTmpAreaSize() {
 | 
			
		||||
    currentTmpValuesSize = 0;
 | 
			
		||||
  }
 | 
			
		||||
  inline void     incrementCurrentOptionalArgsSize(int incr) {
 | 
			
		||||
    currentOptionalArgsSize+= incr;     // stack size already includes this!
 | 
			
		||||
  }
 | 
			
		||||
  int             allocateOptionalArg      (const TargetMachine& target,
 | 
			
		||||
                                            const Type* type);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue