/src/llvm-project/clang/lib/CodeGen/ABIInfoImpl.h
Line | Count | Source (jump to first uncovered line) |
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 | 0 | 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 |