forked from OSchip/llvm-project
				
			
		
			
				
	
	
		
			150 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			150 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			C++
		
	
	
	
| //=- AArch64MachineFuctionInfo.h - AArch64 machine function info -*- C++ -*-==//
 | |
| //
 | |
| //                     The LLVM Compiler Infrastructure
 | |
| //
 | |
| // This file is distributed under the University of Illinois Open Source
 | |
| // License. See LICENSE.TXT for details.
 | |
| //
 | |
| //===----------------------------------------------------------------------===//
 | |
| //
 | |
| // This file declares AArch64-specific per-machine-function information.
 | |
| //
 | |
| //===----------------------------------------------------------------------===//
 | |
| 
 | |
| #ifndef AARCH64MACHINEFUNCTIONINFO_H
 | |
| #define AARCH64MACHINEFUNCTIONINFO_H
 | |
| 
 | |
| #include "llvm/CodeGen/MachineFunction.h"
 | |
| 
 | |
| namespace llvm {
 | |
| 
 | |
| /// This class is derived from MachineFunctionInfo and contains private AArch64
 | |
| /// target-specific information for each MachineFunction.
 | |
| class AArch64MachineFunctionInfo : public MachineFunctionInfo {
 | |
|   virtual void anchor();
 | |
| 
 | |
|   /// Number of bytes of arguments this function has on the stack. If the callee
 | |
|   /// is expected to restore the argument stack this should be a multiple of 16,
 | |
|   /// all usable during a tail call.
 | |
|   ///
 | |
|   /// The alternative would forbid tail call optimisation in some cases: if we
 | |
|   /// want to transfer control from a function with 8-bytes of stack-argument
 | |
|   /// space to a function with 16-bytes then misalignment of this value would
 | |
|   /// make a stack adjustment necessary, which could not be undone by the
 | |
|   /// callee.
 | |
|   unsigned BytesInStackArgArea;
 | |
| 
 | |
|   /// The number of bytes to restore to deallocate space for incoming
 | |
|   /// arguments. Canonically 0 in the C calling convention, but non-zero when
 | |
|   /// callee is expected to pop the args.
 | |
|   unsigned ArgumentStackToRestore;
 | |
| 
 | |
|   /// If the stack needs to be adjusted on frame entry in two stages, this
 | |
|   /// records the size of the first adjustment just prior to storing
 | |
|   /// callee-saved registers. The callee-saved slots are addressed assuming
 | |
|   /// SP == <incoming-SP> - InitialStackAdjust.
 | |
|   unsigned InitialStackAdjust;
 | |
| 
 | |
|   /// Number of local-dynamic TLS accesses.
 | |
|   unsigned NumLocalDynamics;
 | |
| 
 | |
|   /// @see AArch64 Procedure Call Standard, B.3
 | |
|   ///
 | |
|   /// The Frame index of the area where LowerFormalArguments puts the
 | |
|   /// general-purpose registers that might contain variadic parameters.
 | |
|   int VariadicGPRIdx;
 | |
| 
 | |
|   /// @see AArch64 Procedure Call Standard, B.3
 | |
|   ///
 | |
|   /// The size of the frame object used to store the general-purpose registers
 | |
|   /// which might contain variadic arguments. This is the offset from
 | |
|   /// VariadicGPRIdx to what's stored in __gr_top.
 | |
|   unsigned VariadicGPRSize;
 | |
| 
 | |
|   /// @see AArch64 Procedure Call Standard, B.3
 | |
|   ///
 | |
|   /// The Frame index of the area where LowerFormalArguments puts the
 | |
|   /// floating-point registers that might contain variadic parameters.
 | |
|   int VariadicFPRIdx;
 | |
| 
 | |
|   /// @see AArch64 Procedure Call Standard, B.3
 | |
|   ///
 | |
|   /// The size of the frame object used to store the floating-point registers
 | |
|   /// which might contain variadic arguments. This is the offset from
 | |
|   /// VariadicFPRIdx to what's stored in __vr_top.
 | |
|   unsigned VariadicFPRSize;
 | |
| 
 | |
|   /// @see AArch64 Procedure Call Standard, B.3
 | |
|   ///
 | |
|   /// The Frame index of an object pointing just past the last known stacked
 | |
|   /// argument on entry to a variadic function. This goes into the __stack field
 | |
|   /// of the va_list type.
 | |
|   int VariadicStackIdx;
 | |
| 
 | |
|   /// The offset of the frame pointer from the stack pointer on function
 | |
|   /// entry. This is expected to be negative.
 | |
|   int FramePointerOffset;
 | |
| 
 | |
| public:
 | |
|   AArch64MachineFunctionInfo()
 | |
|     : BytesInStackArgArea(0),
 | |
|       ArgumentStackToRestore(0),
 | |
|       InitialStackAdjust(0),
 | |
|       NumLocalDynamics(0),
 | |
|       VariadicGPRIdx(0),
 | |
|       VariadicGPRSize(0),
 | |
|       VariadicFPRIdx(0),
 | |
|       VariadicFPRSize(0),
 | |
|       VariadicStackIdx(0),
 | |
|       FramePointerOffset(0) {}
 | |
| 
 | |
|   explicit AArch64MachineFunctionInfo(MachineFunction &MF)
 | |
|     : BytesInStackArgArea(0),
 | |
|       ArgumentStackToRestore(0),
 | |
|       InitialStackAdjust(0),
 | |
|       NumLocalDynamics(0),
 | |
|       VariadicGPRIdx(0),
 | |
|       VariadicGPRSize(0),
 | |
|       VariadicFPRIdx(0),
 | |
|       VariadicFPRSize(0),
 | |
|       VariadicStackIdx(0),
 | |
|       FramePointerOffset(0) {}
 | |
| 
 | |
|   unsigned getBytesInStackArgArea() const { return BytesInStackArgArea; }
 | |
|   void setBytesInStackArgArea (unsigned bytes) { BytesInStackArgArea = bytes;}
 | |
| 
 | |
|   unsigned getArgumentStackToRestore() const { return ArgumentStackToRestore; }
 | |
|   void setArgumentStackToRestore(unsigned bytes) {
 | |
|     ArgumentStackToRestore = bytes;
 | |
|   }
 | |
| 
 | |
|   unsigned getInitialStackAdjust() const { return InitialStackAdjust; }
 | |
|   void setInitialStackAdjust(unsigned bytes) { InitialStackAdjust = bytes; }
 | |
| 
 | |
|   unsigned getNumLocalDynamicTLSAccesses() const { return NumLocalDynamics; }
 | |
|   void incNumLocalDynamicTLSAccesses() { ++NumLocalDynamics; }
 | |
| 
 | |
|   int getVariadicGPRIdx() const { return VariadicGPRIdx; }
 | |
|   void setVariadicGPRIdx(int Idx) { VariadicGPRIdx = Idx; }
 | |
| 
 | |
|   unsigned getVariadicGPRSize() const { return VariadicGPRSize; }
 | |
|   void setVariadicGPRSize(unsigned Size) { VariadicGPRSize = Size; }
 | |
| 
 | |
|   int getVariadicFPRIdx() const { return VariadicFPRIdx; }
 | |
|   void setVariadicFPRIdx(int Idx) { VariadicFPRIdx = Idx; }
 | |
| 
 | |
|   unsigned getVariadicFPRSize() const { return VariadicFPRSize; }
 | |
|   void setVariadicFPRSize(unsigned Size) { VariadicFPRSize = Size; }
 | |
| 
 | |
|   int getVariadicStackIdx() const { return VariadicStackIdx; }
 | |
|   void setVariadicStackIdx(int Idx) { VariadicStackIdx = Idx; }
 | |
| 
 | |
|   int getFramePointerOffset() const { return FramePointerOffset; }
 | |
|   void setFramePointerOffset(int Idx) { FramePointerOffset = Idx; }
 | |
| 
 | |
| };
 | |
| 
 | |
| } // End llvm namespace
 | |
| 
 | |
| #endif
 |