1 | //===- ABIInfoImpl.h --------------------------------------------*- C++ -*-===// |
2 | // |
3 | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
4 | // See https://llvm.org/LICENSE.txt for license information. |
5 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
6 | // |
7 | //===----------------------------------------------------------------------===// |
8 | |
9 | #ifndef LLVM_CLANG_LIB_CODEGEN_ABIINFOIMPL_H |
10 | #define LLVM_CLANG_LIB_CODEGEN_ABIINFOIMPL_H |
11 | |
12 | #include "ABIInfo.h" |
13 | #include "CGCXXABI.h" |
14 | |
15 | namespace clang::CodeGen { |
16 | |
17 | /// DefaultABIInfo - The default implementation for ABI specific |
18 | /// details. This implementation provides information which results in |
19 | /// self-consistent and sensible LLVM IR generation, but does not |
20 | /// conform to any particular ABI. |
21 | class DefaultABIInfo : public ABIInfo { |
22 | public: |
23 | DefaultABIInfo(CodeGen::CodeGenTypes &CGT) : ABIInfo(CGT) {} |
24 | |
25 | virtual ~DefaultABIInfo(); |
26 | |
27 | ABIArgInfo classifyReturnType(QualType RetTy) const; |
28 | ABIArgInfo classifyArgumentType(QualType RetTy) const; |
29 | |
30 | void computeInfo(CGFunctionInfo &FI) const override; |
31 | |
32 | Address EmitVAArg(CodeGenFunction &CGF, Address VAListAddr, |
33 | QualType Ty) const override; |
34 | }; |
35 | |
36 | // Helper for coercing an aggregate argument or return value into an integer |
37 | // array of the same size (including padding) and alignment. This alternate |
38 | // coercion happens only for the RenderScript ABI and can be removed after |
39 | // runtimes that rely on it are no longer supported. |
40 | // |
41 | // RenderScript assumes that the size of the argument / return value in the IR |
42 | // is the same as the size of the corresponding qualified type. This helper |
43 | // coerces the aggregate type into an array of the same size (including |
44 | // padding). This coercion is used in lieu of expansion of struct members or |
45 | // other canonical coercions that return a coerced-type of larger size. |
46 | // |
47 | // Ty - The argument / return value type |
48 | // Context - The associated ASTContext |
49 | // LLVMContext - The associated LLVMContext |
50 | ABIArgInfo coerceToIntArray(QualType Ty, ASTContext &Context, |
51 | llvm::LLVMContext &LLVMContext); |
52 | |
53 | void AssignToArrayRange(CodeGen::CGBuilderTy &Builder, llvm::Value *Array, |
54 | llvm::Value *Value, unsigned FirstIndex, |
55 | unsigned LastIndex); |
56 | |
57 | bool isAggregateTypeForABI(QualType T); |
58 | |
59 | llvm::Type *getVAListElementType(CodeGenFunction &CGF); |
60 | |
61 | CGCXXABI::RecordArgABI getRecordArgABI(const RecordType *RT, CGCXXABI &CXXABI); |
62 | |
63 | CGCXXABI::RecordArgABI getRecordArgABI(QualType T, CGCXXABI &CXXABI); |
64 | |
65 | bool classifyReturnType(const CGCXXABI &CXXABI, CGFunctionInfo &FI, |
66 | const ABIInfo &Info); |
67 | |
68 | /// Pass transparent unions as if they were the type of the first element. Sema |
69 | /// should ensure that all elements of the union have the same "machine type". |
70 | QualType useFirstFieldIfTransparentUnion(QualType Ty); |
71 | |
72 | // Dynamically round a pointer up to a multiple of the given alignment. |
73 | llvm::Value *emitRoundPointerUpToAlignment(CodeGenFunction &CGF, |
74 | llvm::Value *Ptr, CharUnits Align); |
75 | |
76 | /// Emit va_arg for a platform using the common void* representation, |
77 | /// where arguments are simply emitted in an array of slots on the stack. |
78 | /// |
79 | /// This version implements the core direct-value passing rules. |
80 | /// |
81 | /// \param SlotSize - The size and alignment of a stack slot. |
82 | /// Each argument will be allocated to a multiple of this number of |
83 | /// slots, and all the slots will be aligned to this value. |
84 | /// \param AllowHigherAlign - The slot alignment is not a cap; |
85 | /// an argument type with an alignment greater than the slot size |
86 | /// will be emitted on a higher-alignment address, potentially |
87 | /// leaving one or more empty slots behind as padding. If this |
88 | /// is false, the returned address might be less-aligned than |
89 | /// DirectAlign. |
90 | /// \param ForceRightAdjust - Default is false. On big-endian platform and |
91 | /// if the argument is smaller than a slot, set this flag will force |
92 | /// right-adjust the argument in its slot irrespective of the type. |
93 | Address emitVoidPtrDirectVAArg(CodeGenFunction &CGF, Address VAListAddr, |
94 | llvm::Type *DirectTy, CharUnits DirectSize, |
95 | CharUnits DirectAlign, CharUnits SlotSize, |
96 | bool AllowHigherAlign, |
97 | bool ForceRightAdjust = false); |
98 | |
99 | /// Emit va_arg for a platform using the common void* representation, |
100 | /// where arguments are simply emitted in an array of slots on the stack. |
101 | /// |
102 | /// \param IsIndirect - Values of this type are passed indirectly. |
103 | /// \param ValueInfo - The size and alignment of this type, generally |
104 | /// computed with getContext().getTypeInfoInChars(ValueTy). |
105 | /// \param SlotSizeAndAlign - The size and alignment of a stack slot. |
106 | /// Each argument will be allocated to a multiple of this number of |
107 | /// slots, and all the slots will be aligned to this value. |
108 | /// \param AllowHigherAlign - The slot alignment is not a cap; |
109 | /// an argument type with an alignment greater than the slot size |
110 | /// will be emitted on a higher-alignment address, potentially |
111 | /// leaving one or more empty slots behind as padding. |
112 | /// \param ForceRightAdjust - Default is false. On big-endian platform and |
113 | /// if the argument is smaller than a slot, set this flag will force |
114 | /// right-adjust the argument in its slot irrespective of the type. |
115 | Address emitVoidPtrVAArg(CodeGenFunction &CGF, Address VAListAddr, |
116 | QualType ValueTy, bool IsIndirect, |
117 | TypeInfoChars ValueInfo, CharUnits SlotSizeAndAlign, |
118 | bool AllowHigherAlign, bool ForceRightAdjust = false); |
119 | |
120 | Address emitMergePHI(CodeGenFunction &CGF, Address Addr1, |
121 | llvm::BasicBlock *Block1, Address Addr2, |
122 | llvm::BasicBlock *Block2, const llvm::Twine &Name = "" ); |
123 | |
124 | /// isEmptyField - Return true iff a the field is "empty", that is it |
125 | /// is an unnamed bit-field or an (array of) empty record(s). If |
126 | /// AsIfNoUniqueAddr is true, then C++ record fields are considered empty if |
127 | /// the [[no_unique_address]] attribute would have made them empty. |
128 | bool isEmptyField(ASTContext &Context, const FieldDecl *FD, bool AllowArrays, |
129 | bool AsIfNoUniqueAddr = false); |
130 | |
131 | /// isEmptyRecord - Return true iff a structure contains only empty |
132 | /// fields. Note that a structure with a flexible array member is not |
133 | /// considered empty. If AsIfNoUniqueAddr is true, then C++ record fields are |
134 | /// considered empty if the [[no_unique_address]] attribute would have made |
135 | /// them empty. |
136 | bool isEmptyRecord(ASTContext &Context, QualType T, bool AllowArrays, |
137 | bool AsIfNoUniqueAddr = false); |
138 | |
139 | /// isSingleElementStruct - Determine if a structure is a "single |
140 | /// element struct", i.e. it has exactly one non-empty field or |
141 | /// exactly one field which is itself a single element |
142 | /// struct. Structures with flexible array members are never |
143 | /// considered single element structs. |
144 | /// |
145 | /// \return The field declaration for the single non-empty field, if |
146 | /// it exists. |
147 | const Type *isSingleElementStruct(QualType T, ASTContext &Context); |
148 | |
149 | Address EmitVAArgInstr(CodeGenFunction &CGF, Address VAListAddr, QualType Ty, |
150 | const ABIArgInfo &AI); |
151 | |
152 | bool isSIMDVectorType(ASTContext &Context, QualType Ty); |
153 | |
154 | bool isRecordWithSIMDVectorType(ASTContext &Context, QualType Ty); |
155 | |
156 | } // namespace clang::CodeGen |
157 | |
158 | #endif // LLVM_CLANG_LIB_CODEGEN_ABIINFOIMPL_H |
159 | |