1 //===--- CodeGenTypes.h - Type translation for LLVM CodeGen -----*- C++ -*-===//
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
7 //===----------------------------------------------------------------------===//
9 // This is the code that handles AST -> LLVM type lowering.
11 //===----------------------------------------------------------------------===//
13 #ifndef LLVM_CLANG_LIB_CODEGEN_CODEGENTYPES_H
14 #define LLVM_CLANG_LIB_CODEGEN_CODEGENTYPES_H
17 #include "clang/Basic/ABI.h"
18 #include "clang/CodeGen/CGFunctionInfo.h"
19 #include "llvm/ADT/DenseMap.h"
20 #include "llvm/IR/Module.h"
32 template <typename
> class CanQual
;
33 class CXXConstructorDecl
;
36 class FunctionProtoType
;
42 typedef CanQual
<Type
> CanQualType
;
52 /// This class organizes the cross-module state that is used while lowering
53 /// AST types to LLVM types.
56 // Some of this stuff should probably be left on the CGM.
58 llvm::Module
&TheModule
;
59 const TargetInfo
&Target
;
61 /// The opaque type map for Objective-C interfaces. All direct
62 /// manipulation is done by the runtime interfaces, which are
63 /// responsible for coercing to the appropriate type; these opaque
64 /// types are never refined.
65 llvm::DenseMap
<const ObjCInterfaceType
*, llvm::Type
*> InterfaceTypes
;
67 /// Maps clang struct type with corresponding record layout info.
68 llvm::DenseMap
<const Type
*, std::unique_ptr
<CGRecordLayout
>> CGRecordLayouts
;
70 /// Contains the LLVM IR type for any converted RecordDecl.
71 llvm::DenseMap
<const Type
*, llvm::StructType
*> RecordDeclTypes
;
73 /// Hold memoized CGFunctionInfo results.
74 llvm::FoldingSet
<CGFunctionInfo
> FunctionInfos
{FunctionInfosLog2InitSize
};
76 llvm::SmallPtrSet
<const CGFunctionInfo
*, 4> FunctionsBeingProcessed
;
78 /// True if we didn't layout a function due to a being inside
79 /// a recursive struct conversion, set this to true.
82 /// True if any instance of long double types are used.
83 bool LongDoubleReferenced
;
85 /// This map keeps cache of llvm::Types and maps clang::Type to
86 /// corresponding llvm::Type.
87 llvm::DenseMap
<const Type
*, llvm::Type
*> TypeCache
;
89 llvm::DenseMap
<const Type
*, llvm::Type
*> RecordsWithOpaqueMemberPointers
;
91 static constexpr unsigned FunctionInfosLog2InitSize
= 9;
92 /// Helper for ConvertType.
93 llvm::Type
*ConvertFunctionTypeInternal(QualType FT
);
96 CodeGenTypes(CodeGenModule
&cgm
);
99 const llvm::DataLayout
&getDataLayout() const {
100 return TheModule
.getDataLayout();
102 CodeGenModule
&getCGM() const { return CGM
; }
103 ASTContext
&getContext() const { return Context
; }
104 const TargetInfo
&getTarget() const { return Target
; }
105 CGCXXABI
&getCXXABI() const;
106 llvm::LLVMContext
&getLLVMContext() { return TheModule
.getContext(); }
107 const CodeGenOptions
&getCodeGenOpts() const;
109 /// Convert clang calling convention to LLVM callilng convention.
110 unsigned ClangCallConvToLLVMCallConv(CallingConv CC
);
112 /// Derives the 'this' type for codegen purposes, i.e. ignoring method CVR
114 CanQualType
DeriveThisType(const CXXRecordDecl
*RD
, const CXXMethodDecl
*MD
);
116 /// ConvertType - Convert type T into a llvm::Type.
117 llvm::Type
*ConvertType(QualType T
);
119 /// ConvertTypeForMem - Convert type T into a llvm::Type. This differs from
120 /// ConvertType in that it is used to convert to the memory representation for
121 /// a type. For example, the scalar representation for _Bool is i1, but the
122 /// memory representation is usually i8 or i32, depending on the target.
123 llvm::Type
*ConvertTypeForMem(QualType T
);
125 /// Check whether the given type needs to be laid out in memory
126 /// using an opaque byte-array type because its load/store type
127 /// does not have the correct alloc size in the LLVM data layout.
128 /// If this is false, the load/store type (convertTypeForLoadStore)
129 /// and memory representation type (ConvertTypeForMem) will
130 /// be the same type.
131 bool typeRequiresSplitIntoByteArray(QualType ASTTy
,
132 llvm::Type
*LLVMTy
= nullptr);
134 /// Given that T is a scalar type, return the IR type that should
135 /// be used for load and store operations. For example, this might
136 /// be i8 for _Bool or i96 for _BitInt(65). The store size of the
137 /// load/store type (as reported by LLVM's data layout) is always
138 /// the same as the alloc size of the memory representation type
139 /// returned by ConvertTypeForMem.
141 /// As an optimization, if you already know the scalar value type
142 /// for T (as would be returned by ConvertType), you can pass
143 /// it as the second argument so that it does not need to be
144 /// recomputed in common cases where the value type and
145 /// load/store type are the same.
146 llvm::Type
*convertTypeForLoadStore(QualType T
, llvm::Type
*LLVMTy
= nullptr);
148 /// GetFunctionType - Get the LLVM function type for \arg Info.
149 llvm::FunctionType
*GetFunctionType(const CGFunctionInfo
&Info
);
151 llvm::FunctionType
*GetFunctionType(GlobalDecl GD
);
153 /// isFuncTypeConvertible - Utility to check whether a function type can
154 /// be converted to an LLVM type (i.e. doesn't depend on an incomplete tag
156 bool isFuncTypeConvertible(const FunctionType
*FT
);
157 bool isFuncParamTypeConvertible(QualType Ty
);
159 /// Determine if a C++ inheriting constructor should have parameters matching
160 /// those of its inherited constructor.
161 bool inheritingCtorHasParams(const InheritedConstructor
&Inherited
,
164 /// GetFunctionTypeForVTable - Get the LLVM function type for use in a vtable,
165 /// given a CXXMethodDecl. If the method to has an incomplete return type,
166 /// and/or incomplete argument types, this will return the opaque type.
167 llvm::Type
*GetFunctionTypeForVTable(GlobalDecl GD
);
169 const CGRecordLayout
&getCGRecordLayout(const RecordDecl
*);
171 /// UpdateCompletedType - When we find the full definition for a TagDecl,
172 /// replace the 'opaque' type we previously made for it if applicable.
173 void UpdateCompletedType(const TagDecl
*TD
);
175 /// Remove stale types from the type cache when an inheritance model
176 /// gets assigned to a class.
177 void RefreshTypeCacheForClass(const CXXRecordDecl
*RD
);
179 // The arrangement methods are split into three families:
180 // - those meant to drive the signature and prologue/epilogue
181 // of a function declaration or definition,
182 // - those meant for the computation of the LLVM type for an abstract
183 // appearance of a function, and
184 // - those meant for performing the IR-generation of a call.
185 // They differ mainly in how they deal with optional (i.e. variadic)
186 // arguments, as well as unprototyped functions.
189 // - The CGFunctionInfo for emitting a specific call site must include
190 // entries for the optional arguments.
191 // - The function type used at the call site must reflect the formal
192 // signature of the declaration being called, or else the call will
194 // - For the most part, unprototyped functions are called by casting to
195 // a formal signature inferred from the specific argument types used
196 // at the call-site. However, some targets (e.g. x86-64) screw with
197 // this for compatibility reasons.
199 const CGFunctionInfo
&arrangeGlobalDeclaration(GlobalDecl GD
);
201 /// Given a function info for a declaration, return the function info
202 /// for a call with the given arguments.
204 /// Often this will be able to simply return the declaration info.
205 const CGFunctionInfo
&arrangeCall(const CGFunctionInfo
&declFI
,
206 const CallArgList
&args
);
208 /// Free functions are functions that are compatible with an ordinary
209 /// C function pointer type.
210 const CGFunctionInfo
&arrangeFunctionDeclaration(const FunctionDecl
*FD
);
211 const CGFunctionInfo
&arrangeFreeFunctionCall(const CallArgList
&Args
,
212 const FunctionType
*Ty
,
214 const CGFunctionInfo
&arrangeFreeFunctionType(CanQual
<FunctionProtoType
> Ty
);
215 const CGFunctionInfo
&arrangeFreeFunctionType(CanQual
<FunctionNoProtoType
> Ty
);
217 /// A nullary function is a freestanding function of type 'void ()'.
218 /// This method works for both calls and declarations.
219 const CGFunctionInfo
&arrangeNullaryFunction();
221 /// A builtin function is a freestanding function using the default
223 const CGFunctionInfo
&
224 arrangeBuiltinFunctionDeclaration(QualType resultType
,
225 const FunctionArgList
&args
);
226 const CGFunctionInfo
&
227 arrangeBuiltinFunctionDeclaration(CanQualType resultType
,
228 ArrayRef
<CanQualType
> argTypes
);
229 const CGFunctionInfo
&arrangeBuiltinFunctionCall(QualType resultType
,
230 const CallArgList
&args
);
232 /// Objective-C methods are C functions with some implicit parameters.
233 const CGFunctionInfo
&arrangeObjCMethodDeclaration(const ObjCMethodDecl
*MD
);
234 const CGFunctionInfo
&arrangeObjCMessageSendSignature(const ObjCMethodDecl
*MD
,
235 QualType receiverType
);
236 const CGFunctionInfo
&arrangeUnprototypedObjCMessageSend(
238 const CallArgList
&args
);
240 /// Block invocation functions are C functions with an implicit parameter.
241 const CGFunctionInfo
&arrangeBlockFunctionDeclaration(
242 const FunctionProtoType
*type
,
243 const FunctionArgList
&args
);
244 const CGFunctionInfo
&arrangeBlockFunctionCall(const CallArgList
&args
,
245 const FunctionType
*type
);
247 /// C++ methods have some special rules and also have implicit parameters.
248 const CGFunctionInfo
&arrangeCXXMethodDeclaration(const CXXMethodDecl
*MD
);
249 const CGFunctionInfo
&arrangeCXXStructorDeclaration(GlobalDecl GD
);
250 const CGFunctionInfo
&arrangeCXXConstructorCall(const CallArgList
&Args
,
251 const CXXConstructorDecl
*D
,
252 CXXCtorType CtorKind
,
253 unsigned ExtraPrefixArgs
,
254 unsigned ExtraSuffixArgs
,
255 bool PassProtoArgs
= true);
257 const CGFunctionInfo
&arrangeCXXMethodCall(const CallArgList
&args
,
258 const FunctionProtoType
*type
,
259 RequiredArgs required
,
260 unsigned numPrefixArgs
);
261 const CGFunctionInfo
&
262 arrangeUnprototypedMustTailThunk(const CXXMethodDecl
*MD
);
263 const CGFunctionInfo
&arrangeMSCtorClosure(const CXXConstructorDecl
*CD
,
265 const CGFunctionInfo
&arrangeCXXMethodType(const CXXRecordDecl
*RD
,
266 const FunctionProtoType
*FTP
,
267 const CXXMethodDecl
*MD
);
269 /// "Arrange" the LLVM information for a call or type with the given
270 /// signature. This is largely an internal method; other clients
271 /// should use one of the above routines, which ultimately defer to
274 /// \param argTypes - must all actually be canonical as params
275 const CGFunctionInfo
&arrangeLLVMFunctionInfo(
276 CanQualType returnType
, FnInfoOpts opts
, ArrayRef
<CanQualType
> argTypes
,
277 FunctionType::ExtInfo info
,
278 ArrayRef
<FunctionProtoType::ExtParameterInfo
> paramInfos
,
281 /// Compute a new LLVM record layout object for the given record.
282 std::unique_ptr
<CGRecordLayout
> ComputeRecordLayout(const RecordDecl
*D
,
283 llvm::StructType
*Ty
);
285 /// addRecordTypeName - Compute a name from the given record decl with an
286 /// optional suffix and name the given LLVM type using it.
287 void addRecordTypeName(const RecordDecl
*RD
, llvm::StructType
*Ty
,
291 public: // These are internal details of CGT that shouldn't be used externally.
292 /// ConvertRecordDeclType - Lay out a tagged decl type like struct or union.
293 llvm::StructType
*ConvertRecordDeclType(const RecordDecl
*TD
);
295 /// getExpandedTypes - Expand the type \arg Ty into the LLVM
296 /// argument types it would be passed as. See ABIArgInfo::Expand.
297 void getExpandedTypes(QualType Ty
,
298 SmallVectorImpl
<llvm::Type
*>::iterator
&TI
);
300 /// IsZeroInitializable - Return whether a type can be
301 /// zero-initialized (in the C++ sense) with an LLVM zeroinitializer.
302 bool isZeroInitializable(QualType T
);
304 /// Check if the pointer type can be zero-initialized (in the C++ sense)
305 /// with an LLVM zeroinitializer.
306 bool isPointerZeroInitializable(QualType T
);
308 /// IsZeroInitializable - Return whether a record type can be
309 /// zero-initialized (in the C++ sense) with an LLVM zeroinitializer.
310 bool isZeroInitializable(const RecordDecl
*RD
);
312 bool isLongDoubleReferenced() const { return LongDoubleReferenced
; }
313 bool isRecordLayoutComplete(const Type
*Ty
) const;
314 unsigned getTargetAddressSpace(QualType T
) const;
317 } // end namespace CodeGen
318 } // end namespace clang