xref: /freebsd/contrib/llvm-project/clang/lib/CodeGen/CodeGenTypes.h (revision 5deeebd8c6ca991269e72902a7a62cada57947f6)
1 //===--- CodeGenTypes.h - Type translation for LLVM CodeGen -----*- 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 // This is the code that handles AST -> LLVM type lowering.
10 //
11 //===----------------------------------------------------------------------===//
12 
13 #ifndef LLVM_CLANG_LIB_CODEGEN_CODEGENTYPES_H
14 #define LLVM_CLANG_LIB_CODEGEN_CODEGENTYPES_H
15 
16 #include "CGCall.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"
21 
22 namespace llvm {
23 class FunctionType;
24 class DataLayout;
25 class Type;
26 class LLVMContext;
27 class StructType;
28 }
29 
30 namespace clang {
31 class ASTContext;
32 template <typename> class CanQual;
33 class CXXConstructorDecl;
34 class CXXMethodDecl;
35 class CodeGenOptions;
36 class FunctionProtoType;
37 class QualType;
38 class RecordDecl;
39 class TagDecl;
40 class TargetInfo;
41 class Type;
42 typedef CanQual<Type> CanQualType;
43 class GlobalDecl;
44 
45 namespace CodeGen {
46 class ABIInfo;
47 class CGCXXABI;
48 class CGRecordLayout;
49 class CodeGenModule;
50 class RequiredArgs;
51 
52 /// This class organizes the cross-module state that is used while lowering
53 /// AST types to LLVM types.
54 class CodeGenTypes {
55   CodeGenModule &CGM;
56   // Some of this stuff should probably be left on the CGM.
57   ASTContext &Context;
58   llvm::Module &TheModule;
59   const TargetInfo &Target;
60 
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;
66 
67   /// Maps clang struct type with corresponding record layout info.
68   llvm::DenseMap<const Type*, std::unique_ptr<CGRecordLayout>> CGRecordLayouts;
69 
70   /// Contains the LLVM IR type for any converted RecordDecl.
71   llvm::DenseMap<const Type*, llvm::StructType *> RecordDeclTypes;
72 
73   /// Hold memoized CGFunctionInfo results.
74   llvm::FoldingSet<CGFunctionInfo> FunctionInfos{FunctionInfosLog2InitSize};
75 
76   llvm::SmallPtrSet<const CGFunctionInfo*, 4> FunctionsBeingProcessed;
77 
78   /// True if we didn't layout a function due to a being inside
79   /// a recursive struct conversion, set this to true.
80   bool SkippedLayout;
81 
82   /// True if any instance of long double types are used.
83   bool LongDoubleReferenced;
84 
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;
88 
89   llvm::DenseMap<const Type *, llvm::Type *> RecordsWithOpaqueMemberPointers;
90 
91   static constexpr unsigned FunctionInfosLog2InitSize = 9;
92   /// Helper for ConvertType.
93   llvm::Type *ConvertFunctionTypeInternal(QualType FT);
94 
95 public:
96   CodeGenTypes(CodeGenModule &cgm);
97   ~CodeGenTypes();
98 
getDataLayout()99   const llvm::DataLayout &getDataLayout() const {
100     return TheModule.getDataLayout();
101   }
getCGM()102   CodeGenModule &getCGM() const { return CGM; }
getContext()103   ASTContext &getContext() const { return Context; }
getTarget()104   const TargetInfo &getTarget() const { return Target; }
105   CGCXXABI &getCXXABI() const;
getLLVMContext()106   llvm::LLVMContext &getLLVMContext() { return TheModule.getContext(); }
107   const CodeGenOptions &getCodeGenOpts() const;
108 
109   /// Convert clang calling convention to LLVM callilng convention.
110   unsigned ClangCallConvToLLVMCallConv(CallingConv CC);
111 
112   /// Derives the 'this' type for codegen purposes, i.e. ignoring method CVR
113   /// qualification.
114   CanQualType DeriveThisType(const CXXRecordDecl *RD, const CXXMethodDecl *MD);
115 
116   /// ConvertType - Convert type T into a llvm::Type.
117   llvm::Type *ConvertType(QualType T);
118 
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);
124 
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);
133 
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.
140   ///
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);
147 
148   /// GetFunctionType - Get the LLVM function type for \arg Info.
149   llvm::FunctionType *GetFunctionType(const CGFunctionInfo &Info);
150 
151   llvm::FunctionType *GetFunctionType(GlobalDecl GD);
152 
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
155   /// type).
156   bool isFuncTypeConvertible(const FunctionType *FT);
157   bool isFuncParamTypeConvertible(QualType Ty);
158 
159   /// Determine if a C++ inheriting constructor should have parameters matching
160   /// those of its inherited constructor.
161   bool inheritingCtorHasParams(const InheritedConstructor &Inherited,
162                                CXXCtorType Type);
163 
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);
168 
169   const CGRecordLayout &getCGRecordLayout(const RecordDecl*);
170 
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);
174 
175   /// Remove stale types from the type cache when an inheritance model
176   /// gets assigned to a class.
177   void RefreshTypeCacheForClass(const CXXRecordDecl *RD);
178 
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.
187   //
188   // Key points:
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
193   //   go awry.
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.
198 
199   const CGFunctionInfo &arrangeGlobalDeclaration(GlobalDecl GD);
200 
201   /// Given a function info for a declaration, return the function info
202   /// for a call with the given arguments.
203   ///
204   /// Often this will be able to simply return the declaration info.
205   const CGFunctionInfo &arrangeCall(const CGFunctionInfo &declFI,
206                                     const CallArgList &args);
207 
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,
213                                                 bool ChainCall);
214   const CGFunctionInfo &arrangeFreeFunctionType(CanQual<FunctionProtoType> Ty);
215   const CGFunctionInfo &arrangeFreeFunctionType(CanQual<FunctionNoProtoType> Ty);
216 
217   /// A nullary function is a freestanding function of type 'void ()'.
218   /// This method works for both calls and declarations.
219   const CGFunctionInfo &arrangeNullaryFunction();
220 
221   /// A builtin function is a freestanding function using the default
222   /// C conventions.
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);
231 
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(
237                                                      QualType returnType,
238                                                      const CallArgList &args);
239 
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);
246 
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);
256 
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,
264                                                  CXXCtorType CT);
265   const CGFunctionInfo &arrangeCXXMethodType(const CXXRecordDecl *RD,
266                                              const FunctionProtoType *FTP,
267                                              const CXXMethodDecl *MD);
268 
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
272   /// this.
273   ///
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,
279       RequiredArgs args);
280 
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);
284 
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,
288                          StringRef suffix);
289 
290 
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);
294 
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);
299 
300   /// IsZeroInitializable - Return whether a type can be
301   /// zero-initialized (in the C++ sense) with an LLVM zeroinitializer.
302   bool isZeroInitializable(QualType T);
303 
304   /// Check if the pointer type can be zero-initialized (in the C++ sense)
305   /// with an LLVM zeroinitializer.
306   bool isPointerZeroInitializable(QualType T);
307 
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);
311 
isLongDoubleReferenced()312   bool isLongDoubleReferenced() const { return LongDoubleReferenced; }
313   bool isRecordLayoutComplete(const Type *Ty) const;
314   unsigned getTargetAddressSpace(QualType T) const;
315 };
316 
317 }  // end namespace CodeGen
318 }  // end namespace clang
319 
320 #endif
321