| 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 | RValue EmitVAArg(CodeGenFunction &CGF, Address VAListAddr, QualType Ty, |
| 33 | AggValueSlot Slot) const override; |
| 34 | }; |
| 35 | |
| 36 | void AssignToArrayRange(CodeGen::CGBuilderTy &Builder, llvm::Value *Array, |
| 37 | llvm::Value *Value, unsigned FirstIndex, |
| 38 | unsigned LastIndex); |
| 39 | |
| 40 | bool isAggregateTypeForABI(QualType T); |
| 41 | |
| 42 | llvm::Type *getVAListElementType(CodeGenFunction &CGF); |
| 43 | |
| 44 | CGCXXABI::RecordArgABI getRecordArgABI(const RecordType *RT, CGCXXABI &CXXABI); |
| 45 | |
| 46 | CGCXXABI::RecordArgABI getRecordArgABI(QualType T, CGCXXABI &CXXABI); |
| 47 | |
| 48 | bool classifyReturnType(const CGCXXABI &CXXABI, CGFunctionInfo &FI, |
| 49 | const ABIInfo &Info); |
| 50 | |
| 51 | /// Pass transparent unions as if they were the type of the first element. Sema |
| 52 | /// should ensure that all elements of the union have the same "machine type". |
| 53 | QualType useFirstFieldIfTransparentUnion(QualType Ty); |
| 54 | |
| 55 | // Dynamically round a pointer up to a multiple of the given alignment. |
| 56 | llvm::Value *emitRoundPointerUpToAlignment(CodeGenFunction &CGF, |
| 57 | llvm::Value *Ptr, CharUnits Align); |
| 58 | |
| 59 | /// Emit va_arg for a platform using the common void* representation, |
| 60 | /// where arguments are simply emitted in an array of slots on the stack. |
| 61 | /// |
| 62 | /// This version implements the core direct-value passing rules. |
| 63 | /// |
| 64 | /// \param SlotSize - The size and alignment of a stack slot. |
| 65 | /// Each argument will be allocated to a multiple of this number of |
| 66 | /// slots, and all the slots will be aligned to this value. |
| 67 | /// \param AllowHigherAlign - The slot alignment is not a cap; |
| 68 | /// an argument type with an alignment greater than the slot size |
| 69 | /// will be emitted on a higher-alignment address, potentially |
| 70 | /// leaving one or more empty slots behind as padding. If this |
| 71 | /// is false, the returned address might be less-aligned than |
| 72 | /// DirectAlign. |
| 73 | /// \param ForceRightAdjust - Default is false. On big-endian platform and |
| 74 | /// if the argument is smaller than a slot, set this flag will force |
| 75 | /// right-adjust the argument in its slot irrespective of the type. |
| 76 | Address emitVoidPtrDirectVAArg(CodeGenFunction &CGF, Address VAListAddr, |
| 77 | llvm::Type *DirectTy, CharUnits DirectSize, |
| 78 | CharUnits DirectAlign, CharUnits SlotSize, |
| 79 | bool AllowHigherAlign, |
| 80 | bool ForceRightAdjust = false); |
| 81 | |
| 82 | /// Emit va_arg for a platform using the common void* representation, |
| 83 | /// where arguments are simply emitted in an array of slots on the stack. |
| 84 | /// |
| 85 | /// \param IsIndirect - Values of this type are passed indirectly. |
| 86 | /// \param ValueInfo - The size and alignment of this type, generally |
| 87 | /// computed with getContext().getTypeInfoInChars(ValueTy). |
| 88 | /// \param SlotSizeAndAlign - The size and alignment of a stack slot. |
| 89 | /// Each argument will be allocated to a multiple of this number of |
| 90 | /// slots, and all the slots will be aligned to this value. |
| 91 | /// \param AllowHigherAlign - The slot alignment is not a cap; |
| 92 | /// an argument type with an alignment greater than the slot size |
| 93 | /// will be emitted on a higher-alignment address, potentially |
| 94 | /// leaving one or more empty slots behind as padding. |
| 95 | /// \param ForceRightAdjust - Default is false. On big-endian platform and |
| 96 | /// if the argument is smaller than a slot, set this flag will force |
| 97 | /// right-adjust the argument in its slot irrespective of the type. |
| 98 | RValue emitVoidPtrVAArg(CodeGenFunction &CGF, Address VAListAddr, |
| 99 | QualType ValueTy, bool IsIndirect, |
| 100 | TypeInfoChars ValueInfo, CharUnits SlotSizeAndAlign, |
| 101 | bool AllowHigherAlign, AggValueSlot Slot, |
| 102 | bool ForceRightAdjust = false); |
| 103 | |
| 104 | Address emitMergePHI(CodeGenFunction &CGF, Address Addr1, |
| 105 | llvm::BasicBlock *Block1, Address Addr2, |
| 106 | llvm::BasicBlock *Block2, const llvm::Twine &Name = "" ); |
| 107 | |
| 108 | /// isEmptyField - Return true iff a the field is "empty", that is it |
| 109 | /// is an unnamed bit-field or an (array of) empty record(s). If |
| 110 | /// AsIfNoUniqueAddr is true, then C++ record fields are considered empty if |
| 111 | /// the [[no_unique_address]] attribute would have made them empty. |
| 112 | bool isEmptyField(ASTContext &Context, const FieldDecl *FD, bool AllowArrays, |
| 113 | bool AsIfNoUniqueAddr = false); |
| 114 | |
| 115 | /// isEmptyRecord - Return true iff a structure contains only empty |
| 116 | /// fields. Note that a structure with a flexible array member is not |
| 117 | /// considered empty. If AsIfNoUniqueAddr is true, then C++ record fields are |
| 118 | /// considered empty if the [[no_unique_address]] attribute would have made |
| 119 | /// them empty. |
| 120 | bool isEmptyRecord(ASTContext &Context, QualType T, bool AllowArrays, |
| 121 | bool AsIfNoUniqueAddr = false); |
| 122 | |
| 123 | /// isEmptyFieldForLayout - Return true iff the field is "empty", that is, |
| 124 | /// either a zero-width bit-field or an \ref isEmptyRecordForLayout. |
| 125 | bool isEmptyFieldForLayout(const ASTContext &Context, const FieldDecl *FD); |
| 126 | |
| 127 | /// isEmptyRecordForLayout - Return true iff a structure contains only empty |
| 128 | /// base classes (per \ref isEmptyRecordForLayout) and fields (per |
| 129 | /// \ref isEmptyFieldForLayout). Note, C++ record fields are considered empty |
| 130 | /// if the [[no_unique_address]] attribute would have made them empty. |
| 131 | bool isEmptyRecordForLayout(const ASTContext &Context, QualType T); |
| 132 | |
| 133 | /// isSingleElementStruct - Determine if a structure is a "single |
| 134 | /// element struct", i.e. it has exactly one non-empty field or |
| 135 | /// exactly one field which is itself a single element |
| 136 | /// struct. Structures with flexible array members are never |
| 137 | /// considered single element structs. |
| 138 | /// |
| 139 | /// \return The field declaration for the single non-empty field, if |
| 140 | /// it exists. |
| 141 | const Type *isSingleElementStruct(QualType T, ASTContext &Context); |
| 142 | |
| 143 | Address EmitVAArgInstr(CodeGenFunction &CGF, Address VAListAddr, QualType Ty, |
| 144 | const ABIArgInfo &AI); |
| 145 | |
| 146 | bool isSIMDVectorType(ASTContext &Context, QualType Ty); |
| 147 | |
| 148 | bool isRecordWithSIMDVectorType(ASTContext &Context, QualType Ty); |
| 149 | |
| 150 | } // namespace clang::CodeGen |
| 151 | |
| 152 | #endif // LLVM_CLANG_LIB_CODEGEN_ABIINFOIMPL_H |
| 153 | |