TargetCallingConv.h 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273
  1. #pragma once
  2. #ifdef __GNUC__
  3. #pragma GCC diagnostic push
  4. #pragma GCC diagnostic ignored "-Wunused-parameter"
  5. #endif
  6. //===-- llvm/CodeGen/TargetCallingConv.h - Calling Convention ---*- C++ -*-===//
  7. //
  8. // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
  9. // See https://llvm.org/LICENSE.txt for license information.
  10. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  11. //
  12. //===----------------------------------------------------------------------===//
  13. //
  14. // This file defines types for working with calling-convention information.
  15. //
  16. //===----------------------------------------------------------------------===//
  17. #ifndef LLVM_CODEGEN_TARGETCALLINGCONV_H
  18. #define LLVM_CODEGEN_TARGETCALLINGCONV_H
  19. #include "llvm/CodeGen/ValueTypes.h"
  20. #include "llvm/Support/Alignment.h"
  21. #include "llvm/Support/MachineValueType.h"
  22. #include "llvm/Support/MathExtras.h"
  23. #include <cassert>
  24. #include <climits>
  25. #include <cstdint>
  26. namespace llvm {
  27. namespace ISD {
  28. struct ArgFlagsTy {
  29. private:
  30. unsigned IsZExt : 1; ///< Zero extended
  31. unsigned IsSExt : 1; ///< Sign extended
  32. unsigned IsInReg : 1; ///< Passed in register
  33. unsigned IsSRet : 1; ///< Hidden struct-ret ptr
  34. unsigned IsByVal : 1; ///< Struct passed by value
  35. unsigned IsByRef : 1; ///< Passed in memory
  36. unsigned IsNest : 1; ///< Nested fn static chain
  37. unsigned IsReturned : 1; ///< Always returned
  38. unsigned IsSplit : 1;
  39. unsigned IsInAlloca : 1; ///< Passed with inalloca
  40. unsigned IsPreallocated : 1; ///< ByVal without the copy
  41. unsigned IsSplitEnd : 1; ///< Last part of a split
  42. unsigned IsSwiftSelf : 1; ///< Swift self parameter
  43. unsigned IsSwiftAsync : 1; ///< Swift async context parameter
  44. unsigned IsSwiftError : 1; ///< Swift error parameter
  45. unsigned IsCFGuardTarget : 1; ///< Control Flow Guard target
  46. unsigned IsHva : 1; ///< HVA field for
  47. unsigned IsHvaStart : 1; ///< HVA structure start
  48. unsigned IsSecArgPass : 1; ///< Second argument
  49. unsigned MemAlign : 4; ///< Log 2 of alignment when arg is passed in memory
  50. ///< (including byval/byref). The max alignment is
  51. ///< verified in IR verification.
  52. unsigned OrigAlign : 5; ///< Log 2 of original alignment
  53. unsigned IsInConsecutiveRegsLast : 1;
  54. unsigned IsInConsecutiveRegs : 1;
  55. unsigned IsCopyElisionCandidate : 1; ///< Argument copy elision candidate
  56. unsigned IsPointer : 1;
  57. unsigned ByValOrByRefSize = 0; ///< Byval or byref struct size
  58. unsigned PointerAddrSpace = 0; ///< Address space of pointer argument
  59. public:
  60. ArgFlagsTy()
  61. : IsZExt(0), IsSExt(0), IsInReg(0), IsSRet(0), IsByVal(0), IsByRef(0),
  62. IsNest(0), IsReturned(0), IsSplit(0), IsInAlloca(0),
  63. IsPreallocated(0), IsSplitEnd(0), IsSwiftSelf(0), IsSwiftAsync(0),
  64. IsSwiftError(0), IsCFGuardTarget(0), IsHva(0), IsHvaStart(0),
  65. IsSecArgPass(0), MemAlign(0), OrigAlign(0),
  66. IsInConsecutiveRegsLast(0), IsInConsecutiveRegs(0),
  67. IsCopyElisionCandidate(0), IsPointer(0) {
  68. static_assert(sizeof(*this) == 3 * sizeof(unsigned), "flags are too big");
  69. }
  70. bool isZExt() const { return IsZExt; }
  71. void setZExt() { IsZExt = 1; }
  72. bool isSExt() const { return IsSExt; }
  73. void setSExt() { IsSExt = 1; }
  74. bool isInReg() const { return IsInReg; }
  75. void setInReg() { IsInReg = 1; }
  76. bool isSRet() const { return IsSRet; }
  77. void setSRet() { IsSRet = 1; }
  78. bool isByVal() const { return IsByVal; }
  79. void setByVal() { IsByVal = 1; }
  80. bool isByRef() const { return IsByRef; }
  81. void setByRef() { IsByRef = 1; }
  82. bool isInAlloca() const { return IsInAlloca; }
  83. void setInAlloca() { IsInAlloca = 1; }
  84. bool isPreallocated() const { return IsPreallocated; }
  85. void setPreallocated() { IsPreallocated = 1; }
  86. bool isSwiftSelf() const { return IsSwiftSelf; }
  87. void setSwiftSelf() { IsSwiftSelf = 1; }
  88. bool isSwiftAsync() const { return IsSwiftAsync; }
  89. void setSwiftAsync() { IsSwiftAsync = 1; }
  90. bool isSwiftError() const { return IsSwiftError; }
  91. void setSwiftError() { IsSwiftError = 1; }
  92. bool isCFGuardTarget() const { return IsCFGuardTarget; }
  93. void setCFGuardTarget() { IsCFGuardTarget = 1; }
  94. bool isHva() const { return IsHva; }
  95. void setHva() { IsHva = 1; }
  96. bool isHvaStart() const { return IsHvaStart; }
  97. void setHvaStart() { IsHvaStart = 1; }
  98. bool isSecArgPass() const { return IsSecArgPass; }
  99. void setSecArgPass() { IsSecArgPass = 1; }
  100. bool isNest() const { return IsNest; }
  101. void setNest() { IsNest = 1; }
  102. bool isReturned() const { return IsReturned; }
  103. void setReturned(bool V = true) { IsReturned = V; }
  104. bool isInConsecutiveRegs() const { return IsInConsecutiveRegs; }
  105. void setInConsecutiveRegs(bool Flag = true) { IsInConsecutiveRegs = Flag; }
  106. bool isInConsecutiveRegsLast() const { return IsInConsecutiveRegsLast; }
  107. void setInConsecutiveRegsLast(bool Flag = true) {
  108. IsInConsecutiveRegsLast = Flag;
  109. }
  110. bool isSplit() const { return IsSplit; }
  111. void setSplit() { IsSplit = 1; }
  112. bool isSplitEnd() const { return IsSplitEnd; }
  113. void setSplitEnd() { IsSplitEnd = 1; }
  114. bool isCopyElisionCandidate() const { return IsCopyElisionCandidate; }
  115. void setCopyElisionCandidate() { IsCopyElisionCandidate = 1; }
  116. bool isPointer() const { return IsPointer; }
  117. void setPointer() { IsPointer = 1; }
  118. Align getNonZeroMemAlign() const {
  119. return decodeMaybeAlign(MemAlign).valueOrOne();
  120. }
  121. void setMemAlign(Align A) {
  122. MemAlign = encode(A);
  123. assert(getNonZeroMemAlign() == A && "bitfield overflow");
  124. }
  125. Align getNonZeroByValAlign() const {
  126. assert(isByVal());
  127. MaybeAlign A = decodeMaybeAlign(MemAlign);
  128. assert(A && "ByValAlign must be defined");
  129. return *A;
  130. }
  131. Align getNonZeroOrigAlign() const {
  132. return decodeMaybeAlign(OrigAlign).valueOrOne();
  133. }
  134. void setOrigAlign(Align A) {
  135. OrigAlign = encode(A);
  136. assert(getNonZeroOrigAlign() == A && "bitfield overflow");
  137. }
  138. unsigned getByValSize() const {
  139. assert(isByVal() && !isByRef());
  140. return ByValOrByRefSize;
  141. }
  142. void setByValSize(unsigned S) {
  143. assert(isByVal() && !isByRef());
  144. ByValOrByRefSize = S;
  145. }
  146. unsigned getByRefSize() const {
  147. assert(!isByVal() && isByRef());
  148. return ByValOrByRefSize;
  149. }
  150. void setByRefSize(unsigned S) {
  151. assert(!isByVal() && isByRef());
  152. ByValOrByRefSize = S;
  153. }
  154. unsigned getPointerAddrSpace() const { return PointerAddrSpace; }
  155. void setPointerAddrSpace(unsigned AS) { PointerAddrSpace = AS; }
  156. };
  157. /// InputArg - This struct carries flags and type information about a
  158. /// single incoming (formal) argument or incoming (from the perspective
  159. /// of the caller) return value virtual register.
  160. ///
  161. struct InputArg {
  162. ArgFlagsTy Flags;
  163. MVT VT = MVT::Other;
  164. EVT ArgVT;
  165. bool Used = false;
  166. /// Index original Function's argument.
  167. unsigned OrigArgIndex;
  168. /// Sentinel value for implicit machine-level input arguments.
  169. static const unsigned NoArgIndex = UINT_MAX;
  170. /// Offset in bytes of current input value relative to the beginning of
  171. /// original argument. E.g. if argument was splitted into four 32 bit
  172. /// registers, we got 4 InputArgs with PartOffsets 0, 4, 8 and 12.
  173. unsigned PartOffset;
  174. InputArg() = default;
  175. InputArg(ArgFlagsTy flags, EVT vt, EVT argvt, bool used,
  176. unsigned origIdx, unsigned partOffs)
  177. : Flags(flags), Used(used), OrigArgIndex(origIdx), PartOffset(partOffs) {
  178. VT = vt.getSimpleVT();
  179. ArgVT = argvt;
  180. }
  181. bool isOrigArg() const {
  182. return OrigArgIndex != NoArgIndex;
  183. }
  184. unsigned getOrigArgIndex() const {
  185. assert(OrigArgIndex != NoArgIndex && "Implicit machine-level argument");
  186. return OrigArgIndex;
  187. }
  188. };
  189. /// OutputArg - This struct carries flags and a value for a
  190. /// single outgoing (actual) argument or outgoing (from the perspective
  191. /// of the caller) return value virtual register.
  192. ///
  193. struct OutputArg {
  194. ArgFlagsTy Flags;
  195. MVT VT;
  196. EVT ArgVT;
  197. /// IsFixed - Is this a "fixed" value, ie not passed through a vararg "...".
  198. bool IsFixed = false;
  199. /// Index original Function's argument.
  200. unsigned OrigArgIndex;
  201. /// Offset in bytes of current output value relative to the beginning of
  202. /// original argument. E.g. if argument was splitted into four 32 bit
  203. /// registers, we got 4 OutputArgs with PartOffsets 0, 4, 8 and 12.
  204. unsigned PartOffset;
  205. OutputArg() = default;
  206. OutputArg(ArgFlagsTy flags, MVT vt, EVT argvt, bool isfixed,
  207. unsigned origIdx, unsigned partOffs)
  208. : Flags(flags), IsFixed(isfixed), OrigArgIndex(origIdx),
  209. PartOffset(partOffs) {
  210. VT = vt;
  211. ArgVT = argvt;
  212. }
  213. };
  214. } // end namespace ISD
  215. } // end namespace llvm
  216. #endif // LLVM_CODEGEN_TARGETCALLINGCONV_H
  217. #ifdef __GNUC__
  218. #pragma GCC diagnostic pop
  219. #endif