xref: /llvm-project/clang/lib/CodeGen/ABIInfoImpl.h (revision af7c58b7ea853ef34462ce97739203e2da3c5894)
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