Bug Summary

File:clang/lib/CodeGen/CGObjCMac.cpp
Warning:line 2578, column 26
Called C++ object pointer is null

Annotated Source Code

Press '?' to see keyboard shortcuts

clang -cc1 -cc1 -triple x86_64-pc-linux-gnu -analyze -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name CGObjCMac.cpp -analyzer-store=region -analyzer-opt-analyze-nested-blocks -analyzer-checker=core -analyzer-checker=apiModeling -analyzer-checker=unix -analyzer-checker=deadcode -analyzer-checker=cplusplus -analyzer-checker=security.insecureAPI.UncheckedReturn -analyzer-checker=security.insecureAPI.getpw -analyzer-checker=security.insecureAPI.gets -analyzer-checker=security.insecureAPI.mktemp -analyzer-checker=security.insecureAPI.mkstemp -analyzer-checker=security.insecureAPI.vfork -analyzer-checker=nullability.NullPassedToNonnull -analyzer-checker=nullability.NullReturnedFromNonnull -analyzer-output plist -w -setup-static-analyzer -analyzer-config-compatibility-mode=true -mrelocation-model pic -pic-level 2 -mframe-pointer=none -relaxed-aliasing -fmath-errno -ffp-contract=on -fno-rounding-math -mconstructor-aliases -funwind-tables=2 -target-cpu x86-64 -tune-cpu generic -debugger-tuning=gdb -ffunction-sections -fdata-sections -fcoverage-compilation-dir=/build/llvm-toolchain-snapshot-14~++20220108111521+9345ab3a4550/build-llvm -resource-dir /usr/lib/llvm-14/lib/clang/14.0.0 -D _DEBUG -D _GNU_SOURCE -D __STDC_CONSTANT_MACROS -D __STDC_FORMAT_MACROS -D __STDC_LIMIT_MACROS -I tools/clang/lib/CodeGen -I /build/llvm-toolchain-snapshot-14~++20220108111521+9345ab3a4550/clang/lib/CodeGen -I /build/llvm-toolchain-snapshot-14~++20220108111521+9345ab3a4550/clang/include -I tools/clang/include -I include -I /build/llvm-toolchain-snapshot-14~++20220108111521+9345ab3a4550/llvm/include -D _FORTIFY_SOURCE=2 -D NDEBUG -U NDEBUG -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/10/../../../../include/c++/10 -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/10/../../../../include/x86_64-linux-gnu/c++/10 -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/10/../../../../include/c++/10/backward -internal-isystem /usr/lib/llvm-14/lib/clang/14.0.0/include -internal-isystem /usr/local/include -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/10/../../../../x86_64-linux-gnu/include -internal-externc-isystem /usr/include/x86_64-linux-gnu -internal-externc-isystem /include -internal-externc-isystem /usr/include -fmacro-prefix-map=/build/llvm-toolchain-snapshot-14~++20220108111521+9345ab3a4550/build-llvm=build-llvm -fmacro-prefix-map=/build/llvm-toolchain-snapshot-14~++20220108111521+9345ab3a4550/= -fcoverage-prefix-map=/build/llvm-toolchain-snapshot-14~++20220108111521+9345ab3a4550/build-llvm=build-llvm -fcoverage-prefix-map=/build/llvm-toolchain-snapshot-14~++20220108111521+9345ab3a4550/= -O3 -Wno-unused-command-line-argument -Wno-unused-parameter -Wwrite-strings -Wno-missing-field-initializers -Wno-long-long -Wno-maybe-uninitialized -Wno-class-memaccess -Wno-redundant-move -Wno-pessimizing-move -Wno-noexcept-type -Wno-comment -std=c++14 -fdeprecated-macro -fdebug-compilation-dir=/build/llvm-toolchain-snapshot-14~++20220108111521+9345ab3a4550/build-llvm -fdebug-prefix-map=/build/llvm-toolchain-snapshot-14~++20220108111521+9345ab3a4550/build-llvm=build-llvm -fdebug-prefix-map=/build/llvm-toolchain-snapshot-14~++20220108111521+9345ab3a4550/= -ferror-limit 19 -fvisibility-inlines-hidden -stack-protector 2 -fgnuc-version=4.2.1 -fcolor-diagnostics -vectorize-loops -vectorize-slp -analyzer-output=html -analyzer-config stable-report-filename=true -faddrsig -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o /tmp/scan-build-2022-01-08-143526-16334-1 -x c++ /build/llvm-toolchain-snapshot-14~++20220108111521+9345ab3a4550/clang/lib/CodeGen/CGObjCMac.cpp

/build/llvm-toolchain-snapshot-14~++20220108111521+9345ab3a4550/clang/lib/CodeGen/CGObjCMac.cpp

1//===------- CGObjCMac.cpp - Interface to Apple Objective-C Runtime -------===//
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 provides Objective-C code generation targeting the Apple runtime.
10//
11//===----------------------------------------------------------------------===//
12
13#include "CGBlocks.h"
14#include "CGCleanup.h"
15#include "CGObjCRuntime.h"
16#include "CGRecordLayout.h"
17#include "CodeGenFunction.h"
18#include "CodeGenModule.h"
19#include "clang/AST/ASTContext.h"
20#include "clang/AST/Attr.h"
21#include "clang/AST/Decl.h"
22#include "clang/AST/DeclObjC.h"
23#include "clang/AST/Mangle.h"
24#include "clang/AST/RecordLayout.h"
25#include "clang/AST/StmtObjC.h"
26#include "clang/Basic/CodeGenOptions.h"
27#include "clang/Basic/LangOptions.h"
28#include "clang/CodeGen/CGFunctionInfo.h"
29#include "clang/CodeGen/ConstantInitBuilder.h"
30#include "llvm/ADT/CachedHashString.h"
31#include "llvm/ADT/DenseSet.h"
32#include "llvm/ADT/SetVector.h"
33#include "llvm/ADT/SmallPtrSet.h"
34#include "llvm/ADT/SmallString.h"
35#include "llvm/ADT/UniqueVector.h"
36#include "llvm/IR/DataLayout.h"
37#include "llvm/IR/InlineAsm.h"
38#include "llvm/IR/IntrinsicInst.h"
39#include "llvm/IR/LLVMContext.h"
40#include "llvm/IR/Module.h"
41#include "llvm/Support/ScopedPrinter.h"
42#include "llvm/Support/raw_ostream.h"
43#include <cstdio>
44
45using namespace clang;
46using namespace CodeGen;
47
48namespace {
49
50// FIXME: We should find a nicer way to make the labels for metadata, string
51// concatenation is lame.
52
53class ObjCCommonTypesHelper {
54protected:
55 llvm::LLVMContext &VMContext;
56
57private:
58 // The types of these functions don't really matter because we
59 // should always bitcast before calling them.
60
61 /// id objc_msgSend (id, SEL, ...)
62 ///
63 /// The default messenger, used for sends whose ABI is unchanged from
64 /// the all-integer/pointer case.
65 llvm::FunctionCallee getMessageSendFn() const {
66 // Add the non-lazy-bind attribute, since objc_msgSend is likely to
67 // be called a lot.
68 llvm::Type *params[] = { ObjectPtrTy, SelectorPtrTy };
69 return CGM.CreateRuntimeFunction(
70 llvm::FunctionType::get(ObjectPtrTy, params, true), "objc_msgSend",
71 llvm::AttributeList::get(CGM.getLLVMContext(),
72 llvm::AttributeList::FunctionIndex,
73 llvm::Attribute::NonLazyBind));
74 }
75
76 /// void objc_msgSend_stret (id, SEL, ...)
77 ///
78 /// The messenger used when the return value is an aggregate returned
79 /// by indirect reference in the first argument, and therefore the
80 /// self and selector parameters are shifted over by one.
81 llvm::FunctionCallee getMessageSendStretFn() const {
82 llvm::Type *params[] = { ObjectPtrTy, SelectorPtrTy };
83 return CGM.CreateRuntimeFunction(llvm::FunctionType::get(CGM.VoidTy,
84 params, true),
85 "objc_msgSend_stret");
86 }
87
88 /// [double | long double] objc_msgSend_fpret(id self, SEL op, ...)
89 ///
90 /// The messenger used when the return value is returned on the x87
91 /// floating-point stack; without a special entrypoint, the nil case
92 /// would be unbalanced.
93 llvm::FunctionCallee getMessageSendFpretFn() const {
94 llvm::Type *params[] = { ObjectPtrTy, SelectorPtrTy };
95 return CGM.CreateRuntimeFunction(llvm::FunctionType::get(CGM.DoubleTy,
96 params, true),
97 "objc_msgSend_fpret");
98 }
99
100 /// _Complex long double objc_msgSend_fp2ret(id self, SEL op, ...)
101 ///
102 /// The messenger used when the return value is returned in two values on the
103 /// x87 floating point stack; without a special entrypoint, the nil case
104 /// would be unbalanced. Only used on 64-bit X86.
105 llvm::FunctionCallee getMessageSendFp2retFn() const {
106 llvm::Type *params[] = { ObjectPtrTy, SelectorPtrTy };
107 llvm::Type *longDoubleType = llvm::Type::getX86_FP80Ty(VMContext);
108 llvm::Type *resultType =
109 llvm::StructType::get(longDoubleType, longDoubleType);
110
111 return CGM.CreateRuntimeFunction(llvm::FunctionType::get(resultType,
112 params, true),
113 "objc_msgSend_fp2ret");
114 }
115
116 /// id objc_msgSendSuper(struct objc_super *super, SEL op, ...)
117 ///
118 /// The messenger used for super calls, which have different dispatch
119 /// semantics. The class passed is the superclass of the current
120 /// class.
121 llvm::FunctionCallee getMessageSendSuperFn() const {
122 llvm::Type *params[] = { SuperPtrTy, SelectorPtrTy };
123 return CGM.CreateRuntimeFunction(llvm::FunctionType::get(ObjectPtrTy,
124 params, true),
125 "objc_msgSendSuper");
126 }
127
128 /// id objc_msgSendSuper2(struct objc_super *super, SEL op, ...)
129 ///
130 /// A slightly different messenger used for super calls. The class
131 /// passed is the current class.
132 llvm::FunctionCallee getMessageSendSuperFn2() const {
133 llvm::Type *params[] = { SuperPtrTy, SelectorPtrTy };
134 return CGM.CreateRuntimeFunction(llvm::FunctionType::get(ObjectPtrTy,
135 params, true),
136 "objc_msgSendSuper2");
137 }
138
139 /// void objc_msgSendSuper_stret(void *stretAddr, struct objc_super *super,
140 /// SEL op, ...)
141 ///
142 /// The messenger used for super calls which return an aggregate indirectly.
143 llvm::FunctionCallee getMessageSendSuperStretFn() const {
144 llvm::Type *params[] = { Int8PtrTy, SuperPtrTy, SelectorPtrTy };
145 return CGM.CreateRuntimeFunction(
146 llvm::FunctionType::get(CGM.VoidTy, params, true),
147 "objc_msgSendSuper_stret");
148 }
149
150 /// void objc_msgSendSuper2_stret(void * stretAddr, struct objc_super *super,
151 /// SEL op, ...)
152 ///
153 /// objc_msgSendSuper_stret with the super2 semantics.
154 llvm::FunctionCallee getMessageSendSuperStretFn2() const {
155 llvm::Type *params[] = { Int8PtrTy, SuperPtrTy, SelectorPtrTy };
156 return CGM.CreateRuntimeFunction(
157 llvm::FunctionType::get(CGM.VoidTy, params, true),
158 "objc_msgSendSuper2_stret");
159 }
160
161 llvm::FunctionCallee getMessageSendSuperFpretFn() const {
162 // There is no objc_msgSendSuper_fpret? How can that work?
163 return getMessageSendSuperFn();
164 }
165
166 llvm::FunctionCallee getMessageSendSuperFpretFn2() const {
167 // There is no objc_msgSendSuper_fpret? How can that work?
168 return getMessageSendSuperFn2();
169 }
170
171protected:
172 CodeGen::CodeGenModule &CGM;
173
174public:
175 llvm::IntegerType *ShortTy, *IntTy, *LongTy;
176 llvm::PointerType *Int8PtrTy, *Int8PtrPtrTy;
177 llvm::Type *IvarOffsetVarTy;
178
179 /// ObjectPtrTy - LLVM type for object handles (typeof(id))
180 llvm::PointerType *ObjectPtrTy;
181
182 /// PtrObjectPtrTy - LLVM type for id *
183 llvm::PointerType *PtrObjectPtrTy;
184
185 /// SelectorPtrTy - LLVM type for selector handles (typeof(SEL))
186 llvm::PointerType *SelectorPtrTy;
187
188private:
189 /// ProtocolPtrTy - LLVM type for external protocol handles
190 /// (typeof(Protocol))
191 llvm::Type *ExternalProtocolPtrTy;
192
193public:
194 llvm::Type *getExternalProtocolPtrTy() {
195 if (!ExternalProtocolPtrTy) {
196 // FIXME: It would be nice to unify this with the opaque type, so that the
197 // IR comes out a bit cleaner.
198 CodeGen::CodeGenTypes &Types = CGM.getTypes();
199 ASTContext &Ctx = CGM.getContext();
200 llvm::Type *T = Types.ConvertType(Ctx.getObjCProtoType());
201 ExternalProtocolPtrTy = llvm::PointerType::getUnqual(T);
202 }
203
204 return ExternalProtocolPtrTy;
205 }
206
207 // SuperCTy - clang type for struct objc_super.
208 QualType SuperCTy;
209 // SuperPtrCTy - clang type for struct objc_super *.
210 QualType SuperPtrCTy;
211
212 /// SuperTy - LLVM type for struct objc_super.
213 llvm::StructType *SuperTy;
214 /// SuperPtrTy - LLVM type for struct objc_super *.
215 llvm::PointerType *SuperPtrTy;
216
217 /// PropertyTy - LLVM type for struct objc_property (struct _prop_t
218 /// in GCC parlance).
219 llvm::StructType *PropertyTy;
220
221 /// PropertyListTy - LLVM type for struct objc_property_list
222 /// (_prop_list_t in GCC parlance).
223 llvm::StructType *PropertyListTy;
224 /// PropertyListPtrTy - LLVM type for struct objc_property_list*.
225 llvm::PointerType *PropertyListPtrTy;
226
227 // MethodTy - LLVM type for struct objc_method.
228 llvm::StructType *MethodTy;
229
230 /// CacheTy - LLVM type for struct objc_cache.
231 llvm::Type *CacheTy;
232 /// CachePtrTy - LLVM type for struct objc_cache *.
233 llvm::PointerType *CachePtrTy;
234
235 llvm::FunctionCallee getGetPropertyFn() {
236 CodeGen::CodeGenTypes &Types = CGM.getTypes();
237 ASTContext &Ctx = CGM.getContext();
238 // id objc_getProperty (id, SEL, ptrdiff_t, bool)
239 CanQualType IdType = Ctx.getCanonicalParamType(Ctx.getObjCIdType());
240 CanQualType SelType = Ctx.getCanonicalParamType(Ctx.getObjCSelType());
241 CanQualType Params[] = {
242 IdType, SelType,
243 Ctx.getPointerDiffType()->getCanonicalTypeUnqualified(), Ctx.BoolTy};
244 llvm::FunctionType *FTy =
245 Types.GetFunctionType(
246 Types.arrangeBuiltinFunctionDeclaration(IdType, Params));
247 return CGM.CreateRuntimeFunction(FTy, "objc_getProperty");
248 }
249
250 llvm::FunctionCallee getSetPropertyFn() {
251 CodeGen::CodeGenTypes &Types = CGM.getTypes();
252 ASTContext &Ctx = CGM.getContext();
253 // void objc_setProperty (id, SEL, ptrdiff_t, id, bool, bool)
254 CanQualType IdType = Ctx.getCanonicalParamType(Ctx.getObjCIdType());
255 CanQualType SelType = Ctx.getCanonicalParamType(Ctx.getObjCSelType());
256 CanQualType Params[] = {
257 IdType,
258 SelType,
259 Ctx.getPointerDiffType()->getCanonicalTypeUnqualified(),
260 IdType,
261 Ctx.BoolTy,
262 Ctx.BoolTy};
263 llvm::FunctionType *FTy =
264 Types.GetFunctionType(
265 Types.arrangeBuiltinFunctionDeclaration(Ctx.VoidTy, Params));
266 return CGM.CreateRuntimeFunction(FTy, "objc_setProperty");
267 }
268
269 llvm::FunctionCallee getOptimizedSetPropertyFn(bool atomic, bool copy) {
270 CodeGen::CodeGenTypes &Types = CGM.getTypes();
271 ASTContext &Ctx = CGM.getContext();
272 // void objc_setProperty_atomic(id self, SEL _cmd,
273 // id newValue, ptrdiff_t offset);
274 // void objc_setProperty_nonatomic(id self, SEL _cmd,
275 // id newValue, ptrdiff_t offset);
276 // void objc_setProperty_atomic_copy(id self, SEL _cmd,
277 // id newValue, ptrdiff_t offset);
278 // void objc_setProperty_nonatomic_copy(id self, SEL _cmd,
279 // id newValue, ptrdiff_t offset);
280
281 SmallVector<CanQualType,4> Params;
282 CanQualType IdType = Ctx.getCanonicalParamType(Ctx.getObjCIdType());
283 CanQualType SelType = Ctx.getCanonicalParamType(Ctx.getObjCSelType());
284 Params.push_back(IdType);
285 Params.push_back(SelType);
286 Params.push_back(IdType);
287 Params.push_back(Ctx.getPointerDiffType()->getCanonicalTypeUnqualified());
288 llvm::FunctionType *FTy =
289 Types.GetFunctionType(
290 Types.arrangeBuiltinFunctionDeclaration(Ctx.VoidTy, Params));
291 const char *name;
292 if (atomic && copy)
293 name = "objc_setProperty_atomic_copy";
294 else if (atomic && !copy)
295 name = "objc_setProperty_atomic";
296 else if (!atomic && copy)
297 name = "objc_setProperty_nonatomic_copy";
298 else
299 name = "objc_setProperty_nonatomic";
300
301 return CGM.CreateRuntimeFunction(FTy, name);
302 }
303
304 llvm::FunctionCallee getCopyStructFn() {
305 CodeGen::CodeGenTypes &Types = CGM.getTypes();
306 ASTContext &Ctx = CGM.getContext();
307 // void objc_copyStruct (void *, const void *, size_t, bool, bool)
308 SmallVector<CanQualType,5> Params;
309 Params.push_back(Ctx.VoidPtrTy);
310 Params.push_back(Ctx.VoidPtrTy);
311 Params.push_back(Ctx.getSizeType());
312 Params.push_back(Ctx.BoolTy);
313 Params.push_back(Ctx.BoolTy);
314 llvm::FunctionType *FTy =
315 Types.GetFunctionType(
316 Types.arrangeBuiltinFunctionDeclaration(Ctx.VoidTy, Params));
317 return CGM.CreateRuntimeFunction(FTy, "objc_copyStruct");
318 }
319
320 /// This routine declares and returns address of:
321 /// void objc_copyCppObjectAtomic(
322 /// void *dest, const void *src,
323 /// void (*copyHelper) (void *dest, const void *source));
324 llvm::FunctionCallee getCppAtomicObjectFunction() {
325 CodeGen::CodeGenTypes &Types = CGM.getTypes();
326 ASTContext &Ctx = CGM.getContext();
327 /// void objc_copyCppObjectAtomic(void *dest, const void *src, void *helper);
328 SmallVector<CanQualType,3> Params;
329 Params.push_back(Ctx.VoidPtrTy);
330 Params.push_back(Ctx.VoidPtrTy);
331 Params.push_back(Ctx.VoidPtrTy);
332 llvm::FunctionType *FTy =
333 Types.GetFunctionType(
334 Types.arrangeBuiltinFunctionDeclaration(Ctx.VoidTy, Params));
335 return CGM.CreateRuntimeFunction(FTy, "objc_copyCppObjectAtomic");
336 }
337
338 llvm::FunctionCallee getEnumerationMutationFn() {
339 CodeGen::CodeGenTypes &Types = CGM.getTypes();
340 ASTContext &Ctx = CGM.getContext();
341 // void objc_enumerationMutation (id)
342 SmallVector<CanQualType,1> Params;
343 Params.push_back(Ctx.getCanonicalParamType(Ctx.getObjCIdType()));
344 llvm::FunctionType *FTy =
345 Types.GetFunctionType(
346 Types.arrangeBuiltinFunctionDeclaration(Ctx.VoidTy, Params));
347 return CGM.CreateRuntimeFunction(FTy, "objc_enumerationMutation");
348 }
349
350 llvm::FunctionCallee getLookUpClassFn() {
351 CodeGen::CodeGenTypes &Types = CGM.getTypes();
352 ASTContext &Ctx = CGM.getContext();
353 // Class objc_lookUpClass (const char *)
354 SmallVector<CanQualType,1> Params;
355 Params.push_back(
356 Ctx.getCanonicalType(Ctx.getPointerType(Ctx.CharTy.withConst())));
357 llvm::FunctionType *FTy =
358 Types.GetFunctionType(Types.arrangeBuiltinFunctionDeclaration(
359 Ctx.getCanonicalType(Ctx.getObjCClassType()),
360 Params));
361 return CGM.CreateRuntimeFunction(FTy, "objc_lookUpClass");
362 }
363
364 /// GcReadWeakFn -- LLVM objc_read_weak (id *src) function.
365 llvm::FunctionCallee getGcReadWeakFn() {
366 // id objc_read_weak (id *)
367 llvm::Type *args[] = { ObjectPtrTy->getPointerTo() };
368 llvm::FunctionType *FTy =
369 llvm::FunctionType::get(ObjectPtrTy, args, false);
370 return CGM.CreateRuntimeFunction(FTy, "objc_read_weak");
371 }
372
373 /// GcAssignWeakFn -- LLVM objc_assign_weak function.
374 llvm::FunctionCallee getGcAssignWeakFn() {
375 // id objc_assign_weak (id, id *)
376 llvm::Type *args[] = { ObjectPtrTy, ObjectPtrTy->getPointerTo() };
377 llvm::FunctionType *FTy =
378 llvm::FunctionType::get(ObjectPtrTy, args, false);
379 return CGM.CreateRuntimeFunction(FTy, "objc_assign_weak");
380 }
381
382 /// GcAssignGlobalFn -- LLVM objc_assign_global function.
383 llvm::FunctionCallee getGcAssignGlobalFn() {
384 // id objc_assign_global(id, id *)
385 llvm::Type *args[] = { ObjectPtrTy, ObjectPtrTy->getPointerTo() };
386 llvm::FunctionType *FTy =
387 llvm::FunctionType::get(ObjectPtrTy, args, false);
388 return CGM.CreateRuntimeFunction(FTy, "objc_assign_global");
389 }
390
391 /// GcAssignThreadLocalFn -- LLVM objc_assign_threadlocal function.
392 llvm::FunctionCallee getGcAssignThreadLocalFn() {
393 // id objc_assign_threadlocal(id src, id * dest)
394 llvm::Type *args[] = { ObjectPtrTy, ObjectPtrTy->getPointerTo() };
395 llvm::FunctionType *FTy =
396 llvm::FunctionType::get(ObjectPtrTy, args, false);
397 return CGM.CreateRuntimeFunction(FTy, "objc_assign_threadlocal");
398 }
399
400 /// GcAssignIvarFn -- LLVM objc_assign_ivar function.
401 llvm::FunctionCallee getGcAssignIvarFn() {
402 // id objc_assign_ivar(id, id *, ptrdiff_t)
403 llvm::Type *args[] = { ObjectPtrTy, ObjectPtrTy->getPointerTo(),
404 CGM.PtrDiffTy };
405 llvm::FunctionType *FTy =
406 llvm::FunctionType::get(ObjectPtrTy, args, false);
407 return CGM.CreateRuntimeFunction(FTy, "objc_assign_ivar");
408 }
409
410 /// GcMemmoveCollectableFn -- LLVM objc_memmove_collectable function.
411 llvm::FunctionCallee GcMemmoveCollectableFn() {
412 // void *objc_memmove_collectable(void *dst, const void *src, size_t size)
413 llvm::Type *args[] = { Int8PtrTy, Int8PtrTy, LongTy };
414 llvm::FunctionType *FTy = llvm::FunctionType::get(Int8PtrTy, args, false);
415 return CGM.CreateRuntimeFunction(FTy, "objc_memmove_collectable");
416 }
417
418 /// GcAssignStrongCastFn -- LLVM objc_assign_strongCast function.
419 llvm::FunctionCallee getGcAssignStrongCastFn() {
420 // id objc_assign_strongCast(id, id *)
421 llvm::Type *args[] = { ObjectPtrTy, ObjectPtrTy->getPointerTo() };
422 llvm::FunctionType *FTy =
423 llvm::FunctionType::get(ObjectPtrTy, args, false);
424 return CGM.CreateRuntimeFunction(FTy, "objc_assign_strongCast");
425 }
426
427 /// ExceptionThrowFn - LLVM objc_exception_throw function.
428 llvm::FunctionCallee getExceptionThrowFn() {
429 // void objc_exception_throw(id)
430 llvm::Type *args[] = { ObjectPtrTy };
431 llvm::FunctionType *FTy =
432 llvm::FunctionType::get(CGM.VoidTy, args, false);
433 return CGM.CreateRuntimeFunction(FTy, "objc_exception_throw");
434 }
435
436 /// ExceptionRethrowFn - LLVM objc_exception_rethrow function.
437 llvm::FunctionCallee getExceptionRethrowFn() {
438 // void objc_exception_rethrow(void)
439 llvm::FunctionType *FTy = llvm::FunctionType::get(CGM.VoidTy, false);
440 return CGM.CreateRuntimeFunction(FTy, "objc_exception_rethrow");
441 }
442
443 /// SyncEnterFn - LLVM object_sync_enter function.
444 llvm::FunctionCallee getSyncEnterFn() {
445 // int objc_sync_enter (id)
446 llvm::Type *args[] = { ObjectPtrTy };
447 llvm::FunctionType *FTy =
448 llvm::FunctionType::get(CGM.IntTy, args, false);
449 return CGM.CreateRuntimeFunction(FTy, "objc_sync_enter");
450 }
451
452 /// SyncExitFn - LLVM object_sync_exit function.
453 llvm::FunctionCallee getSyncExitFn() {
454 // int objc_sync_exit (id)
455 llvm::Type *args[] = { ObjectPtrTy };
456 llvm::FunctionType *FTy =
457 llvm::FunctionType::get(CGM.IntTy, args, false);
458 return CGM.CreateRuntimeFunction(FTy, "objc_sync_exit");
459 }
460
461 llvm::FunctionCallee getSendFn(bool IsSuper) const {
462 return IsSuper ? getMessageSendSuperFn() : getMessageSendFn();
463 }
464
465 llvm::FunctionCallee getSendFn2(bool IsSuper) const {
466 return IsSuper ? getMessageSendSuperFn2() : getMessageSendFn();
467 }
468
469 llvm::FunctionCallee getSendStretFn(bool IsSuper) const {
470 return IsSuper ? getMessageSendSuperStretFn() : getMessageSendStretFn();
471 }
472
473 llvm::FunctionCallee getSendStretFn2(bool IsSuper) const {
474 return IsSuper ? getMessageSendSuperStretFn2() : getMessageSendStretFn();
475 }
476
477 llvm::FunctionCallee getSendFpretFn(bool IsSuper) const {
478 return IsSuper ? getMessageSendSuperFpretFn() : getMessageSendFpretFn();
479 }
480
481 llvm::FunctionCallee getSendFpretFn2(bool IsSuper) const {
482 return IsSuper ? getMessageSendSuperFpretFn2() : getMessageSendFpretFn();
483 }
484
485 llvm::FunctionCallee getSendFp2retFn(bool IsSuper) const {
486 return IsSuper ? getMessageSendSuperFn() : getMessageSendFp2retFn();
487 }
488
489 llvm::FunctionCallee getSendFp2RetFn2(bool IsSuper) const {
490 return IsSuper ? getMessageSendSuperFn2() : getMessageSendFp2retFn();
491 }
492
493 ObjCCommonTypesHelper(CodeGen::CodeGenModule &cgm);
494};
495
496/// ObjCTypesHelper - Helper class that encapsulates lazy
497/// construction of varies types used during ObjC generation.
498class ObjCTypesHelper : public ObjCCommonTypesHelper {
499public:
500 /// SymtabTy - LLVM type for struct objc_symtab.
501 llvm::StructType *SymtabTy;
502 /// SymtabPtrTy - LLVM type for struct objc_symtab *.
503 llvm::PointerType *SymtabPtrTy;
504 /// ModuleTy - LLVM type for struct objc_module.
505 llvm::StructType *ModuleTy;
506
507 /// ProtocolTy - LLVM type for struct objc_protocol.
508 llvm::StructType *ProtocolTy;
509 /// ProtocolPtrTy - LLVM type for struct objc_protocol *.
510 llvm::PointerType *ProtocolPtrTy;
511 /// ProtocolExtensionTy - LLVM type for struct
512 /// objc_protocol_extension.
513 llvm::StructType *ProtocolExtensionTy;
514 /// ProtocolExtensionTy - LLVM type for struct
515 /// objc_protocol_extension *.
516 llvm::PointerType *ProtocolExtensionPtrTy;
517 /// MethodDescriptionTy - LLVM type for struct
518 /// objc_method_description.
519 llvm::StructType *MethodDescriptionTy;
520 /// MethodDescriptionListTy - LLVM type for struct
521 /// objc_method_description_list.
522 llvm::StructType *MethodDescriptionListTy;
523 /// MethodDescriptionListPtrTy - LLVM type for struct
524 /// objc_method_description_list *.
525 llvm::PointerType *MethodDescriptionListPtrTy;
526 /// ProtocolListTy - LLVM type for struct objc_property_list.
527 llvm::StructType *ProtocolListTy;
528 /// ProtocolListPtrTy - LLVM type for struct objc_property_list*.
529 llvm::PointerType *ProtocolListPtrTy;
530 /// CategoryTy - LLVM type for struct objc_category.
531 llvm::StructType *CategoryTy;
532 /// ClassTy - LLVM type for struct objc_class.
533 llvm::StructType *ClassTy;
534 /// ClassPtrTy - LLVM type for struct objc_class *.
535 llvm::PointerType *ClassPtrTy;
536 /// ClassExtensionTy - LLVM type for struct objc_class_ext.
537 llvm::StructType *ClassExtensionTy;
538 /// ClassExtensionPtrTy - LLVM type for struct objc_class_ext *.
539 llvm::PointerType *ClassExtensionPtrTy;
540 // IvarTy - LLVM type for struct objc_ivar.
541 llvm::StructType *IvarTy;
542 /// IvarListTy - LLVM type for struct objc_ivar_list.
543 llvm::StructType *IvarListTy;
544 /// IvarListPtrTy - LLVM type for struct objc_ivar_list *.
545 llvm::PointerType *IvarListPtrTy;
546 /// MethodListTy - LLVM type for struct objc_method_list.
547 llvm::StructType *MethodListTy;
548 /// MethodListPtrTy - LLVM type for struct objc_method_list *.
549 llvm::PointerType *MethodListPtrTy;
550
551 /// ExceptionDataTy - LLVM type for struct _objc_exception_data.
552 llvm::StructType *ExceptionDataTy;
553
554 /// ExceptionTryEnterFn - LLVM objc_exception_try_enter function.
555 llvm::FunctionCallee getExceptionTryEnterFn() {
556 llvm::Type *params[] = { ExceptionDataTy->getPointerTo() };
557 return CGM.CreateRuntimeFunction(
558 llvm::FunctionType::get(CGM.VoidTy, params, false),
559 "objc_exception_try_enter");
560 }
561
562 /// ExceptionTryExitFn - LLVM objc_exception_try_exit function.
563 llvm::FunctionCallee getExceptionTryExitFn() {
564 llvm::Type *params[] = { ExceptionDataTy->getPointerTo() };
565 return CGM.CreateRuntimeFunction(
566 llvm::FunctionType::get(CGM.VoidTy, params, false),
567 "objc_exception_try_exit");
568 }
569
570 /// ExceptionExtractFn - LLVM objc_exception_extract function.
571 llvm::FunctionCallee getExceptionExtractFn() {
572 llvm::Type *params[] = { ExceptionDataTy->getPointerTo() };
573 return CGM.CreateRuntimeFunction(llvm::FunctionType::get(ObjectPtrTy,
574 params, false),
575 "objc_exception_extract");
576 }
577
578 /// ExceptionMatchFn - LLVM objc_exception_match function.
579 llvm::FunctionCallee getExceptionMatchFn() {
580 llvm::Type *params[] = { ClassPtrTy, ObjectPtrTy };
581 return CGM.CreateRuntimeFunction(
582 llvm::FunctionType::get(CGM.Int32Ty, params, false),
583 "objc_exception_match");
584 }
585
586 /// SetJmpFn - LLVM _setjmp function.
587 llvm::FunctionCallee getSetJmpFn() {
588 // This is specifically the prototype for x86.
589 llvm::Type *params[] = { CGM.Int32Ty->getPointerTo() };
590 return CGM.CreateRuntimeFunction(
591 llvm::FunctionType::get(CGM.Int32Ty, params, false), "_setjmp",
592 llvm::AttributeList::get(CGM.getLLVMContext(),
593 llvm::AttributeList::FunctionIndex,
594 llvm::Attribute::NonLazyBind));
595 }
596
597public:
598 ObjCTypesHelper(CodeGen::CodeGenModule &cgm);
599};
600
601/// ObjCNonFragileABITypesHelper - will have all types needed by objective-c's
602/// modern abi
603class ObjCNonFragileABITypesHelper : public ObjCCommonTypesHelper {
604public:
605 // MethodListnfABITy - LLVM for struct _method_list_t
606 llvm::StructType *MethodListnfABITy;
607
608 // MethodListnfABIPtrTy - LLVM for struct _method_list_t*
609 llvm::PointerType *MethodListnfABIPtrTy;
610
611 // ProtocolnfABITy = LLVM for struct _protocol_t
612 llvm::StructType *ProtocolnfABITy;
613
614 // ProtocolnfABIPtrTy = LLVM for struct _protocol_t*
615 llvm::PointerType *ProtocolnfABIPtrTy;
616
617 // ProtocolListnfABITy - LLVM for struct _objc_protocol_list
618 llvm::StructType *ProtocolListnfABITy;
619
620 // ProtocolListnfABIPtrTy - LLVM for struct _objc_protocol_list*
621 llvm::PointerType *ProtocolListnfABIPtrTy;
622
623 // ClassnfABITy - LLVM for struct _class_t
624 llvm::StructType *ClassnfABITy;
625
626 // ClassnfABIPtrTy - LLVM for struct _class_t*
627 llvm::PointerType *ClassnfABIPtrTy;
628
629 // IvarnfABITy - LLVM for struct _ivar_t
630 llvm::StructType *IvarnfABITy;
631
632 // IvarListnfABITy - LLVM for struct _ivar_list_t
633 llvm::StructType *IvarListnfABITy;
634
635 // IvarListnfABIPtrTy = LLVM for struct _ivar_list_t*
636 llvm::PointerType *IvarListnfABIPtrTy;
637
638 // ClassRonfABITy - LLVM for struct _class_ro_t
639 llvm::StructType *ClassRonfABITy;
640
641 // ImpnfABITy - LLVM for id (*)(id, SEL, ...)
642 llvm::PointerType *ImpnfABITy;
643
644 // CategorynfABITy - LLVM for struct _category_t
645 llvm::StructType *CategorynfABITy;
646
647 // New types for nonfragile abi messaging.
648
649 // MessageRefTy - LLVM for:
650 // struct _message_ref_t {
651 // IMP messenger;
652 // SEL name;
653 // };
654 llvm::StructType *MessageRefTy;
655 // MessageRefCTy - clang type for struct _message_ref_t
656 QualType MessageRefCTy;
657
658 // MessageRefPtrTy - LLVM for struct _message_ref_t*
659 llvm::Type *MessageRefPtrTy;
660 // MessageRefCPtrTy - clang type for struct _message_ref_t*
661 QualType MessageRefCPtrTy;
662
663 // SuperMessageRefTy - LLVM for:
664 // struct _super_message_ref_t {
665 // SUPER_IMP messenger;
666 // SEL name;
667 // };
668 llvm::StructType *SuperMessageRefTy;
669
670 // SuperMessageRefPtrTy - LLVM for struct _super_message_ref_t*
671 llvm::PointerType *SuperMessageRefPtrTy;
672
673 llvm::FunctionCallee getMessageSendFixupFn() {
674 // id objc_msgSend_fixup(id, struct message_ref_t*, ...)
675 llvm::Type *params[] = { ObjectPtrTy, MessageRefPtrTy };
676 return CGM.CreateRuntimeFunction(llvm::FunctionType::get(ObjectPtrTy,
677 params, true),
678 "objc_msgSend_fixup");
679 }
680
681 llvm::FunctionCallee getMessageSendFpretFixupFn() {
682 // id objc_msgSend_fpret_fixup(id, struct message_ref_t*, ...)
683 llvm::Type *params[] = { ObjectPtrTy, MessageRefPtrTy };
684 return CGM.CreateRuntimeFunction(llvm::FunctionType::get(ObjectPtrTy,
685 params, true),
686 "objc_msgSend_fpret_fixup");
687 }
688
689 llvm::FunctionCallee getMessageSendStretFixupFn() {
690 // id objc_msgSend_stret_fixup(id, struct message_ref_t*, ...)
691 llvm::Type *params[] = { ObjectPtrTy, MessageRefPtrTy };
692 return CGM.CreateRuntimeFunction(llvm::FunctionType::get(ObjectPtrTy,
693 params, true),
694 "objc_msgSend_stret_fixup");
695 }
696
697 llvm::FunctionCallee getMessageSendSuper2FixupFn() {
698 // id objc_msgSendSuper2_fixup (struct objc_super *,
699 // struct _super_message_ref_t*, ...)
700 llvm::Type *params[] = { SuperPtrTy, SuperMessageRefPtrTy };
701 return CGM.CreateRuntimeFunction(llvm::FunctionType::get(ObjectPtrTy,
702 params, true),
703 "objc_msgSendSuper2_fixup");
704 }
705
706 llvm::FunctionCallee getMessageSendSuper2StretFixupFn() {
707 // id objc_msgSendSuper2_stret_fixup(struct objc_super *,
708 // struct _super_message_ref_t*, ...)
709 llvm::Type *params[] = { SuperPtrTy, SuperMessageRefPtrTy };
710 return CGM.CreateRuntimeFunction(llvm::FunctionType::get(ObjectPtrTy,
711 params, true),
712 "objc_msgSendSuper2_stret_fixup");
713 }
714
715 llvm::FunctionCallee getObjCEndCatchFn() {
716 return CGM.CreateRuntimeFunction(llvm::FunctionType::get(CGM.VoidTy, false),
717 "objc_end_catch");
718 }
719
720 llvm::FunctionCallee getObjCBeginCatchFn() {
721 llvm::Type *params[] = { Int8PtrTy };
722 return CGM.CreateRuntimeFunction(llvm::FunctionType::get(Int8PtrTy,
723 params, false),
724 "objc_begin_catch");
725 }
726
727 /// Class objc_loadClassref (void *)
728 ///
729 /// Loads from a classref. For Objective-C stub classes, this invokes the
730 /// initialization callback stored inside the stub. For all other classes
731 /// this simply dereferences the pointer.
732 llvm::FunctionCallee getLoadClassrefFn() const {
733 // Add the non-lazy-bind attribute, since objc_loadClassref is likely to
734 // be called a lot.
735 //
736 // Also it is safe to make it readnone, since we never load or store the
737 // classref except by calling this function.
738 llvm::Type *params[] = { Int8PtrPtrTy };
739 llvm::FunctionCallee F = CGM.CreateRuntimeFunction(
740 llvm::FunctionType::get(ClassnfABIPtrTy, params, false),
741 "objc_loadClassref",
742 llvm::AttributeList::get(CGM.getLLVMContext(),
743 llvm::AttributeList::FunctionIndex,
744 {llvm::Attribute::NonLazyBind,
745 llvm::Attribute::ReadNone,
746 llvm::Attribute::NoUnwind}));
747 if (!CGM.getTriple().isOSBinFormatCOFF())
748 cast<llvm::Function>(F.getCallee())->setLinkage(
749 llvm::Function::ExternalWeakLinkage);
750
751 return F;
752 }
753
754 llvm::StructType *EHTypeTy;
755 llvm::Type *EHTypePtrTy;
756
757 ObjCNonFragileABITypesHelper(CodeGen::CodeGenModule &cgm);
758};
759
760enum class ObjCLabelType {
761 ClassName,
762 MethodVarName,
763 MethodVarType,
764 PropertyName,
765};
766
767class CGObjCCommonMac : public CodeGen::CGObjCRuntime {
768public:
769 class SKIP_SCAN {
770 public:
771 unsigned skip;
772 unsigned scan;
773 SKIP_SCAN(unsigned _skip = 0, unsigned _scan = 0)
774 : skip(_skip), scan(_scan) {}
775 };
776
777 /// opcode for captured block variables layout 'instructions'.
778 /// In the following descriptions, 'I' is the value of the immediate field.
779 /// (field following the opcode).
780 ///
781 enum BLOCK_LAYOUT_OPCODE {
782 /// An operator which affects how the following layout should be
783 /// interpreted.
784 /// I == 0: Halt interpretation and treat everything else as
785 /// a non-pointer. Note that this instruction is equal
786 /// to '\0'.
787 /// I != 0: Currently unused.
788 BLOCK_LAYOUT_OPERATOR = 0,
789
790 /// The next I+1 bytes do not contain a value of object pointer type.
791 /// Note that this can leave the stream unaligned, meaning that
792 /// subsequent word-size instructions do not begin at a multiple of
793 /// the pointer size.
794 BLOCK_LAYOUT_NON_OBJECT_BYTES = 1,
795
796 /// The next I+1 words do not contain a value of object pointer type.
797 /// This is simply an optimized version of BLOCK_LAYOUT_BYTES for
798 /// when the required skip quantity is a multiple of the pointer size.
799 BLOCK_LAYOUT_NON_OBJECT_WORDS = 2,
800
801 /// The next I+1 words are __strong pointers to Objective-C
802 /// objects or blocks.
803 BLOCK_LAYOUT_STRONG = 3,
804
805 /// The next I+1 words are pointers to __block variables.
806 BLOCK_LAYOUT_BYREF = 4,
807
808 /// The next I+1 words are __weak pointers to Objective-C
809 /// objects or blocks.
810 BLOCK_LAYOUT_WEAK = 5,
811
812 /// The next I+1 words are __unsafe_unretained pointers to
813 /// Objective-C objects or blocks.
814 BLOCK_LAYOUT_UNRETAINED = 6
815
816 /// The next I+1 words are block or object pointers with some
817 /// as-yet-unspecified ownership semantics. If we add more
818 /// flavors of ownership semantics, values will be taken from
819 /// this range.
820 ///
821 /// This is included so that older tools can at least continue
822 /// processing the layout past such things.
823 //BLOCK_LAYOUT_OWNERSHIP_UNKNOWN = 7..10,
824
825 /// All other opcodes are reserved. Halt interpretation and
826 /// treat everything else as opaque.
827 };
828
829 class RUN_SKIP {
830 public:
831 enum BLOCK_LAYOUT_OPCODE opcode;
832 CharUnits block_var_bytepos;
833 CharUnits block_var_size;
834 RUN_SKIP(enum BLOCK_LAYOUT_OPCODE Opcode = BLOCK_LAYOUT_OPERATOR,
835 CharUnits BytePos = CharUnits::Zero(),
836 CharUnits Size = CharUnits::Zero())
837 : opcode(Opcode), block_var_bytepos(BytePos), block_var_size(Size) {}
838
839 // Allow sorting based on byte pos.
840 bool operator<(const RUN_SKIP &b) const {
841 return block_var_bytepos < b.block_var_bytepos;
842 }
843 };
844
845protected:
846 llvm::LLVMContext &VMContext;
847 // FIXME! May not be needing this after all.
848 unsigned ObjCABI;
849
850 // arc/mrr layout of captured block literal variables.
851 SmallVector<RUN_SKIP, 16> RunSkipBlockVars;
852
853 /// LazySymbols - Symbols to generate a lazy reference for. See
854 /// DefinedSymbols and FinishModule().
855 llvm::SetVector<IdentifierInfo*> LazySymbols;
856
857 /// DefinedSymbols - External symbols which are defined by this
858 /// module. The symbols in this list and LazySymbols are used to add
859 /// special linker symbols which ensure that Objective-C modules are
860 /// linked properly.
861 llvm::SetVector<IdentifierInfo*> DefinedSymbols;
862
863 /// ClassNames - uniqued class names.
864 llvm::StringMap<llvm::GlobalVariable*> ClassNames;
865
866 /// MethodVarNames - uniqued method variable names.
867 llvm::DenseMap<Selector, llvm::GlobalVariable*> MethodVarNames;
868
869 /// DefinedCategoryNames - list of category names in form Class_Category.
870 llvm::SmallSetVector<llvm::CachedHashString, 16> DefinedCategoryNames;
871
872 /// MethodVarTypes - uniqued method type signatures. We have to use
873 /// a StringMap here because have no other unique reference.
874 llvm::StringMap<llvm::GlobalVariable*> MethodVarTypes;
875
876 /// MethodDefinitions - map of methods which have been defined in
877 /// this translation unit.
878 llvm::DenseMap<const ObjCMethodDecl*, llvm::Function*> MethodDefinitions;
879
880 /// DirectMethodDefinitions - map of direct methods which have been defined in
881 /// this translation unit.
882 llvm::DenseMap<const ObjCMethodDecl*, llvm::Function*> DirectMethodDefinitions;
883
884 /// PropertyNames - uniqued method variable names.
885 llvm::DenseMap<IdentifierInfo*, llvm::GlobalVariable*> PropertyNames;
886
887 /// ClassReferences - uniqued class references.
888 llvm::DenseMap<IdentifierInfo*, llvm::GlobalVariable*> ClassReferences;
889
890 /// SelectorReferences - uniqued selector references.
891 llvm::DenseMap<Selector, llvm::GlobalVariable*> SelectorReferences;
892
893 /// Protocols - Protocols for which an objc_protocol structure has
894 /// been emitted. Forward declarations are handled by creating an
895 /// empty structure whose initializer is filled in when/if defined.
896 llvm::DenseMap<IdentifierInfo*, llvm::GlobalVariable*> Protocols;
897
898 /// DefinedProtocols - Protocols which have actually been
899 /// defined. We should not need this, see FIXME in GenerateProtocol.
900 llvm::DenseSet<IdentifierInfo*> DefinedProtocols;
901
902 /// DefinedClasses - List of defined classes.
903 SmallVector<llvm::GlobalValue*, 16> DefinedClasses;
904
905 /// ImplementedClasses - List of @implemented classes.
906 SmallVector<const ObjCInterfaceDecl*, 16> ImplementedClasses;
907
908 /// DefinedNonLazyClasses - List of defined "non-lazy" classes.
909 SmallVector<llvm::GlobalValue*, 16> DefinedNonLazyClasses;
910
911 /// DefinedCategories - List of defined categories.
912 SmallVector<llvm::GlobalValue*, 16> DefinedCategories;
913
914 /// DefinedStubCategories - List of defined categories on class stubs.
915 SmallVector<llvm::GlobalValue*, 16> DefinedStubCategories;
916
917 /// DefinedNonLazyCategories - List of defined "non-lazy" categories.
918 SmallVector<llvm::GlobalValue*, 16> DefinedNonLazyCategories;
919
920 /// Cached reference to the class for constant strings. This value has type
921 /// int * but is actually an Obj-C class pointer.
922 llvm::WeakTrackingVH ConstantStringClassRef;
923
924 /// The LLVM type corresponding to NSConstantString.
925 llvm::StructType *NSConstantStringType = nullptr;
926
927 llvm::StringMap<llvm::GlobalVariable *> NSConstantStringMap;
928
929 /// GetMethodVarName - Return a unique constant for the given
930 /// selector's name. The return value has type char *.
931 llvm::Constant *GetMethodVarName(Selector Sel);
932 llvm::Constant *GetMethodVarName(IdentifierInfo *Ident);
933
934 /// GetMethodVarType - Return a unique constant for the given
935 /// method's type encoding string. The return value has type char *.
936
937 // FIXME: This is a horrible name.
938 llvm::Constant *GetMethodVarType(const ObjCMethodDecl *D,
939 bool Extended = false);
940 llvm::Constant *GetMethodVarType(const FieldDecl *D);
941
942 /// GetPropertyName - Return a unique constant for the given
943 /// name. The return value has type char *.
944 llvm::Constant *GetPropertyName(IdentifierInfo *Ident);
945
946 // FIXME: This can be dropped once string functions are unified.
947 llvm::Constant *GetPropertyTypeString(const ObjCPropertyDecl *PD,
948 const Decl *Container);
949
950 /// GetClassName - Return a unique constant for the given selector's
951 /// runtime name (which may change via use of objc_runtime_name attribute on
952 /// class or protocol definition. The return value has type char *.
953 llvm::Constant *GetClassName(StringRef RuntimeName);
954
955 llvm::Function *GetMethodDefinition(const ObjCMethodDecl *MD);
956
957 /// BuildIvarLayout - Builds ivar layout bitmap for the class
958 /// implementation for the __strong or __weak case.
959 ///
960 /// \param hasMRCWeakIvars - Whether we are compiling in MRC and there
961 /// are any weak ivars defined directly in the class. Meaningless unless
962 /// building a weak layout. Does not guarantee that the layout will
963 /// actually have any entries, because the ivar might be under-aligned.
964 llvm::Constant *BuildIvarLayout(const ObjCImplementationDecl *OI,
965 CharUnits beginOffset,
966 CharUnits endOffset,
967 bool forStrongLayout,
968 bool hasMRCWeakIvars);
969
970 llvm::Constant *BuildStrongIvarLayout(const ObjCImplementationDecl *OI,
971 CharUnits beginOffset,
972 CharUnits endOffset) {
973 return BuildIvarLayout(OI, beginOffset, endOffset, true, false);
974 }
975
976 llvm::Constant *BuildWeakIvarLayout(const ObjCImplementationDecl *OI,
977 CharUnits beginOffset,
978 CharUnits endOffset,
979 bool hasMRCWeakIvars) {
980 return BuildIvarLayout(OI, beginOffset, endOffset, false, hasMRCWeakIvars);
981 }
982
983 Qualifiers::ObjCLifetime getBlockCaptureLifetime(QualType QT, bool ByrefLayout);
984
985 void UpdateRunSkipBlockVars(bool IsByref,
986 Qualifiers::ObjCLifetime LifeTime,
987 CharUnits FieldOffset,
988 CharUnits FieldSize);
989
990 void BuildRCBlockVarRecordLayout(const RecordType *RT,
991 CharUnits BytePos, bool &HasUnion,
992 bool ByrefLayout=false);
993
994 void BuildRCRecordLayout(const llvm::StructLayout *RecLayout,
995 const RecordDecl *RD,
996 ArrayRef<const FieldDecl*> RecFields,
997 CharUnits BytePos, bool &HasUnion,
998 bool ByrefLayout);
999
1000 uint64_t InlineLayoutInstruction(SmallVectorImpl<unsigned char> &Layout);
1001
1002 llvm::Constant *getBitmapBlockLayout(bool ComputeByrefLayout);
1003
1004 /// GetIvarLayoutName - Returns a unique constant for the given
1005 /// ivar layout bitmap.
1006 llvm::Constant *GetIvarLayoutName(IdentifierInfo *Ident,
1007 const ObjCCommonTypesHelper &ObjCTypes);
1008
1009 /// EmitPropertyList - Emit the given property list. The return
1010 /// value has type PropertyListPtrTy.
1011 llvm::Constant *EmitPropertyList(Twine Name,
1012 const Decl *Container,
1013 const ObjCContainerDecl *OCD,
1014 const ObjCCommonTypesHelper &ObjCTypes,
1015 bool IsClassProperty);
1016
1017 /// EmitProtocolMethodTypes - Generate the array of extended method type
1018 /// strings. The return value has type Int8PtrPtrTy.
1019 llvm::Constant *EmitProtocolMethodTypes(Twine Name,
1020 ArrayRef<llvm::Constant*> MethodTypes,
1021 const ObjCCommonTypesHelper &ObjCTypes);
1022
1023 /// GetProtocolRef - Return a reference to the internal protocol
1024 /// description, creating an empty one if it has not been
1025 /// defined. The return value has type ProtocolPtrTy.
1026 llvm::Constant *GetProtocolRef(const ObjCProtocolDecl *PD);
1027
1028 /// Return a reference to the given Class using runtime calls rather than
1029 /// by a symbol reference.
1030 llvm::Value *EmitClassRefViaRuntime(CodeGenFunction &CGF,
1031 const ObjCInterfaceDecl *ID,
1032 ObjCCommonTypesHelper &ObjCTypes);
1033
1034 std::string GetSectionName(StringRef Section, StringRef MachOAttributes);
1035
1036public:
1037 /// CreateMetadataVar - Create a global variable with internal
1038 /// linkage for use by the Objective-C runtime.
1039 ///
1040 /// This is a convenience wrapper which not only creates the
1041 /// variable, but also sets the section and alignment and adds the
1042 /// global to the "llvm.used" list.
1043 ///
1044 /// \param Name - The variable name.
1045 /// \param Init - The variable initializer; this is also used to
1046 /// define the type of the variable.
1047 /// \param Section - The section the variable should go into, or empty.
1048 /// \param Align - The alignment for the variable, or 0.
1049 /// \param AddToUsed - Whether the variable should be added to
1050 /// "llvm.used".
1051 llvm::GlobalVariable *CreateMetadataVar(Twine Name,
1052 ConstantStructBuilder &Init,
1053 StringRef Section, CharUnits Align,
1054 bool AddToUsed);
1055 llvm::GlobalVariable *CreateMetadataVar(Twine Name,
1056 llvm::Constant *Init,
1057 StringRef Section, CharUnits Align,
1058 bool AddToUsed);
1059
1060 llvm::GlobalVariable *CreateCStringLiteral(StringRef Name,
1061 ObjCLabelType LabelType,
1062 bool ForceNonFragileABI = false,
1063 bool NullTerminate = true);
1064
1065protected:
1066 CodeGen::RValue EmitMessageSend(CodeGen::CodeGenFunction &CGF,
1067 ReturnValueSlot Return,
1068 QualType ResultType,
1069 Selector Sel,
1070 llvm::Value *Arg0,
1071 QualType Arg0Ty,
1072 bool IsSuper,
1073 const CallArgList &CallArgs,
1074 const ObjCMethodDecl *OMD,
1075 const ObjCInterfaceDecl *ClassReceiver,
1076 const ObjCCommonTypesHelper &ObjCTypes);
1077
1078 /// EmitImageInfo - Emit the image info marker used to encode some module
1079 /// level information.
1080 void EmitImageInfo();
1081
1082public:
1083 CGObjCCommonMac(CodeGen::CodeGenModule &cgm)
1084 : CGObjCRuntime(cgm), VMContext(cgm.getLLVMContext()) {}
1085
1086 bool isNonFragileABI() const {
1087 return ObjCABI == 2;
1088 }
1089
1090 ConstantAddress GenerateConstantString(const StringLiteral *SL) override;
1091 ConstantAddress GenerateConstantNSString(const StringLiteral *SL);
1092
1093 llvm::Function *GenerateMethod(const ObjCMethodDecl *OMD,
1094 const ObjCContainerDecl *CD=nullptr) override;
1095
1096 llvm::Function *GenerateDirectMethod(const ObjCMethodDecl *OMD,
1097 const ObjCContainerDecl *CD);
1098
1099 void GenerateDirectMethodPrologue(CodeGenFunction &CGF, llvm::Function *Fn,
1100 const ObjCMethodDecl *OMD,
1101 const ObjCContainerDecl *CD) override;
1102
1103 void GenerateProtocol(const ObjCProtocolDecl *PD) override;
1104
1105 /// GetOrEmitProtocolRef - Get a forward reference to the protocol
1106 /// object for the given declaration, emitting it if needed. These
1107 /// forward references will be filled in with empty bodies if no
1108 /// definition is seen. The return value has type ProtocolPtrTy.
1109 virtual llvm::Constant *GetOrEmitProtocolRef(const ObjCProtocolDecl *PD)=0;
1110
1111 virtual llvm::Constant *getNSConstantStringClassRef() = 0;
1112
1113 llvm::Constant *BuildGCBlockLayout(CodeGen::CodeGenModule &CGM,
1114 const CGBlockInfo &blockInfo) override;
1115 llvm::Constant *BuildRCBlockLayout(CodeGen::CodeGenModule &CGM,
1116 const CGBlockInfo &blockInfo) override;
1117 std::string getRCBlockLayoutStr(CodeGen::CodeGenModule &CGM,
1118 const CGBlockInfo &blockInfo) override;
1119
1120 llvm::Constant *BuildByrefLayout(CodeGen::CodeGenModule &CGM,
1121 QualType T) override;
1122
1123private:
1124 void fillRunSkipBlockVars(CodeGenModule &CGM, const CGBlockInfo &blockInfo);
1125};
1126
1127namespace {
1128
1129enum class MethodListType {
1130 CategoryInstanceMethods,
1131 CategoryClassMethods,
1132 InstanceMethods,
1133 ClassMethods,
1134 ProtocolInstanceMethods,
1135 ProtocolClassMethods,
1136 OptionalProtocolInstanceMethods,
1137 OptionalProtocolClassMethods,
1138};
1139
1140/// A convenience class for splitting the methods of a protocol into
1141/// the four interesting groups.
1142class ProtocolMethodLists {
1143public:
1144 enum Kind {
1145 RequiredInstanceMethods,
1146 RequiredClassMethods,
1147 OptionalInstanceMethods,
1148 OptionalClassMethods
1149 };
1150 enum {
1151 NumProtocolMethodLists = 4
1152 };
1153
1154 static MethodListType getMethodListKind(Kind kind) {
1155 switch (kind) {
1156 case RequiredInstanceMethods:
1157 return MethodListType::ProtocolInstanceMethods;
1158 case RequiredClassMethods:
1159 return MethodListType::ProtocolClassMethods;
1160 case OptionalInstanceMethods:
1161 return MethodListType::OptionalProtocolInstanceMethods;
1162 case OptionalClassMethods:
1163 return MethodListType::OptionalProtocolClassMethods;
1164 }
1165 llvm_unreachable("bad kind")::llvm::llvm_unreachable_internal("bad kind", "clang/lib/CodeGen/CGObjCMac.cpp"
, 1165)
;
1166 }
1167
1168 SmallVector<const ObjCMethodDecl *, 4> Methods[NumProtocolMethodLists];
1169
1170 static ProtocolMethodLists get(const ObjCProtocolDecl *PD) {
1171 ProtocolMethodLists result;
1172
1173 for (auto MD : PD->methods()) {
1174 size_t index = (2 * size_t(MD->isOptional()))
1175 + (size_t(MD->isClassMethod()));
1176 result.Methods[index].push_back(MD);
1177 }
1178
1179 return result;
1180 }
1181
1182 template <class Self>
1183 SmallVector<llvm::Constant*, 8> emitExtendedTypesArray(Self *self) const {
1184 // In both ABIs, the method types list is parallel with the
1185 // concatenation of the methods arrays in the following order:
1186 // instance methods
1187 // class methods
1188 // optional instance methods
1189 // optional class methods
1190 SmallVector<llvm::Constant*, 8> result;
1191
1192 // Methods is already in the correct order for both ABIs.
1193 for (auto &list : Methods) {
1194 for (auto MD : list) {
1195 result.push_back(self->GetMethodVarType(MD, true));
1196 }
1197 }
1198
1199 return result;
1200 }
1201
1202 template <class Self>
1203 llvm::Constant *emitMethodList(Self *self, const ObjCProtocolDecl *PD,
1204 Kind kind) const {
1205 return self->emitMethodList(PD->getObjCRuntimeNameAsString(),
1206 getMethodListKind(kind), Methods[kind]);
1207 }
1208};
1209
1210} // end anonymous namespace
1211
1212class CGObjCMac : public CGObjCCommonMac {
1213private:
1214 friend ProtocolMethodLists;
1215
1216 ObjCTypesHelper ObjCTypes;
1217
1218 /// EmitModuleInfo - Another marker encoding module level
1219 /// information.
1220 void EmitModuleInfo();
1221
1222 /// EmitModuleSymols - Emit module symbols, the list of defined
1223 /// classes and categories. The result has type SymtabPtrTy.
1224 llvm::Constant *EmitModuleSymbols();
1225
1226 /// FinishModule - Write out global data structures at the end of
1227 /// processing a translation unit.
1228 void FinishModule();
1229
1230 /// EmitClassExtension - Generate the class extension structure used
1231 /// to store the weak ivar layout and properties. The return value
1232 /// has type ClassExtensionPtrTy.
1233 llvm::Constant *EmitClassExtension(const ObjCImplementationDecl *ID,
1234 CharUnits instanceSize,
1235 bool hasMRCWeakIvars,
1236 bool isMetaclass);
1237
1238 /// EmitClassRef - Return a Value*, of type ObjCTypes.ClassPtrTy,
1239 /// for the given class.
1240 llvm::Value *EmitClassRef(CodeGenFunction &CGF,
1241 const ObjCInterfaceDecl *ID);
1242
1243 llvm::Value *EmitClassRefFromId(CodeGenFunction &CGF,
1244 IdentifierInfo *II);
1245
1246 llvm::Value *EmitNSAutoreleasePoolClassRef(CodeGenFunction &CGF) override;
1247
1248 /// EmitSuperClassRef - Emits reference to class's main metadata class.
1249 llvm::Value *EmitSuperClassRef(const ObjCInterfaceDecl *ID);
1250
1251 /// EmitIvarList - Emit the ivar list for the given
1252 /// implementation. If ForClass is true the list of class ivars
1253 /// (i.e. metaclass ivars) is emitted, otherwise the list of
1254 /// interface ivars will be emitted. The return value has type
1255 /// IvarListPtrTy.
1256 llvm::Constant *EmitIvarList(const ObjCImplementationDecl *ID,
1257 bool ForClass);
1258
1259 /// EmitMetaClass - Emit a forward reference to the class structure
1260 /// for the metaclass of the given interface. The return value has
1261 /// type ClassPtrTy.
1262 llvm::Constant *EmitMetaClassRef(const ObjCInterfaceDecl *ID);
1263
1264 /// EmitMetaClass - Emit a class structure for the metaclass of the
1265 /// given implementation. The return value has type ClassPtrTy.
1266 llvm::Constant *EmitMetaClass(const ObjCImplementationDecl *ID,
1267 llvm::Constant *Protocols,
1268 ArrayRef<const ObjCMethodDecl *> Methods);
1269
1270 void emitMethodConstant(ConstantArrayBuilder &builder,
1271 const ObjCMethodDecl *MD);
1272
1273 void emitMethodDescriptionConstant(ConstantArrayBuilder &builder,
1274 const ObjCMethodDecl *MD);
1275
1276 /// EmitMethodList - Emit the method list for the given
1277 /// implementation. The return value has type MethodListPtrTy.
1278 llvm::Constant *emitMethodList(Twine Name, MethodListType MLT,
1279 ArrayRef<const ObjCMethodDecl *> Methods);
1280
1281 /// GetOrEmitProtocol - Get the protocol object for the given
1282 /// declaration, emitting it if necessary. The return value has type
1283 /// ProtocolPtrTy.
1284 llvm::Constant *GetOrEmitProtocol(const ObjCProtocolDecl *PD) override;
1285
1286 /// GetOrEmitProtocolRef - Get a forward reference to the protocol
1287 /// object for the given declaration, emitting it if needed. These
1288 /// forward references will be filled in with empty bodies if no
1289 /// definition is seen. The return value has type ProtocolPtrTy.
1290 llvm::Constant *GetOrEmitProtocolRef(const ObjCProtocolDecl *PD) override;
1291
1292 /// EmitProtocolExtension - Generate the protocol extension
1293 /// structure used to store optional instance and class methods, and
1294 /// protocol properties. The return value has type
1295 /// ProtocolExtensionPtrTy.
1296 llvm::Constant *
1297 EmitProtocolExtension(const ObjCProtocolDecl *PD,
1298 const ProtocolMethodLists &methodLists);
1299
1300 /// EmitProtocolList - Generate the list of referenced
1301 /// protocols. The return value has type ProtocolListPtrTy.
1302 llvm::Constant *EmitProtocolList(Twine Name,
1303 ObjCProtocolDecl::protocol_iterator begin,
1304 ObjCProtocolDecl::protocol_iterator end);
1305
1306 /// EmitSelector - Return a Value*, of type ObjCTypes.SelectorPtrTy,
1307 /// for the given selector.
1308 llvm::Value *EmitSelector(CodeGenFunction &CGF, Selector Sel);
1309 Address EmitSelectorAddr(Selector Sel);
1310
1311public:
1312 CGObjCMac(CodeGen::CodeGenModule &cgm);
1313
1314 llvm::Constant *getNSConstantStringClassRef() override;
1315
1316 llvm::Function *ModuleInitFunction() override;
1317
1318 CodeGen::RValue GenerateMessageSend(CodeGen::CodeGenFunction &CGF,
1319 ReturnValueSlot Return,
1320 QualType ResultType,
1321 Selector Sel, llvm::Value *Receiver,
1322 const CallArgList &CallArgs,
1323 const ObjCInterfaceDecl *Class,
1324 const ObjCMethodDecl *Method) override;
1325
1326 CodeGen::RValue
1327 GenerateMessageSendSuper(CodeGen::CodeGenFunction &CGF,
1328 ReturnValueSlot Return, QualType ResultType,
1329 Selector Sel, const ObjCInterfaceDecl *Class,
1330 bool isCategoryImpl, llvm::Value *Receiver,
1331 bool IsClassMessage, const CallArgList &CallArgs,
1332 const ObjCMethodDecl *Method) override;
1333
1334 llvm::Value *GetClass(CodeGenFunction &CGF,
1335 const ObjCInterfaceDecl *ID) override;
1336
1337 llvm::Value *GetSelector(CodeGenFunction &CGF, Selector Sel) override;
1338 Address GetAddrOfSelector(CodeGenFunction &CGF, Selector Sel) override;
1339
1340 /// The NeXT/Apple runtimes do not support typed selectors; just emit an
1341 /// untyped one.
1342 llvm::Value *GetSelector(CodeGenFunction &CGF,
1343 const ObjCMethodDecl *Method) override;
1344
1345 llvm::Constant *GetEHType(QualType T) override;
1346
1347 void GenerateCategory(const ObjCCategoryImplDecl *CMD) override;
1348
1349 void GenerateClass(const ObjCImplementationDecl *ClassDecl) override;
1350
1351 void RegisterAlias(const ObjCCompatibleAliasDecl *OAD) override {}
1352
1353 llvm::Value *GenerateProtocolRef(CodeGenFunction &CGF,
1354 const ObjCProtocolDecl *PD) override;
1355
1356 llvm::FunctionCallee GetPropertyGetFunction() override;
1357 llvm::FunctionCallee GetPropertySetFunction() override;
1358 llvm::FunctionCallee GetOptimizedPropertySetFunction(bool atomic,
1359 bool copy) override;
1360 llvm::FunctionCallee GetGetStructFunction() override;
1361 llvm::FunctionCallee GetSetStructFunction() override;
1362 llvm::FunctionCallee GetCppAtomicObjectGetFunction() override;
1363 llvm::FunctionCallee GetCppAtomicObjectSetFunction() override;
1364 llvm::FunctionCallee EnumerationMutationFunction() override;
1365
1366 void EmitTryStmt(CodeGen::CodeGenFunction &CGF,
1367 const ObjCAtTryStmt &S) override;
1368 void EmitSynchronizedStmt(CodeGen::CodeGenFunction &CGF,
1369 const ObjCAtSynchronizedStmt &S) override;
1370 void EmitTryOrSynchronizedStmt(CodeGen::CodeGenFunction &CGF, const Stmt &S);
1371 void EmitThrowStmt(CodeGen::CodeGenFunction &CGF, const ObjCAtThrowStmt &S,
1372 bool ClearInsertionPoint=true) override;
1373 llvm::Value * EmitObjCWeakRead(CodeGen::CodeGenFunction &CGF,
1374 Address AddrWeakObj) override;
1375 void EmitObjCWeakAssign(CodeGen::CodeGenFunction &CGF,
1376 llvm::Value *src, Address dst) override;
1377 void EmitObjCGlobalAssign(CodeGen::CodeGenFunction &CGF,
1378 llvm::Value *src, Address dest,
1379 bool threadlocal = false) override;
1380 void EmitObjCIvarAssign(CodeGen::CodeGenFunction &CGF,
1381 llvm::Value *src, Address dest,
1382 llvm::Value *ivarOffset) override;
1383 void EmitObjCStrongCastAssign(CodeGen::CodeGenFunction &CGF,
1384 llvm::Value *src, Address dest) override;
1385 void EmitGCMemmoveCollectable(CodeGen::CodeGenFunction &CGF,
1386 Address dest, Address src,
1387 llvm::Value *size) override;
1388
1389 LValue EmitObjCValueForIvar(CodeGen::CodeGenFunction &CGF, QualType ObjectTy,
1390 llvm::Value *BaseValue, const ObjCIvarDecl *Ivar,
1391 unsigned CVRQualifiers) override;
1392 llvm::Value *EmitIvarOffset(CodeGen::CodeGenFunction &CGF,
1393 const ObjCInterfaceDecl *Interface,
1394 const ObjCIvarDecl *Ivar) override;
1395};
1396
1397class CGObjCNonFragileABIMac : public CGObjCCommonMac {
1398private:
1399 friend ProtocolMethodLists;
1400 ObjCNonFragileABITypesHelper ObjCTypes;
1401 llvm::GlobalVariable* ObjCEmptyCacheVar;
1402 llvm::Constant* ObjCEmptyVtableVar;
1403
1404 /// SuperClassReferences - uniqued super class references.
1405 llvm::DenseMap<IdentifierInfo*, llvm::GlobalVariable*> SuperClassReferences;
1406
1407 /// MetaClassReferences - uniqued meta class references.
1408 llvm::DenseMap<IdentifierInfo*, llvm::GlobalVariable*> MetaClassReferences;
1409
1410 /// EHTypeReferences - uniqued class ehtype references.
1411 llvm::DenseMap<IdentifierInfo*, llvm::GlobalVariable*> EHTypeReferences;
1412
1413 /// VTableDispatchMethods - List of methods for which we generate
1414 /// vtable-based message dispatch.
1415 llvm::DenseSet<Selector> VTableDispatchMethods;
1416
1417 /// DefinedMetaClasses - List of defined meta-classes.
1418 std::vector<llvm::GlobalValue*> DefinedMetaClasses;
1419
1420 /// isVTableDispatchedSelector - Returns true if SEL is a
1421 /// vtable-based selector.
1422 bool isVTableDispatchedSelector(Selector Sel);
1423
1424 /// FinishNonFragileABIModule - Write out global data structures at the end of
1425 /// processing a translation unit.
1426 void FinishNonFragileABIModule();
1427
1428 /// AddModuleClassList - Add the given list of class pointers to the
1429 /// module with the provided symbol and section names.
1430 void AddModuleClassList(ArrayRef<llvm::GlobalValue *> Container,
1431 StringRef SymbolName, StringRef SectionName);
1432
1433 llvm::GlobalVariable * BuildClassRoTInitializer(unsigned flags,
1434 unsigned InstanceStart,
1435 unsigned InstanceSize,
1436 const ObjCImplementationDecl *ID);
1437 llvm::GlobalVariable *BuildClassObject(const ObjCInterfaceDecl *CI,
1438 bool isMetaclass,
1439 llvm::Constant *IsAGV,
1440 llvm::Constant *SuperClassGV,
1441 llvm::Constant *ClassRoGV,
1442 bool HiddenVisibility);
1443
1444 void emitMethodConstant(ConstantArrayBuilder &builder,
1445 const ObjCMethodDecl *MD,
1446 bool forProtocol);
1447
1448 /// Emit the method list for the given implementation. The return value
1449 /// has type MethodListnfABITy.
1450 llvm::Constant *emitMethodList(Twine Name, MethodListType MLT,
1451 ArrayRef<const ObjCMethodDecl *> Methods);
1452
1453 /// EmitIvarList - Emit the ivar list for the given
1454 /// implementation. If ForClass is true the list of class ivars
1455 /// (i.e. metaclass ivars) is emitted, otherwise the list of
1456 /// interface ivars will be emitted. The return value has type
1457 /// IvarListnfABIPtrTy.
1458 llvm::Constant *EmitIvarList(const ObjCImplementationDecl *ID);
1459
1460 llvm::Constant *EmitIvarOffsetVar(const ObjCInterfaceDecl *ID,
1461 const ObjCIvarDecl *Ivar,
1462 unsigned long int offset);
1463
1464 /// GetOrEmitProtocol - Get the protocol object for the given
1465 /// declaration, emitting it if necessary. The return value has type
1466 /// ProtocolPtrTy.
1467 llvm::Constant *GetOrEmitProtocol(const ObjCProtocolDecl *PD) override;
1468
1469 /// GetOrEmitProtocolRef - Get a forward reference to the protocol
1470 /// object for the given declaration, emitting it if needed. These
1471 /// forward references will be filled in with empty bodies if no
1472 /// definition is seen. The return value has type ProtocolPtrTy.
1473 llvm::Constant *GetOrEmitProtocolRef(const ObjCProtocolDecl *PD) override;
1474
1475 /// EmitProtocolList - Generate the list of referenced
1476 /// protocols. The return value has type ProtocolListPtrTy.
1477 llvm::Constant *EmitProtocolList(Twine Name,
1478 ObjCProtocolDecl::protocol_iterator begin,
1479 ObjCProtocolDecl::protocol_iterator end);
1480
1481 CodeGen::RValue EmitVTableMessageSend(CodeGen::CodeGenFunction &CGF,
1482 ReturnValueSlot Return,
1483 QualType ResultType,
1484 Selector Sel,
1485 llvm::Value *Receiver,
1486 QualType Arg0Ty,
1487 bool IsSuper,
1488 const CallArgList &CallArgs,
1489 const ObjCMethodDecl *Method);
1490
1491 /// GetClassGlobal - Return the global variable for the Objective-C
1492 /// class of the given name.
1493 llvm::Constant *GetClassGlobal(StringRef Name,
1494 ForDefinition_t IsForDefinition,
1495 bool Weak = false, bool DLLImport = false);
1496 llvm::Constant *GetClassGlobal(const ObjCInterfaceDecl *ID,
1497 bool isMetaclass,
1498 ForDefinition_t isForDefinition);
1499
1500 llvm::Constant *GetClassGlobalForClassRef(const ObjCInterfaceDecl *ID);
1501
1502 llvm::Value *EmitLoadOfClassRef(CodeGenFunction &CGF,
1503 const ObjCInterfaceDecl *ID,
1504 llvm::GlobalVariable *Entry);
1505
1506 /// EmitClassRef - Return a Value*, of type ObjCTypes.ClassPtrTy,
1507 /// for the given class reference.
1508 llvm::Value *EmitClassRef(CodeGenFunction &CGF,
1509 const ObjCInterfaceDecl *ID);
1510
1511 llvm::Value *EmitClassRefFromId(CodeGenFunction &CGF,
1512 IdentifierInfo *II,
1513 const ObjCInterfaceDecl *ID);
1514
1515 llvm::Value *EmitNSAutoreleasePoolClassRef(CodeGenFunction &CGF) override;
1516
1517 /// EmitSuperClassRef - Return a Value*, of type ObjCTypes.ClassPtrTy,
1518 /// for the given super class reference.
1519 llvm::Value *EmitSuperClassRef(CodeGenFunction &CGF,
1520 const ObjCInterfaceDecl *ID);
1521
1522 /// EmitMetaClassRef - Return a Value * of the address of _class_t
1523 /// meta-data
1524 llvm::Value *EmitMetaClassRef(CodeGenFunction &CGF,
1525 const ObjCInterfaceDecl *ID, bool Weak);
1526
1527 /// ObjCIvarOffsetVariable - Returns the ivar offset variable for
1528 /// the given ivar.
1529 ///
1530 llvm::GlobalVariable * ObjCIvarOffsetVariable(
1531 const ObjCInterfaceDecl *ID,
1532 const ObjCIvarDecl *Ivar);
1533
1534 /// EmitSelector - Return a Value*, of type ObjCTypes.SelectorPtrTy,
1535 /// for the given selector.
1536 llvm::Value *EmitSelector(CodeGenFunction &CGF, Selector Sel);
1537 Address EmitSelectorAddr(Selector Sel);
1538
1539 /// GetInterfaceEHType - Get the cached ehtype for the given Objective-C
1540 /// interface. The return value has type EHTypePtrTy.
1541 llvm::Constant *GetInterfaceEHType(const ObjCInterfaceDecl *ID,
1542 ForDefinition_t IsForDefinition);
1543
1544 StringRef getMetaclassSymbolPrefix() const { return "OBJC_METACLASS_$_"; }
1545
1546 StringRef getClassSymbolPrefix() const { return "OBJC_CLASS_$_"; }
1547
1548 void GetClassSizeInfo(const ObjCImplementationDecl *OID,
1549 uint32_t &InstanceStart,
1550 uint32_t &InstanceSize);
1551
1552 // Shamelessly stolen from Analysis/CFRefCount.cpp
1553 Selector GetNullarySelector(const char* name) const {
1554 IdentifierInfo* II = &CGM.getContext().Idents.get(name);
1555 return CGM.getContext().Selectors.getSelector(0, &II);
1556 }
1557
1558 Selector GetUnarySelector(const char* name) const {
1559 IdentifierInfo* II = &CGM.getContext().Idents.get(name);
1560 return CGM.getContext().Selectors.getSelector(1, &II);
1561 }
1562
1563 /// ImplementationIsNonLazy - Check whether the given category or
1564 /// class implementation is "non-lazy".
1565 bool ImplementationIsNonLazy(const ObjCImplDecl *OD) const;
1566
1567 bool IsIvarOffsetKnownIdempotent(const CodeGen::CodeGenFunction &CGF,
1568 const ObjCIvarDecl *IV) {
1569 // Annotate the load as an invariant load iff inside an instance method
1570 // and ivar belongs to instance method's class and one of its super class.
1571 // This check is needed because the ivar offset is a lazily
1572 // initialised value that may depend on objc_msgSend to perform a fixup on
1573 // the first message dispatch.
1574 //
1575 // An additional opportunity to mark the load as invariant arises when the
1576 // base of the ivar access is a parameter to an Objective C method.
1577 // However, because the parameters are not available in the current
1578 // interface, we cannot perform this check.
1579 //
1580 // Note that for direct methods, because objc_msgSend is skipped,
1581 // and that the method may be inlined, this optimization actually
1582 // can't be performed.
1583 if (const ObjCMethodDecl *MD =
1584 dyn_cast_or_null<ObjCMethodDecl>(CGF.CurFuncDecl))
1585 if (MD->isInstanceMethod() && !MD->isDirectMethod())
1586 if (const ObjCInterfaceDecl *ID = MD->getClassInterface())
1587 return IV->getContainingInterface()->isSuperClassOf(ID);
1588 return false;
1589 }
1590
1591 bool isClassLayoutKnownStatically(const ObjCInterfaceDecl *ID) {
1592 // NSObject is a fixed size. If we can see the @implementation of a class
1593 // which inherits from NSObject then we know that all it's offsets also must
1594 // be fixed. FIXME: Can we do this if see a chain of super classes with
1595 // implementations leading to NSObject?
1596 return ID->getImplementation() && ID->getSuperClass() &&
1597 ID->getSuperClass()->getName() == "NSObject";
1598 }
1599
1600public:
1601 CGObjCNonFragileABIMac(CodeGen::CodeGenModule &cgm);
1602
1603 llvm::Constant *getNSConstantStringClassRef() override;
1604
1605 llvm::Function *ModuleInitFunction() override;
1606
1607 CodeGen::RValue GenerateMessageSend(CodeGen::CodeGenFunction &CGF,
1608 ReturnValueSlot Return,
1609 QualType ResultType, Selector Sel,
1610 llvm::Value *Receiver,
1611 const CallArgList &CallArgs,
1612 const ObjCInterfaceDecl *Class,
1613 const ObjCMethodDecl *Method) override;
1614
1615 CodeGen::RValue
1616 GenerateMessageSendSuper(CodeGen::CodeGenFunction &CGF,
1617 ReturnValueSlot Return, QualType ResultType,
1618 Selector Sel, const ObjCInterfaceDecl *Class,
1619 bool isCategoryImpl, llvm::Value *Receiver,
1620 bool IsClassMessage, const CallArgList &CallArgs,
1621 const ObjCMethodDecl *Method) override;
1622
1623 llvm::Value *GetClass(CodeGenFunction &CGF,
1624 const ObjCInterfaceDecl *ID) override;
1625
1626 llvm::Value *GetSelector(CodeGenFunction &CGF, Selector Sel) override
1627 { return EmitSelector(CGF, Sel); }
1628 Address GetAddrOfSelector(CodeGenFunction &CGF, Selector Sel) override
1629 { return EmitSelectorAddr(Sel); }
1630
1631 /// The NeXT/Apple runtimes do not support typed selectors; just emit an
1632 /// untyped one.
1633 llvm::Value *GetSelector(CodeGenFunction &CGF,
1634 const ObjCMethodDecl *Method) override
1635 { return EmitSelector(CGF, Method->getSelector()); }
1636
1637 void GenerateCategory(const ObjCCategoryImplDecl *CMD) override;
1638
1639 void GenerateClass(const ObjCImplementationDecl *ClassDecl) override;
1640
1641 void RegisterAlias(const ObjCCompatibleAliasDecl *OAD) override {}
1642
1643 llvm::Value *GenerateProtocolRef(CodeGenFunction &CGF,
1644 const ObjCProtocolDecl *PD) override;
1645
1646 llvm::Constant *GetEHType(QualType T) override;
1647
1648 llvm::FunctionCallee GetPropertyGetFunction() override {
1649 return ObjCTypes.getGetPropertyFn();
1650 }
1651 llvm::FunctionCallee GetPropertySetFunction() override {
1652 return ObjCTypes.getSetPropertyFn();
1653 }
1654
1655 llvm::FunctionCallee GetOptimizedPropertySetFunction(bool atomic,
1656 bool copy) override {
1657 return ObjCTypes.getOptimizedSetPropertyFn(atomic, copy);
1658 }
1659
1660 llvm::FunctionCallee GetSetStructFunction() override {
1661 return ObjCTypes.getCopyStructFn();
1662 }
1663
1664 llvm::FunctionCallee GetGetStructFunction() override {
1665 return ObjCTypes.getCopyStructFn();
1666 }
1667
1668 llvm::FunctionCallee GetCppAtomicObjectSetFunction() override {
1669 return ObjCTypes.getCppAtomicObjectFunction();
1670 }
1671
1672 llvm::FunctionCallee GetCppAtomicObjectGetFunction() override {
1673 return ObjCTypes.getCppAtomicObjectFunction();
1674 }
1675
1676 llvm::FunctionCallee EnumerationMutationFunction() override {
1677 return ObjCTypes.getEnumerationMutationFn();
1678 }
1679
1680 void EmitTryStmt(CodeGen::CodeGenFunction &CGF,
1681 const ObjCAtTryStmt &S) override;
1682 void EmitSynchronizedStmt(CodeGen::CodeGenFunction &CGF,
1683 const ObjCAtSynchronizedStmt &S) override;
1684 void EmitThrowStmt(CodeGen::CodeGenFunction &CGF, const ObjCAtThrowStmt &S,
1685 bool ClearInsertionPoint=true) override;
1686 llvm::Value * EmitObjCWeakRead(CodeGen::CodeGenFunction &CGF,
1687 Address AddrWeakObj) override;
1688 void EmitObjCWeakAssign(CodeGen::CodeGenFunction &CGF,
1689 llvm::Value *src, Address edst) override;
1690 void EmitObjCGlobalAssign(CodeGen::CodeGenFunction &CGF,
1691 llvm::Value *src, Address dest,
1692 bool threadlocal = false) override;
1693 void EmitObjCIvarAssign(CodeGen::CodeGenFunction &CGF,
1694 llvm::Value *src, Address dest,
1695 llvm::Value *ivarOffset) override;
1696 void EmitObjCStrongCastAssign(CodeGen::CodeGenFunction &CGF,
1697 llvm::Value *src, Address dest) override;
1698 void EmitGCMemmoveCollectable(CodeGen::CodeGenFunction &CGF,
1699 Address dest, Address src,
1700 llvm::Value *size) override;
1701 LValue EmitObjCValueForIvar(CodeGen::CodeGenFunction &CGF, QualType ObjectTy,
1702 llvm::Value *BaseValue, const ObjCIvarDecl *Ivar,
1703 unsigned CVRQualifiers) override;
1704 llvm::Value *EmitIvarOffset(CodeGen::CodeGenFunction &CGF,
1705 const ObjCInterfaceDecl *Interface,
1706 const ObjCIvarDecl *Ivar) override;
1707};
1708
1709/// A helper class for performing the null-initialization of a return
1710/// value.
1711struct NullReturnState {
1712 llvm::BasicBlock *NullBB;
1713 NullReturnState() : NullBB(nullptr) {}
1714
1715 /// Perform a null-check of the given receiver.
1716 void init(CodeGenFunction &CGF, llvm::Value *receiver) {
1717 // Make blocks for the null-receiver and call edges.
1718 NullBB = CGF.createBasicBlock("msgSend.null-receiver");
1719 llvm::BasicBlock *callBB = CGF.createBasicBlock("msgSend.call");
1720
1721 // Check for a null receiver and, if there is one, jump to the
1722 // null-receiver block. There's no point in trying to avoid it:
1723 // we're always going to put *something* there, because otherwise
1724 // we shouldn't have done this null-check in the first place.
1725 llvm::Value *isNull = CGF.Builder.CreateIsNull(receiver);
1726 CGF.Builder.CreateCondBr(isNull, NullBB, callBB);
1727
1728 // Otherwise, start performing the call.
1729 CGF.EmitBlock(callBB);
1730 }
1731
1732 /// Complete the null-return operation. It is valid to call this
1733 /// regardless of whether 'init' has been called.
1734 RValue complete(CodeGenFunction &CGF,
1735 ReturnValueSlot returnSlot,
1736 RValue result,
1737 QualType resultType,
1738 const CallArgList &CallArgs,
1739 const ObjCMethodDecl *Method) {
1740 // If we never had to do a null-check, just use the raw result.
1741 if (!NullBB) return result;
1742
1743 // The continuation block. This will be left null if we don't have an
1744 // IP, which can happen if the method we're calling is marked noreturn.
1745 llvm::BasicBlock *contBB = nullptr;
1746
1747 // Finish the call path.
1748 llvm::BasicBlock *callBB = CGF.Builder.GetInsertBlock();
1749 if (callBB) {
1750 contBB = CGF.createBasicBlock("msgSend.cont");
1751 CGF.Builder.CreateBr(contBB);
1752 }
1753
1754 // Okay, start emitting the null-receiver block.
1755 CGF.EmitBlock(NullBB);
1756
1757 // Destroy any consumed arguments we've got.
1758 if (Method) {
1759 CGObjCRuntime::destroyCalleeDestroyedArguments(CGF, Method, CallArgs);
1760 }
1761
1762 // The phi code below assumes that we haven't needed any control flow yet.
1763 assert(CGF.Builder.GetInsertBlock() == NullBB)(static_cast <bool> (CGF.Builder.GetInsertBlock() == NullBB
) ? void (0) : __assert_fail ("CGF.Builder.GetInsertBlock() == NullBB"
, "clang/lib/CodeGen/CGObjCMac.cpp", 1763, __extension__ __PRETTY_FUNCTION__
))
;
1764
1765 // If we've got a void return, just jump to the continuation block.
1766 if (result.isScalar() && resultType->isVoidType()) {
1767 // No jumps required if the message-send was noreturn.
1768 if (contBB) CGF.EmitBlock(contBB);
1769 return result;
1770 }
1771
1772 // If we've got a scalar return, build a phi.
1773 if (result.isScalar()) {
1774 // Derive the null-initialization value.
1775 llvm::Value *null =
1776 CGF.EmitFromMemory(CGF.CGM.EmitNullConstant(resultType), resultType);
1777
1778 // If no join is necessary, just flow out.
1779 if (!contBB) return RValue::get(null);
1780
1781 // Otherwise, build a phi.
1782 CGF.EmitBlock(contBB);
1783 llvm::PHINode *phi = CGF.Builder.CreatePHI(null->getType(), 2);
1784 phi->addIncoming(result.getScalarVal(), callBB);
1785 phi->addIncoming(null, NullBB);
1786 return RValue::get(phi);
1787 }
1788
1789 // If we've got an aggregate return, null the buffer out.
1790 // FIXME: maybe we should be doing things differently for all the
1791 // cases where the ABI has us returning (1) non-agg values in
1792 // memory or (2) agg values in registers.
1793 if (result.isAggregate()) {
1794 assert(result.isAggregate() && "null init of non-aggregate result?")(static_cast <bool> (result.isAggregate() && "null init of non-aggregate result?"
) ? void (0) : __assert_fail ("result.isAggregate() && \"null init of non-aggregate result?\""
, "clang/lib/CodeGen/CGObjCMac.cpp", 1794, __extension__ __PRETTY_FUNCTION__
))
;
1795 if (!returnSlot.isUnused())
1796 CGF.EmitNullInitialization(result.getAggregateAddress(), resultType);
1797 if (contBB) CGF.EmitBlock(contBB);
1798 return result;
1799 }
1800
1801 // Complex types.
1802 CGF.EmitBlock(contBB);
1803 CodeGenFunction::ComplexPairTy callResult = result.getComplexVal();
1804
1805 // Find the scalar type and its zero value.
1806 llvm::Type *scalarTy = callResult.first->getType();
1807 llvm::Constant *scalarZero = llvm::Constant::getNullValue(scalarTy);
1808
1809 // Build phis for both coordinates.
1810 llvm::PHINode *real = CGF.Builder.CreatePHI(scalarTy, 2);
1811 real->addIncoming(callResult.first, callBB);
1812 real->addIncoming(scalarZero, NullBB);
1813 llvm::PHINode *imag = CGF.Builder.CreatePHI(scalarTy, 2);
1814 imag->addIncoming(callResult.second, callBB);
1815 imag->addIncoming(scalarZero, NullBB);
1816 return RValue::getComplex(real, imag);
1817 }
1818};
1819
1820} // end anonymous namespace
1821
1822/* *** Helper Functions *** */
1823
1824/// getConstantGEP() - Help routine to construct simple GEPs.
1825static llvm::Constant *getConstantGEP(llvm::LLVMContext &VMContext,
1826 llvm::GlobalVariable *C, unsigned idx0,
1827 unsigned idx1) {
1828 llvm::Value *Idxs[] = {
1829 llvm::ConstantInt::get(llvm::Type::getInt32Ty(VMContext), idx0),
1830 llvm::ConstantInt::get(llvm::Type::getInt32Ty(VMContext), idx1)
1831 };
1832 return llvm::ConstantExpr::getGetElementPtr(C->getValueType(), C, Idxs);
1833}
1834
1835/// hasObjCExceptionAttribute - Return true if this class or any super
1836/// class has the __objc_exception__ attribute.
1837static bool hasObjCExceptionAttribute(ASTContext &Context,
1838 const ObjCInterfaceDecl *OID) {
1839 if (OID->hasAttr<ObjCExceptionAttr>())
1840 return true;
1841 if (const ObjCInterfaceDecl *Super = OID->getSuperClass())
1842 return hasObjCExceptionAttribute(Context, Super);
1843 return false;
1844}
1845
1846static llvm::GlobalValue::LinkageTypes
1847getLinkageTypeForObjCMetadata(CodeGenModule &CGM, StringRef Section) {
1848 if (CGM.getTriple().isOSBinFormatMachO() &&
1849 (Section.empty() || Section.startswith("__DATA")))
1850 return llvm::GlobalValue::InternalLinkage;
1851 return llvm::GlobalValue::PrivateLinkage;
1852}
1853
1854/// A helper function to create an internal or private global variable.
1855static llvm::GlobalVariable *
1856finishAndCreateGlobal(ConstantInitBuilder::StructBuilder &Builder,
1857 const llvm::Twine &Name, CodeGenModule &CGM) {
1858 std::string SectionName;
1859 if (CGM.getTriple().isOSBinFormatMachO())
1860 SectionName = "__DATA, __objc_const";
1861 auto *GV = Builder.finishAndCreateGlobal(
1862 Name, CGM.getPointerAlign(), /*constant*/ false,
1863 getLinkageTypeForObjCMetadata(CGM, SectionName));
1864 GV->setSection(SectionName);
1865 return GV;
1866}
1867
1868/* *** CGObjCMac Public Interface *** */
1869
1870CGObjCMac::CGObjCMac(CodeGen::CodeGenModule &cgm) : CGObjCCommonMac(cgm),
1871 ObjCTypes(cgm) {
1872 ObjCABI = 1;
1873 EmitImageInfo();
1874}
1875
1876/// GetClass - Return a reference to the class for the given interface
1877/// decl.
1878llvm::Value *CGObjCMac::GetClass(CodeGenFunction &CGF,
1879 const ObjCInterfaceDecl *ID) {
1880 return EmitClassRef(CGF, ID);
1881}
1882
1883/// GetSelector - Return the pointer to the unique'd string for this selector.
1884llvm::Value *CGObjCMac::GetSelector(CodeGenFunction &CGF, Selector Sel) {
1885 return EmitSelector(CGF, Sel);
1886}
1887Address CGObjCMac::GetAddrOfSelector(CodeGenFunction &CGF, Selector Sel) {
1888 return EmitSelectorAddr(Sel);
1889}
1890llvm::Value *CGObjCMac::GetSelector(CodeGenFunction &CGF, const ObjCMethodDecl
1891 *Method) {
1892 return EmitSelector(CGF, Method->getSelector());
1893}
1894
1895llvm::Constant *CGObjCMac::GetEHType(QualType T) {
1896 if (T->isObjCIdType() ||
1897 T->isObjCQualifiedIdType()) {
1898 return CGM.GetAddrOfRTTIDescriptor(
1899 CGM.getContext().getObjCIdRedefinitionType(), /*ForEH=*/true);
1900 }
1901 if (T->isObjCClassType() ||
1902 T->isObjCQualifiedClassType()) {
1903 return CGM.GetAddrOfRTTIDescriptor(
1904 CGM.getContext().getObjCClassRedefinitionType(), /*ForEH=*/true);
1905 }
1906 if (T->isObjCObjectPointerType())
1907 return CGM.GetAddrOfRTTIDescriptor(T, /*ForEH=*/true);
1908
1909 llvm_unreachable("asking for catch type for ObjC type in fragile runtime")::llvm::llvm_unreachable_internal("asking for catch type for ObjC type in fragile runtime"
, "clang/lib/CodeGen/CGObjCMac.cpp", 1909)
;
1910}
1911
1912/// Generate a constant CFString object.
1913/*
1914 struct __builtin_CFString {
1915 const int *isa; // point to __CFConstantStringClassReference
1916 int flags;
1917 const char *str;
1918 long length;
1919 };
1920*/
1921
1922/// or Generate a constant NSString object.
1923/*
1924 struct __builtin_NSString {
1925 const int *isa; // point to __NSConstantStringClassReference
1926 const char *str;
1927 unsigned int length;
1928 };
1929*/
1930
1931ConstantAddress
1932CGObjCCommonMac::GenerateConstantString(const StringLiteral *SL) {
1933 return (!CGM.getLangOpts().NoConstantCFStrings
1934 ? CGM.GetAddrOfConstantCFString(SL)
1935 : GenerateConstantNSString(SL));
1936}
1937
1938static llvm::StringMapEntry<llvm::GlobalVariable *> &
1939GetConstantStringEntry(llvm::StringMap<llvm::GlobalVariable *> &Map,
1940 const StringLiteral *Literal, unsigned &StringLength) {
1941 StringRef String = Literal->getString();
1942 StringLength = String.size();
1943 return *Map.insert(std::make_pair(String, nullptr)).first;
1944}
1945
1946llvm::Constant *CGObjCMac::getNSConstantStringClassRef() {
1947 if (llvm::Value *V = ConstantStringClassRef)
1948 return cast<llvm::Constant>(V);
1949
1950 auto &StringClass = CGM.getLangOpts().ObjCConstantStringClass;
1951 std::string str =
1952 StringClass.empty() ? "_NSConstantStringClassReference"
1953 : "_" + StringClass + "ClassReference";
1954
1955 llvm::Type *PTy = llvm::ArrayType::get(CGM.IntTy, 0);
1956 auto GV = CGM.CreateRuntimeVariable(PTy, str);
1957 auto V = llvm::ConstantExpr::getBitCast(GV, CGM.IntTy->getPointerTo());
1958 ConstantStringClassRef = V;
1959 return V;
1960}
1961
1962llvm::Constant *CGObjCNonFragileABIMac::getNSConstantStringClassRef() {
1963 if (llvm::Value *V = ConstantStringClassRef)
1964 return cast<llvm::Constant>(V);
1965
1966 auto &StringClass = CGM.getLangOpts().ObjCConstantStringClass;
1967 std::string str =
1968 StringClass.empty() ? "OBJC_CLASS_$_NSConstantString"
1969 : "OBJC_CLASS_$_" + StringClass;
1970 llvm::Constant *GV = GetClassGlobal(str, NotForDefinition);
1971
1972 // Make sure the result is of the correct type.
1973 auto V = llvm::ConstantExpr::getBitCast(GV, CGM.IntTy->getPointerTo());
1974
1975 ConstantStringClassRef = V;
1976 return V;
1977}
1978
1979ConstantAddress
1980CGObjCCommonMac::GenerateConstantNSString(const StringLiteral *Literal) {
1981 unsigned StringLength = 0;
1982 llvm::StringMapEntry<llvm::GlobalVariable *> &Entry =
1983 GetConstantStringEntry(NSConstantStringMap, Literal, StringLength);
1984
1985 if (auto *C = Entry.second)
1986 return ConstantAddress(
1987 C, C->getValueType(), CharUnits::fromQuantity(C->getAlignment()));
1988
1989 // If we don't already have it, get _NSConstantStringClassReference.
1990 llvm::Constant *Class = getNSConstantStringClassRef();
1991
1992 // If we don't already have it, construct the type for a constant NSString.
1993 if (!NSConstantStringType) {
1994 NSConstantStringType =
1995 llvm::StructType::create({
1996 CGM.Int32Ty->getPointerTo(),
1997 CGM.Int8PtrTy,
1998 CGM.IntTy
1999 }, "struct.__builtin_NSString");
2000 }
2001
2002 ConstantInitBuilder Builder(CGM);
2003 auto Fields = Builder.beginStruct(NSConstantStringType);
2004
2005 // Class pointer.
2006 Fields.add(Class);
2007
2008 // String pointer.
2009 llvm::Constant *C =
2010 llvm::ConstantDataArray::getString(VMContext, Entry.first());
2011
2012 llvm::GlobalValue::LinkageTypes Linkage = llvm::GlobalValue::PrivateLinkage;
2013 bool isConstant = !CGM.getLangOpts().WritableStrings;
2014
2015 auto *GV = new llvm::GlobalVariable(CGM.getModule(), C->getType(), isConstant,
2016 Linkage, C, ".str");
2017 GV->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
2018 // Don't enforce the target's minimum global alignment, since the only use
2019 // of the string is via this class initializer.
2020 GV->setAlignment(llvm::Align(1));
2021 Fields.addBitCast(GV, CGM.Int8PtrTy);
2022
2023 // String length.
2024 Fields.addInt(CGM.IntTy, StringLength);
2025
2026 // The struct.
2027 CharUnits Alignment = CGM.getPointerAlign();
2028 GV = Fields.finishAndCreateGlobal("_unnamed_nsstring_", Alignment,
2029 /*constant*/ true,
2030 llvm::GlobalVariable::PrivateLinkage);
2031 const char *NSStringSection = "__OBJC,__cstring_object,regular,no_dead_strip";
2032 const char *NSStringNonFragileABISection =
2033 "__DATA,__objc_stringobj,regular,no_dead_strip";
2034 // FIXME. Fix section.
2035 GV->setSection(CGM.getLangOpts().ObjCRuntime.isNonFragile()
2036 ? NSStringNonFragileABISection
2037 : NSStringSection);
2038 Entry.second = GV;
2039
2040 return ConstantAddress(GV, GV->getValueType(), Alignment);
2041}
2042
2043enum {
2044 kCFTaggedObjectID_Integer = (1 << 1) + 1
2045};
2046
2047/// Generates a message send where the super is the receiver. This is
2048/// a message send to self with special delivery semantics indicating
2049/// which class's method should be called.
2050CodeGen::RValue
2051CGObjCMac::GenerateMessageSendSuper(CodeGen::CodeGenFunction &CGF,
2052 ReturnValueSlot Return,
2053 QualType ResultType,
2054 Selector Sel,
2055 const ObjCInterfaceDecl *Class,
2056 bool isCategoryImpl,
2057 llvm::Value *Receiver,
2058 bool IsClassMessage,
2059 const CodeGen::CallArgList &CallArgs,
2060 const ObjCMethodDecl *Method) {
2061 // Create and init a super structure; this is a (receiver, class)
2062 // pair we will pass to objc_msgSendSuper.
2063 Address ObjCSuper =
2064 CGF.CreateTempAlloca(ObjCTypes.SuperTy, CGF.getPointerAlign(),
2065 "objc_super");
2066 llvm::Value *ReceiverAsObject =
2067 CGF.Builder.CreateBitCast(Receiver, ObjCTypes.ObjectPtrTy);
2068 CGF.Builder.CreateStore(ReceiverAsObject,
2069 CGF.Builder.CreateStructGEP(ObjCSuper, 0));
2070
2071 // If this is a class message the metaclass is passed as the target.
2072 llvm::Type *ClassTyPtr = llvm::PointerType::getUnqual(ObjCTypes.ClassTy);
2073 llvm::Value *Target;
2074 if (IsClassMessage) {
2075 if (isCategoryImpl) {
2076 // Message sent to 'super' in a class method defined in a category
2077 // implementation requires an odd treatment.
2078 // If we are in a class method, we must retrieve the
2079 // _metaclass_ for the current class, pointed at by
2080 // the class's "isa" pointer. The following assumes that
2081 // isa" is the first ivar in a class (which it must be).
2082 Target = EmitClassRef(CGF, Class->getSuperClass());
2083 Target = CGF.Builder.CreateStructGEP(ObjCTypes.ClassTy, Target, 0);
2084 Target = CGF.Builder.CreateAlignedLoad(ClassTyPtr, Target,
2085 CGF.getPointerAlign());
2086 } else {
2087 llvm::Constant *MetaClassPtr = EmitMetaClassRef(Class);
2088 llvm::Value *SuperPtr =
2089 CGF.Builder.CreateStructGEP(ObjCTypes.ClassTy, MetaClassPtr, 1);
2090 llvm::Value *Super = CGF.Builder.CreateAlignedLoad(ClassTyPtr, SuperPtr,
2091 CGF.getPointerAlign());
2092 Target = Super;
2093 }
2094 } else if (isCategoryImpl)
2095 Target = EmitClassRef(CGF, Class->getSuperClass());
2096 else {
2097 llvm::Value *ClassPtr = EmitSuperClassRef(Class);
2098 ClassPtr = CGF.Builder.CreateStructGEP(ObjCTypes.ClassTy, ClassPtr, 1);
2099 Target = CGF.Builder.CreateAlignedLoad(ClassTyPtr, ClassPtr,
2100 CGF.getPointerAlign());
2101 }
2102 // FIXME: We shouldn't need to do this cast, rectify the ASTContext and
2103 // ObjCTypes types.
2104 llvm::Type *ClassTy =
2105 CGM.getTypes().ConvertType(CGF.getContext().getObjCClassType());
2106 Target = CGF.Builder.CreateBitCast(Target, ClassTy);
2107 CGF.Builder.CreateStore(Target, CGF.Builder.CreateStructGEP(ObjCSuper, 1));
2108 return EmitMessageSend(CGF, Return, ResultType, Sel, ObjCSuper.getPointer(),
2109 ObjCTypes.SuperPtrCTy, true, CallArgs, Method, Class,
2110 ObjCTypes);
2111}
2112
2113/// Generate code for a message send expression.
2114CodeGen::RValue CGObjCMac::GenerateMessageSend(CodeGen::CodeGenFunction &CGF,
2115 ReturnValueSlot Return,
2116 QualType ResultType,
2117 Selector Sel,
2118 llvm::Value *Receiver,
2119 const CallArgList &CallArgs,
2120 const ObjCInterfaceDecl *Class,
2121 const ObjCMethodDecl *Method) {
2122 return EmitMessageSend(CGF, Return, ResultType, Sel, Receiver,
2123 CGF.getContext().getObjCIdType(), false, CallArgs,
2124 Method, Class, ObjCTypes);
2125}
2126
2127CodeGen::RValue
2128CGObjCCommonMac::EmitMessageSend(CodeGen::CodeGenFunction &CGF,
2129 ReturnValueSlot Return,
2130 QualType ResultType,
2131 Selector Sel,
2132 llvm::Value *Arg0,
2133 QualType Arg0Ty,
2134 bool IsSuper,
2135 const CallArgList &CallArgs,
2136 const ObjCMethodDecl *Method,
2137 const ObjCInterfaceDecl *ClassReceiver,
2138 const ObjCCommonTypesHelper &ObjCTypes) {
2139 CodeGenTypes &Types = CGM.getTypes();
2140 auto selTy = CGF.getContext().getObjCSelType();
2141 llvm::Value *SelValue;
2142
2143 if (Method && Method->isDirectMethod()) {
2144 // Direct methods will synthesize the proper `_cmd` internally,
2145 // so just don't bother with setting the `_cmd` argument.
2146 assert(!IsSuper)(static_cast <bool> (!IsSuper) ? void (0) : __assert_fail
("!IsSuper", "clang/lib/CodeGen/CGObjCMac.cpp", 2146, __extension__
__PRETTY_FUNCTION__))
;
2147 SelValue = llvm::UndefValue::get(Types.ConvertType(selTy));
2148 } else {
2149 SelValue = GetSelector(CGF, Sel);
2150 }
2151
2152 CallArgList ActualArgs;
2153 if (!IsSuper)
2154 Arg0 = CGF.Builder.CreateBitCast(Arg0, ObjCTypes.ObjectPtrTy);
2155 ActualArgs.add(RValue::get(Arg0), Arg0Ty);
2156 ActualArgs.add(RValue::get(SelValue), selTy);
2157 ActualArgs.addFrom(CallArgs);
2158
2159 // If we're calling a method, use the formal signature.
2160 MessageSendInfo MSI = getMessageSendInfo(Method, ResultType, ActualArgs);
2161
2162 if (Method)
2163 assert(CGM.getContext().getCanonicalType(Method->getReturnType()) ==(static_cast <bool> (CGM.getContext().getCanonicalType(
Method->getReturnType()) == CGM.getContext().getCanonicalType
(ResultType) && "Result type mismatch!") ? void (0) :
__assert_fail ("CGM.getContext().getCanonicalType(Method->getReturnType()) == CGM.getContext().getCanonicalType(ResultType) && \"Result type mismatch!\""
, "clang/lib/CodeGen/CGObjCMac.cpp", 2165, __extension__ __PRETTY_FUNCTION__
))
2164 CGM.getContext().getCanonicalType(ResultType) &&(static_cast <bool> (CGM.getContext().getCanonicalType(
Method->getReturnType()) == CGM.getContext().getCanonicalType
(ResultType) && "Result type mismatch!") ? void (0) :
__assert_fail ("CGM.getContext().getCanonicalType(Method->getReturnType()) == CGM.getContext().getCanonicalType(ResultType) && \"Result type mismatch!\""
, "clang/lib/CodeGen/CGObjCMac.cpp", 2165, __extension__ __PRETTY_FUNCTION__
))
2165 "Result type mismatch!")(static_cast <bool> (CGM.getContext().getCanonicalType(
Method->getReturnType()) == CGM.getContext().getCanonicalType
(ResultType) && "Result type mismatch!") ? void (0) :
__assert_fail ("CGM.getContext().getCanonicalType(Method->getReturnType()) == CGM.getContext().getCanonicalType(ResultType) && \"Result type mismatch!\""
, "clang/lib/CodeGen/CGObjCMac.cpp", 2165, __extension__ __PRETTY_FUNCTION__
))
;
2166
2167 bool ReceiverCanBeNull =
2168 canMessageReceiverBeNull(CGF, Method, IsSuper, ClassReceiver, Arg0);
2169
2170 bool RequiresNullCheck = false;
2171
2172 llvm::FunctionCallee Fn = nullptr;
2173 if (Method && Method->isDirectMethod()) {
2174 Fn = GenerateDirectMethod(Method, Method->getClassInterface());
2175 } else if (CGM.ReturnSlotInterferesWithArgs(MSI.CallInfo)) {
2176 if (ReceiverCanBeNull) RequiresNullCheck = true;
2177 Fn = (ObjCABI == 2) ? ObjCTypes.getSendStretFn2(IsSuper)
2178 : ObjCTypes.getSendStretFn(IsSuper);
2179 } else if (CGM.ReturnTypeUsesFPRet(ResultType)) {
2180 Fn = (ObjCABI == 2) ? ObjCTypes.getSendFpretFn2(IsSuper)
2181 : ObjCTypes.getSendFpretFn(IsSuper);
2182 } else if (CGM.ReturnTypeUsesFP2Ret(ResultType)) {
2183 Fn = (ObjCABI == 2) ? ObjCTypes.getSendFp2RetFn2(IsSuper)
2184 : ObjCTypes.getSendFp2retFn(IsSuper);
2185 } else {
2186 // arm64 uses objc_msgSend for stret methods and yet null receiver check
2187 // must be made for it.
2188 if (ReceiverCanBeNull && CGM.ReturnTypeUsesSRet(MSI.CallInfo))
2189 RequiresNullCheck = true;
2190 Fn = (ObjCABI == 2) ? ObjCTypes.getSendFn2(IsSuper)
2191 : ObjCTypes.getSendFn(IsSuper);
2192 }
2193
2194 // Cast function to proper signature
2195 llvm::Constant *BitcastFn = cast<llvm::Constant>(
2196 CGF.Builder.CreateBitCast(Fn.getCallee(), MSI.MessengerType));
2197
2198 // We don't need to emit a null check to zero out an indirect result if the
2199 // result is ignored.
2200 if (Return.isUnused())
2201 RequiresNullCheck = false;
2202
2203 // Emit a null-check if there's a consumed argument other than the receiver.
2204 if (!RequiresNullCheck && Method && Method->hasParamDestroyedInCallee())
2205 RequiresNullCheck = true;
2206
2207 NullReturnState nullReturn;
2208 if (RequiresNullCheck) {
2209 nullReturn.init(CGF, Arg0);
2210 }
2211
2212 llvm::CallBase *CallSite;
2213 CGCallee Callee = CGCallee::forDirect(BitcastFn);
2214 RValue rvalue = CGF.EmitCall(MSI.CallInfo, Callee, Return, ActualArgs,
2215 &CallSite);
2216
2217 // Mark the call as noreturn if the method is marked noreturn and the
2218 // receiver cannot be null.
2219 if (Method && Method->hasAttr<NoReturnAttr>() && !ReceiverCanBeNull) {
2220 CallSite->setDoesNotReturn();
2221 }
2222
2223 return nullReturn.complete(CGF, Return, rvalue, ResultType, CallArgs,
2224 RequiresNullCheck ? Method : nullptr);
2225}
2226
2227static Qualifiers::GC GetGCAttrTypeForType(ASTContext &Ctx, QualType FQT,
2228 bool pointee = false) {
2229 // Note that GC qualification applies recursively to C pointer types
2230 // that aren't otherwise decorated. This is weird, but it's probably
2231 // an intentional workaround to the unreliable placement of GC qualifiers.
2232 if (FQT.isObjCGCStrong())
2233 return Qualifiers::Strong;
2234
2235 if (FQT.isObjCGCWeak())
2236 return Qualifiers::Weak;
2237
2238 if (auto ownership = FQT.getObjCLifetime()) {
2239 // Ownership does not apply recursively to C pointer types.
2240 if (pointee) return Qualifiers::GCNone;
2241 switch (ownership) {
2242 case Qualifiers::OCL_Weak: return Qualifiers::Weak;
2243 case Qualifiers::OCL_Strong: return Qualifiers::Strong;
2244 case Qualifiers::OCL_ExplicitNone: return Qualifiers::GCNone;
2245 case Qualifiers::OCL_Autoreleasing: llvm_unreachable("autoreleasing ivar?")::llvm::llvm_unreachable_internal("autoreleasing ivar?", "clang/lib/CodeGen/CGObjCMac.cpp"
, 2245)
;
2246 case Qualifiers::OCL_None: llvm_unreachable("known nonzero")::llvm::llvm_unreachable_internal("known nonzero", "clang/lib/CodeGen/CGObjCMac.cpp"
, 2246)
;
2247 }
2248 llvm_unreachable("bad objc ownership")::llvm::llvm_unreachable_internal("bad objc ownership", "clang/lib/CodeGen/CGObjCMac.cpp"
, 2248)
;
2249 }
2250
2251 // Treat unqualified retainable pointers as strong.
2252 if (FQT->isObjCObjectPointerType() || FQT->isBlockPointerType())
2253 return Qualifiers::Strong;
2254
2255 // Walk into C pointer types, but only in GC.
2256 if (Ctx.getLangOpts().getGC() != LangOptions::NonGC) {
2257 if (const PointerType *PT = FQT->getAs<PointerType>())
2258 return GetGCAttrTypeForType(Ctx, PT->getPointeeType(), /*pointee*/ true);
2259 }
2260
2261 return Qualifiers::GCNone;
2262}
2263
2264namespace {
2265 struct IvarInfo {
2266 CharUnits Offset;
2267 uint64_t SizeInWords;
2268 IvarInfo(CharUnits offset, uint64_t sizeInWords)
2269 : Offset(offset), SizeInWords(sizeInWords) {}
2270
2271 // Allow sorting based on byte pos.
2272 bool operator<(const IvarInfo &other) const {
2273 return Offset < other.Offset;
2274 }
2275 };
2276
2277 /// A helper class for building GC layout strings.
2278 class IvarLayoutBuilder {
2279 CodeGenModule &CGM;
2280
2281 /// The start of the layout. Offsets will be relative to this value,
2282 /// and entries less than this value will be silently discarded.
2283 CharUnits InstanceBegin;
2284
2285 /// The end of the layout. Offsets will never exceed this value.
2286 CharUnits InstanceEnd;
2287
2288 /// Whether we're generating the strong layout or the weak layout.
2289 bool ForStrongLayout;
2290
2291 /// Whether the offsets in IvarsInfo might be out-of-order.
2292 bool IsDisordered = false;
2293
2294 llvm::SmallVector<IvarInfo, 8> IvarsInfo;
2295
2296 public:
2297 IvarLayoutBuilder(CodeGenModule &CGM, CharUnits instanceBegin,
2298 CharUnits instanceEnd, bool forStrongLayout)
2299 : CGM(CGM), InstanceBegin(instanceBegin), InstanceEnd(instanceEnd),
2300 ForStrongLayout(forStrongLayout) {
2301 }
2302
2303 void visitRecord(const RecordType *RT, CharUnits offset);
2304
2305 template <class Iterator, class GetOffsetFn>
2306 void visitAggregate(Iterator begin, Iterator end,
2307 CharUnits aggrOffset,
2308 const GetOffsetFn &getOffset);
2309
2310 void visitField(const FieldDecl *field, CharUnits offset);
2311
2312 /// Add the layout of a block implementation.
2313 void visitBlock(const CGBlockInfo &blockInfo);
2314
2315 /// Is there any information for an interesting bitmap?
2316 bool hasBitmapData() const { return !IvarsInfo.empty(); }
2317
2318 llvm::Constant *buildBitmap(CGObjCCommonMac &CGObjC,
2319 llvm::SmallVectorImpl<unsigned char> &buffer);
2320
2321 static void dump(ArrayRef<unsigned char> buffer) {
2322 const unsigned char *s = buffer.data();
2323 for (unsigned i = 0, e = buffer.size(); i < e; i++)
2324 if (!(s[i] & 0xf0))
2325 printf("0x0%x%s", s[i], s[i] != 0 ? ", " : "");
2326 else
2327 printf("0x%x%s", s[i], s[i] != 0 ? ", " : "");
2328 printf("\n");
2329 }
2330 };
2331} // end anonymous namespace
2332
2333llvm::Constant *CGObjCCommonMac::BuildGCBlockLayout(CodeGenModule &CGM,
2334 const CGBlockInfo &blockInfo) {
2335
2336 llvm::Constant *nullPtr = llvm::Constant::getNullValue(CGM.Int8PtrTy);
2337 if (CGM.getLangOpts().getGC() == LangOptions::NonGC)
2338 return nullPtr;
2339
2340 IvarLayoutBuilder builder(CGM, CharUnits::Zero(), blockInfo.BlockSize,
2341 /*for strong layout*/ true);
2342
2343 builder.visitBlock(blockInfo);
2344
2345 if (!builder.hasBitmapData())
2346 return nullPtr;
2347
2348 llvm::SmallVector<unsigned char, 32> buffer;
2349 llvm::Constant *C = builder.buildBitmap(*this, buffer);
2350 if (CGM.getLangOpts().ObjCGCBitmapPrint && !buffer.empty()) {
2351 printf("\n block variable layout for block: ");
2352 builder.dump(buffer);
2353 }
2354
2355 return C;
2356}
2357
2358void IvarLayoutBuilder::visitBlock(const CGBlockInfo &blockInfo) {
2359 // __isa is the first field in block descriptor and must assume by runtime's
2360 // convention that it is GC'able.
2361 IvarsInfo.push_back(IvarInfo(CharUnits::Zero(), 1));
2362
2363 const BlockDecl *blockDecl = blockInfo.getBlockDecl();
2364
2365 // Ignore the optional 'this' capture: C++ objects are not assumed
2366 // to be GC'ed.
2367
2368 CharUnits lastFieldOffset;
2369
2370 // Walk the captured variables.
2371 for (const auto &CI : blockDecl->captures()) {
2372 const VarDecl *variable = CI.getVariable();
2373 QualType type = variable->getType();
2374
2375 const CGBlockInfo::Capture &capture = blockInfo.getCapture(variable);
2376
2377 // Ignore constant captures.
2378 if (capture.isConstant()) continue;
2379
2380 CharUnits fieldOffset = capture.getOffset();
2381
2382 // Block fields are not necessarily ordered; if we detect that we're
2383 // adding them out-of-order, make sure we sort later.
2384 if (fieldOffset < lastFieldOffset)
2385 IsDisordered = true;
2386 lastFieldOffset = fieldOffset;
2387
2388 // __block variables are passed by their descriptor address.
2389 if (CI.isByRef()) {
2390 IvarsInfo.push_back(IvarInfo(fieldOffset, /*size in words*/ 1));
2391 continue;
2392 }
2393
2394 assert(!type->isArrayType() && "array variable should not be caught")(static_cast <bool> (!type->isArrayType() &&
"array variable should not be caught") ? void (0) : __assert_fail
("!type->isArrayType() && \"array variable should not be caught\""
, "clang/lib/CodeGen/CGObjCMac.cpp", 2394, __extension__ __PRETTY_FUNCTION__
))
;
2395 if (const RecordType *record = type->getAs<RecordType>()) {
2396 visitRecord(record, fieldOffset);
2397 continue;
2398 }
2399
2400 Qualifiers::GC GCAttr = GetGCAttrTypeForType(CGM.getContext(), type);
2401
2402 if (GCAttr == Qualifiers::Strong) {
2403 assert(CGM.getContext().getTypeSize(type)(static_cast <bool> (CGM.getContext().getTypeSize(type)
== CGM.getTarget().getPointerWidth(0)) ? void (0) : __assert_fail
("CGM.getContext().getTypeSize(type) == CGM.getTarget().getPointerWidth(0)"
, "clang/lib/CodeGen/CGObjCMac.cpp", 2404, __extension__ __PRETTY_FUNCTION__
))
2404 == CGM.getTarget().getPointerWidth(0))(static_cast <bool> (CGM.getContext().getTypeSize(type)
== CGM.getTarget().getPointerWidth(0)) ? void (0) : __assert_fail
("CGM.getContext().getTypeSize(type) == CGM.getTarget().getPointerWidth(0)"
, "clang/lib/CodeGen/CGObjCMac.cpp", 2404, __extension__ __PRETTY_FUNCTION__
))
;
2405 IvarsInfo.push_back(IvarInfo(fieldOffset, /*size in words*/ 1));
2406 }
2407 }
2408}
2409
2410/// getBlockCaptureLifetime - This routine returns life time of the captured
2411/// block variable for the purpose of block layout meta-data generation. FQT is
2412/// the type of the variable captured in the block.
2413Qualifiers::ObjCLifetime CGObjCCommonMac::getBlockCaptureLifetime(QualType FQT,
2414 bool ByrefLayout) {
2415 // If it has an ownership qualifier, we're done.
2416 if (auto lifetime = FQT.getObjCLifetime())
2417 return lifetime;
2418
2419 // If it doesn't, and this is ARC, it has no ownership.
2420 if (CGM.getLangOpts().ObjCAutoRefCount)
2421 return Qualifiers::OCL_None;
2422
2423 // In MRC, retainable pointers are owned by non-__block variables.
2424 if (FQT->isObjCObjectPointerType() || FQT->isBlockPointerType())
2425 return ByrefLayout ? Qualifiers::OCL_ExplicitNone : Qualifiers::OCL_Strong;
2426
2427 return Qualifiers::OCL_None;
2428}
2429
2430void CGObjCCommonMac::UpdateRunSkipBlockVars(bool IsByref,
2431 Qualifiers::ObjCLifetime LifeTime,
2432 CharUnits FieldOffset,
2433 CharUnits FieldSize) {
2434 // __block variables are passed by their descriptor address.
2435 if (IsByref)
2436 RunSkipBlockVars.push_back(RUN_SKIP(BLOCK_LAYOUT_BYREF, FieldOffset,
2437 FieldSize));
2438 else if (LifeTime == Qualifiers::OCL_Strong)
2439 RunSkipBlockVars.push_back(RUN_SKIP(BLOCK_LAYOUT_STRONG, FieldOffset,
2440 FieldSize));
2441 else if (LifeTime == Qualifiers::OCL_Weak)
2442 RunSkipBlockVars.push_back(RUN_SKIP(BLOCK_LAYOUT_WEAK, FieldOffset,
2443 FieldSize));
2444 else if (LifeTime == Qualifiers::OCL_ExplicitNone)
2445 RunSkipBlockVars.push_back(RUN_SKIP(BLOCK_LAYOUT_UNRETAINED, FieldOffset,
2446 FieldSize));
2447 else
2448 RunSkipBlockVars.push_back(RUN_SKIP(BLOCK_LAYOUT_NON_OBJECT_BYTES,
2449 FieldOffset,
2450 FieldSize));
2451}
2452
2453void CGObjCCommonMac::BuildRCRecordLayout(const llvm::StructLayout *RecLayout,
2454 const RecordDecl *RD,
2455 ArrayRef<const FieldDecl*> RecFields,
2456 CharUnits BytePos, bool &HasUnion,
2457 bool ByrefLayout) {
2458 bool IsUnion = (RD
9.1
'RD' is non-null
9.1
'RD' is non-null
&& RD->isUnion());
2459 CharUnits MaxUnionSize = CharUnits::Zero();
2460 const FieldDecl *MaxField = nullptr;
2461 const FieldDecl *LastFieldBitfieldOrUnnamed = nullptr;
2462 CharUnits MaxFieldOffset = CharUnits::Zero();
2463 CharUnits LastBitfieldOrUnnamedOffset = CharUnits::Zero();
2464
2465 if (RecFields.empty())
10
Assuming the condition is false
11
Taking false branch
2466 return;
2467 unsigned ByteSizeInBits = CGM.getTarget().getCharWidth();
2468
2469 for (unsigned i = 0, e = RecFields.size(); i != e; ++i) {
12
Assuming 'i' is not equal to 'e'
13
Loop condition is true. Entering loop body
2470 const FieldDecl *Field = RecFields[i];
2471 // Note that 'i' here is actually the field index inside RD of Field,
2472 // although this dependency is hidden.
2473 const ASTRecordLayout &RL = CGM.getContext().getASTRecordLayout(RD);
2474 CharUnits FieldOffset =
2475 CGM.getContext().toCharUnitsFromBits(RL.getFieldOffset(i));
2476
2477 // Skip over unnamed or bitfields
2478 if (!Field->getIdentifier() || Field->isBitField()) {
14
Assuming the condition is false
15
Assuming the condition is false
16
Taking false branch
2479 LastFieldBitfieldOrUnnamed = Field;
2480 LastBitfieldOrUnnamedOffset = FieldOffset;
2481 continue;
2482 }
2483
2484 LastFieldBitfieldOrUnnamed = nullptr;
2485 QualType FQT = Field->getType();
2486 if (FQT->isRecordType() || FQT->isUnionType()) {
17
Calling 'Type::isRecordType'
20
Returning from 'Type::isRecordType'
2487 if (FQT->isUnionType())
21
Assuming the condition is false
22
Taking false branch
2488 HasUnion = true;
2489
2490 BuildRCBlockVarRecordLayout(FQT->getAs<RecordType>(),
23
Assuming the object is not a 'RecordType'
24
Passing null pointer value via 1st parameter 'RT'
25
Calling 'CGObjCCommonMac::BuildRCBlockVarRecordLayout'
2491 BytePos + FieldOffset, HasUnion);
2492 continue;
2493 }
2494
2495 if (const ArrayType *Array = CGM.getContext().getAsArrayType(FQT)) {
2496 auto *CArray = cast<ConstantArrayType>(Array);
2497 uint64_t ElCount = CArray->getSize().getZExtValue();
2498 assert(CArray && "only array with known element size is supported")(static_cast <bool> (CArray && "only array with known element size is supported"
) ? void (0) : __assert_fail ("CArray && \"only array with known element size is supported\""
, "clang/lib/CodeGen/CGObjCMac.cpp", 2498, __extension__ __PRETTY_FUNCTION__
))
;
2499 FQT = CArray->getElementType();
2500 while (const ArrayType *Array = CGM.getContext().getAsArrayType(FQT)) {
2501 auto *CArray = cast<ConstantArrayType>(Array);
2502 ElCount *= CArray->getSize().getZExtValue();
2503 FQT = CArray->getElementType();
2504 }
2505 if (FQT->isRecordType() && ElCount) {
2506 int OldIndex = RunSkipBlockVars.size() - 1;
2507 auto *RT = FQT->castAs<RecordType>();
2508 BuildRCBlockVarRecordLayout(RT, BytePos + FieldOffset, HasUnion);
2509
2510 // Replicate layout information for each array element. Note that
2511 // one element is already done.
2512 uint64_t ElIx = 1;
2513 for (int FirstIndex = RunSkipBlockVars.size() - 1 ;ElIx < ElCount; ElIx++) {
2514 CharUnits Size = CGM.getContext().getTypeSizeInChars(RT);
2515 for (int i = OldIndex+1; i <= FirstIndex; ++i)
2516 RunSkipBlockVars.push_back(
2517 RUN_SKIP(RunSkipBlockVars[i].opcode,
2518 RunSkipBlockVars[i].block_var_bytepos + Size*ElIx,
2519 RunSkipBlockVars[i].block_var_size));
2520 }
2521 continue;
2522 }
2523 }
2524 CharUnits FieldSize = CGM.getContext().getTypeSizeInChars(Field->getType());
2525 if (IsUnion) {
2526 CharUnits UnionIvarSize = FieldSize;
2527 if (UnionIvarSize > MaxUnionSize) {
2528 MaxUnionSize = UnionIvarSize;
2529 MaxField = Field;
2530 MaxFieldOffset = FieldOffset;
2531 }
2532 } else {
2533 UpdateRunSkipBlockVars(false,
2534 getBlockCaptureLifetime(FQT, ByrefLayout),
2535 BytePos + FieldOffset,
2536 FieldSize);
2537 }
2538 }
2539
2540 if (LastFieldBitfieldOrUnnamed) {
2541 if (LastFieldBitfieldOrUnnamed->isBitField()) {
2542 // Last field was a bitfield. Must update the info.
2543 uint64_t BitFieldSize
2544 = LastFieldBitfieldOrUnnamed->getBitWidthValue(CGM.getContext());
2545 unsigned UnsSize = (BitFieldSize / ByteSizeInBits) +
2546 ((BitFieldSize % ByteSizeInBits) != 0);
2547 CharUnits Size = CharUnits::fromQuantity(UnsSize);
2548 Size += LastBitfieldOrUnnamedOffset;
2549 UpdateRunSkipBlockVars(false,
2550 getBlockCaptureLifetime(LastFieldBitfieldOrUnnamed->getType(),
2551 ByrefLayout),
2552 BytePos + LastBitfieldOrUnnamedOffset,
2553 Size);
2554 } else {
2555 assert(!LastFieldBitfieldOrUnnamed->getIdentifier() &&"Expected unnamed")(static_cast <bool> (!LastFieldBitfieldOrUnnamed->getIdentifier
() &&"Expected unnamed") ? void (0) : __assert_fail (
"!LastFieldBitfieldOrUnnamed->getIdentifier() &&\"Expected unnamed\""
, "clang/lib/CodeGen/CGObjCMac.cpp", 2555, __extension__ __PRETTY_FUNCTION__
))
;
2556 // Last field was unnamed. Must update skip info.
2557 CharUnits FieldSize
2558 = CGM.getContext().getTypeSizeInChars(LastFieldBitfieldOrUnnamed->getType());
2559 UpdateRunSkipBlockVars(false,
2560 getBlockCaptureLifetime(LastFieldBitfieldOrUnnamed->getType(),
2561 ByrefLayout),
2562 BytePos + LastBitfieldOrUnnamedOffset,
2563 FieldSize);
2564 }
2565 }
2566
2567 if (MaxField)
2568 UpdateRunSkipBlockVars(false,
2569 getBlockCaptureLifetime(MaxField->getType(), ByrefLayout),
2570 BytePos + MaxFieldOffset,
2571 MaxUnionSize);
2572}
2573
2574void CGObjCCommonMac::BuildRCBlockVarRecordLayout(const RecordType *RT,
2575 CharUnits BytePos,
2576 bool &HasUnion,
2577 bool ByrefLayout) {
2578 const RecordDecl *RD = RT->getDecl();
26
Called C++ object pointer is null
2579 SmallVector<const FieldDecl*, 16> Fields(RD->fields());
2580 llvm::Type *Ty = CGM.getTypes().ConvertType(QualType(RT, 0));
2581 const llvm::StructLayout *RecLayout =
2582 CGM.getDataLayout().getStructLayout(cast<llvm::StructType>(Ty));
8
'Ty' is a 'StructType'
2583
2584 BuildRCRecordLayout(RecLayout, RD, Fields, BytePos, HasUnion, ByrefLayout);
9
Calling 'CGObjCCommonMac::BuildRCRecordLayout'
2585}
2586
2587/// InlineLayoutInstruction - This routine produce an inline instruction for the
2588/// block variable layout if it can. If not, it returns 0. Rules are as follow:
2589/// If ((uintptr_t) layout) < (1 << 12), the layout is inline. In the 64bit world,
2590/// an inline layout of value 0x0000000000000xyz is interpreted as follows:
2591/// x captured object pointers of BLOCK_LAYOUT_STRONG. Followed by
2592/// y captured object of BLOCK_LAYOUT_BYREF. Followed by
2593/// z captured object of BLOCK_LAYOUT_WEAK. If any of the above is missing, zero
2594/// replaces it. For example, 0x00000x00 means x BLOCK_LAYOUT_STRONG and no
2595/// BLOCK_LAYOUT_BYREF and no BLOCK_LAYOUT_WEAK objects are captured.
2596uint64_t CGObjCCommonMac::InlineLayoutInstruction(
2597 SmallVectorImpl<unsigned char> &Layout) {
2598 uint64_t Result = 0;
2599 if (Layout.size() <= 3) {
2600 unsigned size = Layout.size();
2601 unsigned strong_word_count = 0, byref_word_count=0, weak_word_count=0;
2602 unsigned char inst;
2603 enum BLOCK_LAYOUT_OPCODE opcode ;
2604 switch (size) {
2605 case 3:
2606 inst = Layout[0];
2607 opcode = (enum BLOCK_LAYOUT_OPCODE) (inst >> 4);
2608 if (opcode == BLOCK_LAYOUT_STRONG)
2609 strong_word_count = (inst & 0xF)+1;
2610 else
2611 return 0;
2612 inst = Layout[1];
2613 opcode = (enum BLOCK_LAYOUT_OPCODE) (inst >> 4);
2614 if (opcode == BLOCK_LAYOUT_BYREF)
2615 byref_word_count = (inst & 0xF)+1;
2616 else
2617 return 0;
2618 inst = Layout[2];
2619 opcode = (enum BLOCK_LAYOUT_OPCODE) (inst >> 4);
2620 if (opcode == BLOCK_LAYOUT_WEAK)
2621 weak_word_count = (inst & 0xF)+1;
2622 else
2623 return 0;
2624 break;
2625
2626 case 2:
2627 inst = Layout[0];
2628 opcode = (enum BLOCK_LAYOUT_OPCODE) (inst >> 4);
2629 if (opcode == BLOCK_LAYOUT_STRONG) {
2630 strong_word_count = (inst & 0xF)+1;
2631 inst = Layout[1];
2632 opcode = (enum BLOCK_LAYOUT_OPCODE) (inst >> 4);
2633 if (opcode == BLOCK_LAYOUT_BYREF)
2634 byref_word_count = (inst & 0xF)+1;
2635 else if (opcode == BLOCK_LAYOUT_WEAK)
2636 weak_word_count = (inst & 0xF)+1;
2637 else
2638 return 0;
2639 }
2640 else if (opcode == BLOCK_LAYOUT_BYREF) {
2641 byref_word_count = (inst & 0xF)+1;
2642 inst = Layout[1];
2643 opcode = (enum BLOCK_LAYOUT_OPCODE) (inst >> 4);
2644 if (opcode == BLOCK_LAYOUT_WEAK)
2645 weak_word_count = (inst & 0xF)+1;
2646 else
2647 return 0;
2648 }
2649 else
2650 return 0;
2651 break;
2652
2653 case 1:
2654 inst = Layout[0];
2655 opcode = (enum BLOCK_LAYOUT_OPCODE) (inst >> 4);
2656 if (opcode == BLOCK_LAYOUT_STRONG)
2657 strong_word_count = (inst & 0xF)+1;
2658 else if (opcode == BLOCK_LAYOUT_BYREF)
2659 byref_word_count = (inst & 0xF)+1;
2660 else if (opcode == BLOCK_LAYOUT_WEAK)
2661 weak_word_count = (inst & 0xF)+1;
2662 else
2663 return 0;
2664 break;
2665
2666 default:
2667 return 0;
2668 }
2669
2670 // Cannot inline when any of the word counts is 15. Because this is one less
2671 // than the actual work count (so 15 means 16 actual word counts),
2672 // and we can only display 0 thru 15 word counts.
2673 if (strong_word_count == 16 || byref_word_count == 16 || weak_word_count == 16)
2674 return 0;
2675
2676 unsigned count =
2677 (strong_word_count != 0) + (byref_word_count != 0) + (weak_word_count != 0);
2678
2679 if (size == count) {
2680 if (strong_word_count)
2681 Result = strong_word_count;
2682 Result <<= 4;
2683 if (byref_word_count)
2684 Result += byref_word_count;
2685 Result <<= 4;
2686 if (weak_word_count)
2687 Result += weak_word_count;
2688 }
2689 }
2690 return Result;
2691}
2692
2693llvm::Constant *CGObjCCommonMac::getBitmapBlockLayout(bool ComputeByrefLayout) {
2694 llvm::Constant *nullPtr = llvm::Constant::getNullValue(CGM.Int8PtrTy);
2695 if (RunSkipBlockVars.empty())
2696 return nullPtr;
2697 unsigned WordSizeInBits = CGM.getTarget().getPointerWidth(0);
2698 unsigned ByteSizeInBits = CGM.getTarget().getCharWidth();
2699 unsigned WordSizeInBytes = WordSizeInBits/ByteSizeInBits;
2700
2701 // Sort on byte position; captures might not be allocated in order,
2702 // and unions can do funny things.
2703 llvm::array_pod_sort(RunSkipBlockVars.begin(), RunSkipBlockVars.end());
2704 SmallVector<unsigned char, 16> Layout;
2705
2706 unsigned size = RunSkipBlockVars.size();
2707 for (unsigned i = 0; i < size; i++) {
2708 enum BLOCK_LAYOUT_OPCODE opcode = RunSkipBlockVars[i].opcode;
2709 CharUnits start_byte_pos = RunSkipBlockVars[i].block_var_bytepos;
2710 CharUnits end_byte_pos = start_byte_pos;
2711 unsigned j = i+1;
2712 while (j < size) {
2713 if (opcode == RunSkipBlockVars[j].opcode) {
2714 end_byte_pos = RunSkipBlockVars[j++].block_var_bytepos;
2715 i++;
2716 }
2717 else
2718 break;
2719 }
2720 CharUnits size_in_bytes =
2721 end_byte_pos - start_byte_pos + RunSkipBlockVars[j-1].block_var_size;
2722 if (j < size) {
2723 CharUnits gap =
2724 RunSkipBlockVars[j].block_var_bytepos -
2725 RunSkipBlockVars[j-1].block_var_bytepos - RunSkipBlockVars[j-1].block_var_size;
2726 size_in_bytes += gap;
2727 }
2728 CharUnits residue_in_bytes = CharUnits::Zero();
2729 if (opcode == BLOCK_LAYOUT_NON_OBJECT_BYTES) {
2730 residue_in_bytes = size_in_bytes % WordSizeInBytes;
2731 size_in_bytes -= residue_in_bytes;
2732 opcode = BLOCK_LAYOUT_NON_OBJECT_WORDS;
2733 }
2734
2735 unsigned size_in_words = size_in_bytes.getQuantity() / WordSizeInBytes;
2736 while (size_in_words >= 16) {
2737 // Note that value in imm. is one less that the actual
2738 // value. So, 0xf means 16 words follow!
2739 unsigned char inst = (opcode << 4) | 0xf;
2740 Layout.push_back(inst);
2741 size_in_words -= 16;
2742 }
2743 if (size_in_words > 0) {
2744 // Note that value in imm. is one less that the actual
2745 // value. So, we subtract 1 away!
2746 unsigned char inst = (opcode << 4) | (size_in_words-1);
2747 Layout.push_back(inst);
2748 }
2749 if (residue_in_bytes > CharUnits::Zero()) {
2750 unsigned char inst =
2751 (BLOCK_LAYOUT_NON_OBJECT_BYTES << 4) | (residue_in_bytes.getQuantity()-1);
2752 Layout.push_back(inst);
2753 }
2754 }
2755
2756 while (!Layout.empty()) {
2757 unsigned char inst = Layout.back();
2758 enum BLOCK_LAYOUT_OPCODE opcode = (enum BLOCK_LAYOUT_OPCODE) (inst >> 4);
2759 if (opcode == BLOCK_LAYOUT_NON_OBJECT_BYTES || opcode == BLOCK_LAYOUT_NON_OBJECT_WORDS)
2760 Layout.pop_back();
2761 else
2762 break;
2763 }
2764
2765 uint64_t Result = InlineLayoutInstruction(Layout);
2766 if (Result != 0) {
2767 // Block variable layout instruction has been inlined.
2768 if (CGM.getLangOpts().ObjCGCBitmapPrint) {
2769 if (ComputeByrefLayout)
2770 printf("\n Inline BYREF variable layout: ");
2771 else
2772 printf("\n Inline block variable layout: ");
2773 printf("0x0%" PRIx64"l" "x" "", Result);
2774 if (auto numStrong = (Result & 0xF00) >> 8)
2775 printf(", BL_STRONG:%d", (int) numStrong);
2776 if (auto numByref = (Result & 0x0F0) >> 4)
2777 printf(", BL_BYREF:%d", (int) numByref);
2778 if (auto numWeak = (Result & 0x00F) >> 0)
2779 printf(", BL_WEAK:%d", (int) numWeak);
2780 printf(", BL_OPERATOR:0\n");
2781 }
2782 return llvm::ConstantInt::get(CGM.IntPtrTy, Result);
2783 }
2784
2785 unsigned char inst = (BLOCK_LAYOUT_OPERATOR << 4) | 0;
2786 Layout.push_back(inst);
2787 std::string BitMap;
2788 for (unsigned i = 0, e = Layout.size(); i != e; i++)
2789 BitMap += Layout[i];
2790
2791 if (CGM.getLangOpts().ObjCGCBitmapPrint) {
2792 if (ComputeByrefLayout)
2793 printf("\n Byref variable layout: ");
2794 else
2795 printf("\n Block variable layout: ");
2796 for (unsigned i = 0, e = BitMap.size(); i != e; i++) {
2797 unsigned char inst = BitMap[i];
2798 enum BLOCK_LAYOUT_OPCODE opcode = (enum BLOCK_LAYOUT_OPCODE) (inst >> 4);
2799 unsigned delta = 1;
2800 switch (opcode) {
2801 case BLOCK_LAYOUT_OPERATOR:
2802 printf("BL_OPERATOR:");
2803 delta = 0;
2804 break;
2805 case BLOCK_LAYOUT_NON_OBJECT_BYTES:
2806 printf("BL_NON_OBJECT_BYTES:");
2807 break;
2808 case BLOCK_LAYOUT_NON_OBJECT_WORDS:
2809 printf("BL_NON_OBJECT_WORD:");
2810 break;
2811 case BLOCK_LAYOUT_STRONG:
2812 printf("BL_STRONG:");
2813 break;
2814 case BLOCK_LAYOUT_BYREF:
2815 printf("BL_BYREF:");
2816 break;
2817 case BLOCK_LAYOUT_WEAK:
2818 printf("BL_WEAK:");
2819 break;
2820 case BLOCK_LAYOUT_UNRETAINED:
2821 printf("BL_UNRETAINED:");
2822 break;
2823 }
2824 // Actual value of word count is one more that what is in the imm.
2825 // field of the instruction
2826 printf("%d", (inst & 0xf) + delta);
2827 if (i < e-1)
2828 printf(", ");
2829 else
2830 printf("\n");
2831 }
2832 }
2833
2834 auto *Entry = CreateCStringLiteral(BitMap, ObjCLabelType::ClassName,
2835 /*ForceNonFragileABI=*/true,
2836 /*NullTerminate=*/false);
2837 return getConstantGEP(VMContext, Entry, 0, 0);
2838}
2839
2840static std::string getBlockLayoutInfoString(
2841 const SmallVectorImpl<CGObjCCommonMac::RUN_SKIP> &RunSkipBlockVars,
2842 bool HasCopyDisposeHelpers) {
2843 std::string Str;
2844 for (const CGObjCCommonMac::RUN_SKIP &R : RunSkipBlockVars) {
2845 if (R.opcode == CGObjCCommonMac::BLOCK_LAYOUT_UNRETAINED) {
2846 // Copy/dispose helpers don't have any information about
2847 // __unsafe_unretained captures, so unconditionally concatenate a string.
2848 Str += "u";
2849 } else if (HasCopyDisposeHelpers) {
2850 // Information about __strong, __weak, or byref captures has already been
2851 // encoded into the names of the copy/dispose helpers. We have to add a
2852 // string here only when the copy/dispose helpers aren't generated (which
2853 // happens when the block is non-escaping).
2854 continue;
2855 } else {
2856 switch (R.opcode) {
2857 case CGObjCCommonMac::BLOCK_LAYOUT_STRONG:
2858 Str += "s";
2859 break;
2860 case CGObjCCommonMac::BLOCK_LAYOUT_BYREF:
2861 Str += "r";
2862 break;
2863 case CGObjCCommonMac::BLOCK_LAYOUT_WEAK:
2864 Str += "w";
2865 break;
2866 default:
2867 continue;
2868 }
2869 }
2870 Str += llvm::to_string(R.block_var_bytepos.getQuantity());
2871 Str += "l" + llvm::to_string(R.block_var_size.getQuantity());
2872 }
2873 return Str;
2874}
2875
2876void CGObjCCommonMac::fillRunSkipBlockVars(CodeGenModule &CGM,
2877 const CGBlockInfo &blockInfo) {
2878 assert(CGM.getLangOpts().getGC() == LangOptions::NonGC)(static_cast <bool> (CGM.getLangOpts().getGC() == LangOptions
::NonGC) ? void (0) : __assert_fail ("CGM.getLangOpts().getGC() == LangOptions::NonGC"
, "clang/lib/CodeGen/CGObjCMac.cpp", 2878, __extension__ __PRETTY_FUNCTION__
))
;
2879
2880 RunSkipBlockVars.clear();
2881 bool hasUnion = false;
2882
2883 unsigned WordSizeInBits = CGM.getTarget().getPointerWidth(0);
2884 unsigned ByteSizeInBits = CGM.getTarget().getCharWidth();
2885 unsigned WordSizeInBytes = WordSizeInBits/ByteSizeInBits;
2886
2887 const BlockDecl *blockDecl = blockInfo.getBlockDecl();
2888
2889 // Calculate the basic layout of the block structure.
2890 const llvm::StructLayout *layout =
2891 CGM.getDataLayout().getStructLayout(blockInfo.StructureType);
2892
2893 // Ignore the optional 'this' capture: C++ objects are not assumed
2894 // to be GC'ed.
2895 if (blockInfo.BlockHeaderForcedGapSize != CharUnits::Zero())
2896 UpdateRunSkipBlockVars(false, Qualifiers::OCL_None,
2897 blockInfo.BlockHeaderForcedGapOffset,
2898 blockInfo.BlockHeaderForcedGapSize);
2899 // Walk the captured variables.
2900 for (const auto &CI : blockDecl->captures()) {
2901 const VarDecl *variable = CI.getVariable();
2902 QualType type = variable->getType();
2903
2904 const CGBlockInfo::Capture &capture = blockInfo.getCapture(variable);
2905
2906 // Ignore constant captures.
2907 if (capture.isConstant()) continue;
2908
2909 CharUnits fieldOffset =
2910 CharUnits::fromQuantity(layout->getElementOffset(capture.getIndex()));
2911
2912 assert(!type->isArrayType() && "array variable should not be caught")(static_cast <bool> (!type->isArrayType() &&
"array variable should not be caught") ? void (0) : __assert_fail
("!type->isArrayType() && \"array variable should not be caught\""
, "clang/lib/CodeGen/CGObjCMac.cpp", 2912, __extension__ __PRETTY_FUNCTION__
))
;
2913 if (!CI.isByRef())
2914 if (const RecordType *record = type->getAs<RecordType>()) {
2915 BuildRCBlockVarRecordLayout(record, fieldOffset, hasUnion);
2916 continue;
2917 }
2918 CharUnits fieldSize;
2919 if (CI.isByRef())
2920 fieldSize = CharUnits::fromQuantity(WordSizeInBytes);
2921 else
2922 fieldSize = CGM.getContext().getTypeSizeInChars(type);
2923 UpdateRunSkipBlockVars(CI.isByRef(), getBlockCaptureLifetime(type, false),
2924 fieldOffset, fieldSize);
2925 }
2926}
2927
2928llvm::Constant *
2929CGObjCCommonMac::BuildRCBlockLayout(CodeGenModule &CGM,
2930 const CGBlockInfo &blockInfo) {
2931 fillRunSkipBlockVars(CGM, blockInfo);
2932 return getBitmapBlockLayout(false);
2933}
2934
2935std::string CGObjCCommonMac::getRCBlockLayoutStr(CodeGenModule &CGM,
2936 const CGBlockInfo &blockInfo) {
2937 fillRunSkipBlockVars(CGM, blockInfo);
2938 return getBlockLayoutInfoString(RunSkipBlockVars,
2939 blockInfo.needsCopyDisposeHelpers());
2940}
2941
2942llvm::Constant *CGObjCCommonMac::BuildByrefLayout(CodeGen::CodeGenModule &CGM,
2943 QualType T) {
2944 assert(CGM.getLangOpts().getGC() == LangOptions::NonGC)(static_cast <bool> (CGM.getLangOpts().getGC() == LangOptions
::NonGC) ? void (0) : __assert_fail ("CGM.getLangOpts().getGC() == LangOptions::NonGC"
, "clang/lib/CodeGen/CGObjCMac.cpp", 2944, __extension__ __PRETTY_FUNCTION__
))
;
1
Assuming the condition is true
2
'?' condition is true
2945 assert(!T->isArrayType() && "__block array variable should not be caught")(static_cast <bool> (!T->isArrayType() && "__block array variable should not be caught"
) ? void (0) : __assert_fail ("!T->isArrayType() && \"__block array variable should not be caught\""
, "clang/lib/CodeGen/CGObjCMac.cpp", 2945, __extension__ __PRETTY_FUNCTION__
))
;
3
'?' condition is true
2946 CharUnits fieldOffset;
2947 RunSkipBlockVars.clear();
2948 bool hasUnion = false;
2949 if (const RecordType *record = T->getAs<RecordType>()) {
4
Assuming the object is a 'RecordType'
5
Assuming 'record' is non-null
6
Taking true branch
2950 BuildRCBlockVarRecordLayout(record, fieldOffset, hasUnion, true /*ByrefLayout */);
7
Calling 'CGObjCCommonMac::BuildRCBlockVarRecordLayout'
2951 llvm::Constant *Result = getBitmapBlockLayout(true);
2952 if (isa<llvm::ConstantInt>(Result))
2953 Result = llvm::ConstantExpr::getIntToPtr(Result, CGM.Int8PtrTy);
2954 return Result;
2955 }
2956 llvm::Constant *nullPtr = llvm::Constant::getNullValue(CGM.Int8PtrTy);
2957 return nullPtr;
2958}
2959
2960llvm::Value *CGObjCMac::GenerateProtocolRef(CodeGenFunction &CGF,
2961 const ObjCProtocolDecl *PD) {
2962 // FIXME: I don't understand why gcc generates this, or where it is
2963 // resolved. Investigate. Its also wasteful to look this up over and over.
2964 LazySymbols.insert(&CGM.getContext().Idents.get("Protocol"));
2965
2966 return llvm::ConstantExpr::getBitCast(GetProtocolRef(PD),
2967 ObjCTypes.getExternalProtocolPtrTy());
2968}
2969
2970void CGObjCCommonMac::GenerateProtocol(const ObjCProtocolDecl *PD) {
2971 // FIXME: We shouldn't need this, the protocol decl should contain enough
2972 // information to tell us whether this was a declaration or a definition.
2973 DefinedProtocols.insert(PD->getIdentifier());
2974
2975 // If we have generated a forward reference to this protocol, emit
2976 // it now. Otherwise do nothing, the protocol objects are lazily
2977 // emitted.
2978 if (Protocols.count(PD->getIdentifier()))
2979 GetOrEmitProtocol(PD);
2980}
2981
2982llvm::Constant *CGObjCCommonMac::GetProtocolRef(const ObjCProtocolDecl *PD) {
2983 if (DefinedProtocols.count(PD->getIdentifier()))
2984 return GetOrEmitProtocol(PD);
2985
2986 return GetOrEmitProtocolRef(PD);
2987}
2988
2989llvm::Value *CGObjCCommonMac::EmitClassRefViaRuntime(
2990 CodeGenFunction &CGF,
2991 const ObjCInterfaceDecl *ID,
2992 ObjCCommonTypesHelper &ObjCTypes) {
2993 llvm::FunctionCallee lookUpClassFn = ObjCTypes.getLookUpClassFn();
2994
2995 llvm::Value *className = CGF.CGM
2996 .GetAddrOfConstantCString(std::string(
2997 ID->getObjCRuntimeNameAsString()))
2998 .getPointer();
2999 ASTContext &ctx = CGF.CGM.getContext();
3000 className =
3001 CGF.Builder.CreateBitCast(className,
3002 CGF.ConvertType(
3003 ctx.getPointerType(ctx.CharTy.withConst())));
3004 llvm::CallInst *call = CGF.Builder.CreateCall(lookUpClassFn, className);
3005 call->setDoesNotThrow();
3006 return call;
3007}
3008
3009/*
3010// Objective-C 1.0 extensions
3011struct _objc_protocol {
3012struct _objc_protocol_extension *isa;
3013char *protocol_name;
3014struct _objc_protocol_list *protocol_list;
3015struct _objc__method_prototype_list *instance_methods;
3016struct _objc__method_prototype_list *class_methods
3017};
3018
3019See EmitProtocolExtension().
3020*/
3021llvm::Constant *CGObjCMac::GetOrEmitProtocol(const ObjCProtocolDecl *PD) {
3022 llvm::GlobalVariable *Entry = Protocols[PD->getIdentifier()];
3023
3024 // Early exit if a defining object has already been generated.
3025 if (Entry && Entry->hasInitializer())
3026 return Entry;
3027
3028 // Use the protocol definition, if there is one.
3029 if (const ObjCProtocolDecl *Def = PD->getDefinition())
3030 PD = Def;
3031
3032 // FIXME: I don't understand why gcc generates this, or where it is
3033 // resolved. Investigate. Its also wasteful to look this up over and over.
3034 LazySymbols.insert(&CGM.getContext().Idents.get("Protocol"));
3035
3036 // Construct method lists.
3037 auto methodLists = ProtocolMethodLists::get(PD);
3038
3039 ConstantInitBuilder builder(CGM);
3040 auto values = builder.beginStruct(ObjCTypes.ProtocolTy);
3041 values.add(EmitProtocolExtension(PD, methodLists));
3042 values.add(GetClassName(PD->getObjCRuntimeNameAsString()));
3043 values.add(EmitProtocolList("OBJC_PROTOCOL_REFS_" + PD->getName(),
3044 PD->protocol_begin(), PD->protocol_end()));
3045 values.add(methodLists.emitMethodList(this, PD,
3046 ProtocolMethodLists::RequiredInstanceMethods));
3047 values.add(methodLists.emitMethodList(this, PD,
3048 ProtocolMethodLists::RequiredClassMethods));
3049
3050 if (Entry) {
3051 // Already created, update the initializer.
3052 assert(Entry->hasPrivateLinkage())(static_cast <bool> (Entry->hasPrivateLinkage()) ? void
(0) : __assert_fail ("Entry->hasPrivateLinkage()", "clang/lib/CodeGen/CGObjCMac.cpp"
, 3052, __extension__ __PRETTY_FUNCTION__))
;
3053 values.finishAndSetAsInitializer(Entry);
3054 } else {
3055 Entry = values.finishAndCreateGlobal("OBJC_PROTOCOL_" + PD->getName(),
3056 CGM.getPointerAlign(),
3057 /*constant*/ false,
3058 llvm::GlobalValue::PrivateLinkage);
3059 Entry->setSection("__OBJC,__protocol,regular,no_dead_strip");
3060
3061 Protocols[PD->getIdentifier()] = Entry;
3062 }
3063 CGM.addCompilerUsedGlobal(Entry);
3064
3065 return Entry;
3066}
3067
3068llvm::Constant *CGObjCMac::GetOrEmitProtocolRef(const ObjCProtocolDecl *PD) {
3069 llvm::GlobalVariable *&Entry = Protocols[PD->getIdentifier()];
3070
3071 if (!Entry) {
3072 // We use the initializer as a marker of whether this is a forward
3073 // reference or not. At module finalization we add the empty
3074 // contents for protocols which were referenced but never defined.
3075 Entry = new llvm::GlobalVariable(CGM.getModule(), ObjCTypes.ProtocolTy,
3076 false, llvm::GlobalValue::PrivateLinkage,
3077 nullptr, "OBJC_PROTOCOL_" + PD->getName());
3078 Entry->setSection("__OBJC,__protocol,regular,no_dead_strip");
3079 // FIXME: Is this necessary? Why only for protocol?
3080 Entry->setAlignment(llvm::Align(4));
3081 }
3082
3083 return Entry;
3084}
3085
3086/*
3087 struct _objc_protocol_extension {
3088 uint32_t size;
3089 struct objc_method_description_list *optional_instance_methods;
3090 struct objc_method_description_list *optional_class_methods;
3091 struct objc_property_list *instance_properties;
3092 const char ** extendedMethodTypes;
3093 struct objc_property_list *class_properties;
3094 };
3095*/
3096llvm::Constant *
3097CGObjCMac::EmitProtocolExtension(const ObjCProtocolDecl *PD,
3098 const ProtocolMethodLists &methodLists) {
3099 auto optInstanceMethods =
3100 methodLists.emitMethodList(this, PD,
3101 ProtocolMethodLists::OptionalInstanceMethods);
3102 auto optClassMethods =
3103 methodLists.emitMethodList(this, PD,
3104 ProtocolMethodLists::OptionalClassMethods);
3105
3106 auto extendedMethodTypes =
3107 EmitProtocolMethodTypes("OBJC_PROTOCOL_METHOD_TYPES_" + PD->getName(),
3108 methodLists.emitExtendedTypesArray(this),
3109 ObjCTypes);
3110
3111 auto instanceProperties =
3112 EmitPropertyList("OBJC_$_PROP_PROTO_LIST_" + PD->getName(), nullptr, PD,
3113 ObjCTypes, false);
3114 auto classProperties =
3115 EmitPropertyList("OBJC_$_CLASS_PROP_PROTO_LIST_" + PD->getName(), nullptr,
3116 PD, ObjCTypes, true);
3117
3118 // Return null if no extension bits are used.
3119 if (optInstanceMethods->isNullValue() &&
3120 optClassMethods->isNullValue() &&
3121 extendedMethodTypes->isNullValue() &&
3122 instanceProperties->isNullValue() &&
3123 classProperties->isNullValue()) {
3124 return llvm::Constant::getNullValue(ObjCTypes.ProtocolExtensionPtrTy);
3125 }
3126
3127 uint64_t size =
3128 CGM.getDataLayout().getTypeAllocSize(ObjCTypes.ProtocolExtensionTy);
3129
3130 ConstantInitBuilder builder(CGM);
3131 auto values = builder.beginStruct(ObjCTypes.ProtocolExtensionTy);
3132 values.addInt(ObjCTypes.IntTy, size);
3133 values.add(optInstanceMethods);
3134 values.add(optClassMethods);
3135 values.add(instanceProperties);
3136 values.add(extendedMethodTypes);
3137 values.add(classProperties);
3138
3139 // No special section, but goes in llvm.used
3140 return CreateMetadataVar("_OBJC_PROTOCOLEXT_" + PD->getName(), values,
3141 StringRef(), CGM.getPointerAlign(), true);
3142}
3143
3144/*
3145 struct objc_protocol_list {
3146 struct objc_protocol_list *next;
3147 long count;
3148 Protocol *list[];
3149 };
3150*/
3151llvm::Constant *
3152CGObjCMac::EmitProtocolList(Twine name,
3153 ObjCProtocolDecl::protocol_iterator begin,
3154 ObjCProtocolDecl::protocol_iterator end) {
3155 // Just return null for empty protocol lists
3156 auto PDs = GetRuntimeProtocolList(begin, end);
3157 if (PDs.empty())
3158 return llvm::Constant::getNullValue(ObjCTypes.ProtocolListPtrTy);
3159
3160 ConstantInitBuilder builder(CGM);
3161 auto values = builder.beginStruct();
3162
3163 // This field is only used by the runtime.
3164 values.addNullPointer(ObjCTypes.ProtocolListPtrTy);
3165
3166 // Reserve a slot for the count.
3167 auto countSlot = values.addPlaceholder();
3168
3169 auto refsArray = values.beginArray(ObjCTypes.ProtocolPtrTy);
3170 for (const auto *Proto : PDs)
3171 refsArray.add(GetProtocolRef(Proto));
3172
3173 auto count = refsArray.size();
3174
3175 // This list is null terminated.
3176 refsArray.addNullPointer(ObjCTypes.ProtocolPtrTy);
3177
3178 refsArray.finishAndAddTo(values);
3179 values.fillPlaceholderWithInt(countSlot, ObjCTypes.LongTy, count);
3180
3181 StringRef section;
3182 if (CGM.getTriple().isOSBinFormatMachO())
3183 section = "__OBJC,__cat_cls_meth,regular,no_dead_strip";
3184
3185 llvm::GlobalVariable *GV =
3186 CreateMetadataVar(name, values, section, CGM.getPointerAlign(), false);
3187 return llvm::ConstantExpr::getBitCast(GV, ObjCTypes.ProtocolListPtrTy);
3188}
3189
3190static void
3191PushProtocolProperties(llvm::SmallPtrSet<const IdentifierInfo*,16> &PropertySet,
3192 SmallVectorImpl<const ObjCPropertyDecl *> &Properties,
3193 const ObjCProtocolDecl *Proto,
3194 bool IsClassProperty) {
3195 for (const auto *PD : Proto->properties()) {
3196 if (IsClassProperty != PD->isClassProperty())
3197 continue;
3198 if (!PropertySet.insert(PD->getIdentifier()).second)
3199 continue;
3200 Properties.push_back(PD);
3201 }
3202
3203 for (const auto *P : Proto->protocols())
3204 PushProtocolProperties(PropertySet, Properties, P, IsClassProperty);
3205}
3206
3207/*
3208 struct _objc_property {
3209 const char * const name;
3210 const char * const attributes;
3211 };
3212
3213 struct _objc_property_list {
3214 uint32_t entsize; // sizeof (struct _objc_property)
3215 uint32_t prop_count;
3216 struct _objc_property[prop_count];
3217 };
3218*/
3219llvm::Constant *CGObjCCommonMac::EmitPropertyList(Twine Name,
3220 const Decl *Container,
3221 const ObjCContainerDecl *OCD,
3222 const ObjCCommonTypesHelper &ObjCTypes,
3223 bool IsClassProperty) {
3224 if (IsClassProperty) {
3225 // Make this entry NULL for OS X with deployment target < 10.11, for iOS
3226 // with deployment target < 9.0.
3227 const llvm::Triple &Triple = CGM.getTarget().getTriple();
3228 if ((Triple.isMacOSX() && Triple.isMacOSXVersionLT(10, 11)) ||
3229 (Triple.isiOS() && Triple.isOSVersionLT(9)))
3230 return llvm::Constant::getNullValue(ObjCTypes.PropertyListPtrTy);
3231 }
3232
3233 SmallVector<const ObjCPropertyDecl *, 16> Properties;
3234 llvm::SmallPtrSet<const IdentifierInfo*, 16> PropertySet;
3235
3236 if (const ObjCInterfaceDecl *OID = dyn_cast<ObjCInterfaceDecl>(OCD))
3237 for (const ObjCCategoryDecl *ClassExt : OID->known_extensions())
3238 for (auto *PD : ClassExt->properties()) {
3239 if (IsClassProperty != PD->isClassProperty())
3240 continue;
3241 if (PD->isDirectProperty())
3242 continue;
3243 PropertySet.insert(PD->getIdentifier());
3244 Properties.push_back(PD);
3245 }
3246
3247 for (const auto *PD : OCD->properties()) {
3248 if (IsClassProperty != PD->isClassProperty())
3249 continue;
3250 // Don't emit duplicate metadata for properties that were already in a
3251 // class extension.
3252 if (!PropertySet.insert(PD->getIdentifier()).second)
3253 continue;
3254 if (PD->isDirectProperty())
3255 continue;
3256 Properties.push_back(PD);
3257 }
3258
3259 if (const ObjCInterfaceDecl *OID = dyn_cast<ObjCInterfaceDecl>(OCD)) {
3260 for (const auto *P : OID->all_referenced_protocols())
3261 PushProtocolProperties(PropertySet, Properties, P, IsClassProperty);
3262 }
3263 else if (const ObjCCategoryDecl *CD = dyn_cast<ObjCCategoryDecl>(OCD)) {
3264 for (const auto *P : CD->protocols())
3265 PushProtocolProperties(PropertySet, Properties, P, IsClassProperty);
3266 }
3267
3268 // Return null for empty list.
3269 if (Properties.empty())
3270 return llvm::Constant::getNullValue(ObjCTypes.PropertyListPtrTy);
3271
3272 unsigned propertySize =
3273 CGM.getDataLayout().getTypeAllocSize(ObjCTypes.PropertyTy);
3274
3275 ConstantInitBuilder builder(CGM);
3276 auto values = builder.beginStruct();
3277 values.addInt(ObjCTypes.IntTy, propertySize);
3278 values.addInt(ObjCTypes.IntTy, Properties.size());
3279 auto propertiesArray = values.beginArray(ObjCTypes.PropertyTy);
3280 for (auto PD : Properties) {
3281 auto property = propertiesArray.beginStruct(ObjCTypes.PropertyTy);
3282 property.add(GetPropertyName(PD->getIdentifier()));
3283 property.add(GetPropertyTypeString(PD, Container));
3284 property.finishAndAddTo(propertiesArray);
3285 }
3286 propertiesArray.finishAndAddTo(values);
3287
3288 StringRef Section;
3289 if (CGM.getTriple().isOSBinFormatMachO())
3290 Section = (ObjCABI == 2) ? "__DATA, __objc_const"
3291 : "__OBJC,__property,regular,no_dead_strip";
3292
3293 llvm::GlobalVariable *GV =
3294 CreateMetadataVar(Name, values, Section, CGM.getPointerAlign(), true);
3295 return llvm::ConstantExpr::getBitCast(GV, ObjCTypes.PropertyListPtrTy);
3296}
3297
3298llvm::Constant *
3299CGObjCCommonMac::EmitProtocolMethodTypes(Twine Name,
3300 ArrayRef<llvm::Constant*> MethodTypes,
3301 const ObjCCommonTypesHelper &ObjCTypes) {
3302 // Return null for empty list.
3303 if (MethodTypes.empty())
3304 return llvm::Constant::getNullValue(ObjCTypes.Int8PtrPtrTy);
3305
3306 llvm::ArrayType *AT = llvm::ArrayType::get(ObjCTypes.Int8PtrTy,
3307 MethodTypes.size());
3308 llvm::Constant *Init = llvm::ConstantArray::get(AT, MethodTypes);
3309
3310 StringRef Section;
3311 if (CGM.getTriple().isOSBinFormatMachO() && ObjCABI == 2)
3312 Section = "__DATA, __objc_const";
3313
3314 llvm::GlobalVariable *GV =
3315 CreateMetadataVar(Name, Init, Section, CGM.getPointerAlign(), true);
3316 return llvm::ConstantExpr::getBitCast(GV, ObjCTypes.Int8PtrPtrTy);
3317}
3318
3319/*
3320 struct _objc_category {
3321 char *category_name;
3322 char *class_name;
3323 struct _objc_method_list *instance_methods;
3324 struct _objc_method_list *class_methods;
3325 struct _objc_protocol_list *protocols;
3326 uint32_t size; // <rdar://4585769>
3327 struct _objc_property_list *instance_properties;
3328 struct _objc_property_list *class_properties;
3329 };
3330*/
3331void CGObjCMac::GenerateCategory(const ObjCCategoryImplDecl *OCD) {
3332 unsigned Size = CGM.getDataLayout().getTypeAllocSize(ObjCTypes.CategoryTy);
3333
3334 // FIXME: This is poor design, the OCD should have a pointer to the category
3335 // decl. Additionally, note that Category can be null for the @implementation
3336 // w/o an @interface case. Sema should just create one for us as it does for
3337 // @implementation so everyone else can live life under a clear blue sky.
3338 const ObjCInterfaceDecl *Interface = OCD->getClassInterface();
3339 const ObjCCategoryDecl *Category =
3340 Interface->FindCategoryDeclaration(OCD->getIdentifier());
3341
3342 SmallString<256> ExtName;
3343 llvm::raw_svector_ostream(ExtName) << Interface->getName() << '_'
3344 << OCD->getName();
3345
3346 ConstantInitBuilder Builder(CGM);
3347 auto Values = Builder.beginStruct(ObjCTypes.CategoryTy);
3348
3349 enum {
3350 InstanceMethods,
3351 ClassMethods,
3352 NumMethodLists
3353 };
3354 SmallVector<const ObjCMethodDecl *, 16> Methods[NumMethodLists];
3355 for (const auto *MD : OCD->methods()) {
3356 if (!MD->isDirectMethod())
3357 Methods[unsigned(MD->isClassMethod())].push_back(MD);
3358 }
3359
3360 Values.add(GetClassName(OCD->getName()));
3361 Values.add(GetClassName(Interface->getObjCRuntimeNameAsString()));
3362 LazySymbols.insert(Interface->getIdentifier());
3363
3364 Values.add(emitMethodList(ExtName, MethodListType::CategoryInstanceMethods,
3365 Methods[InstanceMethods]));
3366 Values.add(emitMethodList(ExtName, MethodListType::CategoryClassMethods,
3367 Methods[ClassMethods]));
3368 if (Category) {
3369 Values.add(
3370 EmitProtocolList("OBJC_CATEGORY_PROTOCOLS_" + ExtName.str(),
3371 Category->protocol_begin(), Category->protocol_end()));
3372 } else {
3373 Values.addNullPointer(ObjCTypes.ProtocolListPtrTy);
3374 }
3375 Values.addInt(ObjCTypes.IntTy, Size);
3376
3377 // If there is no category @interface then there can be no properties.
3378 if (Category) {
3379 Values.add(EmitPropertyList("_OBJC_$_PROP_LIST_" + ExtName.str(),
3380 OCD, Category, ObjCTypes, false));
3381 Values.add(EmitPropertyList("_OBJC_$_CLASS_PROP_LIST_" + ExtName.str(),
3382 OCD, Category, ObjCTypes, true));
3383 } else {
3384 Values.addNullPointer(ObjCTypes.PropertyListPtrTy);
3385 Values.addNullPointer(ObjCTypes.PropertyListPtrTy);
3386 }
3387
3388 llvm::GlobalVariable *GV =
3389 CreateMetadataVar("OBJC_CATEGORY_" + ExtName.str(), Values,
3390 "__OBJC,__category,regular,no_dead_strip",
3391 CGM.getPointerAlign(), true);
3392 DefinedCategories.push_back(GV);
3393 DefinedCategoryNames.insert(llvm::CachedHashString(ExtName));
3394 // method definition entries must be clear for next implementation.
3395 MethodDefinitions.clear();
3396}
3397
3398enum FragileClassFlags {
3399 /// Apparently: is not a meta-class.
3400 FragileABI_Class_Factory = 0x00001,
3401
3402 /// Is a meta-class.
3403 FragileABI_Class_Meta = 0x00002,
3404
3405 /// Has a non-trivial constructor or destructor.
3406 FragileABI_Class_HasCXXStructors = 0x02000,
3407
3408 /// Has hidden visibility.
3409 FragileABI_Class_Hidden = 0x20000,
3410
3411 /// Class implementation was compiled under ARC.
3412 FragileABI_Class_CompiledByARC = 0x04000000,
3413
3414 /// Class implementation was compiled under MRC and has MRC weak ivars.
3415 /// Exclusive with CompiledByARC.
3416 FragileABI_Class_HasMRCWeakIvars = 0x08000000,
3417};
3418
3419enum NonFragileClassFlags {
3420 /// Is a meta-class.
3421 NonFragileABI_Class_Meta = 0x00001,
3422
3423 /// Is a root class.
3424 NonFragileABI_Class_Root = 0x00002,
3425
3426 /// Has a non-trivial constructor or destructor.
3427 NonFragileABI_Class_HasCXXStructors = 0x00004,
3428
3429 /// Has hidden visibility.
3430 NonFragileABI_Class_Hidden = 0x00010,
3431
3432 /// Has the exception attribute.
3433 NonFragileABI_Class_Exception = 0x00020,
3434
3435 /// (Obsolete) ARC-specific: this class has a .release_ivars method
3436 NonFragileABI_Class_HasIvarReleaser = 0x00040,
3437
3438 /// Class implementation was compiled under ARC.
3439 NonFragileABI_Class_CompiledByARC = 0x00080,
3440
3441 /// Class has non-trivial destructors, but zero-initialization is okay.
3442 NonFragileABI_Class_HasCXXDestructorOnly = 0x00100,
3443
3444 /// Class implementation was compiled under MRC and has MRC weak ivars.
3445 /// Exclusive with CompiledByARC.
3446 NonFragileABI_Class_HasMRCWeakIvars = 0x00200,
3447};
3448
3449static bool hasWeakMember(QualType type) {
3450 if (type.getObjCLifetime() == Qualifiers::OCL_Weak) {
3451 return true;
3452 }
3453
3454 if (auto recType = type->getAs<RecordType>()) {
3455 for (auto field : recType->getDecl()->fields()) {
3456 if (hasWeakMember(field->getType()))
3457 return true;
3458 }
3459 }
3460
3461 return false;
3462}
3463
3464/// For compatibility, we only want to set the "HasMRCWeakIvars" flag
3465/// (and actually fill in a layout string) if we really do have any
3466/// __weak ivars.
3467static bool hasMRCWeakIvars(CodeGenModule &CGM,
3468 const ObjCImplementationDecl *ID) {
3469 if (!CGM.getLangOpts().ObjCWeak) return false;
3470 assert(CGM.getLangOpts().getGC() == LangOptions::NonGC)(static_cast <bool> (CGM.getLangOpts().getGC() == LangOptions
::NonGC) ? void (0) : __assert_fail ("CGM.getLangOpts().getGC() == LangOptions::NonGC"
, "clang/lib/CodeGen/CGObjCMac.cpp", 3470, __extension__ __PRETTY_FUNCTION__
))
;
3471
3472 for (const ObjCIvarDecl *ivar =
3473 ID->getClassInterface()->all_declared_ivar_begin();
3474 ivar; ivar = ivar->getNextIvar()) {
3475 if (hasWeakMember(ivar->getType()))
3476 return true;
3477 }
3478
3479 return false;
3480}
3481
3482/*
3483 struct _objc_class {
3484 Class isa;
3485 Class super_class;
3486 const char *name;
3487 long version;
3488 long info;
3489 long instance_size;
3490 struct _objc_ivar_list *ivars;
3491 struct _objc_method_list *methods;
3492 struct _objc_cache *cache;
3493 struct _objc_protocol_list *protocols;
3494 // Objective-C 1.0 extensions (<rdr://4585769>)
3495 const char *ivar_layout;
3496 struct _objc_class_ext *ext;
3497 };
3498
3499 See EmitClassExtension();
3500*/
3501void CGObjCMac::GenerateClass(const ObjCImplementationDecl *ID) {
3502 IdentifierInfo *RuntimeName =
3503 &CGM.getContext().Idents.get(ID->getObjCRuntimeNameAsString());
3504 DefinedSymbols.insert(RuntimeName);
3505
3506 std::string ClassName = ID->getNameAsString();
3507 // FIXME: Gross
3508 ObjCInterfaceDecl *Interface =
3509 const_cast<ObjCInterfaceDecl*>(ID->getClassInterface());
3510 llvm::Constant *Protocols =
3511 EmitProtocolList("OBJC_CLASS_PROTOCOLS_" + ID->getName(),
3512 Interface->all_referenced_protocol_begin(),
3513 Interface->all_referenced_protocol_end());
3514 unsigned Flags = FragileABI_Class_Factory;
3515 if (ID->hasNonZeroConstructors() || ID->hasDestructors())
3516 Flags |= FragileABI_Class_HasCXXStructors;
3517
3518 bool hasMRCWeak = false;
3519
3520 if (CGM.getLangOpts().ObjCAutoRefCount)
3521 Flags |= FragileABI_Class_CompiledByARC;
3522 else if ((hasMRCWeak = hasMRCWeakIvars(CGM, ID)))
3523 Flags |= FragileABI_Class_HasMRCWeakIvars;
3524
3525 CharUnits Size =
3526 CGM.getContext().getASTObjCImplementationLayout(ID).getSize();
3527
3528 // FIXME: Set CXX-structors flag.
3529 if (ID->getClassInterface()->getVisibility() == HiddenVisibility)
3530 Flags |= FragileABI_Class_Hidden;
3531
3532 enum {
3533 InstanceMethods,
3534 ClassMethods,
3535 NumMethodLists
3536 };
3537 SmallVector<const ObjCMethodDecl *, 16> Methods[NumMethodLists];
3538 for (const auto *MD : ID->methods()) {
3539 if (!MD->isDirectMethod())
3540 Methods[unsigned(MD->isClassMethod())].push_back(MD);
3541 }
3542
3543 for (const auto *PID : ID->property_impls()) {
3544 if (PID->getPropertyImplementation() == ObjCPropertyImplDecl::Synthesize) {
3545 if (PID->getPropertyDecl()->isDirectProperty())
3546 continue;
3547 if (ObjCMethodDecl *MD = PID->getGetterMethodDecl())
3548 if (GetMethodDefinition(MD))
3549 Methods[InstanceMethods].push_back(MD);
3550 if (ObjCMethodDecl *MD = PID->getSetterMethodDecl())
3551 if (GetMethodDefinition(MD))
3552 Methods[InstanceMethods].push_back(MD);
3553 }
3554 }
3555
3556 ConstantInitBuilder builder(CGM);
3557 auto values = builder.beginStruct(ObjCTypes.ClassTy);
3558 values.add(EmitMetaClass(ID, Protocols, Methods[ClassMethods]));
3559 if (ObjCInterfaceDecl *Super = Interface->getSuperClass()) {
3560 // Record a reference to the super class.
3561 LazySymbols.insert(Super->getIdentifier());
3562
3563 values.addBitCast(GetClassName(Super->getObjCRuntimeNameAsString()),
3564 ObjCTypes.ClassPtrTy);
3565 } else {
3566 values.addNullPointer(ObjCTypes.ClassPtrTy);
3567 }
3568 values.add(GetClassName(ID->getObjCRuntimeNameAsString()));
3569 // Version is always 0.
3570 values.addInt(ObjCTypes.LongTy, 0);
3571 values.addInt(ObjCTypes.LongTy, Flags);
3572 values.addInt(ObjCTypes.LongTy, Size.getQuantity());
3573 values.add(EmitIvarList(ID, false));
3574 values.add(emitMethodList(ID->getName(), MethodListType::InstanceMethods,
3575 Methods[InstanceMethods]));
3576 // cache is always NULL.
3577 values.addNullPointer(ObjCTypes.CachePtrTy);
3578 values.add(Protocols);
3579 values.add(BuildStrongIvarLayout(ID, CharUnits::Zero(), Size));
3580 values.add(EmitClassExtension(ID, Size, hasMRCWeak,
3581 /*isMetaclass*/ false));
3582
3583 std::string Name("OBJC_CLASS_");
3584 Name += ClassName;
3585 const char *Section = "__OBJC,__class,regular,no_dead_strip";
3586 // Check for a forward reference.
3587 llvm::GlobalVariable *GV = CGM.getModule().getGlobalVariable(Name, true);
3588 if (GV) {
3589 assert(GV->getValueType() == ObjCTypes.ClassTy &&(static_cast <bool> (GV->getValueType() == ObjCTypes
.ClassTy && "Forward metaclass reference has incorrect type."
) ? void (0) : __assert_fail ("GV->getValueType() == ObjCTypes.ClassTy && \"Forward metaclass reference has incorrect type.\""
, "clang/lib/CodeGen/CGObjCMac.cpp", 3590, __extension__ __PRETTY_FUNCTION__
))
3590 "Forward metaclass reference has incorrect type.")(static_cast <bool> (GV->getValueType() == ObjCTypes
.ClassTy && "Forward metaclass reference has incorrect type."
) ? void (0) : __assert_fail ("GV->getValueType() == ObjCTypes.ClassTy && \"Forward metaclass reference has incorrect type.\""
, "clang/lib/CodeGen/CGObjCMac.cpp", 3590, __extension__ __PRETTY_FUNCTION__
))
;
3591 values.finishAndSetAsInitializer(GV);
3592 GV->setSection(Section);
3593 GV->setAlignment(CGM.getPointerAlign().getAsAlign());
3594 CGM.addCompilerUsedGlobal(GV);
3595 } else
3596 GV = CreateMetadataVar(Name, values, Section, CGM.getPointerAlign(), true);
3597 DefinedClasses.push_back(GV);
3598 ImplementedClasses.push_back(Interface);
3599 // method definition entries must be clear for next implementation.
3600 MethodDefinitions.clear();
3601}
3602
3603llvm::Constant *CGObjCMac::EmitMetaClass(const ObjCImplementationDecl *ID,
3604 llvm::Constant *Protocols,
3605 ArrayRef<const ObjCMethodDecl*> Methods) {
3606 unsigned Flags = FragileABI_Class_Meta;
3607 unsigned Size = CGM.getDataLayout().getTypeAllocSize(ObjCTypes.ClassTy);
3608
3609 if (ID->getClassInterface()->getVisibility() == HiddenVisibility)
3610 Flags |= FragileABI_Class_Hidden;
3611
3612 ConstantInitBuilder builder(CGM);
3613 auto values = builder.beginStruct(ObjCTypes.ClassTy);
3614 // The isa for the metaclass is the root of the hierarchy.
3615 const ObjCInterfaceDecl *Root = ID->getClassInterface();
3616 while (const ObjCInterfaceDecl *Super = Root->getSuperClass())
3617 Root = Super;
3618 values.addBitCast(GetClassName(Root->getObjCRuntimeNameAsString()),
3619 ObjCTypes.ClassPtrTy);
3620 // The super class for the metaclass is emitted as the name of the
3621 // super class. The runtime fixes this up to point to the
3622 // *metaclass* for the super class.
3623 if (ObjCInterfaceDecl *Super = ID->getClassInterface()->getSuperClass()) {
3624 values.addBitCast(GetClassName(Super->getObjCRuntimeNameAsString()),
3625 ObjCTypes.ClassPtrTy);
3626 } else {
3627 values.addNullPointer(ObjCTypes.ClassPtrTy);
3628 }
3629 values.add(GetClassName(ID->getObjCRuntimeNameAsString()));
3630 // Version is always 0.
3631 values.addInt(ObjCTypes.LongTy, 0);
3632 values.addInt(ObjCTypes.LongTy, Flags);
3633 values.addInt(ObjCTypes.LongTy, Size);
3634 values.add(EmitIvarList(ID, true));
3635 values.add(emitMethodList(ID->getName(), MethodListType::ClassMethods,
3636 Methods));
3637 // cache is always NULL.
3638 values.addNullPointer(ObjCTypes.CachePtrTy);
3639 values.add(Protocols);
3640 // ivar_layout for metaclass is always NULL.
3641 values.addNullPointer(ObjCTypes.Int8PtrTy);
3642 // The class extension is used to store class properties for metaclasses.
3643 values.add(EmitClassExtension(ID, CharUnits::Zero(), false/*hasMRCWeak*/,
3644 /*isMetaclass*/true));
3645
3646 std::string Name("OBJC_METACLASS_");
3647 Name += ID->getName();
3648
3649 // Check for a forward reference.
3650 llvm::GlobalVariable *GV = CGM.getModule().getGlobalVariable(Name, true);
3651 if (GV) {
3652 assert(GV->getValueType() == ObjCTypes.ClassTy &&(static_cast <bool> (GV->getValueType() == ObjCTypes
.ClassTy && "Forward metaclass reference has incorrect type."
) ? void (0) : __assert_fail ("GV->getValueType() == ObjCTypes.ClassTy && \"Forward metaclass reference has incorrect type.\""
, "clang/lib/CodeGen/CGObjCMac.cpp", 3653, __extension__ __PRETTY_FUNCTION__
))
3653 "Forward metaclass reference has incorrect type.")(static_cast <bool> (GV->getValueType() == ObjCTypes
.ClassTy && "Forward metaclass reference has incorrect type."
) ? void (0) : __assert_fail ("GV->getValueType() == ObjCTypes.ClassTy && \"Forward metaclass reference has incorrect type.\""
, "clang/lib/CodeGen/CGObjCMac.cpp", 3653, __extension__ __PRETTY_FUNCTION__
))
;
3654 values.finishAndSetAsInitializer(GV);
3655 } else {
3656 GV = values.finishAndCreateGlobal(Name, CGM.getPointerAlign(),
3657 /*constant*/ false,
3658 llvm::GlobalValue::PrivateLinkage);
3659 }
3660 GV->setSection("__OBJC,__meta_class,regular,no_dead_strip");
3661 CGM.addCompilerUsedGlobal(GV);
3662
3663 return GV;
3664}
3665
3666llvm::Constant *CGObjCMac::EmitMetaClassRef(const ObjCInterfaceDecl *ID) {
3667 std::string Name = "OBJC_METACLASS_" + ID->getNameAsString();
3668
3669 // FIXME: Should we look these up somewhere other than the module. Its a bit
3670 // silly since we only generate these while processing an implementation, so
3671 // exactly one pointer would work if know when we entered/exitted an
3672 // implementation block.
3673
3674 // Check for an existing forward reference.
3675 // Previously, metaclass with internal linkage may have been defined.
3676 // pass 'true' as 2nd argument so it is returned.
3677 llvm::GlobalVariable *GV = CGM.getModule().getGlobalVariable(Name, true);
3678 if (!GV)
3679 GV = new llvm::GlobalVariable(CGM.getModule(), ObjCTypes.ClassTy, false,
3680 llvm::GlobalValue::PrivateLinkage, nullptr,
3681 Name);
3682
3683 assert(GV->getValueType() == ObjCTypes.ClassTy &&(static_cast <bool> (GV->getValueType() == ObjCTypes
.ClassTy && "Forward metaclass reference has incorrect type."
) ? void (0) : __assert_fail ("GV->getValueType() == ObjCTypes.ClassTy && \"Forward metaclass reference has incorrect type.\""
, "clang/lib/CodeGen/CGObjCMac.cpp", 3684, __extension__ __PRETTY_FUNCTION__
))
3684 "Forward metaclass reference has incorrect type.")(static_cast <bool> (GV->getValueType() == ObjCTypes
.ClassTy && "Forward metaclass reference has incorrect type."
) ? void (0) : __assert_fail ("GV->getValueType() == ObjCTypes.ClassTy && \"Forward metaclass reference has incorrect type.\""
, "clang/lib/CodeGen/CGObjCMac.cpp", 3684, __extension__ __PRETTY_FUNCTION__
))
;
3685 return GV;
3686}
3687
3688llvm::Value *CGObjCMac::EmitSuperClassRef(const ObjCInterfaceDecl *ID) {
3689 std::string Name = "OBJC_CLASS_" + ID->getNameAsString();
3690 llvm::GlobalVariable *GV = CGM.getModule().getGlobalVariable(Name, true);
3691
3692 if (!GV)
3693 GV = new llvm::GlobalVariable(CGM.getModule(), ObjCTypes.ClassTy, false,
3694 llvm::GlobalValue::PrivateLinkage, nullptr,
3695 Name);
3696
3697 assert(GV->getValueType() == ObjCTypes.ClassTy &&(static_cast <bool> (GV->getValueType() == ObjCTypes
.ClassTy && "Forward class metadata reference has incorrect type."
) ? void (0) : __assert_fail ("GV->getValueType() == ObjCTypes.ClassTy && \"Forward class metadata reference has incorrect type.\""
, "clang/lib/CodeGen/CGObjCMac.cpp", 3698, __extension__ __PRETTY_FUNCTION__
))
3698 "Forward class metadata reference has incorrect type.")(static_cast <bool> (GV->getValueType() == ObjCTypes
.ClassTy && "Forward class metadata reference has incorrect type."
) ? void (0) : __assert_fail ("GV->getValueType() == ObjCTypes.ClassTy && \"Forward class metadata reference has incorrect type.\""
, "clang/lib/CodeGen/CGObjCMac.cpp", 3698, __extension__ __PRETTY_FUNCTION__
))
;
3699 return GV;
3700}
3701
3702/*
3703 Emit a "class extension", which in this specific context means extra
3704 data that doesn't fit in the normal fragile-ABI class structure, and
3705 has nothing to do with the language concept of a class extension.
3706
3707 struct objc_class_ext {
3708 uint32_t size;
3709 const char *weak_ivar_layout;
3710 struct _objc_property_list *properties;
3711 };
3712*/
3713llvm::Constant *
3714CGObjCMac::EmitClassExtension(const ObjCImplementationDecl *ID,
3715 CharUnits InstanceSize, bool hasMRCWeakIvars,
3716 bool isMetaclass) {
3717 // Weak ivar layout.
3718 llvm::Constant *layout;
3719 if (isMetaclass) {
3720 layout = llvm::ConstantPointerNull::get(CGM.Int8PtrTy);
3721 } else {
3722 layout = BuildWeakIvarLayout(ID, CharUnits::Zero(), InstanceSize,
3723 hasMRCWeakIvars);
3724 }
3725
3726 // Properties.
3727 llvm::Constant *propertyList =
3728 EmitPropertyList((isMetaclass ? Twine("_OBJC_$_CLASS_PROP_LIST_")
3729 : Twine("_OBJC_$_PROP_LIST_"))
3730 + ID->getName(),
3731 ID, ID->getClassInterface(), ObjCTypes, isMetaclass);
3732
3733 // Return null if no extension bits are used.
3734 if (layout->isNullValue() && propertyList->isNullValue()) {
3735 return llvm::Constant::getNullValue(ObjCTypes.ClassExtensionPtrTy);
3736 }
3737
3738 uint64_t size =
3739 CGM.getDataLayout().getTypeAllocSize(ObjCTypes.ClassExtensionTy);
3740
3741 ConstantInitBuilder builder(CGM);
3742 auto values = builder.beginStruct(ObjCTypes.ClassExtensionTy);
3743 values.addInt(ObjCTypes.IntTy, size);
3744 values.add(layout);
3745 values.add(propertyList);
3746
3747 return CreateMetadataVar("OBJC_CLASSEXT_" + ID->getName(), values,
3748 "__OBJC,__class_ext,regular,no_dead_strip",
3749 CGM.getPointerAlign(), true);
3750}
3751
3752/*
3753 struct objc_ivar {
3754 char *ivar_name;
3755 char *ivar_type;
3756 int ivar_offset;
3757 };
3758
3759 struct objc_ivar_list {
3760 int ivar_count;
3761 struct objc_ivar list[count];
3762 };
3763*/
3764llvm::Constant *CGObjCMac::EmitIvarList(const ObjCImplementationDecl *ID,
3765 bool ForClass) {
3766 // When emitting the root class GCC emits ivar entries for the
3767 // actual class structure. It is not clear if we need to follow this
3768 // behavior; for now lets try and get away with not doing it. If so,
3769 // the cleanest solution would be to make up an ObjCInterfaceDecl
3770 // for the class.
3771 if (ForClass)
3772 return llvm::Constant::getNullValue(ObjCTypes.IvarListPtrTy);
3773
3774 const ObjCInterfaceDecl *OID = ID->getClassInterface();
3775
3776 ConstantInitBuilder builder(CGM);
3777 auto ivarList = builder.beginStruct();
3778 auto countSlot = ivarList.addPlaceholder();
3779 auto ivars = ivarList.beginArray(ObjCTypes.IvarTy);
3780
3781 for (const ObjCIvarDecl *IVD = OID->all_declared_ivar_begin();
3782 IVD; IVD = IVD->getNextIvar()) {
3783 // Ignore unnamed bit-fields.
3784 if (!IVD->getDeclName())
3785 continue;
3786
3787 auto ivar = ivars.beginStruct(ObjCTypes.IvarTy);
3788 ivar.add(GetMethodVarName(IVD->getIdentifier()));
3789 ivar.add(GetMethodVarType(IVD));
3790 ivar.addInt(ObjCTypes.IntTy, ComputeIvarBaseOffset(CGM, OID, IVD));
3791 ivar.finishAndAddTo(ivars);
3792 }
3793
3794 // Return null for empty list.
3795 auto count = ivars.size();
3796 if (count == 0) {
3797 ivars.abandon();
3798 ivarList.abandon();
3799 return llvm::Constant::getNullValue(ObjCTypes.IvarListPtrTy);
3800 }
3801
3802 ivars.finishAndAddTo(ivarList);
3803 ivarList.fillPlaceholderWithInt(countSlot, ObjCTypes.IntTy, count);
3804
3805 llvm::GlobalVariable *GV;
3806 if (ForClass)
3807 GV =
3808 CreateMetadataVar("OBJC_CLASS_VARIABLES_" + ID->getName(), ivarList,
3809 "__OBJC,__class_vars,regular,no_dead_strip",
3810 CGM.getPointerAlign(), true);
3811 else
3812 GV = CreateMetadataVar("OBJC_INSTANCE_VARIABLES_" + ID->getName(), ivarList,
3813 "__OBJC,__instance_vars,regular,no_dead_strip",
3814 CGM.getPointerAlign(), true);
3815 return llvm::ConstantExpr::getBitCast(GV, ObjCTypes.IvarListPtrTy);
3816}
3817
3818/// Build a struct objc_method_description constant for the given method.
3819///
3820/// struct objc_method_description {
3821/// SEL method_name;
3822/// char *method_types;
3823/// };
3824void CGObjCMac::emitMethodDescriptionConstant(ConstantArrayBuilder &builder,
3825 const ObjCMethodDecl *MD) {
3826 auto description = builder.beginStruct(ObjCTypes.MethodDescriptionTy);
3827 description.addBitCast(GetMethodVarName(MD->getSelector()),
3828 ObjCTypes.SelectorPtrTy);
3829 description.add(GetMethodVarType(MD));
3830 description.finishAndAddTo(builder);
3831}
3832
3833/// Build a struct objc_method constant for the given method.
3834///
3835/// struct objc_method {
3836/// SEL method_name;
3837/// char *method_types;
3838/// void *method;
3839/// };
3840void CGObjCMac::emitMethodConstant(ConstantArrayBuilder &builder,
3841 const ObjCMethodDecl *MD) {
3842 llvm::Function *fn = GetMethodDefinition(MD);
3843 assert(fn && "no definition registered for method")(static_cast <bool> (fn && "no definition registered for method"
) ? void (0) : __assert_fail ("fn && \"no definition registered for method\""
, "clang/lib/CodeGen/CGObjCMac.cpp", 3843, __extension__ __PRETTY_FUNCTION__
))
;
3844
3845 auto method = builder.beginStruct(ObjCTypes.MethodTy);
3846 method.addBitCast(GetMethodVarName(MD->getSelector()),
3847 ObjCTypes.SelectorPtrTy);
3848 method.add(GetMethodVarType(MD));
3849 method.addBitCast(fn, ObjCTypes.Int8PtrTy);
3850 method.finishAndAddTo(builder);
3851}
3852
3853/// Build a struct objc_method_list or struct objc_method_description_list,
3854/// as appropriate.
3855///
3856/// struct objc_method_list {
3857/// struct objc_method_list *obsolete;
3858/// int count;
3859/// struct objc_method methods_list[count];
3860/// };
3861///
3862/// struct objc_method_description_list {
3863/// int count;
3864/// struct objc_method_description list[count];
3865/// };
3866llvm::Constant *CGObjCMac::emitMethodList(Twine name, MethodListType MLT,
3867 ArrayRef<const ObjCMethodDecl *> methods) {
3868 StringRef prefix;
3869 StringRef section;
3870 bool forProtocol = false;
3871 switch (MLT) {
3872 case MethodListType::CategoryInstanceMethods:
3873 prefix = "OBJC_CATEGORY_INSTANCE_METHODS_";
3874 section = "__OBJC,__cat_inst_meth,regular,no_dead_strip";
3875 forProtocol = false;
3876 break;
3877 case MethodListType::CategoryClassMethods:
3878 prefix = "OBJC_CATEGORY_CLASS_METHODS_";
3879 section = "__OBJC,__cat_cls_meth,regular,no_dead_strip";
3880 forProtocol = false;
3881 break;
3882 case MethodListType::InstanceMethods:
3883 prefix = "OBJC_INSTANCE_METHODS_";
3884 section = "__OBJC,__inst_meth,regular,no_dead_strip";
3885 forProtocol = false;
3886 break;
3887 case MethodListType::ClassMethods:
3888 prefix = "OBJC_CLASS_METHODS_";
3889 section = "__OBJC,__cls_meth,regular,no_dead_strip";
3890 forProtocol = false;
3891 break;
3892 case MethodListType::ProtocolInstanceMethods:
3893 prefix = "OBJC_PROTOCOL_INSTANCE_METHODS_";
3894 section = "__OBJC,__cat_inst_meth,regular,no_dead_strip";
3895 forProtocol = true;
3896 break;
3897 case MethodListType::ProtocolClassMethods:
3898 prefix = "OBJC_PROTOCOL_CLASS_METHODS_";
3899 section = "__OBJC,__cat_cls_meth,regular,no_dead_strip";
3900 forProtocol = true;
3901 break;
3902 case MethodListType::OptionalProtocolInstanceMethods:
3903 prefix = "OBJC_PROTOCOL_INSTANCE_METHODS_OPT_";
3904 section = "__OBJC,__cat_inst_meth,regular,no_dead_strip";
3905 forProtocol = true;
3906 break;
3907 case MethodListType::OptionalProtocolClassMethods:
3908 prefix = "OBJC_PROTOCOL_CLASS_METHODS_OPT_";
3909 section = "__OBJC,__cat_cls_meth,regular,no_dead_strip";
3910 forProtocol = true;
3911 break;
3912 }
3913
3914 // Return null for empty list.
3915 if (methods.empty())
3916 return llvm::Constant::getNullValue(forProtocol
3917 ? ObjCTypes.MethodDescriptionListPtrTy
3918 : ObjCTypes.MethodListPtrTy);
3919
3920 // For protocols, this is an objc_method_description_list, which has
3921 // a slightly different structure.
3922 if (forProtocol) {
3923 ConstantInitBuilder builder(CGM);
3924 auto values = builder.beginStruct();
3925 values.addInt(ObjCTypes.IntTy, methods.size());
3926 auto methodArray = values.beginArray(ObjCTypes.MethodDescriptionTy);
3927 for (auto MD : methods) {
3928 emitMethodDescriptionConstant(methodArray, MD);
3929 }
3930 methodArray.finishAndAddTo(values);
3931
3932 llvm::GlobalVariable *GV = CreateMetadataVar(prefix + name, values, section,
3933 CGM.getPointerAlign(), true);
3934 return llvm::ConstantExpr::getBitCast(GV,
3935 ObjCTypes.MethodDescriptionListPtrTy);
3936 }
3937
3938 // Otherwise, it's an objc_method_list.
3939 ConstantInitBuilder builder(CGM);
3940 auto values = builder.beginStruct();
3941 values.addNullPointer(ObjCTypes.Int8PtrTy);
3942 values.addInt(ObjCTypes.IntTy, methods.size());
3943 auto methodArray = values.beginArray(ObjCTypes.MethodTy);
3944 for (auto MD : methods) {
3945 if (!MD->isDirectMethod())
3946 emitMethodConstant(methodArray, MD);
3947 }
3948 methodArray.finishAndAddTo(values);
3949
3950 llvm::GlobalVariable *GV = CreateMetadataVar(prefix + name, values, section,
3951 CGM.getPointerAlign(), true);
3952 return llvm::ConstantExpr::getBitCast(GV, ObjCTypes.MethodListPtrTy);
3953}
3954
3955llvm::Function *CGObjCCommonMac::GenerateMethod(const ObjCMethodDecl *OMD,
3956 const ObjCContainerDecl *CD) {
3957 llvm::Function *Method;
3958
3959 if (OMD->isDirectMethod()) {
3960 Method = GenerateDirectMethod(OMD, CD);
3961 } else {
3962 auto Name = getSymbolNameForMethod(OMD);
3963
3964 CodeGenTypes &Types = CGM.getTypes();
3965 llvm::FunctionType *MethodTy =
3966 Types.GetFunctionType(Types.arrangeObjCMethodDeclaration(OMD));
3967 Method =
3968 llvm::Function::Create(MethodTy, llvm::GlobalValue::InternalLinkage,
3969 Name, &CGM.getModule());
3970 }
3971
3972 MethodDefinitions.insert(std::make_pair(OMD, Method));
3973
3974 return Method;
3975}
3976
3977llvm::Function *
3978CGObjCCommonMac::GenerateDirectMethod(const ObjCMethodDecl *OMD,
3979 const ObjCContainerDecl *CD) {
3980 auto *COMD = OMD->getCanonicalDecl();
3981 auto I = DirectMethodDefinitions.find(COMD);
3982 llvm::Function *OldFn = nullptr, *Fn = nullptr;
3983
3984 if (I != DirectMethodDefinitions.end()) {
3985 // Objective-C allows for the declaration and implementation types
3986 // to differ slightly.
3987 //
3988 // If we're being asked for the Function associated for a method
3989 // implementation, a previous value might have been cached
3990 // based on the type of the canonical declaration.
3991 //
3992 // If these do not match, then we'll replace this function with
3993 // a new one that has the proper type below.
3994 if (!OMD->getBody() || COMD->getReturnType() == OMD->getReturnType())
3995 return I->second;
3996 OldFn = I->second;
3997 }
3998
3999 CodeGenTypes &Types = CGM.getTypes();
4000 llvm::FunctionType *MethodTy =
4001 Types.GetFunctionType(Types.arrangeObjCMethodDeclaration(OMD));
4002
4003 if (OldFn) {
4004 Fn = llvm::Function::Create(MethodTy, llvm::GlobalValue::ExternalLinkage,
4005 "", &CGM.getModule());
4006 Fn->takeName(OldFn);
4007 OldFn->replaceAllUsesWith(
4008 llvm::ConstantExpr::getBitCast(Fn, OldFn->getType()));
4009 OldFn->eraseFromParent();
4010
4011 // Replace the cached function in the map.
4012 I->second = Fn;
4013 } else {
4014 auto Name = getSymbolNameForMethod(OMD, /*include category*/ false);
4015
4016 Fn = llvm::Function::Create(MethodTy, llvm::GlobalValue::ExternalLinkage,
4017 Name, &CGM.getModule());
4018 DirectMethodDefinitions.insert(std::make_pair(COMD, Fn));
4019 }
4020
4021 return Fn;
4022}
4023
4024void CGObjCCommonMac::GenerateDirectMethodPrologue(
4025 CodeGenFunction &CGF, llvm::Function *Fn, const ObjCMethodDecl *OMD,
4026 const ObjCContainerDecl *CD) {
4027 auto &Builder = CGF.Builder;
4028 bool ReceiverCanBeNull = true;
4029 auto selfAddr = CGF.GetAddrOfLocalVar(OMD->getSelfDecl());
4030 auto selfValue = Builder.CreateLoad(selfAddr);
4031
4032 // Generate:
4033 //
4034 // /* for class methods only to force class lazy initialization */
4035 // self = [self self];
4036 //
4037 // /* unless the receiver is never NULL */
4038 // if (self == nil) {
4039 // return (ReturnType){ };
4040 // }
4041 //
4042 // _cmd = @selector(...)
4043 // ...
4044
4045 if (OMD->isClassMethod()) {
4046 const ObjCInterfaceDecl *OID = cast<ObjCInterfaceDecl>(CD);
4047 assert(OID &&(static_cast <bool> (OID && "GenerateDirectMethod() should be called with the Class Interface"
) ? void (0) : __assert_fail ("OID && \"GenerateDirectMethod() should be called with the Class Interface\""
, "clang/lib/CodeGen/CGObjCMac.cpp", 4048, __extension__ __PRETTY_FUNCTION__
))
4048 "GenerateDirectMethod() should be called with the Class Interface")(static_cast <bool> (OID && "GenerateDirectMethod() should be called with the Class Interface"
) ? void (0) : __assert_fail ("OID && \"GenerateDirectMethod() should be called with the Class Interface\""
, "clang/lib/CodeGen/CGObjCMac.cpp", 4048, __extension__ __PRETTY_FUNCTION__
))
;
4049 Selector SelfSel = GetNullarySelector("self", CGM.getContext());
4050 auto ResultType = CGF.getContext().getObjCIdType();
4051 RValue result;
4052 CallArgList Args;
4053
4054 // TODO: If this method is inlined, the caller might know that `self` is
4055 // already initialized; for example, it might be an ordinary Objective-C
4056 // method which always receives an initialized `self`, or it might have just
4057 // forced initialization on its own.
4058 //
4059 // We should find a way to eliminate this unnecessary initialization in such
4060 // cases in LLVM.
4061 result = GeneratePossiblySpecializedMessageSend(
4062 CGF, ReturnValueSlot(), ResultType, SelfSel, selfValue, Args, OID,
4063 nullptr, true);
4064 Builder.CreateStore(result.getScalarVal(), selfAddr);
4065
4066 // Nullable `Class` expressions cannot be messaged with a direct method
4067 // so the only reason why the receive can be null would be because
4068 // of weak linking.
4069 ReceiverCanBeNull = isWeakLinkedClass(OID);
4070 }
4071
4072 if (ReceiverCanBeNull) {
4073 llvm::BasicBlock *SelfIsNilBlock =
4074 CGF.createBasicBlock("objc_direct_method.self_is_nil");
4075 llvm::BasicBlock *ContBlock =
4076 CGF.createBasicBlock("objc_direct_method.cont");
4077
4078 // if (self == nil) {
4079 auto selfTy = cast<llvm::PointerType>(selfValue->getType());
4080 auto Zero = llvm::ConstantPointerNull::get(selfTy);
4081
4082 llvm::MDBuilder MDHelper(CGM.getLLVMContext());
4083 Builder.CreateCondBr(Builder.CreateICmpEQ(selfValue, Zero), SelfIsNilBlock,
4084 ContBlock, MDHelper.createBranchWeights(1, 1 << 20));
4085
4086 CGF.EmitBlock(SelfIsNilBlock);
4087
4088 // return (ReturnType){ };
4089 auto retTy = OMD->getReturnType();
4090 Builder.SetInsertPoint(SelfIsNilBlock);
4091 if (!retTy->isVoidType()) {
4092 CGF.EmitNullInitialization(CGF.ReturnValue, retTy);
4093 }
4094 CGF.EmitBranchThroughCleanup(CGF.ReturnBlock);
4095 // }
4096
4097 // rest of the body
4098 CGF.EmitBlock(ContBlock);
4099 Builder.SetInsertPoint(ContBlock);
4100 }
4101
4102 // only synthesize _cmd if it's referenced
4103 if (OMD->getCmdDecl()->isUsed()) {
4104 Builder.CreateStore(GetSelector(CGF, OMD),
4105 CGF.GetAddrOfLocalVar(OMD->getCmdDecl()));
4106 }
4107}
4108
4109llvm::GlobalVariable *CGObjCCommonMac::CreateMetadataVar(Twine Name,
4110 ConstantStructBuilder &Init,
4111 StringRef Section,
4112 CharUnits Align,
4113 bool AddToUsed) {
4114 llvm::GlobalValue::LinkageTypes LT =
4115 getLinkageTypeForObjCMetadata(CGM, Section);
4116 llvm::GlobalVariable *GV =
4117 Init.finishAndCreateGlobal(Name, Align, /*constant*/ false, LT);
4118 if (!Section.empty())
4119 GV->setSection(Section);
4120 if (AddToUsed)
4121 CGM.addCompilerUsedGlobal(GV);
4122 return GV;
4123}
4124
4125llvm::GlobalVariable *CGObjCCommonMac::CreateMetadataVar(Twine Name,
4126 llvm::Constant *Init,
4127 StringRef Section,
4128 CharUnits Align,
4129 bool AddToUsed) {
4130 llvm::Type *Ty = Init->getType();
4131 llvm::GlobalValue::LinkageTypes LT =
4132 getLinkageTypeForObjCMetadata(CGM, Section);
4133 llvm::GlobalVariable *GV =
4134 new llvm::GlobalVariable(CGM.getModule(), Ty, false, LT, Init, Name);
4135 if (!Section.empty())
4136 GV->setSection(Section);
4137 GV->setAlignment(Align.getAsAlign());
4138 if (AddToUsed)
4139 CGM.addCompilerUsedGlobal(GV);
4140 return GV;
4141}
4142
4143llvm::GlobalVariable *
4144CGObjCCommonMac::CreateCStringLiteral(StringRef Name, ObjCLabelType Type,
4145 bool ForceNonFragileABI,
4146 bool NullTerminate) {
4147 StringRef Label;
4148 switch (Type) {
4149 case ObjCLabelType::ClassName: Label = "OBJC_CLASS_NAME_"; break;
4150 case ObjCLabelType::MethodVarName: Label = "OBJC_METH_VAR_NAME_"; break;
4151 case ObjCLabelType::MethodVarType: Label = "OBJC_METH_VAR_TYPE_"; break;
4152 case ObjCLabelType::PropertyName: Label = "OBJC_PROP_NAME_ATTR_"; break;
4153 }
4154
4155 bool NonFragile = ForceNonFragileABI || isNonFragileABI();
4156
4157 StringRef Section;
4158 switch (Type) {
4159 case ObjCLabelType::ClassName:
4160 Section = NonFragile ? "__TEXT,__objc_classname,cstring_literals"
4161 : "__TEXT,__cstring,cstring_literals";
4162 break;
4163 case ObjCLabelType::MethodVarName:
4164 Section = NonFragile ? "__TEXT,__objc_methname,cstring_literals"
4165 : "__TEXT,__cstring,cstring_literals";
4166 break;
4167 case ObjCLabelType::MethodVarType:
4168 Section = NonFragile ? "__TEXT,__objc_methtype,cstring_literals"
4169 : "__TEXT,__cstring,cstring_literals";
4170 break;
4171 case ObjCLabelType::PropertyName:
4172 Section = NonFragile ? "__TEXT,__objc_methname,cstring_literals"
4173 : "__TEXT,__cstring,cstring_literals";
4174 break;
4175 }
4176
4177 llvm::Constant *Value =
4178 llvm::ConstantDataArray::getString(VMContext, Name, NullTerminate);
4179 llvm::GlobalVariable *GV =
4180 new llvm::GlobalVariable(CGM.getModule(), Value->getType(),
4181 /*isConstant=*/true,
4182 llvm::GlobalValue::PrivateLinkage, Value, Label);
4183 if (CGM.getTriple().isOSBinFormatMachO())
4184 GV->setSection(Section);
4185 GV->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
4186 GV->setAlignment(CharUnits::One().getAsAlign());
4187 CGM.addCompilerUsedGlobal(GV);
4188
4189 return GV;
4190}
4191
4192llvm::Function *CGObjCMac::ModuleInitFunction() {
4193 // Abuse this interface function as a place to finalize.
4194 FinishModule();
4195 return nullptr;
4196}
4197
4198llvm::FunctionCallee CGObjCMac::GetPropertyGetFunction() {
4199 return ObjCTypes.getGetPropertyFn();
4200}
4201
4202llvm::FunctionCallee CGObjCMac::GetPropertySetFunction() {
4203 return ObjCTypes.getSetPropertyFn();
4204}
4205
4206llvm::FunctionCallee CGObjCMac::GetOptimizedPropertySetFunction(bool atomic,
4207 bool copy) {
4208 return ObjCTypes.getOptimizedSetPropertyFn(atomic, copy);
4209}
4210
4211llvm::FunctionCallee CGObjCMac::GetGetStructFunction() {
4212 return ObjCTypes.getCopyStructFn();
4213}
4214
4215llvm::FunctionCallee CGObjCMac::GetSetStructFunction() {
4216 return ObjCTypes.getCopyStructFn();
4217}
4218
4219llvm::FunctionCallee CGObjCMac::GetCppAtomicObjectGetFunction() {
4220 return ObjCTypes.getCppAtomicObjectFunction();
4221}
4222
4223llvm::FunctionCallee CGObjCMac::GetCppAtomicObjectSetFunction() {
4224 return ObjCTypes.getCppAtomicObjectFunction();
4225}
4226
4227llvm::FunctionCallee CGObjCMac::EnumerationMutationFunction() {
4228 return ObjCTypes.getEnumerationMutationFn();
4229}
4230
4231void CGObjCMac::EmitTryStmt(CodeGenFunction &CGF, const ObjCAtTryStmt &S) {
4232 return EmitTryOrSynchronizedStmt(CGF, S);
4233}
4234
4235void CGObjCMac::EmitSynchronizedStmt(CodeGenFunction &CGF,
4236 const ObjCAtSynchronizedStmt &S) {
4237 return EmitTryOrSynchronizedStmt(CGF, S);
4238}
4239
4240namespace {
4241 struct PerformFragileFinally final : EHScopeStack::Cleanup {
4242 const Stmt &S;
4243 Address SyncArgSlot;
4244 Address CallTryExitVar;
4245 Address ExceptionData;
4246 ObjCTypesHelper &ObjCTypes;
4247 PerformFragileFinally(const Stmt *S,
4248 Address SyncArgSlot,
4249 Address CallTryExitVar,
4250 Address ExceptionData,
4251 ObjCTypesHelper *ObjCTypes)
4252 : S(*S), SyncArgSlot(SyncArgSlot), CallTryExitVar(CallTryExitVar),
4253 ExceptionData(ExceptionData), ObjCTypes(*ObjCTypes) {}
4254
4255 void Emit(CodeGenFunction &CGF, Flags flags) override {
4256 // Check whether we need to call objc_exception_try_exit.
4257 // In optimized code, this branch will always be folded.
4258 llvm::BasicBlock *FinallyCallExit =
4259 CGF.createBasicBlock("finally.call_exit");
4260 llvm::BasicBlock *FinallyNoCallExit =
4261 CGF.createBasicBlock("finally.no_call_exit");
4262 CGF.Builder.CreateCondBr(CGF.Builder.CreateLoad(CallTryExitVar),
4263 FinallyCallExit, FinallyNoCallExit);
4264
4265 CGF.EmitBlock(FinallyCallExit);
4266 CGF.EmitNounwindRuntimeCall(ObjCTypes.getExceptionTryExitFn(),
4267 ExceptionData.getPointer());
4268
4269 CGF.EmitBlock(FinallyNoCallExit);
4270
4271 if (isa<ObjCAtTryStmt>(S)) {
4272 if (const ObjCAtFinallyStmt* FinallyStmt =
4273 cast<ObjCAtTryStmt>(S).getFinallyStmt()) {
4274 // Don't try to do the @finally if this is an EH cleanup.
4275 if (flags.isForEHCleanup()) return;
4276
4277 // Save the current cleanup destination in case there's
4278 // control flow inside the finally statement.
4279 llvm::Value *CurCleanupDest =
4280 CGF.Builder.CreateLoad(CGF.getNormalCleanupDestSlot());
4281
4282 CGF.EmitStmt(FinallyStmt->getFinallyBody());
4283
4284 if (CGF.HaveInsertPoint()) {
4285 CGF.Builder.CreateStore(CurCleanupDest,
4286 CGF.getNormalCleanupDestSlot());
4287 } else {
4288 // Currently, the end of the cleanup must always exist.
4289 CGF.EnsureInsertPoint();
4290 }
4291 }
4292 } else {
4293 // Emit objc_sync_exit(expr); as finally's sole statement for
4294 // @synchronized.
4295 llvm::Value *SyncArg = CGF.Builder.CreateLoad(SyncArgSlot);
4296 CGF.EmitNounwindRuntimeCall(ObjCTypes.getSyncExitFn(), SyncArg);
4297 }
4298 }
4299 };
4300
4301 class FragileHazards {
4302 CodeGenFunction &CGF;
4303 SmallVector<llvm::Value*, 20> Locals;
4304 llvm::DenseSet<llvm::BasicBlock*> BlocksBeforeTry;
4305
4306 llvm::InlineAsm *ReadHazard;
4307 llvm::InlineAsm *WriteHazard;
4308
4309 llvm::FunctionType *GetAsmFnType();
4310
4311 void collectLocals();
4312 void emitReadHazard(CGBuilderTy &Builder);
4313
4314 public:
4315 FragileHazards(CodeGenFunction &CGF);
4316
4317 void emitWriteHazard();
4318 void emitHazardsInNewBlocks();
4319 };
4320} // end anonymous namespace
4321
4322/// Create the fragile-ABI read and write hazards based on the current
4323/// state of the function, which is presumed to be immediately prior
4324/// to a @try block. These hazards are used to maintain correct
4325/// semantics in the face of optimization and the fragile ABI's
4326/// cavalier use of setjmp/longjmp.
4327FragileHazards::FragileHazards(CodeGenFunction &CGF) : CGF(CGF) {
4328 collectLocals();
4329
4330 if (Locals.empty()) return;
4331
4332 // Collect all the blocks in the function.
4333 for (llvm::Function::iterator
4334 I = CGF.CurFn->begin(), E = CGF.CurFn->end(); I != E; ++I)
4335 BlocksBeforeTry.insert(&*I);
4336
4337 llvm::FunctionType *AsmFnTy = GetAsmFnType();
4338
4339 // Create a read hazard for the allocas. This inhibits dead-store
4340 // optimizations and forces the values to memory. This hazard is
4341 // inserted before any 'throwing' calls in the protected scope to
4342 // reflect the possibility that the variables might be read from the
4343 // catch block if the call throws.
4344 {
4345 std::string Constraint;
4346 for (unsigned I = 0, E = Locals.size(); I != E; ++I) {
4347 if (I) Constraint += ',';
4348 Constraint += "*m";
4349 }
4350
4351 ReadHazard = llvm::InlineAsm::get(AsmFnTy, "", Constraint, true, false);
4352 }
4353
4354 // Create a write hazard for the allocas. This inhibits folding
4355 // loads across the hazard. This hazard is inserted at the
4356 // beginning of the catch path to reflect the possibility that the
4357 // variables might have been written within the protected scope.
4358 {
4359 std::string Constraint;
4360 for (unsigned I = 0, E = Locals.size(); I != E; ++I) {
4361 if (I) Constraint += ',';
4362 Constraint += "=*m";
4363 }
4364
4365 WriteHazard = llvm::InlineAsm::get(AsmFnTy, "", Constraint, true, false);
4366 }
4367}
4368
4369/// Emit a write hazard at the current location.
4370void FragileHazards::emitWriteHazard() {
4371 if (Locals.empty()) return;
4372
4373 llvm::CallInst *Call = CGF.EmitNounwindRuntimeCall(WriteHazard, Locals);
4374 for (auto Pair : llvm::enumerate(Locals))
4375 Call->addParamAttr(Pair.index(), llvm::Attribute::get(
4376 CGF.getLLVMContext(), llvm::Attribute::ElementType,
4377 cast<llvm::AllocaInst>(Pair.value())->getAllocatedType()));
4378}
4379
4380void FragileHazards::emitReadHazard(CGBuilderTy &Builder) {
4381 assert(!Locals.empty())(static_cast <bool> (!Locals.empty()) ? void (0) : __assert_fail
("!Locals.empty()", "clang/lib/CodeGen/CGObjCMac.cpp", 4381,
__extension__ __PRETTY_FUNCTION__))
;
4382 llvm::CallInst *call = Builder.CreateCall(ReadHazard, Locals);
4383 call->setDoesNotThrow();
4384 call->setCallingConv(CGF.getRuntimeCC());
4385 for (auto Pair : llvm::enumerate(Locals))
4386 call->addParamAttr(Pair.index(), llvm::Attribute::get(
4387 Builder.getContext(), llvm::Attribute::ElementType,
4388 cast<llvm::AllocaInst>(Pair.value())->getAllocatedType()));
4389}
4390
4391/// Emit read hazards in all the protected blocks, i.e. all the blocks
4392/// which have been inserted since the beginning of the try.
4393void FragileHazards::emitHazardsInNewBlocks() {
4394 if (Locals.empty()) return;
4395
4396 CGBuilderTy Builder(CGF, CGF.getLLVMContext());
4397
4398 // Iterate through all blocks, skipping those prior to the try.
4399 for (llvm::Function::iterator
4400 FI = CGF.CurFn->begin(), FE = CGF.CurFn->end(); FI != FE; ++FI) {
4401 llvm::BasicBlock &BB = *FI;
4402 if (BlocksBeforeTry.count(&BB)) continue;
4403
4404 // Walk through all the calls in the block.
4405 for (llvm::BasicBlock::iterator
4406 BI = BB.begin(), BE = BB.end(); BI != BE; ++BI) {
4407 llvm::Instruction &I = *BI;
4408
4409 // Ignore instructions that aren't non-intrinsic calls.
4410 // These are the only calls that can possibly call longjmp.
4411 if (!isa<llvm::CallInst>(I) && !isa<llvm::InvokeInst>(I))
4412 continue;
4413 if (isa<llvm::IntrinsicInst>(I))
4414 continue;
4415
4416 // Ignore call sites marked nounwind. This may be questionable,
4417 // since 'nounwind' doesn't necessarily mean 'does not call longjmp'.
4418 if (cast<llvm::CallBase>(I).doesNotThrow())
4419 continue;
4420
4421 // Insert a read hazard before the call. This will ensure that
4422 // any writes to the locals are performed before making the
4423 // call. If the call throws, then this is sufficient to
4424 // guarantee correctness as long as it doesn't also write to any
4425 // locals.
4426 Builder.SetInsertPoint(&BB, BI);
4427 emitReadHazard(Builder);
4428 }
4429 }
4430}
4431
4432static void addIfPresent(llvm::DenseSet<llvm::Value*> &S, Address V) {
4433 if (V.isValid()) S.insert(V.getPointer());
4434}
4435
4436void FragileHazards::collectLocals() {
4437 // Compute a set of allocas to ignore.
4438 llvm::DenseSet<llvm::Value*> AllocasToIgnore;
4439 addIfPresent(AllocasToIgnore, CGF.ReturnValue);
4440 addIfPresent(AllocasToIgnore, CGF.NormalCleanupDest);
4441
4442 // Collect all the allocas currently in the function. This is
4443 // probably way too aggressive.
4444 llvm::BasicBlock &Entry = CGF.CurFn->getEntryBlock();
4445 for (llvm::BasicBlock::iterator
4446 I = Entry.begin(), E = Entry.end(); I != E; ++I)
4447 if (isa<llvm::AllocaInst>(*I) && !AllocasToIgnore.count(&*I))
4448 Locals.push_back(&*I);
4449}
4450
4451llvm::FunctionType *FragileHazards::GetAsmFnType() {
4452 SmallVector<llvm::Type *, 16> tys(Locals.size());
4453 for (unsigned i = 0, e = Locals.size(); i != e; ++i)
4454 tys[i] = Locals[i]->getType();
4455 return llvm::FunctionType::get(CGF.VoidTy, tys, false);
4456}
4457
4458/*
4459
4460 Objective-C setjmp-longjmp (sjlj) Exception Handling
4461 --
4462
4463 A catch buffer is a setjmp buffer plus:
4464 - a pointer to the exception that was caught
4465 - a pointer to the previous exception data buffer
4466 - two pointers of reserved storage
4467 Therefore catch buffers form a stack, with a pointer to the top
4468 of the stack kept in thread-local storage.
4469
4470 objc_exception_try_enter pushes a catch buffer onto the EH stack.
4471 objc_exception_try_exit pops the given catch buffer, which is
4472 required to be the top of the EH stack.
4473 objc_exception_throw pops the top of the EH stack, writes the
4474 thrown exception into the appropriate field, and longjmps
4475 to the setjmp buffer. It crashes the process (with a printf
4476 and an abort()) if there are no catch buffers on the stack.
4477 objc_exception_extract just reads the exception pointer out of the
4478 catch buffer.
4479
4480 There's no reason an implementation couldn't use a light-weight
4481 setjmp here --- something like __builtin_setjmp, but API-compatible
4482 with the heavyweight setjmp. This will be more important if we ever
4483 want to implement correct ObjC/C++ exception interactions for the
4484 fragile ABI.
4485
4486 Note that for this use of setjmp/longjmp to be correct, we may need
4487 to mark some local variables volatile: if a non-volatile local
4488 variable is modified between the setjmp and the longjmp, it has
4489 indeterminate value. For the purposes of LLVM IR, it may be
4490 sufficient to make loads and stores within the @try (to variables
4491 declared outside the @try) volatile. This is necessary for
4492 optimized correctness, but is not currently being done; this is
4493 being tracked as rdar://problem/8160285
4494
4495 The basic framework for a @try-catch-finally is as follows:
4496 {
4497 objc_exception_data d;
4498 id _rethrow = null;
4499 bool _call_try_exit = true;
4500
4501 objc_exception_try_enter(&d);
4502 if (!setjmp(d.jmp_buf)) {
4503 ... try body ...
4504 } else {
4505 // exception path
4506 id _caught = objc_exception_extract(&d);
4507
4508 // enter new try scope for handlers
4509 if (!setjmp(d.jmp_buf)) {
4510 ... match exception and execute catch blocks ...
4511
4512 // fell off end, rethrow.
4513 _rethrow = _caught;
4514 ... jump-through-finally to finally_rethrow ...
4515 } else {
4516 // exception in catch block
4517 _rethrow = objc_exception_extract(&d);
4518 _call_try_exit = false;
4519 ... jump-through-finally to finally_rethrow ...
4520 }
4521 }
4522 ... jump-through-finally to finally_end ...
4523
4524 finally:
4525 if (_call_try_exit)
4526 objc_exception_try_exit(&d);
4527
4528 ... finally block ....
4529 ... dispatch to finally destination ...
4530
4531 finally_rethrow:
4532 objc_exception_throw(_rethrow);
4533
4534 finally_end:
4535 }
4536
4537 This framework differs slightly from the one gcc uses, in that gcc
4538 uses _rethrow to determine if objc_exception_try_exit should be called
4539 and if the object should be rethrown. This breaks in the face of
4540 throwing nil and introduces unnecessary branches.
4541
4542 We specialize this framework for a few particular circumstances:
4543
4544 - If there are no catch blocks, then we avoid emitting the second
4545 exception handling context.
4546
4547 - If there is a catch-all catch block (i.e. @catch(...) or @catch(id
4548 e)) we avoid emitting the code to rethrow an uncaught exception.
4549
4550 - FIXME: If there is no @finally block we can do a few more
4551 simplifications.
4552
4553 Rethrows and Jumps-Through-Finally
4554 --
4555
4556 '@throw;' is supported by pushing the currently-caught exception
4557 onto ObjCEHStack while the @catch blocks are emitted.
4558
4559 Branches through the @finally block are handled with an ordinary
4560 normal cleanup. We do not register an EH cleanup; fragile-ABI ObjC
4561 exceptions are not compatible with C++ exceptions, and this is
4562 hardly the only place where this will go wrong.
4563
4564 @synchronized(expr) { stmt; } is emitted as if it were:
4565 id synch_value = expr;
4566 objc_sync_enter(synch_value);
4567 @try { stmt; } @finally { objc_sync_exit(synch_value); }
4568*/
4569
4570void CGObjCMac::EmitTryOrSynchronizedStmt(CodeGen::CodeGenFunction &CGF,
4571 const Stmt &S) {
4572 bool isTry = isa<ObjCAtTryStmt>(S);
4573
4574 // A destination for the fall-through edges of the catch handlers to
4575 // jump to.
4576 CodeGenFunction::JumpDest FinallyEnd =
4577 CGF.getJumpDestInCurrentScope("finally.end");
4578
4579 // A destination for the rethrow edge of the catch handlers to jump
4580 // to.
4581 CodeGenFunction::JumpDest FinallyRethrow =
4582 CGF.getJumpDestInCurrentScope("finally.rethrow");
4583
4584 // For @synchronized, call objc_sync_enter(sync.expr). The
4585 // evaluation of the expression must occur before we enter the
4586 // @synchronized. We can't avoid a temp here because we need the
4587 // value to be preserved. If the backend ever does liveness
4588 // correctly after setjmp, this will be unnecessary.
4589 Address SyncArgSlot = Address::invalid();
4590 if (!isTry) {
4591 llvm::Value *SyncArg =
4592 CGF.EmitScalarExpr(cast<ObjCAtSynchronizedStmt>(S).getSynchExpr());
4593 SyncArg = CGF.Builder.CreateBitCast(SyncArg, ObjCTypes.ObjectPtrTy);
4594 CGF.EmitNounwindRuntimeCall(ObjCTypes.getSyncEnterFn(), SyncArg);
4595
4596 SyncArgSlot = CGF.CreateTempAlloca(SyncArg->getType(),
4597 CGF.getPointerAlign(), "sync.arg");
4598 CGF.Builder.CreateStore(SyncArg, SyncArgSlot);
4599 }
4600
4601 // Allocate memory for the setjmp buffer. This needs to be kept
4602 // live throughout the try and catch blocks.
4603 Address ExceptionData = CGF.CreateTempAlloca(ObjCTypes.ExceptionDataTy,
4604 CGF.getPointerAlign(),
4605 "exceptiondata.ptr");
4606
4607 // Create the fragile hazards. Note that this will not capture any
4608 // of the allocas required for exception processing, but will
4609 // capture the current basic block (which extends all the way to the
4610 // setjmp call) as "before the @try".
4611 FragileHazards Hazards(CGF);
4612
4613 // Create a flag indicating whether the cleanup needs to call
4614 // objc_exception_try_exit. This is true except when
4615 // - no catches match and we're branching through the cleanup
4616 // just to rethrow the exception, or
4617 // - a catch matched and we're falling out of the catch handler.
4618 // The setjmp-safety rule here is that we should always store to this
4619 // variable in a place that dominates the branch through the cleanup
4620 // without passing through any setjmps.
4621 Address CallTryExitVar = CGF.CreateTempAlloca(CGF.Builder.getInt1Ty(),
4622 CharUnits::One(),
4623 "_call_try_exit");
4624
4625 // A slot containing the exception to rethrow. Only needed when we
4626 // have both a @catch and a @finally.
4627 Address PropagatingExnVar = Address::invalid();
4628
4629 // Push a normal cleanup to leave the try scope.
4630 CGF.EHStack.pushCleanup<PerformFragileFinally>(NormalAndEHCleanup, &S,
4631 SyncArgSlot,
4632 CallTryExitVar,
4633 ExceptionData,
4634 &ObjCTypes);
4635
4636 // Enter a try block:
4637 // - Call objc_exception_try_enter to push ExceptionData on top of
4638 // the EH stack.
4639 CGF.EmitNounwindRuntimeCall(ObjCTypes.getExceptionTryEnterFn(),
4640 ExceptionData.getPointer());
4641
4642 // - Call setjmp on the exception data buffer.
4643 llvm::Constant *Zero = llvm::ConstantInt::get(CGF.Builder.getInt32Ty(), 0);
4644 llvm::Value *GEPIndexes[] = { Zero, Zero, Zero };
4645 llvm::Value *SetJmpBuffer = CGF.Builder.CreateGEP(
4646 ObjCTypes.ExceptionDataTy, ExceptionData.getPointer(), GEPIndexes,
4647 "setjmp_buffer");
4648 llvm::CallInst *SetJmpResult = CGF.EmitNounwindRuntimeCall(
4649 ObjCTypes.getSetJmpFn(), SetJmpBuffer, "setjmp_result");
4650 SetJmpResult->setCanReturnTwice();
4651
4652 // If setjmp returned 0, enter the protected block; otherwise,
4653 // branch to the handler.
4654 llvm::BasicBlock *TryBlock = CGF.createBasicBlock("try");
4655 llvm::BasicBlock *TryHandler = CGF.createBasicBlock("try.handler");
4656 llvm::Value *DidCatch =
4657 CGF.Builder.CreateIsNotNull(SetJmpResult, "did_catch_exception");
4658 CGF.Builder.CreateCondBr(DidCatch, TryHandler, TryBlock);
4659
4660 // Emit the protected block.
4661 CGF.EmitBlock(TryBlock);
4662 CGF.Builder.CreateStore(CGF.Builder.getTrue(), CallTryExitVar);
4663 CGF.EmitStmt(isTry ? cast<ObjCAtTryStmt>(S).getTryBody()
4664 : cast<ObjCAtSynchronizedStmt>(S).getSynchBody());
4665
4666 CGBuilderTy::InsertPoint TryFallthroughIP = CGF.Builder.saveAndClearIP();
4667
4668 // Emit the exception handler block.
4669 CGF.EmitBlock(TryHandler);
4670
4671 // Don't optimize loads of the in-scope locals across this point.
4672 Hazards.emitWriteHazard();
4673
4674 // For a @synchronized (or a @try with no catches), just branch
4675 // through the cleanup to the rethrow block.
4676 if (!isTry || !cast<ObjCAtTryStmt>(S).getNumCatchStmts()) {
4677 // Tell the cleanup not to re-pop the exit.
4678 CGF.Builder.CreateStore(CGF.Builder.getFalse(), CallTryExitVar);
4679 CGF.EmitBranchThroughCleanup(FinallyRethrow);
4680
4681 // Otherwise, we have to match against the caught exceptions.
4682 } else {
4683 // Retrieve the exception object. We may emit multiple blocks but
4684 // nothing can cross this so the value is already in SSA form.
4685 llvm::CallInst *Caught =
4686 CGF.EmitNounwindRuntimeCall(ObjCTypes.getExceptionExtractFn(),
4687 ExceptionData.getPointer(), "caught");
4688
4689 // Push the exception to rethrow onto the EH value stack for the
4690 // benefit of any @throws in the handlers.
4691 CGF.ObjCEHValueStack.push_back(Caught);
4692
4693 const ObjCAtTryStmt* AtTryStmt = cast<ObjCAtTryStmt>(&S);
4694
4695 bool HasFinally = (AtTryStmt->getFinallyStmt() != nullptr);
4696
4697 llvm::BasicBlock *CatchBlock = nullptr;
4698 llvm::BasicBlock *CatchHandler = nullptr;
4699 if (HasFinally) {
4700 // Save the currently-propagating exception before
4701 // objc_exception_try_enter clears the exception slot.
4702 PropagatingExnVar = CGF.CreateTempAlloca(Caught->getType(),
4703 CGF.getPointerAlign(),
4704 "propagating_exception");
4705 CGF.Builder.CreateStore(Caught, PropagatingExnVar);
4706
4707 // Enter a new exception try block (in case a @catch block
4708 // throws an exception).
4709 CGF.EmitNounwindRuntimeCall(ObjCTypes.getExceptionTryEnterFn(),
4710 ExceptionData.getPointer());
4711
4712 llvm::CallInst *SetJmpResult =
4713 CGF.EmitNounwindRuntimeCall(ObjCTypes.getSetJmpFn(),
4714 SetJmpBuffer, "setjmp.result");
4715 SetJmpResult->setCanReturnTwice();
4716
4717 llvm::Value *Threw =
4718 CGF.Builder.CreateIsNotNull(SetJmpResult, "did_catch_exception");
4719
4720 CatchBlock = CGF.createBasicBlock("catch");
4721 CatchHandler = CGF.createBasicBlock("catch_for_catch");
4722 CGF.Builder.CreateCondBr(Threw, CatchHandler, CatchBlock);
4723
4724 CGF.EmitBlock(CatchBlock);
4725 }
4726
4727 CGF.Builder.CreateStore(CGF.Builder.getInt1(HasFinally), CallTryExitVar);
4728
4729 // Handle catch list. As a special case we check if everything is
4730 // matched and avoid generating code for falling off the end if
4731 // so.
4732 bool AllMatched = false;
4733 for (const ObjCAtCatchStmt *CatchStmt : AtTryStmt->catch_stmts()) {
4734 const VarDecl *CatchParam = CatchStmt->getCatchParamDecl();
4735 const ObjCObjectPointerType *OPT = nullptr;
4736
4737 // catch(...) always matches.
4738 if (!CatchParam) {
4739 AllMatched = true;
4740 } else {
4741 OPT = CatchParam->getType()->getAs<ObjCObjectPointerType>();
4742
4743 // catch(id e) always matches under this ABI, since only
4744 // ObjC exceptions end up here in the first place.
4745 // FIXME: For the time being we also match id<X>; this should
4746 // be rejected by Sema instead.
4747 if (OPT && (OPT->isObjCIdType() || OPT->isObjCQualifiedIdType()))
4748 AllMatched = true;
4749 }
4750
4751 // If this is a catch-all, we don't need to test anything.
4752 if (AllMatched) {
4753 CodeGenFunction::RunCleanupsScope CatchVarCleanups(CGF);
4754
4755 if (CatchParam) {
4756 CGF.EmitAutoVarDecl(*CatchParam);
4757 assert(CGF.HaveInsertPoint() && "DeclStmt destroyed insert point?")(static_cast <bool> (CGF.HaveInsertPoint() && "DeclStmt destroyed insert point?"
) ? void (0) : __assert_fail ("CGF.HaveInsertPoint() && \"DeclStmt destroyed insert point?\""
, "clang/lib/CodeGen/CGObjCMac.cpp", 4757, __extension__ __PRETTY_FUNCTION__
))
;
4758
4759 // These types work out because ConvertType(id) == i8*.
4760 EmitInitOfCatchParam(CGF, Caught, CatchParam);
4761 }
4762
4763 CGF.EmitStmt(CatchStmt->getCatchBody());
4764
4765 // The scope of the catch variable ends right here.
4766 CatchVarCleanups.ForceCleanup();
4767
4768 CGF.EmitBranchThroughCleanup(FinallyEnd);
4769 break;
4770 }
4771
4772 assert(OPT && "Unexpected non-object pointer type in @catch")(static_cast <bool> (OPT && "Unexpected non-object pointer type in @catch"
) ? void (0) : __assert_fail ("OPT && \"Unexpected non-object pointer type in @catch\""
, "clang/lib/CodeGen/CGObjCMac.cpp", 4772, __extension__ __PRETTY_FUNCTION__
))
;
4773 const ObjCObjectType *ObjTy = OPT->getObjectType();
4774
4775 // FIXME: @catch (Class c) ?
4776 ObjCInterfaceDecl *IDecl = ObjTy->getInterface();
4777 assert(IDecl && "Catch parameter must have Objective-C type!")(static_cast <bool> (IDecl && "Catch parameter must have Objective-C type!"
) ? void (0) : __assert_fail ("IDecl && \"Catch parameter must have Objective-C type!\""
, "clang/lib/CodeGen/CGObjCMac.cpp", 4777, __extension__ __PRETTY_FUNCTION__
))
;
4778
4779 // Check if the @catch block matches the exception object.
4780 llvm::Value *Class = EmitClassRef(CGF, IDecl);
4781
4782 llvm::Value *matchArgs[] = { Class, Caught };
4783 llvm::CallInst *Match =
4784 CGF.EmitNounwindRuntimeCall(ObjCTypes.getExceptionMatchFn(),
4785 matchArgs, "match");
4786
4787 llvm::BasicBlock *MatchedBlock = CGF.createBasicBlock("match");
4788 llvm::BasicBlock *NextCatchBlock = CGF.createBasicBlock("catch.next");
4789
4790 CGF.Builder.CreateCondBr(CGF.Builder.CreateIsNotNull(Match, "matched"),
4791 MatchedBlock, NextCatchBlock);
4792
4793 // Emit the @catch block.
4794 CGF.EmitBlock(MatchedBlock);
4795
4796 // Collect any cleanups for the catch variable. The scope lasts until
4797 // the end of the catch body.
4798 CodeGenFunction::RunCleanupsScope CatchVarCleanups(CGF);
4799
4800 CGF.EmitAutoVarDecl(*CatchParam);
4801 assert(CGF.HaveInsertPoint() && "DeclStmt destroyed insert point?")(static_cast <bool> (CGF.HaveInsertPoint() && "DeclStmt destroyed insert point?"
) ? void (0) : __assert_fail ("CGF.HaveInsertPoint() && \"DeclStmt destroyed insert point?\""
, "clang/lib/CodeGen/CGObjCMac.cpp", 4801, __extension__ __PRETTY_FUNCTION__
))
;
4802
4803 // Initialize the catch variable.
4804 llvm::Value *Tmp =
4805 CGF.Builder.CreateBitCast(Caught,
4806 CGF.ConvertType(CatchParam->getType()));
4807 EmitInitOfCatchParam(CGF, Tmp, CatchParam);
4808
4809 CGF.EmitStmt(CatchStmt->getCatchBody());
4810
4811 // We're done with the catch variable.
4812 CatchVarCleanups.ForceCleanup();
4813
4814 CGF.EmitBranchThroughCleanup(FinallyEnd);
4815
4816 CGF.EmitBlock(NextCatchBlock);
4817 }
4818
4819 CGF.ObjCEHValueStack.pop_back();
4820
4821 // If nothing wanted anything to do with the caught exception,
4822 // kill the extract call.
4823 if (Caught->use_empty())
4824 Caught->eraseFromParent();
4825
4826 if (!AllMatched)
4827 CGF.EmitBranchThroughCleanup(FinallyRethrow);
4828
4829 if (HasFinally) {
4830 // Emit the exception handler for the @catch blocks.
4831 CGF.EmitBlock(CatchHandler);
4832
4833 // In theory we might now need a write hazard, but actually it's
4834 // unnecessary because there's no local-accessing code between
4835 // the try's write hazard and here.
4836 //Hazards.emitWriteHazard();
4837
4838 // Extract the new exception and save it to the
4839 // propagating-exception slot.
4840 assert(PropagatingExnVar.isValid())(static_cast <bool> (PropagatingExnVar.isValid()) ? void
(0) : __assert_fail ("PropagatingExnVar.isValid()", "clang/lib/CodeGen/CGObjCMac.cpp"
, 4840, __extension__ __PRETTY_FUNCTION__))
;
4841 llvm::CallInst *NewCaught =
4842 CGF.EmitNounwindRuntimeCall(ObjCTypes.getExceptionExtractFn(),
4843 ExceptionData.getPointer(), "caught");
4844 CGF.Builder.CreateStore(NewCaught, PropagatingExnVar);
4845
4846 // Don't pop the catch handler; the throw already did.
4847 CGF.Builder.CreateStore(CGF.Builder.getFalse(), CallTryExitVar);
4848 CGF.EmitBranchThroughCleanup(FinallyRethrow);
4849 }
4850 }
4851
4852 // Insert read hazards as required in the new blocks.
4853 Hazards.emitHazardsInNewBlocks();
4854
4855 // Pop the cleanup.
4856 CGF.Builder.restoreIP(TryFallthroughIP);
4857 if (CGF.HaveInsertPoint())
4858 CGF.Builder.CreateStore(CGF.Builder.getTrue(), CallTryExitVar);
4859 CGF.PopCleanupBlock();
4860 CGF.EmitBlock(FinallyEnd.getBlock(), true);
4861
4862 // Emit the rethrow block.
4863 CGBuilderTy::InsertPoint SavedIP = CGF.Builder.saveAndClearIP();
4864 CGF.EmitBlock(FinallyRethrow.getBlock(), true);
4865 if (CGF.HaveInsertPoint()) {
4866 // If we have a propagating-exception variable, check it.
4867 llvm::Value *PropagatingExn;
4868 if (PropagatingExnVar.isValid()) {
4869 PropagatingExn = CGF.Builder.CreateLoad(PropagatingExnVar);
4870
4871 // Otherwise, just look in the buffer for the exception to throw.
4872 } else {
4873 llvm::CallInst *Caught =
4874 CGF.EmitNounwindRuntimeCall(ObjCTypes.getExceptionExtractFn(),
4875 ExceptionData.getPointer());
4876 PropagatingExn = Caught;
4877 }
4878
4879 CGF.EmitNounwindRuntimeCall(ObjCTypes.getExceptionThrowFn(),
4880 PropagatingExn);
4881 CGF.Builder.CreateUnreachable();
4882 }
4883
4884 CGF.Builder.restoreIP(SavedIP);
4885}
4886
4887void CGObjCMac::EmitThrowStmt(CodeGen::CodeGenFunction &CGF,
4888 const ObjCAtThrowStmt &S,
4889 bool ClearInsertionPoint) {
4890 llvm::Value *ExceptionAsObject;
4891
4892 if (const Expr *ThrowExpr = S.getThrowExpr()) {
4893 llvm::Value *Exception = CGF.EmitObjCThrowOperand(ThrowExpr);
4894 ExceptionAsObject =
4895 CGF.Builder.CreateBitCast(Exception, ObjCTypes.ObjectPtrTy);
4896 } else {
4897 assert((!CGF.ObjCEHValueStack.empty() && CGF.ObjCEHValueStack.back()) &&(static_cast <bool> ((!CGF.ObjCEHValueStack.empty() &&
CGF.ObjCEHValueStack.back()) && "Unexpected rethrow outside @catch block."
) ? void (0) : __assert_fail ("(!CGF.ObjCEHValueStack.empty() && CGF.ObjCEHValueStack.back()) && \"Unexpected rethrow outside @catch block.\""
, "clang/lib/CodeGen/CGObjCMac.cpp", 4898, __extension__ __PRETTY_FUNCTION__
))
4898 "Unexpected rethrow outside @catch block.")(static_cast <bool> ((!CGF.ObjCEHValueStack.empty() &&
CGF.ObjCEHValueStack.back()) && "Unexpected rethrow outside @catch block."
) ? void (0) : __assert_fail ("(!CGF.ObjCEHValueStack.empty() && CGF.ObjCEHValueStack.back()) && \"Unexpected rethrow outside @catch block.\""
, "clang/lib/CodeGen/CGObjCMac.cpp", 4898, __extension__ __PRETTY_FUNCTION__
))
;
4899 ExceptionAsObject = CGF.ObjCEHValueStack.back();
4900 }
4901
4902 CGF.EmitRuntimeCall(ObjCTypes.getExceptionThrowFn(), ExceptionAsObject)
4903 ->setDoesNotReturn();
4904 CGF.Builder.CreateUnreachable();
4905
4906 // Clear the insertion point to indicate we are in unreachable code.
4907 if (ClearInsertionPoint)
4908 CGF.Builder.ClearInsertionPoint();
4909}
4910
4911/// EmitObjCWeakRead - Code gen for loading value of a __weak
4912/// object: objc_read_weak (id *src)
4913///
4914llvm::Value * CGObjCMac::EmitObjCWeakRead(CodeGen::CodeGenFunction &CGF,
4915 Address AddrWeakObj) {
4916 llvm::Type* DestTy = AddrWeakObj.getElementType();
4917 AddrWeakObj = CGF.Builder.CreateBitCast(AddrWeakObj,
4918 ObjCTypes.PtrObjectPtrTy);
4919 llvm::Value *read_weak =
4920 CGF.EmitNounwindRuntimeCall(ObjCTypes.getGcReadWeakFn(),
4921 AddrWeakObj.getPointer(), "weakread");
4922 read_weak = CGF.Builder.CreateBitCast(read_weak, DestTy);
4923 return read_weak;
4924}
4925
4926/// EmitObjCWeakAssign - Code gen for assigning to a __weak object.
4927/// objc_assign_weak (id src, id *dst)
4928///
4929void CGObjCMac::EmitObjCWeakAssign(CodeGen::CodeGenFunction &CGF,
4930 llvm::Value *src, Address dst) {
4931 llvm::Type * SrcTy = src->getType();
4932 if (!isa<llvm::PointerType>(SrcTy)) {
4933 unsigned Size = CGM.getDataLayout().getTypeAllocSize(SrcTy);
4934 assert(Size <= 8 && "does not support size > 8")(static_cast <bool> (Size <= 8 && "does not support size > 8"
) ? void (0) : __assert_fail ("Size <= 8 && \"does not support size > 8\""
, "clang/lib/CodeGen/CGObjCMac.cpp", 4934, __extension__ __PRETTY_FUNCTION__
))
;
4935 src = (Size == 4) ? CGF.Builder.CreateBitCast(src, CGM.Int32Ty)
4936 : CGF.Builder.CreateBitCast(src, CGM.Int64Ty);
4937 src = CGF.Builder.CreateIntToPtr(src, ObjCTypes.Int8PtrTy);
4938 }
4939 src = CGF.Builder.CreateBitCast(src, ObjCTypes.ObjectPtrTy);
4940 dst = CGF.Builder.CreateBitCast(dst, ObjCTypes.PtrObjectPtrTy);
4941 llvm::Value *args[] = { src, dst.getPointer() };
4942 CGF.EmitNounwindRuntimeCall(ObjCTypes.getGcAssignWeakFn(),
4943 args, "weakassign");
4944}
4945
4946/// EmitObjCGlobalAssign - Code gen for assigning to a __strong object.
4947/// objc_assign_global (id src, id *dst)
4948///
4949void CGObjCMac::EmitObjCGlobalAssign(CodeGen::CodeGenFunction &CGF,
4950 llvm::Value *src, Address dst,
4951 bool threadlocal) {
4952 llvm::Type * SrcTy = src->getType();
4953 if (!isa<llvm::PointerType>(SrcTy)) {
4954 unsigned Size = CGM.getDataLayout().getTypeAllocSize(SrcTy);
4955 assert(Size <= 8 && "does not support size > 8")(static_cast <bool> (Size <= 8 && "does not support size > 8"
) ? void (0) : __assert_fail ("Size <= 8 && \"does not support size > 8\""
, "clang/lib/CodeGen/CGObjCMac.cpp", 4955, __extension__ __PRETTY_FUNCTION__
))
;
4956 src = (Size == 4) ? CGF.Builder.CreateBitCast(src, CGM.Int32Ty)
4957 : CGF.Builder.CreateBitCast(src, CGM.Int64Ty);
4958 src = CGF.Builder.CreateIntToPtr(src, ObjCTypes.Int8PtrTy);
4959 }
4960 src = CGF.Builder.CreateBitCast(src, ObjCTypes.ObjectPtrTy);
4961 dst = CGF.Builder.CreateBitCast(dst, ObjCTypes.PtrObjectPtrTy);
4962 llvm::Value *args[] = { src, dst.getPointer() };
4963 if (!threadlocal)
4964 CGF.EmitNounwindRuntimeCall(ObjCTypes.getGcAssignGlobalFn(),
4965 args, "globalassign");
4966 else
4967 CGF.EmitNounwindRuntimeCall(ObjCTypes.getGcAssignThreadLocalFn(),
4968 args, "threadlocalassign");
4969}
4970
4971/// EmitObjCIvarAssign - Code gen for assigning to a __strong object.
4972/// objc_assign_ivar (id src, id *dst, ptrdiff_t ivaroffset)
4973///
4974void CGObjCMac::EmitObjCIvarAssign(CodeGen::CodeGenFunction &CGF,
4975 llvm::Value *src, Address dst,
4976 llvm::Value *ivarOffset) {
4977 assert(ivarOffset && "EmitObjCIvarAssign - ivarOffset is NULL")(static_cast <bool> (ivarOffset && "EmitObjCIvarAssign - ivarOffset is NULL"
) ? void (0) : __assert_fail ("ivarOffset && \"EmitObjCIvarAssign - ivarOffset is NULL\""
, "clang/lib/CodeGen/CGObjCMac.cpp", 4977, __extension__ __PRETTY_FUNCTION__
))
;
4978 llvm::Type * SrcTy = src->getType();
4979 if (!isa<llvm::PointerType>(SrcTy)) {
4980 unsigned Size = CGM.getDataLayout().getTypeAllocSize(SrcTy);
4981 assert(Size <= 8 && "does not support size > 8")(static_cast <bool> (Size <= 8 && "does not support size > 8"
) ? void (0) : __assert_fail ("Size <= 8 && \"does not support size > 8\""
, "clang/lib/CodeGen/CGObjCMac.cpp", 4981, __extension__ __PRETTY_FUNCTION__
))
;
4982 src = (Size == 4) ? CGF.Builder.CreateBitCast(src, CGM.Int32Ty)
4983 : CGF.Builder.CreateBitCast(src, CGM.Int64Ty);
4984 src = CGF.Builder.CreateIntToPtr(src, ObjCTypes.Int8PtrTy);
4985 }
4986 src = CGF.Builder.CreateBitCast(src, ObjCTypes.ObjectPtrTy);
4987 dst = CGF.Builder.CreateBitCast(dst, ObjCTypes.PtrObjectPtrTy);
4988 llvm::Value *args[] = { src, dst.getPointer(), ivarOffset };
4989 CGF.EmitNounwindRuntimeCall(ObjCTypes.getGcAssignIvarFn(), args);
4990}
4991
4992/// EmitObjCStrongCastAssign - Code gen for assigning to a __strong cast object.
4993/// objc_assign_strongCast (id src, id *dst)
4994///
4995void CGObjCMac::EmitObjCStrongCastAssign(CodeGen::CodeGenFunction &CGF,
4996 llvm::Value *src, Address dst) {
4997 llvm::Type * SrcTy = src->getType();
4998 if (!isa<llvm::PointerType>(SrcTy)) {
4999 unsigned Size = CGM.getDataLayout().getTypeAllocSize(SrcTy);
5000 assert(Size <= 8 && "does not support size > 8")(static_cast <bool> (Size <= 8 && "does not support size > 8"
) ? void (0) : __assert_fail ("Size <= 8 && \"does not support size > 8\""
, "clang/lib/CodeGen/CGObjCMac.cpp", 5000, __extension__ __PRETTY_FUNCTION__
))
;
5001 src = (Size == 4) ? CGF.Builder.CreateBitCast(src, CGM.Int32Ty)
5002 : CGF.Builder.CreateBitCast(src, CGM.Int64Ty);
5003 src = CGF.Builder.CreateIntToPtr(src, ObjCTypes.Int8PtrTy);
5004 }
5005 src = CGF.Builder.CreateBitCast(src, ObjCTypes.ObjectPtrTy);
5006 dst = CGF.Builder.CreateBitCast(dst, ObjCTypes.PtrObjectPtrTy);
5007 llvm::Value *args[] = { src, dst.getPointer() };
5008 CGF.EmitNounwindRuntimeCall(ObjCTypes.getGcAssignStrongCastFn(),
5009 args, "strongassign");
5010}
5011
5012void CGObjCMac::EmitGCMemmoveCollectable(CodeGen::CodeGenFunction &CGF,
5013 Address DestPtr,
5014 Address SrcPtr,
5015 llvm::Value *size) {
5016 SrcPtr = CGF.Builder.CreateBitCast(SrcPtr, ObjCTypes.Int8PtrTy);
5017 DestPtr = CGF.Builder.CreateBitCast(DestPtr, ObjCTypes.Int8PtrTy);
5018 llvm::Value *args[] = { DestPtr.getPointer(), SrcPtr.getPointer(), size };
5019 CGF.EmitNounwindRuntimeCall(ObjCTypes.GcMemmoveCollectableFn(), args);
5020}
5021
5022/// EmitObjCValueForIvar - Code Gen for ivar reference.
5023///
5024LValue CGObjCMac::EmitObjCValueForIvar(CodeGen::CodeGenFunction &CGF,
5025 QualType ObjectTy,
5026 llvm::Value *BaseValue,
5027 const ObjCIvarDecl *Ivar,
5028 unsigned CVRQualifiers) {
5029 const ObjCInterfaceDecl *ID =
5030 ObjectTy->castAs<ObjCObjectType>()->getInterface();
5031 return EmitValueForIvarAtOffset(CGF, ID, BaseValue, Ivar, CVRQualifiers,
5032 EmitIvarOffset(CGF, ID, Ivar));
5033}
5034
5035llvm::Value *CGObjCMac::EmitIvarOffset(CodeGen::CodeGenFunction &CGF,
5036 const ObjCInterfaceDecl *Interface,
5037 const ObjCIvarDecl *Ivar) {
5038 uint64_t Offset = ComputeIvarBaseOffset(CGM, Interface, Ivar);
5039 return llvm::ConstantInt::get(
5040 CGM.getTypes().ConvertType(CGM.getContext().LongTy),
5041 Offset);
5042}
5043
5044/* *** Private Interface *** */
5045
5046std::string CGObjCCommonMac::GetSectionName(StringRef Section,
5047 StringRef MachOAttributes) {
5048 switch (CGM.getTriple().getObjectFormat()) {
5049 case llvm::Triple::UnknownObjectFormat:
5050 llvm_unreachable("unexpected object file format")::llvm::llvm_unreachable_internal("unexpected object file format"
, "clang/lib/CodeGen/CGObjCMac.cpp", 5050)
;
5051 case llvm::Triple::MachO: {
5052 if (MachOAttributes.empty())
5053 return ("__DATA," + Section).str();
5054 return ("__DATA," + Section + "," + MachOAttributes).str();
5055 }
5056 case llvm::Triple::ELF:
5057 assert(Section.substr(0, 2) == "__" &&(static_cast <bool> (Section.substr(0, 2) == "__" &&
"expected the name to begin with __") ? void (0) : __assert_fail
("Section.substr(0, 2) == \"__\" && \"expected the name to begin with __\""
, "clang/lib/CodeGen/CGObjCMac.cpp", 5058, __extension__ __PRETTY_FUNCTION__
))
5058 "expected the name to begin with __")(static_cast <bool> (Section.substr(0, 2) == "__" &&
"expected the name to begin with __") ? void (0) : __assert_fail
("Section.substr(0, 2) == \"__\" && \"expected the name to begin with __\""
, "clang/lib/CodeGen/CGObjCMac.cpp", 5058, __extension__ __PRETTY_FUNCTION__
))
;
5059 return Section.substr(2).str();
5060 case llvm::Triple::COFF:
5061 assert(Section.substr(0, 2) == "__" &&(static_cast <bool> (Section.substr(0, 2) == "__" &&
"expected the name to begin with __") ? void (0) : __assert_fail
("Section.substr(0, 2) == \"__\" && \"expected the name to begin with __\""
, "clang/lib/CodeGen/CGObjCMac.cpp", 5062, __extension__ __PRETTY_FUNCTION__
))
5062 "expected the name to begin with __")(static_cast <bool> (Section.substr(0, 2) == "__" &&
"expected the name to begin with __") ? void (0) : __assert_fail
("Section.substr(0, 2) == \"__\" && \"expected the name to begin with __\""
, "clang/lib/CodeGen/CGObjCMac.cpp", 5062, __extension__ __PRETTY_FUNCTION__
))
;
5063 return ("." + Section.substr(2) + "$B").str();
5064 case llvm::Triple::Wasm:
5065 case llvm::Triple::GOFF:
5066 case llvm::Triple::XCOFF:
5067 llvm::report_fatal_error(
5068 "Objective-C support is unimplemented for object file format");
5069 }
5070
5071 llvm_unreachable("Unhandled llvm::Triple::ObjectFormatType enum")::llvm::llvm_unreachable_internal("Unhandled llvm::Triple::ObjectFormatType enum"
, "clang/lib/CodeGen/CGObjCMac.cpp", 5071)
;
5072}
5073
5074/// EmitImageInfo - Emit the image info marker used to encode some module
5075/// level information.
5076///
5077/// See: <rdr://4810609&4810587&4810587>
5078/// struct IMAGE_INFO {
5079/// unsigned version;
5080/// unsigned flags;
5081/// };
5082enum ImageInfoFlags {
5083 eImageInfo_FixAndContinue = (1 << 0), // This flag is no longer set by clang.
5084 eImageInfo_GarbageCollected = (1 << 1),
5085 eImageInfo_GCOnly = (1 << 2),
5086 eImageInfo_OptimizedByDyld = (1 << 3), // This flag is set by the dyld shared cache.
5087
5088 // A flag indicating that the module has no instances of a @synthesize of a
5089 // superclass variable. <rdar://problem/6803242>
5090 eImageInfo_CorrectedSynthesize = (1 << 4), // This flag is no longer set by clang.
5091 eImageInfo_ImageIsSimulated = (1 << 5),
5092 eImageInfo_ClassProperties = (1 << 6)
5093};
5094
5095void CGObjCCommonMac::EmitImageInfo() {
5096 unsigned version = 0; // Version is unused?
5097 std::string Section =
5098 (ObjCABI == 1)
5099 ? "__OBJC,__image_info,regular"
5100 : GetSectionName("__objc_imageinfo", "regular,no_dead_strip");
5101
5102 // Generate module-level named metadata to convey this information to the
5103 // linker and code-gen.
5104 llvm::Module &Mod = CGM.getModule();
5105
5106 // Add the ObjC ABI version to the module flags.
5107 Mod.addModuleFlag(llvm::Module::Error, "Objective-C Version", ObjCABI);
5108 Mod.addModuleFlag(llvm::Module::Error, "Objective-C Image Info Version",
5109 version);
5110 Mod.addModuleFlag(llvm::Module::Error, "Objective-C Image Info Section",
5111 llvm::MDString::get(VMContext, Section));
5112
5113 auto Int8Ty = llvm::Type::getInt8Ty(VMContext);
5114 if (CGM.getLangOpts().getGC() == LangOptions::NonGC) {
5115 // Non-GC overrides those files which specify GC.
5116 Mod.addModuleFlag(llvm::Module::Error,
5117 "Objective-C Garbage Collection",
5118 llvm::ConstantInt::get(Int8Ty,0));
5119 } else {
5120 // Add the ObjC garbage collection value.
5121 Mod.addModuleFlag(llvm::Module::Error,
5122 "Objective-C Garbage Collection",
5123 llvm::ConstantInt::get(Int8Ty,
5124 (uint8_t)eImageInfo_GarbageCollected));
5125
5126 if (CGM.getLangOpts().getGC() == LangOptions::GCOnly) {
5127 // Add the ObjC GC Only value.
5128 Mod.addModuleFlag(llvm::Module::Error, "Objective-C GC Only",
5129 eImageInfo_GCOnly);
5130
5131 // Require that GC be specified and set to eImageInfo_GarbageCollected.
5132 llvm::Metadata *Ops[2] = {
5133 llvm::MDString::get(VMContext, "Objective-C Garbage Collection"),
5134 llvm::ConstantAsMetadata::get(llvm::ConstantInt::get(
5135 Int8Ty, eImageInfo_GarbageCollected))};
5136 Mod.addModuleFlag(llvm::Module::Require, "Objective-C GC Only",
5137 llvm::MDNode::get(VMContext, Ops));
5138 }
5139 }
5140
5141 // Indicate whether we're compiling this to run on a simulator.
5142 if (CGM.getTarget().getTriple().isSimulatorEnvironment())
5143 Mod.addModuleFlag(llvm::Module::Error, "Objective-C Is Simulated",
5144 eImageInfo_ImageIsSimulated);
5145
5146 // Indicate whether we are generating class properties.
5147 Mod.addModuleFlag(llvm::Module::Error, "Objective-C Class Properties",
5148 eImageInfo_ClassProperties);
5149}
5150
5151// struct objc_module {
5152// unsigned long version;
5153// unsigned long size;
5154// const char *name;
5155// Symtab symtab;
5156// };
5157
5158// FIXME: Get from somewhere
5159static const int ModuleVersion = 7;
5160
5161void CGObjCMac::EmitModuleInfo() {
5162 uint64_t Size = CGM.getDataLayout().getTypeAllocSize(ObjCTypes.ModuleTy);
5163
5164 ConstantInitBuilder builder(CGM);
5165 auto values = builder.beginStruct(ObjCTypes.ModuleTy);
5166 values.addInt(ObjCTypes.LongTy, ModuleVersion);
5167 values.addInt(ObjCTypes.LongTy, Size);
5168 // This used to be the filename, now it is unused. <rdr://4327263>
5169 values.add(GetClassName(StringRef("")));
5170 values.add(EmitModuleSymbols());
5171 CreateMetadataVar("OBJC_MODULES", values,
5172 "__OBJC,__module_info,regular,no_dead_strip",
5173 CGM.getPointerAlign(), true);
5174}
5175
5176llvm::Constant *CGObjCMac::EmitModuleSymbols() {
5177 unsigned NumClasses = DefinedClasses.size();
5178 unsigned NumCategories = DefinedCategories.size();
5179
5180 // Return null if no symbols were defined.
5181 if (!NumClasses && !NumCategories)
5182 return llvm::Constant::getNullValue(ObjCTypes.SymtabPtrTy);
5183
5184 ConstantInitBuilder builder(CGM);
5185 auto values = builder.beginStruct();
5186 values.addInt(ObjCTypes.LongTy, 0);
5187 values.addNullPointer(ObjCTypes.SelectorPtrTy);
5188 values.addInt(ObjCTypes.ShortTy, NumClasses);
5189 values.addInt(ObjCTypes.ShortTy, NumCategories);
5190
5191 // The runtime expects exactly the list of defined classes followed
5192 // by the list of defined categories, in a single array.
5193 auto array = values.beginArray(ObjCTypes.Int8PtrTy);
5194 for (unsigned i=0; i<NumClasses; i++) {
5195 const ObjCInterfaceDecl *ID = ImplementedClasses[i];
5196 assert(ID)(static_cast <bool> (ID) ? void (0) : __assert_fail ("ID"
, "clang/lib/CodeGen/CGObjCMac.cpp", 5196, __extension__ __PRETTY_FUNCTION__
))
;
5197 if (ObjCImplementationDecl *IMP = ID->getImplementation())
5198 // We are implementing a weak imported interface. Give it external linkage
5199 if (ID->isWeakImported() && !IMP->isWeakImported())
5200 DefinedClasses[i]->setLinkage(llvm::GlobalVariable::ExternalLinkage);
5201
5202 array.addBitCast(DefinedClasses[i], ObjCTypes.Int8PtrTy);
5203 }
5204 for (unsigned i=0; i<NumCategories; i++)
5205 array.addBitCast(DefinedCategories[i], ObjCTypes.Int8PtrTy);
5206
5207 array.finishAndAddTo(values);
5208
5209 llvm::GlobalVariable *GV = CreateMetadataVar(
5210 "OBJC_SYMBOLS", values, "__OBJC,__symbols,regular,no_dead_strip",
5211 CGM.getPointerAlign(), true);
5212 return llvm::ConstantExpr::getBitCast(GV, ObjCTypes.SymtabPtrTy);
5213}
5214
5215llvm::Value *CGObjCMac::EmitClassRefFromId(CodeGenFunction &CGF,
5216 IdentifierInfo *II) {
5217 LazySymbols.insert(II);
5218
5219 llvm::GlobalVariable *&Entry = ClassReferences[II];
5220
5221 if (!Entry) {
5222 llvm::Constant *Casted =
5223 llvm::ConstantExpr::getBitCast(GetClassName(II->getName()),
5224 ObjCTypes.ClassPtrTy);
5225 Entry = CreateMetadataVar(
5226 "OBJC_CLASS_REFERENCES_", Casted,
5227 "__OBJC,__cls_refs,literal_pointers,no_dead_strip",
5228 CGM.getPointerAlign(), true);
5229 }
5230
5231 return CGF.Builder.CreateAlignedLoad(Entry->getValueType(), Entry,
5232 CGF.getPointerAlign());
5233}
5234
5235llvm::Value *CGObjCMac::EmitClassRef(CodeGenFunction &CGF,
5236 const ObjCInterfaceDecl *ID) {
5237 // If the class has the objc_runtime_visible attribute, we need to
5238 // use the Objective-C runtime to get the class.
5239 if (ID->hasAttr<ObjCRuntimeVisibleAttr>())
5240 return EmitClassRefViaRuntime(CGF, ID, ObjCTypes);
5241
5242 IdentifierInfo *RuntimeName =
5243 &CGM.getContext().Idents.get(ID->getObjCRuntimeNameAsString());
5244 return EmitClassRefFromId(CGF, RuntimeName);
5245}
5246
5247llvm::Value *CGObjCMac::EmitNSAutoreleasePoolClassRef(CodeGenFunction &CGF) {
5248 IdentifierInfo *II = &CGM.getContext().Idents.get("NSAutoreleasePool");
5249 return EmitClassRefFromId(CGF, II);
5250}
5251
5252llvm::Value *CGObjCMac::EmitSelector(CodeGenFunction &CGF, Selector Sel) {
5253 return CGF.Builder.CreateLoad(EmitSelectorAddr(Sel));
5254}
5255
5256Address CGObjCMac::EmitSelectorAddr(Selector Sel) {
5257 CharUnits Align = CGM.getPointerAlign();
5258
5259 llvm::GlobalVariable *&Entry = SelectorReferences[Sel];
5260 if (!Entry) {
5261 llvm::Constant *Casted =
5262 llvm::ConstantExpr::getBitCast(GetMethodVarName(Sel),
5263 ObjCTypes.SelectorPtrTy);
5264 Entry = CreateMetadataVar(
5265 "OBJC_SELECTOR_REFERENCES_", Casted,
5266 "__OBJC,__message_refs,literal_pointers,no_dead_strip", Align, true);
5267 Entry->setExternallyInitialized(true);
5268 }
5269
5270 return Address(Entry, Align);
5271}
5272
5273llvm::Constant *CGObjCCommonMac::GetClassName(StringRef RuntimeName) {
5274 llvm::GlobalVariable *&Entry = ClassNames[RuntimeName];
5275 if (!Entry)
5276 Entry = CreateCStringLiteral(RuntimeName, ObjCLabelType::ClassName);
5277 return getConstantGEP(VMContext, Entry, 0, 0);
5278}
5279
5280llvm::Function *CGObjCCommonMac::GetMethodDefinition(const ObjCMethodDecl *MD) {
5281 llvm::DenseMap<const ObjCMethodDecl*, llvm::Function*>::iterator
5282 I = MethodDefinitions.find(MD);
5283 if (I != MethodDefinitions.end())
5284 return I->second;
5285
5286 return nullptr;
5287}
5288
5289/// GetIvarLayoutName - Returns a unique constant for the given
5290/// ivar layout bitmap.
5291llvm::Constant *CGObjCCommonMac::GetIvarLayoutName(IdentifierInfo *Ident,
5292 const ObjCCommonTypesHelper &ObjCTypes) {
5293 return llvm::Constant::getNullValue(ObjCTypes.Int8PtrTy);
5294}
5295
5296void IvarLayoutBuilder::visitRecord(const RecordType *RT,
5297 CharUnits offset) {
5298 const RecordDecl *RD = RT->getDecl();
5299
5300 // If this is a union, remember that we had one, because it might mess
5301 // up the ordering of layout entries.
5302 if (RD->isUnion())
5303 IsDisordered = true;
5304
5305 const ASTRecordLayout *recLayout = nullptr;
5306 visitAggregate(RD->field_begin(), RD->field_end(), offset,
5307 [&](const FieldDecl *field) -> CharUnits {
5308 if (!recLayout)
5309 recLayout = &CGM.getContext().getASTRecordLayout(RD);
5310 auto offsetInBits = recLayout->getFieldOffset(field->getFieldIndex());
5311 return CGM.getContext().toCharUnitsFromBits(offsetInBits);
5312 });
5313}
5314
5315template <class Iterator, class GetOffsetFn>
5316void IvarLayoutBuilder::visitAggregate(Iterator begin, Iterator end,
5317 CharUnits aggregateOffset,
5318 const GetOffsetFn &getOffset) {
5319 for (; begin != end; ++begin) {
5320 auto field = *begin;
5321
5322 // Skip over bitfields.
5323 if (field->isBitField()) {
5324 continue;
5325 }
5326
5327 // Compute the offset of the field within the aggregate.
5328 CharUnits fieldOffset = aggregateOffset + getOffset(field);
5329
5330 visitField(field, fieldOffset);
5331 }
5332}
5333
5334/// Collect layout information for the given fields into IvarsInfo.
5335void IvarLayoutBuilder::visitField(const FieldDecl *field,
5336 CharUnits fieldOffset) {
5337 QualType fieldType = field->getType();
5338
5339 // Drill down into arrays.
5340 uint64_t numElts = 1;
5341 if (auto arrayType = CGM.getContext().getAsIncompleteArrayType(fieldType)) {
5342 numElts = 0;
5343 fieldType = arrayType->getElementType();
5344 }
5345 // Unlike incomplete arrays, constant arrays can be nested.
5346 while (auto arrayType = CGM.getContext().getAsConstantArrayType(fieldType)) {
5347 numElts *= arrayType->getSize().getZExtValue();
5348 fieldType = arrayType->getElementType();
5349 }
5350
5351 assert(!fieldType->isArrayType() && "ivar of non-constant array type?")(static_cast <bool> (!fieldType->isArrayType() &&
"ivar of non-constant array type?") ? void (0) : __assert_fail
("!fieldType->isArrayType() && \"ivar of non-constant array type?\""
, "clang/lib/CodeGen/CGObjCMac.cpp", 5351, __extension__ __PRETTY_FUNCTION__
))
;
5352
5353 // If we ended up with a zero-sized array, we've done what we can do within
5354 // the limits of this layout encoding.
5355 if (numElts == 0) return;
5356
5357 // Recurse if the base element type is a record type.
5358 if (auto recType = fieldType->getAs<RecordType>()) {
5359 size_t oldEnd = IvarsInfo.size();
5360
5361 visitRecord(recType, fieldOffset);
5362
5363 // If we have an array, replicate the first entry's layout information.
5364 auto numEltEntries = IvarsInfo.size() - oldEnd;
5365 if (numElts != 1 && numEltEntries != 0) {
5366 CharUnits eltSize = CGM.getContext().getTypeSizeInChars(recType);
5367 for (uint64_t eltIndex = 1; eltIndex != numElts; ++eltIndex) {
5368 // Copy the last numEltEntries onto the end of the array, adjusting
5369 // each for the element size.
5370 for (size_t i = 0; i != numEltEntries; ++i) {
5371 auto firstEntry = IvarsInfo[oldEnd + i];
5372 IvarsInfo.push_back(IvarInfo(firstEntry.Offset + eltIndex * eltSize,
5373 firstEntry.SizeInWords));
5374 }
5375 }
5376 }
5377
5378 return;
5379 }
5380
5381 // Classify the element type.
5382 Qualifiers::GC GCAttr = GetGCAttrTypeForType(CGM.getContext(), fieldType);
5383
5384 // If it matches what we're looking for, add an entry.
5385 if ((ForStrongLayout && GCAttr == Qualifiers::Strong)
5386 || (!ForStrongLayout && GCAttr == Qualifiers::Weak)) {
5387 assert(CGM.getContext().getTypeSizeInChars(fieldType)(static_cast <bool> (CGM.getContext().getTypeSizeInChars
(fieldType) == CGM.getPointerSize()) ? void (0) : __assert_fail
("CGM.getContext().getTypeSizeInChars(fieldType) == CGM.getPointerSize()"
, "clang/lib/CodeGen/CGObjCMac.cpp", 5388, __extension__ __PRETTY_FUNCTION__
))
5388 == CGM.getPointerSize())(static_cast <bool> (CGM.getContext().getTypeSizeInChars
(fieldType) == CGM.getPointerSize()) ? void (0) : __assert_fail
("CGM.getContext().getTypeSizeInChars(fieldType) == CGM.getPointerSize()"
, "clang/lib/CodeGen/CGObjCMac.cpp", 5388, __extension__ __PRETTY_FUNCTION__
))
;
5389 IvarsInfo.push_back(IvarInfo(fieldOffset, numElts));
5390 }
5391}
5392
5393/// buildBitmap - This routine does the horsework of taking the offsets of
5394/// strong/weak references and creating a bitmap. The bitmap is also
5395/// returned in the given buffer, suitable for being passed to \c dump().
5396llvm::Constant *IvarLayoutBuilder::buildBitmap(CGObjCCommonMac &CGObjC,
5397 llvm::SmallVectorImpl<unsigned char> &buffer) {
5398 // The bitmap is a series of skip/scan instructions, aligned to word
5399 // boundaries. The skip is performed first.
5400 const unsigned char MaxNibble = 0xF;
5401 const unsigned char SkipMask = 0xF0, SkipShift = 4;
5402 const unsigned char ScanMask = 0x0F, ScanShift = 0;
5403
5404 assert(!IvarsInfo.empty() && "generating bitmap for no data")(static_cast <bool> (!IvarsInfo.empty() && "generating bitmap for no data"
) ? void (0) : __assert_fail ("!IvarsInfo.empty() && \"generating bitmap for no data\""
, "clang/lib/CodeGen/CGObjCMac.cpp", 5404, __extension__ __PRETTY_FUNCTION__
))
;
5405
5406 // Sort the ivar info on byte position in case we encounterred a
5407 // union nested in the ivar list.
5408 if (IsDisordered) {
5409 // This isn't a stable sort, but our algorithm should handle it fine.
5410 llvm::array_pod_sort(IvarsInfo.begin(), IvarsInfo.end());
5411 } else {
5412 assert(llvm::is_sorted(IvarsInfo))(static_cast <bool> (llvm::is_sorted(IvarsInfo)) ? void
(0) : __assert_fail ("llvm::is_sorted(IvarsInfo)", "clang/lib/CodeGen/CGObjCMac.cpp"
, 5412, __extension__ __PRETTY_FUNCTION__))
;
5413 }
5414 assert(IvarsInfo.back().Offset < InstanceEnd)(static_cast <bool> (IvarsInfo.back().Offset < InstanceEnd
) ? void (0) : __assert_fail ("IvarsInfo.back().Offset < InstanceEnd"
, "clang/lib/CodeGen/CGObjCMac.cpp", 5414, __extension__ __PRETTY_FUNCTION__
))
;
5415
5416 assert(buffer.empty())(static_cast <bool> (buffer.empty()) ? void (0) : __assert_fail
("buffer.empty()", "clang/lib/CodeGen/CGObjCMac.cpp", 5416, __extension__
__PRETTY_FUNCTION__))
;
5417
5418 // Skip the next N words.
5419 auto skip = [&](unsigned numWords) {
5420 assert(numWords > 0)(static_cast <bool> (numWords > 0) ? void (0) : __assert_fail
("numWords > 0", "clang/lib/CodeGen/CGObjCMac.cpp", 5420,
__extension__ __PRETTY_FUNCTION__))
;
5421
5422 // Try to merge into the previous byte. Since scans happen second, we
5423 // can't do this if it includes a scan.
5424 if (!buffer.empty() && !(buffer.back() & ScanMask)) {
5425 unsigned lastSkip = buffer.back() >> SkipShift;
5426 if (lastSkip < MaxNibble) {
5427 unsigned claimed = std::min(MaxNibble - lastSkip, numWords);
5428 numWords -= claimed;
5429 lastSkip += claimed;
5430 buffer.back() = (lastSkip << SkipShift);
5431 }
5432 }
5433
5434 while (numWords >= MaxNibble) {
5435 buffer.push_back(MaxNibble << SkipShift);
5436 numWords -= MaxNibble;
5437 }
5438 if (numWords) {
5439 buffer.push_back(numWords << SkipShift);
5440 }
5441 };
5442
5443 // Scan the next N words.
5444 auto scan = [&](unsigned numWords) {
5445 assert(numWords > 0)(static_cast <bool> (numWords > 0) ? void (0) : __assert_fail
("numWords > 0", "clang/lib/CodeGen/CGObjCMac.cpp", 5445,
__extension__ __PRETTY_FUNCTION__))
;
5446
5447 // Try to merge into the previous byte. Since scans happen second, we can
5448 // do this even if it includes a skip.
5449 if (!buffer.empty()) {
5450 unsigned lastScan = (buffer.back() & ScanMask) >> ScanShift;
5451 if (lastScan < MaxNibble) {
5452 unsigned claimed = std::min(MaxNibble - lastScan, numWords);
5453 numWords -= claimed;
5454 lastScan += claimed;
5455 buffer.back() = (buffer.back() & SkipMask) | (lastScan << ScanShift);
5456 }
5457 }
5458
5459 while (numWords >= MaxNibble) {
5460 buffer.push_back(MaxNibble << ScanShift);
5461 numWords -= MaxNibble;
5462 }
5463 if (numWords) {
5464 buffer.push_back(numWords << ScanShift);
5465 }
5466 };
5467
5468 // One past the end of the last scan.
5469 unsigned endOfLastScanInWords = 0;
5470 const CharUnits WordSize = CGM.getPointerSize();
5471
5472 // Consider all the scan requests.
5473 for (auto &request : IvarsInfo) {
5474 CharUnits beginOfScan = request.Offset - InstanceBegin;
5475
5476 // Ignore scan requests that don't start at an even multiple of the
5477 // word size. We can't encode them.
5478 if ((beginOfScan % WordSize) != 0) continue;
5479
5480 // Ignore scan requests that start before the instance start.
5481 // This assumes that scans never span that boundary. The boundary
5482 // isn't the true start of the ivars, because in the fragile-ARC case
5483 // it's rounded up to word alignment, but the test above should leave
5484 // us ignoring that possibility.
5485 if (beginOfScan.isNegative()) {
5486 assert(request.Offset + request.SizeInWords * WordSize <= InstanceBegin)(static_cast <bool> (request.Offset + request.SizeInWords
* WordSize <= InstanceBegin) ? void (0) : __assert_fail (
"request.Offset + request.SizeInWords * WordSize <= InstanceBegin"
, "clang/lib/CodeGen/CGObjCMac.cpp", 5486, __extension__ __PRETTY_FUNCTION__
))
;
5487 continue;
5488 }
5489
5490 unsigned beginOfScanInWords = beginOfScan / WordSize;
5491 unsigned endOfScanInWords = beginOfScanInWords + request.SizeInWords;
5492
5493 // If the scan starts some number of words after the last one ended,
5494 // skip forward.
5495 if (beginOfScanInWords > endOfLastScanInWords) {
5496 skip(beginOfScanInWords - endOfLastScanInWords);
5497
5498 // Otherwise, start scanning where the last left off.
5499 } else {
5500 beginOfScanInWords = endOfLastScanInWords;
5501
5502 // If that leaves us with nothing to scan, ignore this request.
5503 if (beginOfScanInWords >= endOfScanInWords) continue;
5504 }
5505
5506 // Scan to the end of the request.
5507 assert(beginOfScanInWords < endOfScanInWords)(static_cast <bool> (beginOfScanInWords < endOfScanInWords
) ? void (0) : __assert_fail ("beginOfScanInWords < endOfScanInWords"
, "clang/lib/CodeGen/CGObjCMac.cpp", 5507, __extension__ __PRETTY_FUNCTION__
))
;
5508 scan(endOfScanInWords - beginOfScanInWords);
5509 endOfLastScanInWords = endOfScanInWords;
5510 }
5511
5512 if (buffer.empty())
5513 return llvm::ConstantPointerNull::get(CGM.Int8PtrTy);
5514
5515 // For GC layouts, emit a skip to the end of the allocation so that we
5516 // have precise information about the entire thing. This isn't useful
5517 // or necessary for the ARC-style layout strings.
5518 if (CGM.getLangOpts().getGC() != LangOptions::NonGC) {
5519 unsigned lastOffsetInWords =
5520 (InstanceEnd - InstanceBegin + WordSize - CharUnits::One()) / WordSize;
5521 if (lastOffsetInWords > endOfLastScanInWords) {
5522 skip(lastOffsetInWords - endOfLastScanInWords);
5523 }
5524 }
5525
5526 // Null terminate the string.
5527 buffer.push_back(0);
5528
5529 auto *Entry = CGObjC.CreateCStringLiteral(
5530 reinterpret_cast<char *>(buffer.data()), ObjCLabelType::ClassName);
5531 return getConstantGEP(CGM.getLLVMContext(), Entry, 0, 0);
5532}
5533
5534/// BuildIvarLayout - Builds ivar layout bitmap for the class
5535/// implementation for the __strong or __weak case.
5536/// The layout map displays which words in ivar list must be skipped
5537/// and which must be scanned by GC (see below). String is built of bytes.
5538/// Each byte is divided up in two nibbles (4-bit each). Left nibble is count
5539/// of words to skip and right nibble is count of words to scan. So, each
5540/// nibble represents up to 15 workds to skip or scan. Skipping the rest is
5541/// represented by a 0x00 byte which also ends the string.
5542/// 1. when ForStrongLayout is true, following ivars are scanned:
5543/// - id, Class
5544/// - object *
5545/// - __strong anything
5546///
5547/// 2. When ForStrongLayout is false, following ivars are scanned:
5548/// - __weak anything
5549///
5550llvm::Constant *
5551CGObjCCommonMac::BuildIvarLayout(const ObjCImplementationDecl *OMD,
5552 CharUnits beginOffset, CharUnits endOffset,
5553 bool ForStrongLayout, bool HasMRCWeakIvars) {
5554 // If this is MRC, and we're either building a strong layout or there
5555 // are no weak ivars, bail out early.
5556 llvm::Type *PtrTy = CGM.Int8PtrTy;
5557 if (CGM.getLangOpts().getGC() == LangOptions::NonGC &&
5558 !CGM.getLangOpts().ObjCAutoRefCount &&
5559 (ForStrongLayout || !HasMRCWeakIvars))
5560 return llvm::Constant::getNullValue(PtrTy);
5561
5562 const ObjCInterfaceDecl *OI = OMD->getClassInterface();
5563 SmallVector<const ObjCIvarDecl*, 32> ivars;
5564
5565 // GC layout strings include the complete object layout, possibly
5566 // inaccurately in the non-fragile ABI; the runtime knows how to fix this
5567 // up.
5568 //
5569 // ARC layout strings only include the class's ivars. In non-fragile
5570 // runtimes, that means starting at InstanceStart, rounded up to word
5571 // alignment. In fragile runtimes, there's no InstanceStart, so it means
5572 // starting at the offset of the first ivar, rounded up to word alignment.
5573 //
5574 // MRC weak layout strings follow the ARC style.
5575 CharUnits baseOffset;
5576 if (CGM.getLangOpts().getGC() == LangOptions::NonGC) {
5577 for (const ObjCIvarDecl *IVD = OI->all_declared_ivar_begin();
5578 IVD; IVD = IVD->getNextIvar())
5579 ivars.push_back(IVD);
5580
5581 if (isNonFragileABI()) {
5582 baseOffset = beginOffset; // InstanceStart
5583 } else if (!ivars.empty()) {
5584 baseOffset =
5585 CharUnits::fromQuantity(ComputeIvarBaseOffset(CGM, OMD, ivars[0]));
5586 } else {
5587 baseOffset = CharUnits::Zero();
5588 }
5589
5590 baseOffset = baseOffset.alignTo(CGM.getPointerAlign());
5591 }
5592 else {
5593 CGM.getContext().DeepCollectObjCIvars(OI, true, ivars);
5594
5595 baseOffset = CharUnits::Zero();
5596 }
5597
5598 if (ivars.empty())
5599 return llvm::Constant::getNullValue(PtrTy);
5600
5601 IvarLayoutBuilder builder(CGM, baseOffset, endOffset, ForStrongLayout);
5602
5603 builder.visitAggregate(ivars.begin(), ivars.end(), CharUnits::Zero(),
5604 [&](const ObjCIvarDecl *ivar) -> CharUnits {
5605 return CharUnits::fromQuantity(ComputeIvarBaseOffset(CGM, OMD, ivar));
5606 });
5607
5608 if (!builder.hasBitmapData())
5609 return llvm::Constant::getNullValue(PtrTy);
5610
5611 llvm::SmallVector<unsigned char, 4> buffer;
5612 llvm::Constant *C = builder.buildBitmap(*this, buffer);
5613
5614 if (CGM.getLangOpts().ObjCGCBitmapPrint && !buffer.empty()) {
5615 printf("\n%s ivar layout for class '%s': ",
5616 ForStrongLayout ? "strong" : "weak",
5617 OMD->getClassInterface()->getName().str().c_str());
5618 builder.dump(buffer);
5619 }
5620 return C;
5621}
5622
5623llvm::Constant *CGObjCCommonMac::GetMethodVarName(Selector Sel) {
5624 llvm::GlobalVariable *&Entry = MethodVarNames[Sel];
5625 // FIXME: Avoid std::string in "Sel.getAsString()"
5626 if (!Entry)
5627 Entry = CreateCStringLiteral(Sel.getAsString(), ObjCLabelType::MethodVarName);
5628 return getConstantGEP(VMContext, Entry, 0, 0);
5629}
5630
5631// FIXME: Merge into a single cstring creation function.
5632llvm::Constant *CGObjCCommonMac::GetMethodVarName(IdentifierInfo *ID) {
5633 return GetMethodVarName(CGM.getContext().Selectors.getNullarySelector(ID));
5634}
5635
5636llvm::Constant *CGObjCCommonMac::GetMethodVarType(const FieldDecl *Field) {
5637 std::string TypeStr;
5638 CGM.getContext().getObjCEncodingForType(Field->getType(), TypeStr, Field);
5639
5640 llvm::GlobalVariable *&Entry = MethodVarTypes[TypeStr];
5641 if (!Entry)
5642 Entry = CreateCStringLiteral(TypeStr, ObjCLabelType::MethodVarType);
5643 return getConstantGEP(VMContext, Entry, 0, 0);
5644}
5645
5646llvm::Constant *CGObjCCommonMac::GetMethodVarType(const ObjCMethodDecl *D,
5647 bool Extended) {
5648 std::string TypeStr =
5649 CGM.getContext().getObjCEncodingForMethodDecl(D, Extended);
5650
5651 llvm::GlobalVariable *&Entry = MethodVarTypes[TypeStr];
5652 if (!Entry)
5653 Entry = CreateCStringLiteral(TypeStr, ObjCLabelType::MethodVarType);
5654 return getConstantGEP(VMContext, Entry, 0, 0);
5655}
5656
5657// FIXME: Merge into a single cstring creation function.
5658llvm::Constant *CGObjCCommonMac::GetPropertyName(IdentifierInfo *Ident) {
5659 llvm::GlobalVariable *&Entry = PropertyNames[Ident];
5660 if (!Entry)
5661 Entry = CreateCStringLiteral(Ident->getName(), ObjCLabelType::PropertyName);
5662 return getConstantGEP(VMContext, Entry, 0, 0);
5663}
5664
5665// FIXME: Merge into a single cstring creation function.
5666// FIXME: This Decl should be more precise.
5667llvm::Constant *
5668CGObjCCommonMac::GetPropertyTypeString(const ObjCPropertyDecl *PD,
5669 const Decl *Container) {
5670 std::string TypeStr =
5671 CGM.getContext().getObjCEncodingForPropertyDecl(PD, Container);
5672 return GetPropertyName(&CGM.getContext().Idents.get(TypeStr));
5673}
5674
5675void CGObjCMac::FinishModule() {
5676 EmitModuleInfo();
5677
5678 // Emit the dummy bodies for any protocols which were referenced but
5679 // never defined.
5680 for (auto &entry : Protocols) {
5681 llvm::GlobalVariable *global = entry.second;
5682 if (global->hasInitializer())
5683 continue;
5684
5685 ConstantInitBuilder builder(CGM);
5686 auto values = builder.beginStruct(ObjCTypes.ProtocolTy);
5687 values.addNullPointer(ObjCTypes.ProtocolExtensionPtrTy);
5688 values.add(GetClassName(entry.first->getName()));
5689 values.addNullPointer(ObjCTypes.ProtocolListPtrTy);
5690 values.addNullPointer(ObjCTypes.MethodDescriptionListPtrTy);
5691 values.addNullPointer(ObjCTypes.MethodDescriptionListPtrTy);
5692 values.finishAndSetAsInitializer(global);
5693 CGM.addCompilerUsedGlobal(global);
5694 }
5695
5696 // Add assembler directives to add lazy undefined symbol references
5697 // for classes which are referenced but not defined. This is
5698 // important for correct linker interaction.
5699 //
5700 // FIXME: It would be nice if we had an LLVM construct for this.
5701 if ((!LazySymbols.empty() || !DefinedSymbols.empty()) &&
5702 CGM.getTriple().isOSBinFormatMachO()) {
5703 SmallString<256> Asm;
5704 Asm += CGM.getModule().getModuleInlineAsm();
5705 if (!Asm.empty() && Asm.back() != '\n')
5706 Asm += '\n';
5707
5708 llvm::raw_svector_ostream OS(Asm);
5709 for (const auto *Sym : DefinedSymbols)
5710 OS << "\t.objc_class_name_" << Sym->getName() << "=0\n"
5711 << "\t.globl .objc_class_name_" << Sym->getName() << "\n";
5712 for (const auto *Sym : LazySymbols)
5713 OS << "\t.lazy_reference .objc_class_name_" << Sym->getName() << "\n";
5714 for (const auto &Category : DefinedCategoryNames)
5715 OS << "\t.objc_category_name_" << Category << "=0\n"
5716 << "\t.globl .objc_category_name_" << Category << "\n";
5717
5718 CGM.getModule().setModuleInlineAsm(OS.str());
5719 }
5720}
5721
5722CGObjCNonFragileABIMac::CGObjCNonFragileABIMac(CodeGen::CodeGenModule &cgm)
5723 : CGObjCCommonMac(cgm), ObjCTypes(cgm), ObjCEmptyCacheVar(nullptr),
5724 ObjCEmptyVtableVar(nullptr) {
5725 ObjCABI = 2;
5726}
5727
5728/* *** */
5729
5730ObjCCommonTypesHelper::ObjCCommonTypesHelper(CodeGen::CodeGenModule &cgm)
5731 : VMContext(cgm.getLLVMContext()), CGM(cgm), ExternalProtocolPtrTy(nullptr)
5732{
5733 CodeGen::CodeGenTypes &Types = CGM.getTypes();
5734 ASTContext &Ctx = CGM.getContext();
5735
5736 ShortTy = cast<llvm::IntegerType>(Types.ConvertType(Ctx.ShortTy));
5737 IntTy = CGM.IntTy;
5738 LongTy = cast<llvm::IntegerType>(Types.ConvertType(Ctx.LongTy));
5739 Int8PtrTy = CGM.Int8PtrTy;
5740 Int8PtrPtrTy = CGM.Int8PtrPtrTy;
5741
5742 // arm64 targets use "int" ivar offset variables. All others,
5743 // including OS X x86_64 and Windows x86_64, use "long" ivar offsets.
5744 if (CGM.getTarget().getTriple().getArch() == llvm::Triple::aarch64)
5745 IvarOffsetVarTy = IntTy;
5746 else
5747 IvarOffsetVarTy = LongTy;
5748
5749 ObjectPtrTy =
5750 cast<llvm::PointerType>(Types.ConvertType(Ctx.getObjCIdType()));
5751 PtrObjectPtrTy =
5752 llvm::PointerType::getUnqual(ObjectPtrTy);
5753 SelectorPtrTy =
5754 cast<llvm::PointerType>(Types.ConvertType(Ctx.getObjCSelType()));
5755
5756 // I'm not sure I like this. The implicit coordination is a bit
5757 // gross. We should solve this in a reasonable fashion because this
5758 // is a pretty common task (match some runtime data structure with
5759 // an LLVM data structure).
5760
5761 // FIXME: This is leaked.
5762 // FIXME: Merge with rewriter code?
5763
5764 // struct _objc_super {
5765 // id self;
5766 // Class cls;
5767 // }
5768 RecordDecl *RD = RecordDecl::Create(Ctx, TTK_Struct,
5769 Ctx.getTranslationUnitDecl(),
5770 SourceLocation(), SourceLocation(),
5771 &Ctx.Idents.get("_objc_super"));
5772 RD->addDecl(FieldDecl::Create(Ctx, RD, SourceLocation(), SourceLocation(),
5773 nullptr, Ctx.getObjCIdType(), nullptr, nullptr,
5774 false, ICIS_NoInit));
5775 RD->addDecl(FieldDecl::Create(Ctx, RD, SourceLocation(), SourceLocation(),
5776 nullptr, Ctx.getObjCClassType(), nullptr,
5777 nullptr, false, ICIS_NoInit));
5778 RD->completeDefinition();
5779
5780 SuperCTy = Ctx.getTagDeclType(RD);
5781 SuperPtrCTy = Ctx.getPointerType(SuperCTy);
5782
5783 SuperTy = cast<llvm::StructType>(Types.ConvertType(SuperCTy));
5784 SuperPtrTy = llvm::PointerType::getUnqual(SuperTy);
5785
5786 // struct _prop_t {
5787 // char *name;
5788 // char *attributes;
5789 // }
5790 PropertyTy = llvm::StructType::create("struct._prop_t", Int8PtrTy, Int8PtrTy);
5791
5792 // struct _prop_list_t {
5793 // uint32_t entsize; // sizeof(struct _prop_t)
5794 // uint32_t count_of_properties;
5795 // struct _prop_t prop_list[count_of_properties];
5796 // }
5797 PropertyListTy = llvm::StructType::create(
5798 "struct._prop_list_t", IntTy, IntTy, llvm::ArrayType::get(PropertyTy, 0));
5799 // struct _prop_list_t *
5800 PropertyListPtrTy = llvm::PointerType::getUnqual(PropertyListTy);
5801
5802 // struct _objc_method {
5803 // SEL _cmd;
5804 // char *method_type;
5805 // char *_imp;
5806 // }
5807 MethodTy = llvm::StructType::create("struct._objc_method", SelectorPtrTy,
5808 Int8PtrTy, Int8PtrTy);
5809
5810 // struct _objc_cache *
5811 CacheTy = llvm::StructType::create(VMContext, "struct._objc_cache");
5812 CachePtrTy = llvm::PointerType::getUnqual(CacheTy);
5813}
5814
5815ObjCTypesHelper::ObjCTypesHelper(CodeGen::CodeGenModule &cgm)
5816 : ObjCCommonTypesHelper(cgm) {
5817 // struct _objc_method_description {
5818 // SEL name;
5819 // char *types;
5820 // }
5821 MethodDescriptionTy = llvm::StructType::create(
5822 "struct._objc_method_description", SelectorPtrTy, Int8PtrTy);
5823
5824 // struct _objc_method_description_list {
5825 // int count;
5826 // struct _objc_method_description[1];
5827 // }
5828 MethodDescriptionListTy =
5829 llvm::StructType::create("struct._objc_method_description_list", IntTy,
5830 llvm::ArrayType::get(MethodDescriptionTy, 0));
5831
5832 // struct _objc_method_description_list *
5833 MethodDescriptionListPtrTy =
5834 llvm::PointerType::getUnqual(MethodDescriptionListTy);
5835
5836 // Protocol description structures
5837
5838 // struct _objc_protocol_extension {
5839 // uint32_t size; // sizeof(struct _objc_protocol_extension)
5840 // struct _objc_method_description_list *optional_instance_methods;
5841 // struct _objc_method_description_list *optional_class_methods;
5842 // struct _objc_property_list *instance_properties;
5843 // const char ** extendedMethodTypes;
5844 // struct _objc_property_list *class_properties;
5845 // }
5846 ProtocolExtensionTy = llvm::StructType::create(
5847 "struct._objc_protocol_extension", IntTy, MethodDescriptionListPtrTy,
5848 MethodDescriptionListPtrTy, PropertyListPtrTy, Int8PtrPtrTy,
5849 PropertyListPtrTy);
5850
5851 // struct _objc_protocol_extension *
5852 ProtocolExtensionPtrTy = llvm::PointerType::getUnqual(ProtocolExtensionTy);
5853
5854 // Handle recursive construction of Protocol and ProtocolList types
5855
5856 ProtocolTy =
5857 llvm::StructType::create(VMContext, "struct._objc_protocol");
5858
5859 ProtocolListTy =
5860 llvm::StructType::create(VMContext, "struct._objc_protocol_list");
5861 ProtocolListTy->setBody(llvm::PointerType::getUnqual(ProtocolListTy), LongTy,
5862 llvm::ArrayType::get(ProtocolTy, 0));
5863
5864 // struct _objc_protocol {
5865 // struct _objc_protocol_extension *isa;
5866 // char *protocol_name;
5867 // struct _objc_protocol **_objc_protocol_list;
5868 // struct _objc_method_description_list *instance_methods;
5869 // struct _objc_method_description_list *class_methods;
5870 // }
5871 ProtocolTy->setBody(ProtocolExtensionPtrTy, Int8PtrTy,
5872 llvm::PointerType::getUnqual(ProtocolListTy),
5873 MethodDescriptionListPtrTy, MethodDescriptionListPtrTy);
5874
5875 // struct _objc_protocol_list *
5876 ProtocolListPtrTy = llvm::PointerType::getUnqual(ProtocolListTy);
5877
5878 ProtocolPtrTy = llvm::PointerType::getUnqual(ProtocolTy);
5879
5880 // Class description structures
5881
5882 // struct _objc_ivar {
5883 // char *ivar_name;
5884 // char *ivar_type;
5885 // int ivar_offset;
5886 // }
5887 IvarTy = llvm::StructType::create("struct._objc_ivar", Int8PtrTy, Int8PtrTy,
5888 IntTy);
5889
5890 // struct _objc_ivar_list *
5891 IvarListTy =
5892 llvm::StructType::create(VMContext, "struct._objc_ivar_list");
5893 IvarListPtrTy = llvm::PointerType::getUnqual(IvarListTy);
5894
5895 // struct _objc_method_list *
5896 MethodListTy =
5897 llvm::StructType::create(VMContext, "struct._objc_method_list");
5898 MethodListPtrTy = llvm::PointerType::getUnqual(MethodListTy);
5899
5900 // struct _objc_class_extension *
5901 ClassExtensionTy = llvm::StructType::create(
5902 "struct._objc_class_extension", IntTy, Int8PtrTy, PropertyListPtrTy);
5903 ClassExtensionPtrTy = llvm::PointerType::getUnqual(ClassExtensionTy);
5904
5905 ClassTy = llvm::StructType::create(VMContext, "struct._objc_class");
5906
5907 // struct _objc_class {
5908 // Class isa;
5909 // Class super_class;
5910 // char *name;
5911 // long version;
5912 // long info;
5913 // long instance_size;
5914 // struct _objc_ivar_list *ivars;
5915 // struct _objc_method_list *methods;
5916 // struct _objc_cache *cache;
5917 // struct _objc_protocol_list *protocols;
5918 // char *ivar_layout;
5919 // struct _objc_class_ext *ext;
5920 // };
5921 ClassTy->setBody(llvm::PointerType::getUnqual(ClassTy),
5922 llvm::PointerType::getUnqual(ClassTy), Int8PtrTy, LongTy,
5923 LongTy, LongTy, IvarListPtrTy, MethodListPtrTy, CachePtrTy,
5924 ProtocolListPtrTy, Int8PtrTy, ClassExtensionPtrTy);
5925
5926 ClassPtrTy = llvm::PointerType::getUnqual(ClassTy);
5927
5928 // struct _objc_category {
5929 // char *category_name;
5930 // char *class_name;
5931 // struct _objc_method_list *instance_method;
5932 // struct _objc_method_list *class_method;
5933 // struct _objc_protocol_list *protocols;
5934 // uint32_t size; // sizeof(struct _objc_category)
5935 // struct _objc_property_list *instance_properties;// category's @property
5936 // struct _objc_property_list *class_properties;
5937 // }
5938 CategoryTy = llvm::StructType::create(
5939 "struct._objc_category", Int8PtrTy, Int8PtrTy, MethodListPtrTy,
5940 MethodListPtrTy, ProtocolListPtrTy, IntTy, PropertyListPtrTy,
5941 PropertyListPtrTy);
5942
5943 // Global metadata structures
5944
5945 // struct _objc_symtab {
5946 // long sel_ref_cnt;
5947 // SEL *refs;
5948 // short cls_def_cnt;
5949 // short cat_def_cnt;
5950 // char *defs[cls_def_cnt + cat_def_cnt];
5951 // }
5952 SymtabTy = llvm::StructType::create("struct._objc_symtab", LongTy,
5953 SelectorPtrTy, ShortTy, ShortTy,
5954 llvm::ArrayType::get(Int8PtrTy, 0));
5955 SymtabPtrTy = llvm::PointerType::getUnqual(SymtabTy);
5956
5957 // struct _objc_module {
5958 // long version;
5959 // long size; // sizeof(struct _objc_module)
5960 // char *name;
5961 // struct _objc_symtab* symtab;
5962 // }
5963 ModuleTy = llvm::StructType::create("struct._objc_module", LongTy, LongTy,
5964 Int8PtrTy, SymtabPtrTy);
5965
5966 // FIXME: This is the size of the setjmp buffer and should be target
5967 // specific. 18 is what's used on 32-bit X86.
5968 uint64_t SetJmpBufferSize = 18;
5969
5970 // Exceptions
5971 llvm::Type *StackPtrTy = llvm::ArrayType::get(CGM.Int8PtrTy, 4);
5972
5973 ExceptionDataTy = llvm::StructType::create(
5974 "struct._objc_exception_data",
5975 llvm::ArrayType::get(CGM.Int32Ty, SetJmpBufferSize), StackPtrTy);
5976}
5977
5978ObjCNonFragileABITypesHelper::ObjCNonFragileABITypesHelper(CodeGen::CodeGenModule &cgm)
5979 : ObjCCommonTypesHelper(cgm) {
5980 // struct _method_list_t {
5981 // uint32_t entsize; // sizeof(struct _objc_method)
5982 // uint32_t method_count;
5983 // struct _objc_method method_list[method_count];
5984 // }
5985 MethodListnfABITy =
5986 llvm::StructType::create("struct.__method_list_t", IntTy, IntTy,
5987 llvm::ArrayType::get(MethodTy, 0));
5988 // struct method_list_t *
5989 MethodListnfABIPtrTy = llvm::PointerType::getUnqual(MethodListnfABITy);
5990
5991 // struct _protocol_t {
5992 // id isa; // NULL
5993 // const char * const protocol_name;
5994 // const struct _protocol_list_t * protocol_list; // super protocols
5995 // const struct method_list_t * const instance_methods;
5996 // const struct method_list_t * const class_methods;
5997 // const struct method_list_t *optionalInstanceMethods;
5998 // const struct method_list_t *optionalClassMethods;
5999 // const struct _prop_list_t * properties;
6000 // const uint32_t size; // sizeof(struct _protocol_t)
6001 // const uint32_t flags; // = 0
6002 // const char ** extendedMethodTypes;
6003 // const char *demangledName;
6004 // const struct _prop_list_t * class_properties;
6005 // }
6006
6007 // Holder for struct _protocol_list_t *
6008 ProtocolListnfABITy =
6009 llvm::StructType::create(VMContext, "struct._objc_protocol_list");
6010
6011 ProtocolnfABITy = llvm::StructType::create(
6012 "struct._protocol_t", ObjectPtrTy, Int8PtrTy,
6013 llvm::PointerType::getUnqual(ProtocolListnfABITy), MethodListnfABIPtrTy,
6014 MethodListnfABIPtrTy, MethodListnfABIPtrTy, MethodListnfABIPtrTy,
6015 PropertyListPtrTy, IntTy, IntTy, Int8PtrPtrTy, Int8PtrTy,
6016 PropertyListPtrTy);
6017
6018 // struct _protocol_t*
6019 ProtocolnfABIPtrTy = llvm::PointerType::getUnqual(ProtocolnfABITy);
6020
6021 // struct _protocol_list_t {
6022 // long protocol_count; // Note, this is 32/64 bit
6023 // struct _protocol_t *[protocol_count];
6024 // }
6025 ProtocolListnfABITy->setBody(LongTy,
6026 llvm::ArrayType::get(ProtocolnfABIPtrTy, 0));
6027
6028 // struct _objc_protocol_list*
6029 ProtocolListnfABIPtrTy = llvm::PointerType::getUnqual(ProtocolListnfABITy);
6030
6031 // struct _ivar_t {
6032 // unsigned [long] int *offset; // pointer to ivar offset location
6033 // char *name;
6034 // char *type;
6035 // uint32_t alignment;
6036 // uint32_t size;
6037 // }
6038 IvarnfABITy = llvm::StructType::create(
6039 "struct._ivar_t", llvm::PointerType::getUnqual(IvarOffsetVarTy),
6040 Int8PtrTy, Int8PtrTy, IntTy, IntTy);
6041
6042 // struct _ivar_list_t {
6043 // uint32 entsize; // sizeof(struct _ivar_t)
6044 // uint32 count;
6045 // struct _iver_t list[count];
6046 // }
6047 IvarListnfABITy =
6048 llvm::StructType::create("struct._ivar_list_t", IntTy, IntTy,
6049 llvm::ArrayType::get(IvarnfABITy, 0));
6050
6051 IvarListnfABIPtrTy = llvm::PointerType::getUnqual(IvarListnfABITy);
6052
6053 // struct _class_ro_t {
6054 // uint32_t const flags;
6055 // uint32_t const instanceStart;
6056 // uint32_t const instanceSize;
6057 // uint32_t const reserved; // only when building for 64bit targets
6058 // const uint8_t * const ivarLayout;
6059 // const char *const name;
6060 // const struct _method_list_t * const baseMethods;
6061 // const struct _objc_protocol_list *const baseProtocols;
6062 // const struct _ivar_list_t *const ivars;
6063 // const uint8_t * const weakIvarLayout;
6064 // const struct _prop_list_t * const properties;
6065 // }
6066
6067 // FIXME. Add 'reserved' field in 64bit abi mode!
6068 ClassRonfABITy = llvm::StructType::create(
6069 "struct._class_ro_t", IntTy, IntTy, IntTy, Int8PtrTy, Int8PtrTy,
6070 MethodListnfABIPtrTy, ProtocolListnfABIPtrTy, IvarListnfABIPtrTy,
6071 Int8PtrTy, PropertyListPtrTy);
6072
6073 // ImpnfABITy - LLVM for id (*)(id, SEL, ...)
6074 llvm::Type *params[] = { ObjectPtrTy, SelectorPtrTy };
6075 ImpnfABITy = llvm::FunctionType::get(ObjectPtrTy, params, false)
6076 ->getPointerTo();
6077
6078 // struct _class_t {
6079 // struct _class_t *isa;
6080 // struct _class_t * const superclass;
6081 // void *cache;
6082 // IMP *vtable;
6083 // struct class_ro_t *ro;
6084 // }
6085
6086 ClassnfABITy = llvm::StructType::create(VMContext, "struct._class_t");
6087 ClassnfABITy->setBody(llvm::PointerType::getUnqual(ClassnfABITy),
6088 llvm::PointerType::getUnqual(ClassnfABITy), CachePtrTy,
6089 llvm::PointerType::getUnqual(ImpnfABITy),
6090 llvm::PointerType::getUnqual(ClassRonfABITy));
6091
6092 // LLVM for struct _class_t *
6093 ClassnfABIPtrTy = llvm::PointerType::getUnqual(ClassnfABITy);
6094
6095 // struct _category_t {
6096 // const char * const name;
6097 // struct _class_t *const cls;
6098 // const struct _method_list_t * const instance_methods;
6099 // const struct _method_list_t * const class_methods;
6100 // const struct _protocol_list_t * const protocols;
6101 // const struct _prop_list_t * const properties;
6102 // const struct _prop_list_t * const class_properties;
6103 // const uint32_t size;
6104 // }
6105 CategorynfABITy = llvm::StructType::create(
6106 "struct._category_t", Int8PtrTy, ClassnfABIPtrTy, MethodListnfABIPtrTy,
6107 MethodListnfABIPtrTy, ProtocolListnfABIPtrTy, PropertyListPtrTy,
6108 PropertyListPtrTy, IntTy);
6109
6110 // New types for nonfragile abi messaging.
6111 CodeGen::CodeGenTypes &Types = CGM.getTypes();
6112 ASTContext &Ctx = CGM.getContext();
6113
6114 // MessageRefTy - LLVM for:
6115 // struct _message_ref_t {
6116 // IMP messenger;
6117 // SEL name;
6118 // };
6119
6120 // First the clang type for struct _message_ref_t
6121 RecordDecl *RD = RecordDecl::Create(Ctx, TTK_Struct,
6122 Ctx.getTranslationUnitDecl(),
6123 SourceLocation(), SourceLocation(),
6124 &Ctx.Idents.get("_message_ref_t"));
6125 RD->addDecl(FieldDecl::Create(Ctx, RD, SourceLocation(), SourceLocation(),
6126 nullptr, Ctx.VoidPtrTy, nullptr, nullptr, false,
6127 ICIS_NoInit));
6128 RD->addDecl(FieldDecl::Create(Ctx, RD, SourceLocation(), SourceLocation(),
6129 nullptr, Ctx.getObjCSelType(), nullptr, nullptr,
6130 false, ICIS_NoInit));
6131 RD->completeDefinition();
6132
6133 MessageRefCTy = Ctx.getTagDeclType(RD);
6134 MessageRefCPtrTy = Ctx.getPointerType(MessageRefCTy);
6135 MessageRefTy = cast<llvm::StructType>(Types.ConvertType(MessageRefCTy));
6136
6137 // MessageRefPtrTy - LLVM for struct _message_ref_t*
6138 MessageRefPtrTy = llvm::PointerType::getUnqual(MessageRefTy);
6139
6140 // SuperMessageRefTy - LLVM for:
6141 // struct _super_message_ref_t {
6142 // SUPER_IMP messenger;
6143 // SEL name;
6144 // };
6145 SuperMessageRefTy = llvm::StructType::create("struct._super_message_ref_t",
6146 ImpnfABITy, SelectorPtrTy);
6147
6148 // SuperMessageRefPtrTy - LLVM for struct _super_message_ref_t*
6149 SuperMessageRefPtrTy = llvm::PointerType::getUnqual(SuperMessageRefTy);
6150
6151
6152 // struct objc_typeinfo {
6153 // const void** vtable; // objc_ehtype_vtable + 2
6154 // const char* name; // c++ typeinfo string
6155 // Class cls;
6156 // };
6157 EHTypeTy = llvm::StructType::create("struct._objc_typeinfo",
6158 llvm::PointerType::getUnqual(Int8PtrTy),
6159 Int8PtrTy, ClassnfABIPtrTy);
6160 EHTypePtrTy = llvm::PointerType::getUnqual(EHTypeTy);
6161}
6162
6163llvm::Function *CGObjCNonFragileABIMac::ModuleInitFunction() {
6164 FinishNonFragileABIModule();
6165
6166 return nullptr;
6167}
6168
6169void CGObjCNonFragileABIMac::AddModuleClassList(
6170 ArrayRef<llvm::GlobalValue *> Container, StringRef SymbolName,
6171 StringRef SectionName) {
6172 unsigned NumClasses = Container.size();
6173
6174 if (!NumClasses)
6175 return;
6176
6177 SmallVector<llvm::Constant*, 8> Symbols(NumClasses);
6178 for (unsigned i=0; i<NumClasses; i++)
6179 Symbols[i] = llvm::ConstantExpr::getBitCast(Container[i],
6180 ObjCTypes.Int8PtrTy);
6181 llvm::Constant *Init =
6182 llvm::ConstantArray::get(llvm::ArrayType::get(ObjCTypes.Int8PtrTy,
6183 Symbols.size()),
6184 Symbols);
6185
6186 // Section name is obtained by calling GetSectionName, which returns
6187 // sections in the __DATA segment on MachO.
6188 assert((!CGM.getTriple().isOSBinFormatMachO() ||(static_cast <bool> ((!CGM.getTriple().isOSBinFormatMachO
() || SectionName.startswith("__DATA")) && "SectionName expected to start with __DATA on MachO"
) ? void (0) : __assert_fail ("(!CGM.getTriple().isOSBinFormatMachO() || SectionName.startswith(\"__DATA\")) && \"SectionName expected to start with __DATA on MachO\""
, "clang/lib/CodeGen/CGObjCMac.cpp", 6190, __extension__ __PRETTY_FUNCTION__
))
6189 SectionName.startswith("__DATA")) &&(static_cast <bool> ((!CGM.getTriple().isOSBinFormatMachO
() || SectionName.startswith("__DATA")) && "SectionName expected to start with __DATA on MachO"
) ? void (0) : __assert_fail ("(!CGM.getTriple().isOSBinFormatMachO() || SectionName.startswith(\"__DATA\")) && \"SectionName expected to start with __DATA on MachO\""
, "clang/lib/CodeGen/CGObjCMac.cpp", 6190, __extension__ __PRETTY_FUNCTION__
))
6190 "SectionName expected to start with __DATA on MachO")(static_cast <bool> ((!CGM.getTriple().isOSBinFormatMachO
() || SectionName.startswith("__DATA")) && "SectionName expected to start with __DATA on MachO"
) ? void (0) : __assert_fail ("(!CGM.getTriple().isOSBinFormatMachO() || SectionName.startswith(\"__DATA\")) && \"SectionName expected to start with __DATA on MachO\""
, "clang/lib/CodeGen/CGObjCMac.cpp", 6190, __extension__ __PRETTY_FUNCTION__
))
;
6191 llvm::GlobalVariable *GV = new llvm::GlobalVariable(
6192 CGM.getModule(), Init->getType(), false,
6193 llvm::GlobalValue::PrivateLinkage, Init, SymbolName);
6194 GV->setAlignment(
6195 llvm::Align(CGM.getDataLayout().getABITypeAlignment(Init->getType())));
6196 GV->setSection(SectionName);
6197 CGM.addCompilerUsedGlobal(GV);
6198}
6199
6200void CGObjCNonFragileABIMac::FinishNonFragileABIModule() {
6201 // nonfragile abi has no module definition.
6202
6203 // Build list of all implemented class addresses in array
6204 // L_OBJC_LABEL_CLASS_$.
6205
6206 for (unsigned i=0, NumClasses=ImplementedClasses.size(); i<NumClasses; i++) {
6207 const ObjCInterfaceDecl *ID = ImplementedClasses[i];
6208 assert(ID)(static_cast <bool> (ID) ? void (0) : __assert_fail ("ID"
, "clang/lib/CodeGen/CGObjCMac.cpp", 6208, __extension__ __PRETTY_FUNCTION__
))
;
6209 if (ObjCImplementationDecl *IMP = ID->getImplementation())
6210 // We are implementing a weak imported interface. Give it external linkage
6211 if (ID->isWeakImported() && !IMP->isWeakImported()) {
6212 DefinedClasses[i]->setLinkage(llvm::GlobalVariable::ExternalLinkage);
6213 DefinedMetaClasses[i]->setLinkage(llvm::GlobalVariable::ExternalLinkage);
6214 }
6215 }
6216
6217 AddModuleClassList(DefinedClasses, "OBJC_LABEL_CLASS_$",
6218 GetSectionName("__objc_classlist",
6219 "regular,no_dead_strip"));
6220
6221 AddModuleClassList(DefinedNonLazyClasses, "OBJC_LABEL_NONLAZY_CLASS_$",
6222 GetSectionName("__objc_nlclslist",
6223 "regular,no_dead_strip"));
6224
6225 // Build list of all implemented category addresses in array
6226 // L_OBJC_LABEL_CATEGORY_$.
6227 AddModuleClassList(DefinedCategories, "OBJC_LABEL_CATEGORY_$",
6228 GetSectionName("__objc_catlist",
6229 "regular,no_dead_strip"));
6230 AddModuleClassList(DefinedStubCategories, "OBJC_LABEL_STUB_CATEGORY_$",
6231 GetSectionName("__objc_catlist2",
6232 "regular,no_dead_strip"));
6233 AddModuleClassList(DefinedNonLazyCategories, "OBJC_LABEL_NONLAZY_CATEGORY_$",
6234 GetSectionName("__objc_nlcatlist",
6235 "regular,no_dead_strip"));
6236
6237 EmitImageInfo();
6238}
6239
6240/// isVTableDispatchedSelector - Returns true if SEL is not in the list of
6241/// VTableDispatchMethods; false otherwise. What this means is that
6242/// except for the 19 selectors in the list, we generate 32bit-style
6243/// message dispatch call for all the rest.
6244bool CGObjCNonFragileABIMac::isVTableDispatchedSelector(Selector Sel) {
6245 // At various points we've experimented with using vtable-based
6246 // dispatch for all methods.
6247 switch (CGM.getCodeGenOpts().getObjCDispatchMethod()) {
6248 case CodeGenOptions::Legacy:
6249 return false;
6250 case CodeGenOptions::NonLegacy:
6251 return true;
6252 case CodeGenOptions::Mixed:
6253 break;
6254 }
6255
6256 // If so, see whether this selector is in the white-list of things which must
6257 // use the new dispatch convention. We lazily build a dense set for this.
6258 if (VTableDispatchMethods.empty()) {
6259 VTableDispatchMethods.insert(GetNullarySelector("alloc"));
6260 VTableDispatchMethods.insert(GetNullarySelector("class"));
6261 VTableDispatchMethods.insert(GetNullarySelector("self"));
6262 VTableDispatchMethods.insert(GetNullarySelector("isFlipped"));
6263 VTableDispatchMethods.insert(GetNullarySelector("length"));
6264 VTableDispatchMethods.insert(GetNullarySelector("count"));
6265
6266 // These are vtable-based if GC is disabled.
6267 // Optimistically use vtable dispatch for hybrid compiles.
6268 if (CGM.getLangOpts().getGC() != LangOptions::GCOnly) {
6269 VTableDispatchMethods.insert(GetNullarySelector("retain"));
6270 VTableDispatchMethods.insert(GetNullarySelector("release"));
6271 VTableDispatchMethods.insert(GetNullarySelector("autorelease"));
6272 }
6273
6274 VTableDispatchMethods.insert(GetUnarySelector("allocWithZone"));
6275 VTableDispatchMethods.insert(GetUnarySelector("isKindOfClass"));
6276 VTableDispatchMethods.insert(GetUnarySelector("respondsToSelector"));
6277 VTableDispatchMethods.insert(GetUnarySelector("objectForKey"));
6278 VTableDispatchMethods.insert(GetUnarySelector("objectAtIndex"));
6279 VTableDispatchMethods.insert(GetUnarySelector("isEqualToString"));
6280 VTableDispatchMethods.insert(GetUnarySelector("isEqual"));
6281
6282 // These are vtable-based if GC is enabled.
6283 // Optimistically use vtable dispatch for hybrid compiles.
6284 if (CGM.getLangOpts().getGC() != LangOptions::NonGC) {
6285 VTableDispatchMethods.insert(GetNullarySelector("hash"));
6286 VTableDispatchMethods.insert(GetUnarySelector("addObject"));
6287
6288 // "countByEnumeratingWithState:objects:count"
6289 IdentifierInfo *KeyIdents[] = {
6290 &CGM.getContext().Idents.get("countByEnumeratingWithState"),
6291 &CGM.getContext().Idents.get("objects"),
6292 &CGM.getContext().Idents.get("count")
6293 };
6294 VTableDispatchMethods.insert(
6295 CGM.getContext().Selectors.getSelector(3, KeyIdents));
6296 }
6297 }
6298
6299 return VTableDispatchMethods.count(Sel);
6300}
6301
6302/// BuildClassRoTInitializer - generate meta-data for:
6303/// struct _class_ro_t {
6304/// uint32_t const flags;
6305/// uint32_t const instanceStart;
6306/// uint32_t const instanceSize;
6307/// uint32_t const reserved; // only when building for 64bit targets
6308/// const uint8_t * const ivarLayout;
6309/// const char *const name;
6310/// const struct _method_list_t * const baseMethods;
6311/// const struct _protocol_list_t *const baseProtocols;
6312/// const struct _ivar_list_t *const ivars;
6313/// const uint8_t * const weakIvarLayout;
6314/// const struct _prop_list_t * const properties;
6315/// }
6316///
6317llvm::GlobalVariable * CGObjCNonFragileABIMac::BuildClassRoTInitializer(
6318 unsigned flags,
6319 unsigned InstanceStart,
6320 unsigned InstanceSize,
6321 const ObjCImplementationDecl *ID) {
6322 std::string ClassName = std::string(ID->getObjCRuntimeNameAsString());
6323
6324 CharUnits beginInstance = CharUnits::fromQuantity(InstanceStart);
6325 CharUnits endInstance = CharUnits::fromQuantity(InstanceSize);
6326
6327 bool hasMRCWeak = false;
6328 if (CGM.getLangOpts().ObjCAutoRefCount)
6329 flags |= NonFragileABI_Class_CompiledByARC;
6330 else if ((hasMRCWeak = hasMRCWeakIvars(CGM, ID)))
6331 flags |= NonFragileABI_Class_HasMRCWeakIvars;
6332
6333 ConstantInitBuilder builder(CGM);
6334 auto values = builder.beginStruct(ObjCTypes.ClassRonfABITy);
6335
6336 values.addInt(ObjCTypes.IntTy, flags);
6337 values.addInt(ObjCTypes.IntTy, InstanceStart);
6338 values.addInt(ObjCTypes.IntTy, InstanceSize);
6339 values.add((flags & NonFragileABI_Class_Meta)
6340 ? GetIvarLayoutName(nullptr, ObjCTypes)
6341 : BuildStrongIvarLayout(ID, beginInstance, endInstance));
6342 values.add(GetClassName(ID->getObjCRuntimeNameAsString()));
6343
6344 // const struct _method_list_t * const baseMethods;
6345 SmallVector<const ObjCMethodDecl*, 16> methods;
6346 if (flags & NonFragileABI_Class_Meta) {
6347 for (const auto *MD : ID->class_methods())
6348 if (!MD->isDirectMethod())
6349 methods.push_back(MD);
6350 } else {
6351 for (const auto *MD : ID->instance_methods())
6352 if (!MD->isDirectMethod())
6353 methods.push_back(MD);
6354 }
6355
6356 values.add(emitMethodList(ID->getObjCRuntimeNameAsString(),
6357 (flags & NonFragileABI_Class_Meta)
6358 ? MethodListType::ClassMethods
6359 : MethodListType::InstanceMethods,
6360 methods));
6361
6362 const ObjCInterfaceDecl *OID = ID->getClassInterface();
6363 assert(OID && "CGObjCNonFragileABIMac::BuildClassRoTInitializer")(static_cast <bool> (OID && "CGObjCNonFragileABIMac::BuildClassRoTInitializer"
) ? void (0) : __assert_fail ("OID && \"CGObjCNonFragileABIMac::BuildClassRoTInitializer\""
, "clang/lib/CodeGen/CGObjCMac.cpp", 6363, __extension__ __PRETTY_FUNCTION__
))
;
6364 values.add(EmitProtocolList("_OBJC_CLASS_PROTOCOLS_$_"
6365 + OID->getObjCRuntimeNameAsString(),
6366 OID->all_referenced_protocol_begin(),
6367 OID->all_referenced_protocol_end()));
6368
6369 if (flags & NonFragileABI_Class_Meta) {
6370 values.addNullPointer(ObjCTypes.IvarListnfABIPtrTy);
6371 values.add(GetIvarLayoutName(nullptr, ObjCTypes));
6372 values.add(EmitPropertyList(
6373 "_OBJC_$_CLASS_PROP_LIST_" + ID->getObjCRuntimeNameAsString(),
6374 ID, ID->getClassInterface(), ObjCTypes, true));
6375 } else {
6376 values.add(EmitIvarList(ID));
6377 values.add(BuildWeakIvarLayout(ID, beginInstance, endInstance, hasMRCWeak));
6378 values.add(EmitPropertyList(
6379 "_OBJC_$_PROP_LIST_" + ID->getObjCRuntimeNameAsString(),
6380 ID, ID->getClassInterface(), ObjCTypes, false));
6381 }
6382
6383 llvm::SmallString<64> roLabel;
6384 llvm::raw_svector_ostream(roLabel)
6385 << ((flags & NonFragileABI_Class_Meta) ? "_OBJC_METACLASS_RO_$_"
6386 : "_OBJC_CLASS_RO_$_")
6387 << ClassName;
6388
6389 return finishAndCreateGlobal(values, roLabel, CGM);
6390}
6391
6392/// Build the metaclass object for a class.
6393///
6394/// struct _class_t {
6395/// struct _class_t *isa;
6396/// struct _class_t * const superclass;
6397/// void *cache;
6398/// IMP *vtable;
6399/// struct class_ro_t *ro;
6400/// }
6401///
6402llvm::GlobalVariable *
6403CGObjCNonFragileABIMac::BuildClassObject(const ObjCInterfaceDecl *CI,
6404 bool isMetaclass,
6405 llvm::Constant *IsAGV,
6406 llvm::Constant *SuperClassGV,
6407 llvm::Constant *ClassRoGV,
6408 bool HiddenVisibility) {
6409 ConstantInitBuilder builder(CGM);
6410 auto values = builder.beginStruct(ObjCTypes.ClassnfABITy);
6411 values.add(IsAGV);
6412 if (SuperClassGV) {
6413 values.add(SuperClassGV);
6414 } else {
6415 values.addNullPointer(ObjCTypes.ClassnfABIPtrTy);
6416 }
6417 values.add(ObjCEmptyCacheVar);
6418 values.add(ObjCEmptyVtableVar);
6419 values.add(ClassRoGV);
6420
6421 llvm::GlobalVariable *GV =
6422 cast<llvm::GlobalVariable>(GetClassGlobal(CI, isMetaclass, ForDefinition));
6423 values.finishAndSetAsInitializer(GV);
6424
6425 if (CGM.getTriple().isOSBinFormatMachO())
6426 GV->setSection("__DATA, __objc_data");
6427 GV->setAlignment(llvm::Align(
6428 CGM.getDataLayout().getABITypeAlignment(ObjCTypes.ClassnfABITy)));
6429 if (!CGM.getTriple().isOSBinFormatCOFF())
6430 if (HiddenVisibility)
6431 GV->setVisibility(llvm::GlobalValue::HiddenVisibility);
6432 return GV;
6433}
6434
6435bool CGObjCNonFragileABIMac::ImplementationIsNonLazy(
6436 const ObjCImplDecl *OD) const {
6437 return OD->getClassMethod(GetNullarySelector("load")) != nullptr ||
6438 OD->getClassInterface()->hasAttr<ObjCNonLazyClassAttr>() ||
6439 OD->hasAttr<ObjCNonLazyClassAttr>();
6440}
6441
6442void CGObjCNonFragileABIMac::GetClassSizeInfo(const ObjCImplementationDecl *OID,
6443 uint32_t &InstanceStart,
6444 uint32_t &InstanceSize) {
6445 const ASTRecordLayout &RL =
6446 CGM.getContext().getASTObjCImplementationLayout(OID);
6447
6448 // InstanceSize is really instance end.
6449 InstanceSize = RL.getDataSize().getQuantity();
6450
6451 // If there are no fields, the start is the same as the end.
6452 if (!RL.getFieldCount())
6453 InstanceStart = InstanceSize;
6454 else
6455 InstanceStart = RL.getFieldOffset(0) / CGM.getContext().getCharWidth();
6456}
6457
6458static llvm::GlobalValue::DLLStorageClassTypes getStorage(CodeGenModule &CGM,
6459 StringRef Name) {
6460 IdentifierInfo &II = CGM.getContext().Idents.get(Name);
6461 TranslationUnitDecl *TUDecl = CGM.getContext().getTranslationUnitDecl();
6462 DeclContext *DC = TranslationUnitDecl::castToDeclContext(TUDecl);
6463
6464 const VarDecl *VD = nullptr;
6465 for (const auto *Result : DC->lookup(&II))
6466 if ((VD = dyn_cast<VarDecl>(Result)))
6467 break;
6468
6469 if (!VD)
6470 return llvm::GlobalValue::DLLImportStorageClass;
6471 if (VD->hasAttr<DLLExportAttr>())
6472 return llvm::GlobalValue::DLLExportStorageClass;
6473 if (VD->hasAttr<DLLImportAttr>())
6474 return llvm::GlobalValue::DLLImportStorageClass;
6475 return llvm::GlobalValue::DefaultStorageClass;
6476}
6477
6478void CGObjCNonFragileABIMac::GenerateClass(const ObjCImplementationDecl *ID) {
6479 if (!ObjCEmptyCacheVar) {
6480 ObjCEmptyCacheVar =
6481 new llvm::GlobalVariable(CGM.getModule(), ObjCTypes.CacheTy, false,
6482 llvm::GlobalValue::ExternalLinkage, nullptr,
6483 "_objc_empty_cache");
6484 if (CGM.getTriple().isOSBinFormatCOFF())
6485 ObjCEmptyCacheVar->setDLLStorageClass(getStorage(CGM, "_objc_empty_cache"));
6486
6487 // Only OS X with deployment version <10.9 use the empty vtable symbol
6488 const llvm::Triple &Triple = CGM.getTarget().getTriple();
6489 if (Triple.isMacOSX() && Triple.isMacOSXVersionLT(10, 9))
6490 ObjCEmptyVtableVar =
6491 new llvm::GlobalVariable(CGM.getModule(), ObjCTypes.ImpnfABITy, false,
6492 llvm::GlobalValue::ExternalLinkage, nullptr,
6493 "_objc_empty_vtable");
6494 else
6495 ObjCEmptyVtableVar =
6496 llvm::ConstantPointerNull::get(ObjCTypes.ImpnfABITy->getPointerTo());
6497 }
6498
6499 // FIXME: Is this correct (that meta class size is never computed)?
6500 uint32_t InstanceStart =
6501 CGM.getDataLayout().getTypeAllocSize(ObjCTypes.ClassnfABITy);
6502 uint32_t InstanceSize = InstanceStart;
6503 uint32_t flags = NonFragileABI_Class_Meta;
6504
6505 llvm::Constant *SuperClassGV, *IsAGV;
6506
6507 const auto *CI = ID->getClassInterface();
6508 assert(CI && "CGObjCNonFragileABIMac::GenerateClass - class is 0")(static_cast <bool> (CI && "CGObjCNonFragileABIMac::GenerateClass - class is 0"
) ? void (0) : __assert_fail ("CI && \"CGObjCNonFragileABIMac::GenerateClass - class is 0\""
, "clang/lib/CodeGen/CGObjCMac.cpp", 6508, __extension__ __PRETTY_FUNCTION__
))
;
6509
6510 // Build the flags for the metaclass.
6511 bool classIsHidden = (CGM.getTriple().isOSBinFormatCOFF())
6512 ? !CI->hasAttr<DLLExportAttr>()
6513 : CI->getVisibility() == HiddenVisibility;
6514 if (classIsHidden)
6515 flags |= NonFragileABI_Class_Hidden;
6516
6517 // FIXME: why is this flag set on the metaclass?
6518 // ObjC metaclasses have no fields and don't really get constructed.
6519 if (ID->hasNonZeroConstructors() || ID->hasDestructors()) {
6520 flags |= NonFragileABI_Class_HasCXXStructors;
6521 if (!ID->hasNonZeroConstructors())
6522 flags |= NonFragileABI_Class_HasCXXDestructorOnly;
6523 }
6524
6525 if (!CI->getSuperClass()) {
6526 // class is root
6527 flags |= NonFragileABI_Class_Root;
6528
6529 SuperClassGV = GetClassGlobal(CI, /*metaclass*/ false, NotForDefinition);
6530 IsAGV = GetClassGlobal(CI, /*metaclass*/ true, NotForDefinition);
6531 } else {
6532 // Has a root. Current class is not a root.
6533 const ObjCInterfaceDecl *Root = ID->getClassInterface();
6534 while (const ObjCInterfaceDecl *Super = Root->getSuperClass())
6535 Root = Super;
6536
6537 const auto *Super = CI->getSuperClass();
6538 IsAGV = GetClassGlobal(Root, /*metaclass*/ true, NotForDefinition);
6539 SuperClassGV = GetClassGlobal(Super, /*metaclass*/ true, NotForDefinition);
6540 }
6541
6542 llvm::GlobalVariable *CLASS_RO_GV =
6543 BuildClassRoTInitializer(flags, InstanceStart, InstanceSize, ID);
6544
6545 llvm::GlobalVariable *MetaTClass =
6546 BuildClassObject(CI, /*metaclass*/ true,
6547 IsAGV, SuperClassGV, CLASS_RO_GV, classIsHidden);
6548 CGM.setGVProperties(MetaTClass, CI);
6549 DefinedMetaClasses.push_back(MetaTClass);
6550
6551 // Metadata for the class
6552 flags = 0;
6553 if (classIsHidden)
6554 flags |= NonFragileABI_Class_Hidden;
6555
6556 if (ID->hasNonZeroConstructors() || ID->hasDestructors()) {
6557 flags |= NonFragileABI_Class_HasCXXStructors;
6558
6559 // Set a flag to enable a runtime optimization when a class has
6560 // fields that require destruction but which don't require
6561 // anything except zero-initialization during construction. This
6562 // is most notably true of __strong and __weak types, but you can
6563 // also imagine there being C++ types with non-trivial default
6564 // constructors that merely set all fields to null.
6565 if (!ID->hasNonZeroConstructors())
6566 flags |= NonFragileABI_Class_HasCXXDestructorOnly;
6567 }
6568
6569 if (hasObjCExceptionAttribute(CGM.getContext(), CI))
6570 flags |= NonFragileABI_Class_Exception;
6571
6572 if (!CI->getSuperClass()) {
6573 flags |= NonFragileABI_Class_Root;
6574 SuperClassGV = nullptr;
6575 } else {
6576 // Has a root. Current class is not a root.
6577 const auto *Super = CI->getSuperClass();
6578 SuperClassGV = GetClassGlobal(Super, /*metaclass*/ false, NotForDefinition);
6579 }
6580
6581 GetClassSizeInfo(ID, InstanceStart, InstanceSize);
6582 CLASS_RO_GV =
6583 BuildClassRoTInitializer(flags, InstanceStart, InstanceSize, ID);
6584
6585 llvm::GlobalVariable *ClassMD =
6586 BuildClassObject(CI, /*metaclass*/ false,
6587 MetaTClass, SuperClassGV, CLASS_RO_GV, classIsHidden);
6588 CGM.setGVProperties(ClassMD, CI);
6589 DefinedClasses.push_back(ClassMD);
6590 ImplementedClasses.push_back(CI);
6591
6592 // Determine if this class is also "non-lazy".
6593 if (ImplementationIsNonLazy(ID))
6594 DefinedNonLazyClasses.push_back(ClassMD);
6595
6596 // Force the definition of the EHType if necessary.
6597 if (flags & NonFragileABI_Class_Exception)
6598 (void) GetInterfaceEHType(CI, ForDefinition);
6599 // Make sure method definition entries are all clear for next implementation.
6600 MethodDefinitions.clear();
6601}
6602
6603/// GenerateProtocolRef - This routine is called to generate code for
6604/// a protocol reference expression; as in:
6605/// @code
6606/// @protocol(Proto1);
6607/// @endcode
6608/// It generates a weak reference to l_OBJC_PROTOCOL_REFERENCE_$_Proto1
6609/// which will hold address of the protocol meta-data.
6610///
6611llvm::Value *CGObjCNonFragileABIMac::GenerateProtocolRef(CodeGenFunction &CGF,
6612 const ObjCProtocolDecl *PD) {
6613
6614 // This routine is called for @protocol only. So, we must build definition
6615 // of protocol's meta-data (not a reference to it!)
6616 assert(!PD->isNonRuntimeProtocol() &&(static_cast <bool> (!PD->isNonRuntimeProtocol() &&
"attempting to get a protocol ref to a static protocol.") ? void
(0) : __assert_fail ("!PD->isNonRuntimeProtocol() && \"attempting to get a protocol ref to a static protocol.\""
, "clang/lib/CodeGen/CGObjCMac.cpp", 6617, __extension__ __PRETTY_FUNCTION__
))
6617 "attempting to get a protocol ref to a static protocol.")(static_cast <bool> (!PD->isNonRuntimeProtocol() &&
"attempting to get a protocol ref to a static protocol.") ? void
(0) : __assert_fail ("!PD->isNonRuntimeProtocol() && \"attempting to get a protocol ref to a static protocol.\""
, "clang/lib/CodeGen/CGObjCMac.cpp", 6617, __extension__ __PRETTY_FUNCTION__
))
;
6618 llvm::Constant *Init =
6619 llvm::ConstantExpr::getBitCast(GetOrEmitProtocol(PD),
6620 ObjCTypes.getExternalProtocolPtrTy());
6621
6622 std::string ProtocolName("_OBJC_PROTOCOL_REFERENCE_$_");
6623 ProtocolName += PD->getObjCRuntimeNameAsString();
6624
6625 CharUnits Align = CGF.getPointerAlign();
6626
6627 llvm::GlobalVariable *PTGV = CGM.getModule().getGlobalVariable(ProtocolName);
6628 if (PTGV)
6629 return CGF.Builder.CreateAlignedLoad(PTGV->getValueType(), PTGV, Align);
6630 PTGV = new llvm::GlobalVariable(CGM.getModule(), Init->getType(), false,
6631 llvm::GlobalValue::WeakAnyLinkage, Init,
6632 ProtocolName);
6633 PTGV->setSection(GetSectionName("__objc_protorefs",
6634 "coalesced,no_dead_strip"));
6635 PTGV->setVisibility(llvm::GlobalValue::HiddenVisibility);
6636 PTGV->setAlignment(Align.getAsAlign());
6637 if (!CGM.getTriple().isOSBinFormatMachO())
6638 PTGV->setComdat(CGM.getModule().getOrInsertComdat(ProtocolName));
6639 CGM.addUsedGlobal(PTGV);
6640 return CGF.Builder.CreateAlignedLoad(PTGV->getValueType(), PTGV, Align);
6641}
6642
6643/// GenerateCategory - Build metadata for a category implementation.
6644/// struct _category_t {
6645/// const char * const name;
6646/// struct _class_t *const cls;
6647/// const struct _method_list_t * const instance_methods;
6648/// const struct _method_list_t * const class_methods;
6649/// const struct _protocol_list_t * const protocols;
6650/// const struct _prop_list_t * const properties;
6651/// const struct _prop_list_t * const class_properties;
6652/// const uint32_t size;
6653/// }
6654///
6655void CGObjCNonFragileABIMac::GenerateCategory(const ObjCCategoryImplDecl *OCD) {
6656 const ObjCInterfaceDecl *Interface = OCD->getClassInterface();
6657 const char *Prefix = "_OBJC_$_CATEGORY_";
6658
6659 llvm::SmallString<64> ExtCatName(Prefix);
6660 ExtCatName += Interface->getObjCRuntimeNameAsString();
6661 ExtCatName += "_$_";
6662 ExtCatName += OCD->getNameAsString();
6663
6664 ConstantInitBuilder builder(CGM);
6665 auto values = builder.beginStruct(ObjCTypes.CategorynfABITy);
6666 values.add(GetClassName(OCD->getIdentifier()->getName()));
6667 // meta-class entry symbol
6668 values.add(GetClassGlobal(Interface, /*metaclass*/ false, NotForDefinition));
6669 std::string listName =
6670 (Interface->getObjCRuntimeNameAsString() + "_$_" + OCD->getName()).str();
6671
6672 SmallVector<const ObjCMethodDecl *, 16> instanceMethods;
6673 SmallVector<const ObjCMethodDecl *, 8> classMethods;
6674 for (const auto *MD : OCD->methods()) {
6675 if (MD->isDirectMethod())
6676 continue;
6677 if (MD->isInstanceMethod()) {
6678 instanceMethods.push_back(MD);
6679 } else {
6680 classMethods.push_back(MD);
6681 }
6682 }
6683
6684 auto instanceMethodList = emitMethodList(
6685 listName, MethodListType::CategoryInstanceMethods, instanceMethods);
6686 auto classMethodList = emitMethodList(
6687 listName, MethodListType::CategoryClassMethods, classMethods);
6688 values.add(instanceMethodList);
6689 values.add(classMethodList);
6690 // Keep track of whether we have actual metadata to emit.
6691 bool isEmptyCategory =
6692 instanceMethodList->isNullValue() && classMethodList->isNullValue();
6693
6694 const ObjCCategoryDecl *Category =
6695 Interface->FindCategoryDeclaration(OCD->getIdentifier());
6696 if (Category) {
6697 SmallString<256> ExtName;
6698 llvm::raw_svector_ostream(ExtName)
6699 << Interface->getObjCRuntimeNameAsString() << "_$_" << OCD->getName();
6700 auto protocolList =
6701 EmitProtocolList("_OBJC_CATEGORY_PROTOCOLS_$_" +
6702 Interface->getObjCRuntimeNameAsString() + "_$_" +
6703 Category->getName(),
6704 Category->protocol_begin(), Category->protocol_end());
6705 auto propertyList = EmitPropertyList("_OBJC_$_PROP_LIST_" + ExtName.str(),
6706 OCD, Category, ObjCTypes, false);
6707 auto classPropertyList =
6708 EmitPropertyList("_OBJC_$_CLASS_PROP_LIST_" + ExtName.str(), OCD,
6709 Category, ObjCTypes, true);
6710 values.add(protocolList);
6711 values.add(propertyList);
6712 values.add(classPropertyList);
6713 isEmptyCategory &= protocolList->isNullValue() &&
6714 propertyList->isNullValue() &&
6715 classPropertyList->isNullValue();
6716 } else {
6717 values.addNullPointer(ObjCTypes.ProtocolListnfABIPtrTy);
6718 values.addNullPointer(ObjCTypes.PropertyListPtrTy);
6719 values.addNullPointer(ObjCTypes.PropertyListPtrTy);
6720 }
6721
6722 if (isEmptyCategory) {
6723 // Empty category, don't emit any metadata.
6724 values.abandon();
6725 MethodDefinitions.clear();
6726 return;
6727 }
6728
6729 unsigned Size =
6730 CGM.getDataLayout().getTypeAllocSize(ObjCTypes.CategorynfABITy);
6731 values.addInt(ObjCTypes.IntTy, Size);
6732
6733 llvm::GlobalVariable *GCATV =
6734 finishAndCreateGlobal(values, ExtCatName.str(), CGM);
6735 CGM.addCompilerUsedGlobal(GCATV);
6736 if (Interface->hasAttr<ObjCClassStubAttr>())
6737 DefinedStubCategories.push_back(GCATV);
6738 else
6739 DefinedCategories.push_back(GCATV);
6740
6741 // Determine if this category is also "non-lazy".
6742 if (ImplementationIsNonLazy(OCD))
6743 DefinedNonLazyCategories.push_back(GCATV);
6744 // method definition entries must be clear for next implementation.
6745 MethodDefinitions.clear();
6746}
6747
6748/// emitMethodConstant - Return a struct objc_method constant. If
6749/// forProtocol is true, the implementation will be null; otherwise,
6750/// the method must have a definition registered with the runtime.
6751///
6752/// struct _objc_method {
6753/// SEL _cmd;
6754/// char *method_type;
6755/// char *_imp;
6756/// }
6757void CGObjCNonFragileABIMac::emitMethodConstant(ConstantArrayBuilder &builder,
6758 const ObjCMethodDecl *MD,
6759 bool forProtocol) {
6760 auto method = builder.beginStruct(ObjCTypes.MethodTy);
6761 method.addBitCast(GetMethodVarName(MD->getSelector()),
6762 ObjCTypes.SelectorPtrTy);
6763 method.add(GetMethodVarType(MD));
6764
6765 if (forProtocol) {
6766 // Protocol methods have no implementation. So, this entry is always NULL.
6767 method.addNullPointer(ObjCTypes.Int8PtrTy);
6768 } else {
6769 llvm::Function *fn = GetMethodDefinition(MD);
6770 assert(fn && "no definition for method?")(static_cast <bool> (fn && "no definition for method?"
) ? void (0) : __assert_fail ("fn && \"no definition for method?\""
, "clang/lib/CodeGen/CGObjCMac.cpp", 6770, __extension__ __PRETTY_FUNCTION__
))
;
6771 method.addBitCast(fn, ObjCTypes.Int8PtrTy);
6772 }
6773
6774 method.finishAndAddTo(builder);
6775}
6776
6777/// Build meta-data for method declarations.
6778///
6779/// struct _method_list_t {
6780/// uint32_t entsize; // sizeof(struct _objc_method)
6781/// uint32_t method_count;
6782/// struct _objc_method method_list[method_count];
6783/// }
6784///
6785llvm::Constant *
6786CGObjCNonFragileABIMac::emitMethodList(Twine name, MethodListType kind,
6787 ArrayRef<const ObjCMethodDecl *> methods) {
6788 // Return null for empty list.
6789 if (methods.empty())
6790 return llvm::Constant::getNullValue(ObjCTypes.MethodListnfABIPtrTy);
6791
6792 StringRef prefix;
6793 bool forProtocol;
6794 switch (kind) {
6795 case MethodListType::CategoryInstanceMethods:
6796 prefix = "_OBJC_$_CATEGORY_INSTANCE_METHODS_";
6797 forProtocol = false;
6798 break;
6799 case MethodListType::CategoryClassMethods:
6800 prefix = "_OBJC_$_CATEGORY_CLASS_METHODS_";
6801 forProtocol = false;
6802 break;
6803 case MethodListType::InstanceMethods:
6804 prefix = "_OBJC_$_INSTANCE_METHODS_";
6805 forProtocol = false;
6806 break;
6807 case MethodListType::ClassMethods:
6808 prefix = "_OBJC_$_CLASS_METHODS_";
6809 forProtocol = false;
6810 break;
6811
6812 case MethodListType::ProtocolInstanceMethods:
6813 prefix = "_OBJC_$_PROTOCOL_INSTANCE_METHODS_";
6814 forProtocol = true;
6815 break;
6816 case MethodListType::ProtocolClassMethods:
6817 prefix = "_OBJC_$_PROTOCOL_CLASS_METHODS_";
6818 forProtocol = true;
6819 break;
6820 case MethodListType::OptionalProtocolInstanceMethods:
6821 prefix = "_OBJC_$_PROTOCOL_INSTANCE_METHODS_OPT_";
6822 forProtocol = true;
6823 break;
6824 case MethodListType::OptionalProtocolClassMethods:
6825 prefix = "_OBJC_$_PROTOCOL_CLASS_METHODS_OPT_";
6826 forProtocol = true;
6827 break;
6828 }
6829
6830 ConstantInitBuilder builder(CGM);
6831 auto values = builder.beginStruct();
6832
6833 // sizeof(struct _objc_method)
6834 unsigned Size = CGM.getDataLayout().getTypeAllocSize(ObjCTypes.MethodTy);
6835 values.addInt(ObjCTypes.IntTy, Size);
6836 // method_count
6837 values.addInt(ObjCTypes.IntTy, methods.size());
6838 auto methodArray = values.beginArray(ObjCTypes.MethodTy);
6839 for (auto MD : methods)
6840 emitMethodConstant(methodArray, MD, forProtocol);
6841 methodArray.finishAndAddTo(values);
6842
6843 llvm::GlobalVariable *GV = finishAndCreateGlobal(values, prefix + name, CGM);
6844 CGM.addCompilerUsedGlobal(GV);
6845 return llvm::ConstantExpr::getBitCast(GV, ObjCTypes.MethodListnfABIPtrTy);
6846}
6847
6848/// ObjCIvarOffsetVariable - Returns the ivar offset variable for
6849/// the given ivar.
6850llvm::GlobalVariable *
6851CGObjCNonFragileABIMac::ObjCIvarOffsetVariable(const ObjCInterfaceDecl *ID,
6852 const ObjCIvarDecl *Ivar) {
6853 const ObjCInterfaceDecl *Container = Ivar->getContainingInterface();
6854 llvm::SmallString<64> Name("OBJC_IVAR_$_");
6855 Name += Container->getObjCRuntimeNameAsString();
6856 Name += ".";
6857 Name += Ivar->getName();
6858 llvm::GlobalVariable *IvarOffsetGV = CGM.getModule().getGlobalVariable(Name);
6859 if (!IvarOffsetGV) {
6860 IvarOffsetGV =
6861 new llvm::GlobalVariable(CGM.getModule(), ObjCTypes.IvarOffsetVarTy,
6862 false, llvm::GlobalValue::ExternalLinkage,
6863 nullptr, Name.str());
6864 if (CGM.getTriple().isOSBinFormatCOFF()) {
6865 bool IsPrivateOrPackage =
6866 Ivar->getAccessControl() == ObjCIvarDecl::Private ||
6867 Ivar->getAccessControl() == ObjCIvarDecl::Package;
6868
6869 const ObjCInterfaceDecl *ContainingID = Ivar->getContainingInterface();
6870
6871 if (ContainingID->hasAttr<DLLImportAttr>())
6872 IvarOffsetGV
6873 ->setDLLStorageClass(llvm::GlobalValue::DLLImportStorageClass);
6874 else if (ContainingID->hasAttr<DLLExportAttr>() && !IsPrivateOrPackage)
6875 IvarOffsetGV
6876 ->setDLLStorageClass(llvm::GlobalValue::DLLExportStorageClass);
6877 }
6878 }
6879 return IvarOffsetGV;
6880}
6881
6882llvm::Constant *
6883CGObjCNonFragileABIMac::EmitIvarOffsetVar(const ObjCInterfaceDecl *ID,
6884 const ObjCIvarDecl *Ivar,
6885 unsigned long int Offset) {
6886 llvm::GlobalVariable *IvarOffsetGV = ObjCIvarOffsetVariable(ID, Ivar);
6887 IvarOffsetGV->setInitializer(
6888 llvm::ConstantInt::get(ObjCTypes.IvarOffsetVarTy, Offset));
6889 IvarOffsetGV->setAlignment(llvm::Align(
6890 CGM.getDataLayout().getABITypeAlignment(ObjCTypes.IvarOffsetVarTy)));
6891
6892 if (!CGM.getTriple().isOSBinFormatCOFF()) {
6893 // FIXME: This matches gcc, but shouldn't the visibility be set on the use
6894 // as well (i.e., in ObjCIvarOffsetVariable).
6895 if (Ivar->getAccessControl() == ObjCIvarDecl::Private ||
6896 Ivar->getAccessControl() == ObjCIvarDecl::Package ||
6897 ID->getVisibility() == HiddenVisibility)
6898 IvarOffsetGV->setVisibility(llvm::GlobalValue::HiddenVisibility);
6899 else
6900 IvarOffsetGV->setVisibility(llvm::GlobalValue::DefaultVisibility);
6901 }
6902
6903 // If ID's layout is known, then make the global constant. This serves as a
6904 // useful assertion: we'll never use this variable to calculate ivar offsets,
6905 // so if the runtime tries to patch it then we should crash.
6906 if (isClassLayoutKnownStatically(ID))
6907 IvarOffsetGV->setConstant(true);
6908
6909 if (CGM.getTriple().isOSBinFormatMachO())
6910 IvarOffsetGV->setSection("__DATA, __objc_ivar");
6911 return IvarOffsetGV;
6912}
6913
6914/// EmitIvarList - Emit the ivar list for the given
6915/// implementation. The return value has type
6916/// IvarListnfABIPtrTy.
6917/// struct _ivar_t {
6918/// unsigned [long] int *offset; // pointer to ivar offset location
6919/// char *name;
6920/// char *type;
6921/// uint32_t alignment;
6922/// uint32_t size;
6923/// }
6924/// struct _ivar_list_t {
6925/// uint32 entsize; // sizeof(struct _ivar_t)
6926/// uint32 count;
6927/// struct _iver_t list[count];
6928/// }
6929///
6930
6931llvm::Constant *CGObjCNonFragileABIMac::EmitIvarList(
6932 const ObjCImplementationDecl *ID) {
6933
6934 ConstantInitBuilder builder(CGM);
6935 auto ivarList = builder.beginStruct();
6936 ivarList.addInt(ObjCTypes.IntTy,
6937 CGM.getDataLayout().getTypeAllocSize(ObjCTypes.IvarnfABITy));
6938 auto ivarCountSlot = ivarList.addPlaceholder();
6939 auto ivars = ivarList.beginArray(ObjCTypes.IvarnfABITy);
6940
6941 const ObjCInterfaceDecl *OID = ID->getClassInterface();
6942 assert(OID && "CGObjCNonFragileABIMac::EmitIvarList - null interface")(static_cast <bool> (OID && "CGObjCNonFragileABIMac::EmitIvarList - null interface"
) ? void (0) : __assert_fail ("OID && \"CGObjCNonFragileABIMac::EmitIvarList - null interface\""
, "clang/lib/CodeGen/CGObjCMac.cpp", 6942, __extension__ __PRETTY_FUNCTION__
))
;
6943
6944 // FIXME. Consolidate this with similar code in GenerateClass.
6945
6946 for (const ObjCIvarDecl *IVD = OID->all_declared_ivar_begin();
6947 IVD; IVD = IVD->getNextIvar()) {
6948 // Ignore unnamed bit-fields.
6949 if (!IVD->getDeclName())
6950 continue;
6951
6952 auto ivar = ivars.beginStruct(ObjCTypes.IvarnfABITy);
6953 ivar.add(EmitIvarOffsetVar(ID->getClassInterface(), IVD,
6954 ComputeIvarBaseOffset(CGM, ID, IVD)));
6955 ivar.add(GetMethodVarName(IVD->getIdentifier()));
6956 ivar.add(GetMethodVarType(IVD));
6957 llvm::Type *FieldTy =
6958 CGM.getTypes().ConvertTypeForMem(IVD->getType());
6959 unsigned Size = CGM.getDataLayout().getTypeAllocSize(FieldTy);
6960 unsigned Align = CGM.getContext().getPreferredTypeAlign(
6961 IVD->getType().getTypePtr()) >> 3;
6962 Align = llvm::Log2_32(Align);
6963 ivar.addInt(ObjCTypes.IntTy, Align);
6964 // NOTE. Size of a bitfield does not match gcc's, because of the
6965 // way bitfields are treated special in each. But I am told that
6966 // 'size' for bitfield ivars is ignored by the runtime so it does
6967 // not matter. If it matters, there is enough info to get the
6968 // bitfield right!
6969 ivar.addInt(ObjCTypes.IntTy, Size);
6970 ivar.finishAndAddTo(ivars);
6971 }
6972 // Return null for empty list.
6973 if (ivars.empty()) {
6974 ivars.abandon();
6975 ivarList.abandon();
6976 return llvm::Constant::getNullValue(ObjCTypes.IvarListnfABIPtrTy);
6977 }
6978
6979 auto ivarCount = ivars.size();
6980 ivars.finishAndAddTo(ivarList);
6981 ivarList.fillPlaceholderWithInt(ivarCountSlot, ObjCTypes.IntTy, ivarCount);
6982
6983 const char *Prefix = "_OBJC_$_INSTANCE_VARIABLES_";
6984 llvm::GlobalVariable *GV = finishAndCreateGlobal(
6985 ivarList, Prefix + OID->getObjCRuntimeNameAsString(), CGM);
6986 CGM.addCompilerUsedGlobal(GV);
6987 return llvm::ConstantExpr::getBitCast(GV, ObjCTypes.IvarListnfABIPtrTy);
6988}
6989
6990llvm::Constant *CGObjCNonFragileABIMac::GetOrEmitProtocolRef(
6991 const ObjCProtocolDecl *PD) {
6992 llvm::GlobalVariable *&Entry = Protocols[PD->getIdentifier()];
6993
6994 assert(!PD->isNonRuntimeProtocol() &&(static_cast <bool> (!PD->isNonRuntimeProtocol() &&
"attempting to GetOrEmit a non-runtime protocol") ? void (0)
: __assert_fail ("!PD->isNonRuntimeProtocol() && \"attempting to GetOrEmit a non-runtime protocol\""
, "clang/lib/CodeGen/CGObjCMac.cpp", 6995, __extension__ __PRETTY_FUNCTION__
))
6995 "attempting to GetOrEmit a non-runtime protocol")(static_cast <bool> (!PD->isNonRuntimeProtocol() &&
"attempting to GetOrEmit a non-runtime protocol") ? void (0)
: __assert_fail ("!PD->isNonRuntimeProtocol() && \"attempting to GetOrEmit a non-runtime protocol\""
, "clang/lib/CodeGen/CGObjCMac.cpp", 6995, __extension__ __PRETTY_FUNCTION__
))
;
6996 if (!Entry) {
6997 // We use the initializer as a marker of whether this is a forward
6998 // reference or not. At module finalization we add the empty
6999 // contents for protocols which were referenced but never defined.
7000 llvm::SmallString<64> Protocol;
7001 llvm::raw_svector_ostream(Protocol) << "_OBJC_PROTOCOL_$_"
7002 << PD->getObjCRuntimeNameAsString();
7003
7004 Entry = new llvm::GlobalVariable(CGM.getModule(), ObjCTypes.ProtocolnfABITy,
7005 false, llvm::GlobalValue::ExternalLinkage,
7006 nullptr, Protocol);
7007 if (!CGM.getTriple().isOSBinFormatMachO())
7008 Entry->setComdat(CGM.getModule().getOrInsertComdat(Protocol));
7009 }
7010
7011 return Entry;
7012}
7013
7014/// GetOrEmitProtocol - Generate the protocol meta-data:
7015/// @code
7016/// struct _protocol_t {
7017/// id isa; // NULL
7018/// const char * const protocol_name;
7019/// const struct _protocol_list_t * protocol_list; // super protocols
7020/// const struct method_list_t * const instance_methods;
7021/// const struct method_list_t * const class_methods;
7022/// const struct method_list_t *optionalInstanceMethods;
7023/// const struct method_list_t *optionalClassMethods;
7024/// const struct _prop_list_t * properties;
7025/// const uint32_t size; // sizeof(struct _protocol_t)
7026/// const uint32_t flags; // = 0
7027/// const char ** extendedMethodTypes;
7028/// const char *demangledName;
7029/// const struct _prop_list_t * class_properties;
7030/// }
7031/// @endcode
7032///
7033
7034llvm::Constant *CGObjCNonFragileABIMac::GetOrEmitProtocol(
7035 const ObjCProtocolDecl *PD) {
7036 llvm::GlobalVariable *Entry = Protocols[PD->getIdentifier()];
7037
7038 // Early exit if a defining object has already been generated.
7039 if (Entry && Entry->hasInitializer())
7040 return Entry;
7041
7042 // Use the protocol definition, if there is one.
7043 assert(PD->hasDefinition() &&(static_cast <bool> (PD->hasDefinition() && "emitting protocol metadata without definition"
) ? void (0) : __assert_fail ("PD->hasDefinition() && \"emitting protocol metadata without definition\""
, "clang/lib/CodeGen/CGObjCMac.cpp", 7044, __extension__ __PRETTY_FUNCTION__
))
7044 "emitting protocol metadata without definition")(static_cast <bool> (PD->hasDefinition() && "emitting protocol metadata without definition"
) ? void (0) : __assert_fail ("PD->hasDefinition() && \"emitting protocol metadata without definition\""
, "clang/lib/CodeGen/CGObjCMac.cpp", 7044, __extension__ __PRETTY_FUNCTION__
))
;
7045 PD = PD->getDefinition();
7046
7047 auto methodLists = ProtocolMethodLists::get(PD);
7048
7049 ConstantInitBuilder builder(CGM);
7050 auto values = builder.beginStruct(ObjCTypes.ProtocolnfABITy);
7051
7052 // isa is NULL
7053 values.addNullPointer(ObjCTypes.ObjectPtrTy);
7054 values.add(GetClassName(PD->getObjCRuntimeNameAsString()));
7055 values.add(EmitProtocolList("_OBJC_$_PROTOCOL_REFS_"
7056 + PD->getObjCRuntimeNameAsString(),
7057 PD->protocol_begin(),
7058 PD->protocol_end()));
7059 values.add(methodLists.emitMethodList(this, PD,
7060 ProtocolMethodLists::RequiredInstanceMethods));
7061 values.add(methodLists.emitMethodList(this, PD,
7062 ProtocolMethodLists::RequiredClassMethods));
7063 values.add(methodLists.emitMethodList(this, PD,
7064 ProtocolMethodLists::OptionalInstanceMethods));
7065 values.add(methodLists.emitMethodList(this, PD,
7066 ProtocolMethodLists::OptionalClassMethods));
7067 values.add(EmitPropertyList(
7068 "_OBJC_$_PROP_LIST_" + PD->getObjCRuntimeNameAsString(),
7069 nullptr, PD, ObjCTypes, false));
7070 uint32_t Size =
7071 CGM.getDataLayout().getTypeAllocSize(ObjCTypes.ProtocolnfABITy);
7072 values.addInt(ObjCTypes.IntTy, Size);
7073 values.addInt(ObjCTypes.IntTy, 0);
7074 values.add(EmitProtocolMethodTypes("_OBJC_$_PROTOCOL_METHOD_TYPES_"
7075 + PD->getObjCRuntimeNameAsString(),
7076 methodLists.emitExtendedTypesArray(this),
7077 ObjCTypes));
7078
7079 // const char *demangledName;
7080 values.addNullPointer(ObjCTypes.Int8PtrTy);
7081
7082 values.add(EmitPropertyList(
7083 "_OBJC_$_CLASS_PROP_LIST_" + PD->getObjCRuntimeNameAsString(),
7084 nullptr, PD, ObjCTypes, true));
7085
7086 if (Entry) {
7087 // Already created, fix the linkage and update the initializer.
7088 Entry->setLinkage(llvm::GlobalValue::WeakAnyLinkage);
7089 values.finishAndSetAsInitializer(Entry);
7090 } else {
7091 llvm::SmallString<64> symbolName;
7092 llvm::raw_svector_ostream(symbolName)
7093 << "_OBJC_PROTOCOL_$_" << PD->getObjCRuntimeNameAsString();
7094
7095 Entry = values.finishAndCreateGlobal(symbolName, CGM.getPointerAlign(),
7096 /*constant*/ false,
7097 llvm::GlobalValue::WeakAnyLinkage);
7098 if (!CGM.getTriple().isOSBinFormatMachO())
7099 Entry->setComdat(CGM.getModule().getOrInsertComdat(symbolName));
7100
7101 Protocols[PD->getIdentifier()] = Entry;
7102 }
7103 Entry->setVisibility(llvm::GlobalValue::HiddenVisibility);
7104 CGM.addUsedGlobal(Entry);
7105
7106 // Use this protocol meta-data to build protocol list table in section
7107 // __DATA, __objc_protolist
7108 llvm::SmallString<64> ProtocolRef;
7109 llvm::raw_svector_ostream(ProtocolRef) << "_OBJC_LABEL_PROTOCOL_$_"
7110 << PD->getObjCRuntimeNameAsString();
7111
7112 llvm::GlobalVariable *PTGV =
7113 new llvm::GlobalVariable(CGM.getModule(), ObjCTypes.ProtocolnfABIPtrTy,
7114 false, llvm::GlobalValue::WeakAnyLinkage, Entry,
7115 ProtocolRef);
7116 if (!CGM.getTriple().isOSBinFormatMachO())
7117 PTGV->setComdat(CGM.getModule().getOrInsertComdat(ProtocolRef));
7118 PTGV->setAlignment(llvm::Align(
7119 CGM.getDataLayout().getABITypeAlignment(ObjCTypes.ProtocolnfABIPtrTy)));
7120 PTGV->setSection(GetSectionName("__objc_protolist",
7121 "coalesced,no_dead_strip"));
7122 PTGV->setVisibility(llvm::GlobalValue::HiddenVisibility);
7123 CGM.addUsedGlobal(PTGV);
7124 return Entry;
7125}
7126
7127/// EmitProtocolList - Generate protocol list meta-data:
7128/// @code
7129/// struct _protocol_list_t {
7130/// long protocol_count; // Note, this is 32/64 bit
7131/// struct _protocol_t[protocol_count];
7132/// }
7133/// @endcode
7134///
7135llvm::Constant *
7136CGObjCNonFragileABIMac::EmitProtocolList(Twine Name,
7137 ObjCProtocolDecl::protocol_iterator begin,
7138 ObjCProtocolDecl::protocol_iterator end) {
7139 // Just return null for empty protocol lists
7140 auto Protocols = GetRuntimeProtocolList(begin, end);
7141 if (Protocols.empty())
7142 return llvm::Constant::getNullValue(ObjCTypes.ProtocolListnfABIPtrTy);
7143
7144 SmallVector<llvm::Constant *, 16> ProtocolRefs;
7145 ProtocolRefs.reserve(Protocols.size());
7146
7147 for (const auto *PD : Protocols)
7148 ProtocolRefs.push_back(GetProtocolRef(PD));
7149
7150 // If all of the protocols in the protocol list are objc_non_runtime_protocol
7151 // just return null
7152 if (ProtocolRefs.size() == 0)
7153 return llvm::Constant::getNullValue(ObjCTypes.ProtocolListnfABIPtrTy);
7154
7155 // FIXME: We shouldn't need to do this lookup here, should we?
7156 SmallString<256> TmpName;
7157 Name.toVector(TmpName);
7158 llvm::GlobalVariable *GV =
7159 CGM.getModule().getGlobalVariable(TmpName.str(), true);
7160 if (GV)
7161 return llvm::ConstantExpr::getBitCast(GV, ObjCTypes.ProtocolListnfABIPtrTy);
7162
7163 ConstantInitBuilder builder(CGM);
7164 auto values = builder.beginStruct();
7165 auto countSlot = values.addPlaceholder();
7166
7167 // A null-terminated array of protocols.
7168 auto array = values.beginArray(ObjCTypes.ProtocolnfABIPtrTy);
7169 for (auto const &proto : ProtocolRefs)
7170 array.add(proto);
7171 auto count = array.size();
7172 array.addNullPointer(ObjCTypes.ProtocolnfABIPtrTy);
7173
7174 array.finishAndAddTo(values);
7175 values.fillPlaceholderWithInt(countSlot, ObjCTypes.LongTy, count);
7176
7177 GV = finishAndCreateGlobal(values, Name, CGM);
7178 CGM.addCompilerUsedGlobal(GV);
7179 return llvm::ConstantExpr::getBitCast(GV,
7180 ObjCTypes.ProtocolListnfABIPtrTy);
7181}
7182
7183/// EmitObjCValueForIvar - Code Gen for nonfragile ivar reference.
7184/// This code gen. amounts to generating code for:
7185/// @code
7186/// (type *)((char *)base + _OBJC_IVAR_$_.ivar;
7187/// @encode
7188///
7189LValue CGObjCNonFragileABIMac::EmitObjCValueForIvar(
7190 CodeGen::CodeGenFunction &CGF,
7191 QualType ObjectTy,
7192 llvm::Value *BaseValue,
7193 const ObjCIvarDecl *Ivar,
7194 unsigned CVRQualifiers) {
7195 ObjCInterfaceDecl *ID = ObjectTy->castAs<ObjCObjectType>()->getInterface();
7196 llvm::Value *Offset = EmitIvarOffset(CGF, ID, Ivar);
7197 return EmitValueForIvarAtOffset(CGF, ID, BaseValue, Ivar, CVRQualifiers,
7198 Offset);
7199}
7200
7201llvm::Value *
7202CGObjCNonFragileABIMac::EmitIvarOffset(CodeGen::CodeGenFunction &CGF,
7203 const ObjCInterfaceDecl *Interface,
7204 const ObjCIvarDecl *Ivar) {
7205 llvm::Value *IvarOffsetValue;
7206 if (isClassLayoutKnownStatically(Interface)) {
7207 IvarOffsetValue = llvm::ConstantInt::get(
7208 ObjCTypes.IvarOffsetVarTy,
7209 ComputeIvarBaseOffset(CGM, Interface->getImplementation(), Ivar));
7210 } else {
7211 llvm::GlobalVariable *GV = ObjCIvarOffsetVariable(Interface, Ivar);
7212 IvarOffsetValue =
7213 CGF.Builder.CreateAlignedLoad(GV->getValueType(), GV,
7214 CGF.getSizeAlign(), "ivar");
7215 if (IsIvarOffsetKnownIdempotent(CGF, Ivar))
7216 cast<llvm::LoadInst>(IvarOffsetValue)
7217 ->setMetadata(CGM.getModule().getMDKindID("invariant.load"),
7218 llvm::MDNode::get(VMContext, None));
7219 }
7220
7221 // This could be 32bit int or 64bit integer depending on the architecture.
7222 // Cast it to 64bit integer value, if it is a 32bit integer ivar offset value
7223 // as this is what caller always expects.
7224 if (ObjCTypes.IvarOffsetVarTy == ObjCTypes.IntTy)
7225 IvarOffsetValue = CGF.Builder.CreateIntCast(
7226 IvarOffsetValue, ObjCTypes.LongTy, true, "ivar.conv");
7227 return IvarOffsetValue;
7228}
7229
7230static void appendSelectorForMessageRefTable(std::string &buffer,
7231 Selector selector) {
7232 if (selector.isUnarySelector()) {
7233 buffer += selector.getNameForSlot(0);
7234 return;
7235 }
7236
7237 for (unsigned i = 0, e = selector.getNumArgs(); i != e; ++i) {
7238 buffer += selector.getNameForSlot(i);
7239 buffer += '_';
7240 }
7241}
7242
7243/// Emit a "vtable" message send. We emit a weak hidden-visibility
7244/// struct, initially containing the selector pointer and a pointer to
7245/// a "fixup" variant of the appropriate objc_msgSend. To call, we
7246/// load and call the function pointer, passing the address of the
7247/// struct as the second parameter. The runtime determines whether
7248/// the selector is currently emitted using vtable dispatch; if so, it
7249/// substitutes a stub function which simply tail-calls through the
7250/// appropriate vtable slot, and if not, it substitues a stub function
7251/// which tail-calls objc_msgSend. Both stubs adjust the selector
7252/// argument to correctly point to the selector.
7253RValue
7254CGObjCNonFragileABIMac::EmitVTableMessageSend(CodeGenFunction &CGF,
7255 ReturnValueSlot returnSlot,
7256 QualType resultType,
7257 Selector selector,
7258 llvm::Value *arg0,
7259 QualType arg0Type,
7260 bool isSuper,
7261 const CallArgList &formalArgs,
7262 const ObjCMethodDecl *method) {
7263 // Compute the actual arguments.
7264 CallArgList args;
7265
7266 // First argument: the receiver / super-call structure.
7267 if (!isSuper)
7268 arg0 = CGF.Builder.CreateBitCast(arg0, ObjCTypes.ObjectPtrTy);
7269 args.add(RValue::get(arg0), arg0Type);
7270
7271 // Second argument: a pointer to the message ref structure. Leave
7272 // the actual argument value blank for now.
7273 args.add(RValue::get(nullptr), ObjCTypes.MessageRefCPtrTy);
7274
7275 args.insert(args.end(), formalArgs.begin(), formalArgs.end());
7276
7277 MessageSendInfo MSI = getMessageSendInfo(method, resultType, args);
7278
7279 NullReturnState nullReturn;
7280
7281 // Find the function to call and the mangled name for the message
7282 // ref structure. Using a different mangled name wouldn't actually
7283 // be a problem; it would just be a waste.
7284 //
7285 // The runtime currently never uses vtable dispatch for anything
7286 // except normal, non-super message-sends.
7287 // FIXME: don't use this for that.
7288 llvm::FunctionCallee fn = nullptr;
7289 std::string messageRefName("_");
7290 if (CGM.ReturnSlotInterferesWithArgs(MSI.CallInfo)) {
7291 if (isSuper) {
7292 fn = ObjCTypes.getMessageSendSuper2StretFixupFn();
7293 messageRefName += "objc_msgSendSuper2_stret_fixup";
7294 } else {
7295 nullReturn.init(CGF, arg0);
7296 fn = ObjCTypes.getMessageSendStretFixupFn();
7297 messageRefName += "objc_msgSend_stret_fixup";
7298 }
7299 } else if (!isSuper && CGM.ReturnTypeUsesFPRet(resultType)) {
7300 fn = ObjCTypes.getMessageSendFpretFixupFn();
7301 messageRefName += "objc_msgSend_fpret_fixup";
7302 } else {
7303 if (isSuper) {
7304 fn = ObjCTypes.getMessageSendSuper2FixupFn();
7305 messageRefName += "objc_msgSendSuper2_fixup";
7306 } else {
7307 fn = ObjCTypes.getMessageSendFixupFn();
7308 messageRefName += "objc_msgSend_fixup";
7309 }
7310 }
7311 assert(fn && "CGObjCNonFragileABIMac::EmitMessageSend")(static_cast <bool> (fn && "CGObjCNonFragileABIMac::EmitMessageSend"
) ? void (0) : __assert_fail ("fn && \"CGObjCNonFragileABIMac::EmitMessageSend\""
, "clang/lib/CodeGen/CGObjCMac.cpp", 7311, __extension__ __PRETTY_FUNCTION__
))
;
7312 messageRefName += '_';
7313
7314 // Append the selector name, except use underscores anywhere we
7315 // would have used colons.
7316 appendSelectorForMessageRefTable(messageRefName, selector);
7317
7318 llvm::GlobalVariable *messageRef
7319 = CGM.getModule().getGlobalVariable(messageRefName);
7320 if (!messageRef) {
7321 // Build the message ref structure.
7322 ConstantInitBuilder builder(CGM);
7323 auto values = builder.beginStruct();
7324 values.add(cast<llvm::Constant>(fn.getCallee()));
7325 values.add(GetMethodVarName(selector));
7326 messageRef = values.finishAndCreateGlobal(messageRefName,
7327 CharUnits::fromQuantity(16),
7328 /*constant*/ false,
7329 llvm::GlobalValue::WeakAnyLinkage);
7330 messageRef->setVisibility(llvm::GlobalValue::HiddenVisibility);
7331 messageRef->setSection(GetSectionName("__objc_msgrefs", "coalesced"));
7332 }
7333
7334 bool requiresnullCheck = false;
7335 if (CGM.getLangOpts().ObjCAutoRefCount && method)
7336 for (const auto *ParamDecl : method->parameters()) {
7337 if (ParamDecl->isDestroyedInCallee()) {
7338 if (!nullReturn.NullBB)
7339 nullReturn.init(CGF, arg0);
7340 requiresnullCheck = true;
7341 break;
7342 }
7343 }
7344
7345 Address mref =
7346 Address(CGF.Builder.CreateBitCast(messageRef, ObjCTypes.MessageRefPtrTy),
7347 CGF.getPointerAlign());
7348
7349 // Update the message ref argument.
7350 args[1].setRValue(RValue::get(mref.getPointer()));
7351
7352 // Load the function to call from the message ref table.
7353 Address calleeAddr = CGF.Builder.CreateStructGEP(mref, 0);
7354 llvm::Value *calleePtr = CGF.Builder.CreateLoad(calleeAddr, "msgSend_fn");
7355
7356 calleePtr = CGF.Builder.CreateBitCast(calleePtr, MSI.MessengerType);
7357 CGCallee callee(CGCalleeInfo(), calleePtr);
7358
7359 RValue result = CGF.EmitCall(MSI.CallInfo, callee, returnSlot, args);
7360 return nullReturn.complete(CGF, returnSlot, result, resultType, formalArgs,
7361 requiresnullCheck ? method : nullptr);
7362}
7363
7364/// Generate code for a message send expression in the nonfragile abi.
7365CodeGen::RValue
7366CGObjCNonFragileABIMac::GenerateMessageSend(CodeGen::CodeGenFunction &CGF,
7367 ReturnValueSlot Return,
7368 QualType ResultType,
7369 Selector Sel,
7370 llvm::Value *Receiver,
7371 const CallArgList &CallArgs,
7372 const ObjCInterfaceDecl *Class,
7373 const ObjCMethodDecl *Method) {
7374 return isVTableDispatchedSelector(Sel)
7375 ? EmitVTableMessageSend(CGF, Return, ResultType, Sel,
7376 Receiver, CGF.getContext().getObjCIdType(),
7377 false, CallArgs, Method)
7378 : EmitMessageSend(CGF, Return, ResultType, Sel,
7379 Receiver, CGF.getContext().getObjCIdType(),
7380 false, CallArgs, Method, Class, ObjCTypes);
7381}
7382
7383llvm::Constant *
7384CGObjCNonFragileABIMac::GetClassGlobal(const ObjCInterfaceDecl *ID,
7385 bool metaclass,
7386 ForDefinition_t isForDefinition) {
7387 auto prefix =
7388 (metaclass ? getMetaclassSymbolPrefix() : getClassSymbolPrefix());
7389 return GetClassGlobal((prefix + ID->getObjCRuntimeNameAsString()).str(),
7390 isForDefinition,
7391 ID->isWeakImported(),
7392 !isForDefinition
7393 && CGM.getTriple().isOSBinFormatCOFF()
7394 && ID->hasAttr<DLLImportAttr>());
7395}
7396
7397llvm::Constant *
7398CGObjCNonFragileABIMac::GetClassGlobal(StringRef Name,
7399 ForDefinition_t IsForDefinition,
7400 bool Weak, bool DLLImport) {
7401 llvm::GlobalValue::LinkageTypes L =
7402 Weak ? llvm::GlobalValue::ExternalWeakLinkage
7403 : llvm::GlobalValue::ExternalLinkage;
7404
7405 llvm::GlobalVariable *GV = CGM.getModule().getGlobalVariable(Name);
7406 if (!GV || GV->getType() != ObjCTypes.ClassnfABITy->getPointerTo()) {
7407 auto *NewGV = new llvm::GlobalVariable(ObjCTypes.ClassnfABITy, false, L,
7408 nullptr, Name);
7409
7410 if (DLLImport)
7411 NewGV->setDLLStorageClass(llvm::GlobalValue::DLLImportStorageClass);
7412
7413 if (GV) {
7414 GV->replaceAllUsesWith(
7415 llvm::ConstantExpr::getBitCast(NewGV, GV->getType()));
7416 GV->eraseFromParent();
7417 }
7418 GV = NewGV;
7419 CGM.getModule().getGlobalList().push_back(GV);
7420 }
7421
7422 assert(GV->getLinkage() == L)(static_cast <bool> (GV->getLinkage() == L) ? void (
0) : __assert_fail ("GV->getLinkage() == L", "clang/lib/CodeGen/CGObjCMac.cpp"
, 7422, __extension__ __PRETTY_FUNCTION__))
;
7423 return GV;
7424}
7425
7426llvm::Constant *
7427CGObjCNonFragileABIMac::GetClassGlobalForClassRef(const ObjCInterfaceDecl *ID) {
7428 llvm::Constant *ClassGV = GetClassGlobal(ID, /*metaclass*/ false,
7429 NotForDefinition);
7430
7431 if (!ID->hasAttr<ObjCClassStubAttr>())
7432 return ClassGV;
7433
7434 ClassGV = llvm::ConstantExpr::getPointerCast(ClassGV, ObjCTypes.Int8PtrTy);
7435
7436 // Stub classes are pointer-aligned. Classrefs pointing at stub classes
7437 // must set the least significant bit set to 1.
7438 auto *Idx = llvm::ConstantInt::get(CGM.Int32Ty, 1);
7439 return llvm::ConstantExpr::getGetElementPtr(CGM.Int8Ty, ClassGV, Idx);
7440}
7441
7442llvm::Value *
7443CGObjCNonFragileABIMac::EmitLoadOfClassRef(CodeGenFunction &CGF,
7444 const ObjCInterfaceDecl *ID,
7445 llvm::GlobalVariable *Entry) {
7446 if (ID && ID->hasAttr<ObjCClassStubAttr>()) {
7447 // Classrefs pointing at Objective-C stub classes must be loaded by calling
7448 // a special runtime function.
7449 return CGF.EmitRuntimeCall(
7450 ObjCTypes.getLoadClassrefFn(), Entry, "load_classref_result");
7451 }
7452
7453 CharUnits Align = CGF.getPointerAlign();
7454 return CGF.Builder.CreateAlignedLoad(Entry->getValueType(), Entry, Align);
7455}
7456
7457llvm::Value *
7458CGObjCNonFragileABIMac::EmitClassRefFromId(CodeGenFunction &CGF,
7459 IdentifierInfo *II,
7460 const ObjCInterfaceDecl *ID) {
7461 llvm::GlobalVariable *&Entry = ClassReferences[II];
7462
7463 if (!Entry) {
7464 llvm::Constant *ClassGV;
7465 if (ID) {
7466 ClassGV = GetClassGlobalForClassRef(ID);
7467 } else {
7468 ClassGV = GetClassGlobal((getClassSymbolPrefix() + II->getName()).str(),
7469 NotForDefinition);
7470 assert(ClassGV->getType() == ObjCTypes.ClassnfABIPtrTy &&(static_cast <bool> (ClassGV->getType() == ObjCTypes
.ClassnfABIPtrTy && "classref was emitted with the wrong type?"
) ? void (0) : __assert_fail ("ClassGV->getType() == ObjCTypes.ClassnfABIPtrTy && \"classref was emitted with the wrong type?\""
, "clang/lib/CodeGen/CGObjCMac.cpp", 7471, __extension__ __PRETTY_FUNCTION__
))
7471 "classref was emitted with the wrong type?")(static_cast <bool> (ClassGV->getType() == ObjCTypes
.ClassnfABIPtrTy && "classref was emitted with the wrong type?"
) ? void (0) : __assert_fail ("ClassGV->getType() == ObjCTypes.ClassnfABIPtrTy && \"classref was emitted with the wrong type?\""
, "clang/lib/CodeGen/CGObjCMac.cpp", 7471, __extension__ __PRETTY_FUNCTION__
))
;
7472 }
7473
7474 std::string SectionName =
7475 GetSectionName("__objc_classrefs", "regular,no_dead_strip");
7476 Entry = new llvm::GlobalVariable(
7477 CGM.getModule(), ClassGV->getType(), false,
7478 getLinkageTypeForObjCMetadata(CGM, SectionName), ClassGV,
7479 "OBJC_CLASSLIST_REFERENCES_$_");
7480 Entry->setAlignment(CGF.getPointerAlign().getAsAlign());
7481 if (!ID || !ID->hasAttr<ObjCClassStubAttr>())
7482 Entry->setSection(SectionName);
7483
7484 CGM.addCompilerUsedGlobal(Entry);
7485 }
7486
7487 return EmitLoadOfClassRef(CGF, ID, Entry);
7488}
7489
7490llvm::Value *CGObjCNonFragileABIMac::EmitClassRef(CodeGenFunction &CGF,
7491 const ObjCInterfaceDecl *ID) {
7492 // If the class has the objc_runtime_visible attribute, we need to
7493 // use the Objective-C runtime to get the class.
7494 if (ID->hasAttr<ObjCRuntimeVisibleAttr>())
7495 return EmitClassRefViaRuntime(CGF, ID, ObjCTypes);
7496
7497 return EmitClassRefFromId(CGF, ID->getIdentifier(), ID);
7498}
7499
7500llvm::Value *CGObjCNonFragileABIMac::EmitNSAutoreleasePoolClassRef(
7501 CodeGenFunction &CGF) {
7502 IdentifierInfo *II = &CGM.getContext().Idents.get("NSAutoreleasePool");
7503 return EmitClassRefFromId(CGF, II, nullptr);
7504}
7505
7506llvm::Value *
7507CGObjCNonFragileABIMac::EmitSuperClassRef(CodeGenFunction &CGF,
7508 const ObjCInterfaceDecl *ID) {
7509 llvm::GlobalVariable *&Entry = SuperClassReferences[ID->getIdentifier()];
7510
7511 if (!Entry) {
7512 llvm::Constant *ClassGV = GetClassGlobalForClassRef(ID);
7513 std::string SectionName =
7514 GetSectionName("__objc_superrefs", "regular,no_dead_strip");
7515 Entry = new llvm::GlobalVariable(CGM.getModule(), ClassGV->getType(), false,
7516 llvm::GlobalValue::PrivateLinkage, ClassGV,
7517 "OBJC_CLASSLIST_SUP_REFS_$_");
7518 Entry->setAlignment(CGF.getPointerAlign().getAsAlign());
7519 Entry->setSection(SectionName);
7520 CGM.addCompilerUsedGlobal(Entry);
7521 }
7522
7523 return EmitLoadOfClassRef(CGF, ID, Entry);
7524}
7525
7526/// EmitMetaClassRef - Return a Value * of the address of _class_t
7527/// meta-data
7528///
7529llvm::Value *CGObjCNonFragileABIMac::EmitMetaClassRef(CodeGenFunction &CGF,
7530 const ObjCInterfaceDecl *ID,
7531 bool Weak) {
7532 CharUnits Align = CGF.getPointerAlign();
7533 llvm::GlobalVariable * &Entry = MetaClassReferences[ID->getIdentifier()];
7534 if (!Entry) {
7535 auto MetaClassGV = GetClassGlobal(ID, /*metaclass*/ true, NotForDefinition);
7536 std::string SectionName =
7537 GetSectionName("__objc_superrefs", "regular,no_dead_strip");
7538 Entry = new llvm::GlobalVariable(CGM.getModule(), ObjCTypes.ClassnfABIPtrTy,
7539 false, llvm::GlobalValue::PrivateLinkage,
7540 MetaClassGV, "OBJC_CLASSLIST_SUP_REFS_$_");
7541 Entry->setAlignment(Align.getAsAlign());
7542 Entry->setSection(SectionName);
7543 CGM.addCompilerUsedGlobal(Entry);
7544 }
7545
7546 return CGF.Builder.CreateAlignedLoad(ObjCTypes.ClassnfABIPtrTy, Entry, Align);
7547}
7548
7549/// GetClass - Return a reference to the class for the given interface
7550/// decl.
7551llvm::Value *CGObjCNonFragileABIMac::GetClass(CodeGenFunction &CGF,
7552 const ObjCInterfaceDecl *ID) {
7553 if (ID->isWeakImported()) {
7554 auto ClassGV = GetClassGlobal(ID, /*metaclass*/ false, NotForDefinition);
7555 (void)ClassGV;
7556 assert(!isa<llvm::GlobalVariable>(ClassGV) ||(static_cast <bool> (!isa<llvm::GlobalVariable>(ClassGV
) || cast<llvm::GlobalVariable>(ClassGV)->hasExternalWeakLinkage
()) ? void (0) : __assert_fail ("!isa<llvm::GlobalVariable>(ClassGV) || cast<llvm::GlobalVariable>(ClassGV)->hasExternalWeakLinkage()"
, "clang/lib/CodeGen/CGObjCMac.cpp", 7557, __extension__ __PRETTY_FUNCTION__
))
7557 cast<llvm::GlobalVariable>(ClassGV)->hasExternalWeakLinkage())(static_cast <bool> (!isa<llvm::GlobalVariable>(ClassGV
) || cast<llvm::GlobalVariable>(ClassGV)->hasExternalWeakLinkage
()) ? void (0) : __assert_fail ("!isa<llvm::GlobalVariable>(ClassGV) || cast<llvm::GlobalVariable>(ClassGV)->hasExternalWeakLinkage()"
, "clang/lib/CodeGen/CGObjCMac.cpp", 7557, __extension__ __PRETTY_FUNCTION__
))
;
7558 }
7559
7560 return EmitClassRef(CGF, ID);
7561}
7562
7563/// Generates a message send where the super is the receiver. This is
7564/// a message send to self with special delivery semantics indicating
7565/// which class's method should be called.
7566CodeGen::RValue
7567CGObjCNonFragileABIMac::GenerateMessageSendSuper(CodeGen::CodeGenFunction &CGF,
7568 ReturnValueSlot Return,
7569 QualType ResultType,
7570 Selector Sel,
7571 const ObjCInterfaceDecl *Class,
7572 bool isCategoryImpl,
7573 llvm::Value *Receiver,
7574 bool IsClassMessage,
7575 const CodeGen::CallArgList &CallArgs,
7576 const ObjCMethodDecl *Method) {
7577 // ...
7578 // Create and init a super structure; this is a (receiver, class)
7579 // pair we will pass to objc_msgSendSuper.
7580 Address ObjCSuper =
7581 CGF.CreateTempAlloca(ObjCTypes.SuperTy, CGF.getPointerAlign(),
7582 "objc_super");
7583
7584 llvm::Value *ReceiverAsObject =
7585 CGF.Builder.CreateBitCast(Receiver, ObjCTypes.ObjectPtrTy);
7586 CGF.Builder.CreateStore(ReceiverAsObject,
7587 CGF.Builder.CreateStructGEP(ObjCSuper, 0));
7588
7589 // If this is a class message the metaclass is passed as the target.
7590 llvm::Value *Target;
7591 if (IsClassMessage)
7592 Target = EmitMetaClassRef(CGF, Class, Class->isWeakImported());
7593 else
7594 Target = EmitSuperClassRef(CGF, Class);
7595
7596 // FIXME: We shouldn't need to do this cast, rectify the ASTContext and
7597 // ObjCTypes types.
7598 llvm::Type *ClassTy =
7599 CGM.getTypes().ConvertType(CGF.getContext().getObjCClassType());
7600 Target = CGF.Builder.CreateBitCast(Target, ClassTy);
7601 CGF.Builder.CreateStore(Target, CGF.Builder.CreateStructGEP(ObjCSuper, 1));
7602
7603 return (isVTableDispatchedSelector(Sel))
7604 ? EmitVTableMessageSend(CGF, Return, ResultType, Sel,
7605 ObjCSuper.getPointer(), ObjCTypes.SuperPtrCTy,
7606 true, CallArgs, Method)
7607 : EmitMessageSend(CGF, Return, ResultType, Sel,
7608 ObjCSuper.getPointer(), ObjCTypes.SuperPtrCTy,
7609 true, CallArgs, Method, Class, ObjCTypes);
7610}
7611
7612llvm::Value *CGObjCNonFragileABIMac::EmitSelector(CodeGenFunction &CGF,
7613 Selector Sel) {
7614 Address Addr = EmitSelectorAddr(Sel);
7615
7616 llvm::LoadInst* LI = CGF.Builder.CreateLoad(Addr);
7617 LI->setMetadata(CGM.getModule().getMDKindID("invariant.load"),
7618 llvm::MDNode::get(VMContext, None));
7619 return LI;
7620}
7621
7622Address CGObjCNonFragileABIMac::EmitSelectorAddr(Selector Sel) {
7623 llvm::GlobalVariable *&Entry = SelectorReferences[Sel];
7624 CharUnits Align = CGM.getPointerAlign();
7625 if (!Entry) {
7626 llvm::Constant *Casted =
7627 llvm::ConstantExpr::getBitCast(GetMethodVarName(Sel),
7628 ObjCTypes.SelectorPtrTy);
7629 std::string SectionName =
7630 GetSectionName("__objc_selrefs", "literal_pointers,no_dead_strip");
7631 Entry = new llvm::GlobalVariable(
7632 CGM.getModule(), ObjCTypes.SelectorPtrTy, false,
7633 getLinkageTypeForObjCMetadata(CGM, SectionName), Casted,
7634 "OBJC_SELECTOR_REFERENCES_");
7635 Entry->setExternallyInitialized(true);
7636 Entry->setSection(SectionName);
7637 Entry->setAlignment(Align.getAsAlign());
7638 CGM.addCompilerUsedGlobal(Entry);
7639 }
7640
7641 return Address(Entry, Align);
7642}
7643
7644/// EmitObjCIvarAssign - Code gen for assigning to a __strong object.
7645/// objc_assign_ivar (id src, id *dst, ptrdiff_t)
7646///
7647void CGObjCNonFragileABIMac::EmitObjCIvarAssign(CodeGen::CodeGenFunction &CGF,
7648 llvm::Value *src,
7649 Address dst,
7650 llvm::Value *ivarOffset) {
7651 llvm::Type * SrcTy = src->getType();
7652 if (!isa<llvm::PointerType>(SrcTy)) {
7653 unsigned Size = CGM.getDataLayout().getTypeAllocSize(SrcTy);
7654 assert(Size <= 8 && "does not support size > 8")(static_cast <bool> (Size <= 8 && "does not support size > 8"
) ? void (0) : __assert_fail ("Size <= 8 && \"does not support size > 8\""
, "clang/lib/CodeGen/CGObjCMac.cpp", 7654, __extension__ __PRETTY_FUNCTION__
))
;
7655 src = (Size == 4 ? CGF.Builder.CreateBitCast(src, ObjCTypes.IntTy)
7656 : CGF.Builder.CreateBitCast(src, ObjCTypes.LongTy));
7657 src = CGF.Builder.CreateIntToPtr(src, ObjCTypes.Int8PtrTy);
7658 }
7659 src = CGF.Builder.CreateBitCast(src, ObjCTypes.ObjectPtrTy);
7660 dst = CGF.Builder.CreateBitCast(dst, ObjCTypes.PtrObjectPtrTy);
7661 llvm::Value *args[] = { src, dst.getPointer(), ivarOffset };
7662 CGF.EmitNounwindRuntimeCall(ObjCTypes.getGcAssignIvarFn(), args);
7663}
7664
7665/// EmitObjCStrongCastAssign - Code gen for assigning to a __strong cast object.
7666/// objc_assign_strongCast (id src, id *dst)
7667///
7668void CGObjCNonFragileABIMac::EmitObjCStrongCastAssign(
7669 CodeGen::CodeGenFunction &CGF,
7670 llvm::Value *src, Address dst) {
7671 llvm::Type * SrcTy = src->getType();
7672 if (!isa<llvm::PointerType>(SrcTy)) {
7673 unsigned Size = CGM.getDataLayout().getTypeAllocSize(SrcTy);
7674 assert(Size <= 8 && "does not support size > 8")(static_cast <bool> (Size <= 8 && "does not support size > 8"
) ? void (0) : __assert_fail ("Size <= 8 && \"does not support size > 8\""
, "clang/lib/CodeGen/CGObjCMac.cpp", 7674, __extension__ __PRETTY_FUNCTION__
))
;
7675 src = (Size == 4 ? CGF.Builder.CreateBitCast(src, ObjCTypes.IntTy)
7676 : CGF.Builder.CreateBitCast(src, ObjCTypes.LongTy));
7677 src = CGF.Builder.CreateIntToPtr(src, ObjCTypes.Int8PtrTy);
7678 }
7679 src = CGF.Builder.CreateBitCast(src, ObjCTypes.ObjectPtrTy);
7680 dst = CGF.Builder.CreateBitCast(dst, ObjCTypes.PtrObjectPtrTy);
7681 llvm::Value *args[] = { src, dst.getPointer() };
7682 CGF.EmitNounwindRuntimeCall(ObjCTypes.getGcAssignStrongCastFn(),
7683 args, "weakassign");
7684}
7685
7686void CGObjCNonFragileABIMac::EmitGCMemmoveCollectable(
7687 CodeGen::CodeGenFunction &CGF,
7688 Address DestPtr,
7689 Address SrcPtr,
7690 llvm::Value *Size) {
7691 SrcPtr = CGF.Builder.CreateBitCast(SrcPtr, ObjCTypes.Int8PtrTy);
7692 DestPtr = CGF.Builder.CreateBitCast(DestPtr, ObjCTypes.Int8PtrTy);
7693 llvm::Value *args[] = { DestPtr.getPointer(), SrcPtr.getPointer(), Size };
7694 CGF.EmitNounwindRuntimeCall(ObjCTypes.GcMemmoveCollectableFn(), args);
7695}
7696
7697/// EmitObjCWeakRead - Code gen for loading value of a __weak
7698/// object: objc_read_weak (id *src)
7699///
7700llvm::Value * CGObjCNonFragileABIMac::EmitObjCWeakRead(
7701 CodeGen::CodeGenFunction &CGF,
7702 Address AddrWeakObj) {
7703 llvm::Type *DestTy = AddrWeakObj.getElementType();
7704 AddrWeakObj = CGF.Builder.CreateBitCast(AddrWeakObj, ObjCTypes.PtrObjectPtrTy);
7705 llvm::Value *read_weak =
7706 CGF.EmitNounwindRuntimeCall(ObjCTypes.getGcReadWeakFn(),
7707 AddrWeakObj.getPointer(), "weakread");
7708 read_weak = CGF.Builder.CreateBitCast(read_weak, DestTy);
7709 return read_weak;
7710}
7711
7712/// EmitObjCWeakAssign - Code gen for assigning to a __weak object.
7713/// objc_assign_weak (id src, id *dst)
7714///
7715void CGObjCNonFragileABIMac::EmitObjCWeakAssign(CodeGen::CodeGenFunction &CGF,
7716 llvm::Value *src, Address dst) {
7717 llvm::Type * SrcTy = src->getType();
7718 if (!isa<llvm::PointerType>(SrcTy)) {
7719 unsigned Size = CGM.getDataLayout().getTypeAllocSize(SrcTy);
7720 assert(Size <= 8 && "does not support size > 8")(static_cast <bool> (Size <= 8 && "does not support size > 8"
) ? void (0) : __assert_fail ("Size <= 8 && \"does not support size > 8\""
, "clang/lib/CodeGen/CGObjCMac.cpp", 7720, __extension__ __PRETTY_FUNCTION__
))
;
7721 src = (Size == 4 ? CGF.Builder.CreateBitCast(src, ObjCTypes.IntTy)
7722 : CGF.Builder.CreateBitCast(src, ObjCTypes.LongTy));
7723 src = CGF.Builder.CreateIntToPtr(src, ObjCTypes.Int8PtrTy);
7724 }
7725 src = CGF.Builder.CreateBitCast(src, ObjCTypes.ObjectPtrTy);
7726 dst = CGF.Builder.CreateBitCast(dst, ObjCTypes.PtrObjectPtrTy);
7727 llvm::Value *args[] = { src, dst.getPointer() };
7728 CGF.EmitNounwindRuntimeCall(ObjCTypes.getGcAssignWeakFn(),
7729 args, "weakassign");
7730}
7731
7732/// EmitObjCGlobalAssign - Code gen for assigning to a __strong object.
7733/// objc_assign_global (id src, id *dst)
7734///
7735void CGObjCNonFragileABIMac::EmitObjCGlobalAssign(CodeGen::CodeGenFunction &CGF,
7736 llvm::Value *src, Address dst,
7737 bool threadlocal) {
7738 llvm::Type * SrcTy = src->getType();
7739 if (!isa<llvm::PointerType>(SrcTy)) {
7740 unsigned Size = CGM.getDataLayout().getTypeAllocSize(SrcTy);
7741 assert(Size <= 8 && "does not support size > 8")(static_cast <bool> (Size <= 8 && "does not support size > 8"
) ? void (0) : __assert_fail ("Size <= 8 && \"does not support size > 8\""
, "clang/lib/CodeGen/CGObjCMac.cpp", 7741, __extension__ __PRETTY_FUNCTION__
))
;
7742 src = (Size == 4 ? CGF.Builder.CreateBitCast(src, ObjCTypes.IntTy)
7743 : CGF.Builder.CreateBitCast(src, ObjCTypes.LongTy));
7744 src = CGF.Builder.CreateIntToPtr(src, ObjCTypes.Int8PtrTy);
7745 }
7746 src = CGF.Builder.CreateBitCast(src, ObjCTypes.ObjectPtrTy);
7747 dst = CGF.Builder.CreateBitCast(dst, ObjCTypes.PtrObjectPtrTy);
7748 llvm::Value *args[] = { src, dst.getPointer() };
7749 if (!threadlocal)
7750 CGF.EmitNounwindRuntimeCall(ObjCTypes.getGcAssignGlobalFn(),
7751 args, "globalassign");
7752 else
7753 CGF.EmitNounwindRuntimeCall(ObjCTypes.getGcAssignThreadLocalFn(),
7754 args, "threadlocalassign");
7755}
7756
7757void
7758CGObjCNonFragileABIMac::EmitSynchronizedStmt(CodeGen::CodeGenFunction &CGF,
7759 const ObjCAtSynchronizedStmt &S) {
7760 EmitAtSynchronizedStmt(CGF, S, ObjCTypes.getSyncEnterFn(),
7761 ObjCTypes.getSyncExitFn());
7762}
7763
7764llvm::Constant *
7765CGObjCNonFragileABIMac::GetEHType(QualType T) {
7766 // There's a particular fixed type info for 'id'.
7767 if (T->isObjCIdType() || T->isObjCQualifiedIdType()) {
7768 auto *IDEHType = CGM.getModule().getGlobalVariable("OBJC_EHTYPE_id");
7769 if (!IDEHType) {
7770 IDEHType =
7771 new llvm::GlobalVariable(CGM.getModule(), ObjCTypes.EHTypeTy, false,
7772 llvm::GlobalValue::ExternalLinkage, nullptr,
7773 "OBJC_EHTYPE_id");
7774 if (CGM.getTriple().isOSBinFormatCOFF())
7775 IDEHType->setDLLStorageClass(getStorage(CGM, "OBJC_EHTYPE_id"));
7776 }
7777 return IDEHType;
7778 }
7779
7780 // All other types should be Objective-C interface pointer types.
7781 const ObjCObjectPointerType *PT = T->getAs<ObjCObjectPointerType>();
7782 assert(PT && "Invalid @catch type.")(static_cast <bool> (PT && "Invalid @catch type."
) ? void (0) : __assert_fail ("PT && \"Invalid @catch type.\""
, "clang/lib/CodeGen/CGObjCMac.cpp", 7782, __extension__ __PRETTY_FUNCTION__
))
;
7783
7784 const ObjCInterfaceType *IT = PT->getInterfaceType();
7785 assert(IT && "Invalid @catch type.")(static_cast <bool> (IT && "Invalid @catch type."
) ? void (0) : __assert_fail ("IT && \"Invalid @catch type.\""
, "clang/lib/CodeGen/CGObjCMac.cpp", 7785, __extension__ __PRETTY_FUNCTION__
))
;
7786
7787 return GetInterfaceEHType(IT->getDecl(), NotForDefinition);
7788}
7789
7790void CGObjCNonFragileABIMac::EmitTryStmt(CodeGen::CodeGenFunction &CGF,
7791 const ObjCAtTryStmt &S) {
7792 EmitTryCatchStmt(CGF, S, ObjCTypes.getObjCBeginCatchFn(),
7793 ObjCTypes.getObjCEndCatchFn(),
7794 ObjCTypes.getExceptionRethrowFn());
7795}
7796
7797/// EmitThrowStmt - Generate code for a throw statement.
7798void CGObjCNonFragileABIMac::EmitThrowStmt(CodeGen::CodeGenFunction &CGF,
7799 const ObjCAtThrowStmt &S,
7800 bool ClearInsertionPoint) {
7801 if (const Expr *ThrowExpr = S.getThrowExpr()) {
7802 llvm::Value *Exception = CGF.EmitObjCThrowOperand(ThrowExpr);
7803 Exception = CGF.Builder.CreateBitCast(Exception, ObjCTypes.ObjectPtrTy);
7804 llvm::CallBase *Call =
7805 CGF.EmitRuntimeCallOrInvoke(ObjCTypes.getExceptionThrowFn(), Exception);
7806 Call->setDoesNotReturn();
7807 } else {
7808 llvm::CallBase *Call =
7809 CGF.EmitRuntimeCallOrInvoke(ObjCTypes.getExceptionRethrowFn());
7810 Call->setDoesNotReturn();
7811 }
7812
7813 CGF.Builder.CreateUnreachable();
7814 if (ClearInsertionPoint)
7815 CGF.Builder.ClearInsertionPoint();
7816}
7817
7818llvm::Constant *
7819CGObjCNonFragileABIMac::GetInterfaceEHType(const ObjCInterfaceDecl *ID,
7820 ForDefinition_t IsForDefinition) {
7821 llvm::GlobalVariable * &Entry = EHTypeReferences[ID->getIdentifier()];
7822 StringRef ClassName = ID->getObjCRuntimeNameAsString();
7823
7824 // If we don't need a definition, return the entry if found or check
7825 // if we use an external reference.
7826 if (!IsForDefinition) {
7827 if (Entry)
7828 return Entry;
7829
7830 // If this type (or a super class) has the __objc_exception__
7831 // attribute, emit an external reference.
7832 if (hasObjCExceptionAttribute(CGM.getContext(), ID)) {
7833 std::string EHTypeName = ("OBJC_EHTYPE_$_" + ClassName).str();
7834 Entry = new llvm::GlobalVariable(CGM.getModule(), ObjCTypes.EHTypeTy,
7835 false, llvm::GlobalValue::ExternalLinkage,
7836 nullptr, EHTypeName);
7837 CGM.setGVProperties(Entry, ID);
7838 return Entry;
7839 }
7840 }
7841
7842 // Otherwise we need to either make a new entry or fill in the initializer.
7843 assert((!Entry || !Entry->hasInitializer()) && "Duplicate EHType definition")(static_cast <bool> ((!Entry || !Entry->hasInitializer
()) && "Duplicate EHType definition") ? void (0) : __assert_fail
("(!Entry || !Entry->hasInitializer()) && \"Duplicate EHType definition\""
, "clang/lib/CodeGen/CGObjCMac.cpp", 7843, __extension__ __PRETTY_FUNCTION__
))
;
7844
7845 std::string VTableName = "objc_ehtype_vtable";
7846 auto *VTableGV = CGM.getModule().getGlobalVariable(VTableName);
7847 if (!VTableGV) {
7848 VTableGV =
7849 new llvm::GlobalVariable(CGM.getModule(), ObjCTypes.Int8PtrTy, false,
7850 llvm::GlobalValue::ExternalLinkage, nullptr,
7851 VTableName);
7852 if (CGM.getTriple().isOSBinFormatCOFF())
7853 VTableGV->setDLLStorageClass(getStorage(CGM, VTableName));
7854 }
7855
7856 llvm::Value *VTableIdx = llvm::ConstantInt::get(CGM.Int32Ty, 2);
7857 ConstantInitBuilder builder(CGM);
7858 auto values = builder.beginStruct(ObjCTypes.EHTypeTy);
7859 values.add(
7860 llvm::ConstantExpr::getInBoundsGetElementPtr(VTableGV->getValueType(),
7861 VTableGV, VTableIdx));
7862 values.add(GetClassName(ClassName));
7863 values.add(GetClassGlobal(ID, /*metaclass*/ false, NotForDefinition));
7864
7865 llvm::GlobalValue::LinkageTypes L = IsForDefinition
7866 ? llvm::GlobalValue::ExternalLinkage
7867 : llvm::GlobalValue::WeakAnyLinkage;
7868 if (Entry) {
7869 values.finishAndSetAsInitializer(Entry);
7870 Entry->setAlignment(CGM.getPointerAlign().getAsAlign());
7871 } else {
7872 Entry = values.finishAndCreateGlobal("OBJC_EHTYPE_$_" + ClassName,
7873 CGM.getPointerAlign(),
7874 /*constant*/ false,
7875 L);
7876 if (hasObjCExceptionAttribute(CGM.getContext(), ID))
7877 CGM.setGVProperties(Entry, ID);
7878 }
7879 assert(Entry->getLinkage() == L)(static_cast <bool> (Entry->getLinkage() == L) ? void
(0) : __assert_fail ("Entry->getLinkage() == L", "clang/lib/CodeGen/CGObjCMac.cpp"
, 7879, __extension__ __PRETTY_FUNCTION__))
;
7880
7881 if (!CGM.getTriple().isOSBinFormatCOFF())
7882 if (ID->getVisibility() == HiddenVisibility)
7883 Entry->setVisibility(llvm::GlobalValue::HiddenVisibility);
7884
7885 if (IsForDefinition)
7886 if (CGM.getTriple().isOSBinFormatMachO())
7887 Entry->setSection("__DATA,__objc_const");
7888
7889 return Entry;
7890}
7891
7892/* *** */
7893
7894CodeGen::CGObjCRuntime *
7895CodeGen::CreateMacObjCRuntime(CodeGen::CodeGenModule &CGM) {
7896 switch (CGM.getLangOpts().ObjCRuntime.getKind()) {
7897 case ObjCRuntime::FragileMacOSX:
7898 return new CGObjCMac(CGM);
7899
7900 case ObjCRuntime::MacOSX:
7901 case ObjCRuntime::iOS:
7902 case ObjCRuntime::WatchOS:
7903 return new CGObjCNonFragileABIMac(CGM);
7904
7905 case ObjCRuntime::GNUstep:
7906 case ObjCRuntime::GCC:
7907 case ObjCRuntime::ObjFW:
7908 llvm_unreachable("these runtimes are not Mac runtimes")::llvm::llvm_unreachable_internal("these runtimes are not Mac runtimes"
, "clang/lib/CodeGen/CGObjCMac.cpp", 7908)
;
7909 }
7910 llvm_unreachable("bad runtime")::llvm::llvm_unreachable_internal("bad runtime", "clang/lib/CodeGen/CGObjCMac.cpp"
, 7910)
;
7911}

/build/llvm-toolchain-snapshot-14~++20220108111521+9345ab3a4550/clang/include/clang/AST/Type.h

1//===- Type.h - C Language Family Type Representation -----------*- 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/// \file
10/// C Language Family Type Representation
11///
12/// This file defines the clang::Type interface and subclasses, used to
13/// represent types for languages in the C family.
14//
15//===----------------------------------------------------------------------===//
16
17#ifndef LLVM_CLANG_AST_TYPE_H
18#define LLVM_CLANG_AST_TYPE_H
19
20#include "clang/AST/DependenceFlags.h"
21#include "clang/AST/NestedNameSpecifier.h"
22#include "clang/AST/TemplateName.h"
23#include "clang/Basic/AddressSpaces.h"
24#include "clang/Basic/AttrKinds.h"
25#include "clang/Basic/Diagnostic.h"
26#include "clang/Basic/ExceptionSpecificationType.h"
27#include "clang/Basic/LLVM.h"
28#include "clang/Basic/Linkage.h"
29#include "clang/Basic/PartialDiagnostic.h"
30#include "clang/Basic/SourceLocation.h"
31#include "clang/Basic/Specifiers.h"
32#include "clang/Basic/Visibility.h"
33#include "llvm/ADT/APInt.h"
34#include "llvm/ADT/APSInt.h"
35#include "llvm/ADT/ArrayRef.h"
36#include "llvm/ADT/FoldingSet.h"
37#include "llvm/ADT/None.h"
38#include "llvm/ADT/Optional.h"
39#include "llvm/ADT/PointerIntPair.h"
40#include "llvm/ADT/PointerUnion.h"
41#include "llvm/ADT/StringRef.h"
42#include "llvm/ADT/Twine.h"
43#include "llvm/ADT/iterator_range.h"
44#include "llvm/Support/Casting.h"
45#include "llvm/Support/Compiler.h"
46#include "llvm/Support/ErrorHandling.h"
47#include "llvm/Support/PointerLikeTypeTraits.h"
48#include "llvm/Support/TrailingObjects.h"
49#include "llvm/Support/type_traits.h"
50#include <cassert>
51#include <cstddef>
52#include <cstdint>
53#include <cstring>
54#include <string>
55#include <type_traits>
56#include <utility>
57
58namespace clang {
59
60class ExtQuals;
61class QualType;
62class ConceptDecl;
63class TagDecl;
64class TemplateParameterList;
65class Type;
66
67enum {
68 TypeAlignmentInBits = 4,
69 TypeAlignment = 1 << TypeAlignmentInBits
70};
71
72namespace serialization {
73 template <class T> class AbstractTypeReader;
74 template <class T> class AbstractTypeWriter;
75}
76
77} // namespace clang
78
79namespace llvm {
80
81 template <typename T>
82 struct PointerLikeTypeTraits;
83 template<>
84 struct PointerLikeTypeTraits< ::clang::Type*> {
85 static inline void *getAsVoidPointer(::clang::Type *P) { return P; }
86
87 static inline ::clang::Type *getFromVoidPointer(void *P) {
88 return static_cast< ::clang::Type*>(P);
89 }
90
91 static constexpr int NumLowBitsAvailable = clang::TypeAlignmentInBits;
92 };
93
94 template<>
95 struct PointerLikeTypeTraits< ::clang::ExtQuals*> {
96 static inline void *getAsVoidPointer(::clang::ExtQuals *P) { return P; }
97
98 static inline ::clang::ExtQuals *getFromVoidPointer(void *P) {
99 return static_cast< ::clang::ExtQuals*>(P);
100 }
101
102 static constexpr int NumLowBitsAvailable = clang::TypeAlignmentInBits;
103 };
104
105} // namespace llvm
106
107namespace clang {
108
109class ASTContext;
110template <typename> class CanQual;
111class CXXRecordDecl;
112class DeclContext;
113class EnumDecl;
114class Expr;
115class ExtQualsTypeCommonBase;
116class FunctionDecl;
117class IdentifierInfo;
118class NamedDecl;
119class ObjCInterfaceDecl;
120class ObjCProtocolDecl;
121class ObjCTypeParamDecl;
122struct PrintingPolicy;
123class RecordDecl;
124class Stmt;
125class TagDecl;
126class TemplateArgument;
127class TemplateArgumentListInfo;
128class TemplateArgumentLoc;
129class TemplateTypeParmDecl;
130class TypedefNameDecl;
131class UnresolvedUsingTypenameDecl;
132class UsingShadowDecl;
133
134using CanQualType = CanQual<Type>;
135
136// Provide forward declarations for all of the *Type classes.
137#define TYPE(Class, Base) class Class##Type;
138#include "clang/AST/TypeNodes.inc"
139
140/// The collection of all-type qualifiers we support.
141/// Clang supports five independent qualifiers:
142/// * C99: const, volatile, and restrict
143/// * MS: __unaligned
144/// * Embedded C (TR18037): address spaces
145/// * Objective C: the GC attributes (none, weak, or strong)
146class Qualifiers {
147public:
148 enum TQ { // NOTE: These flags must be kept in sync with DeclSpec::TQ.
149 Const = 0x1,
150 Restrict = 0x2,
151 Volatile = 0x4,
152 CVRMask = Const | Volatile | Restrict
153 };
154
155 enum GC {
156 GCNone = 0,
157 Weak,
158 Strong
159 };
160
161 enum ObjCLifetime {
162 /// There is no lifetime qualification on this type.
163 OCL_None,
164
165 /// This object can be modified without requiring retains or
166 /// releases.
167 OCL_ExplicitNone,
168
169 /// Assigning into this object requires the old value to be
170 /// released and the new value to be retained. The timing of the
171 /// release of the old value is inexact: it may be moved to
172 /// immediately after the last known point where the value is
173 /// live.
174 OCL_Strong,
175
176 /// Reading or writing from this object requires a barrier call.
177 OCL_Weak,
178
179 /// Assigning into this object requires a lifetime extension.
180 OCL_Autoreleasing
181 };
182
183 enum {
184 /// The maximum supported address space number.
185 /// 23 bits should be enough for anyone.
186 MaxAddressSpace = 0x7fffffu,
187
188 /// The width of the "fast" qualifier mask.
189 FastWidth = 3,
190
191 /// The fast qualifier mask.
192 FastMask = (1 << FastWidth) - 1
193 };
194
195 /// Returns the common set of qualifiers while removing them from
196 /// the given sets.
197 static Qualifiers removeCommonQualifiers(Qualifiers &L, Qualifiers &R) {
198 // If both are only CVR-qualified, bit operations are sufficient.
199 if (!(L.Mask & ~CVRMask) && !(R.Mask & ~CVRMask)) {
200 Qualifiers Q;
201 Q.Mask = L.Mask & R.Mask;
202 L.Mask &= ~Q.Mask;
203 R.Mask &= ~Q.Mask;
204 return Q;
205 }
206
207 Qualifiers Q;
208 unsigned CommonCRV = L.getCVRQualifiers() & R.getCVRQualifiers();
209 Q.addCVRQualifiers(CommonCRV);
210 L.removeCVRQualifiers(CommonCRV);
211 R.removeCVRQualifiers(CommonCRV);
212
213 if (L.getObjCGCAttr() == R.getObjCGCAttr()) {
214 Q.setObjCGCAttr(L.getObjCGCAttr());
215 L.removeObjCGCAttr();
216 R.removeObjCGCAttr();
217 }
218
219 if (L.getObjCLifetime() == R.getObjCLifetime()) {
220 Q.setObjCLifetime(L.getObjCLifetime());
221 L.removeObjCLifetime();
222 R.removeObjCLifetime();
223 }
224
225 if (L.getAddressSpace() == R.getAddressSpace()) {
226 Q.setAddressSpace(L.getAddressSpace());
227 L.removeAddressSpace();
228 R.removeAddressSpace();
229 }
230 return Q;
231 }
232
233 static Qualifiers fromFastMask(unsigned Mask) {
234 Qualifiers Qs;
235 Qs.addFastQualifiers(Mask);
236 return Qs;
237 }
238
239 static Qualifiers fromCVRMask(unsigned CVR) {
240 Qualifiers Qs;
241 Qs.addCVRQualifiers(CVR);
242 return Qs;
243 }
244
245 static Qualifiers fromCVRUMask(unsigned CVRU) {
246 Qualifiers Qs;
247 Qs.addCVRUQualifiers(CVRU);
248 return Qs;
249 }
250
251 // Deserialize qualifiers from an opaque representation.
252 static Qualifiers fromOpaqueValue(unsigned opaque) {
253 Qualifiers Qs;
254 Qs.Mask = opaque;
255 return Qs;
256 }
257
258 // Serialize these qualifiers into an opaque representation.
259 unsigned getAsOpaqueValue() const {
260 return Mask;
261 }
262
263 bool hasConst() const { return Mask & Const; }
264 bool hasOnlyConst() const { return Mask == Const; }
265 void removeConst() { Mask &= ~Const; }
266 void addConst() { Mask |= Const; }
267
268 bool hasVolatile() const { return Mask & Volatile; }
269 bool hasOnlyVolatile() const { return Mask == Volatile; }
270 void removeVolatile() { Mask &= ~Volatile; }
271 void addVolatile() { Mask |= Volatile; }
272
273 bool hasRestrict() const { return Mask & Restrict; }
274 bool hasOnlyRestrict() const { return Mask == Restrict; }
275 void removeRestrict() { Mask &= ~Restrict; }
276 void addRestrict() { Mask |= Restrict; }
277
278 bool hasCVRQualifiers() const { return getCVRQualifiers(); }
279 unsigned getCVRQualifiers() const { return Mask & CVRMask; }
280 unsigned getCVRUQualifiers() const { return Mask & (CVRMask | UMask); }
281
282 void setCVRQualifiers(unsigned mask) {
283 assert(!(mask & ~CVRMask) && "bitmask contains non-CVR bits")(static_cast <bool> (!(mask & ~CVRMask) && "bitmask contains non-CVR bits"
) ? void (0) : __assert_fail ("!(mask & ~CVRMask) && \"bitmask contains non-CVR bits\""
, "clang/include/clang/AST/Type.h", 283, __extension__ __PRETTY_FUNCTION__
))
;
284 Mask = (Mask & ~CVRMask) | mask;
285 }
286 void removeCVRQualifiers(unsigned mask) {
287 assert(!(mask & ~CVRMask) && "bitmask contains non-CVR bits")(static_cast <bool> (!(mask & ~CVRMask) && "bitmask contains non-CVR bits"
) ? void (0) : __assert_fail ("!(mask & ~CVRMask) && \"bitmask contains non-CVR bits\""
, "clang/include/clang/AST/Type.h", 287, __extension__ __PRETTY_FUNCTION__
))
;
288 Mask &= ~mask;
289 }
290 void removeCVRQualifiers() {
291 removeCVRQualifiers(CVRMask);
292 }
293 void addCVRQualifiers(unsigned mask) {
294 assert(!(mask & ~CVRMask) && "bitmask contains non-CVR bits")(static_cast <bool> (!(mask & ~CVRMask) && "bitmask contains non-CVR bits"
) ? void (0) : __assert_fail ("!(mask & ~CVRMask) && \"bitmask contains non-CVR bits\""
, "clang/include/clang/AST/Type.h", 294, __extension__ __PRETTY_FUNCTION__
))
;
295 Mask |= mask;
296 }
297 void addCVRUQualifiers(unsigned mask) {
298 assert(!(mask & ~CVRMask & ~UMask) && "bitmask contains non-CVRU bits")(static_cast <bool> (!(mask & ~CVRMask & ~UMask
) && "bitmask contains non-CVRU bits") ? void (0) : __assert_fail
("!(mask & ~CVRMask & ~UMask) && \"bitmask contains non-CVRU bits\""
, "clang/include/clang/AST/Type.h", 298, __extension__ __PRETTY_FUNCTION__
))
;
299 Mask |= mask;
300 }
301
302 bool hasUnaligned() const { return Mask & UMask; }
303 void setUnaligned(bool flag) {
304 Mask = (Mask & ~UMask) | (flag ? UMask : 0);
305 }
306 void removeUnaligned() { Mask &= ~UMask; }
307 void addUnaligned() { Mask |= UMask; }
308
309 bool hasObjCGCAttr() const { return Mask & GCAttrMask; }
310 GC getObjCGCAttr() const { return GC((Mask & GCAttrMask) >> GCAttrShift); }
311 void setObjCGCAttr(GC type) {
312 Mask = (Mask & ~GCAttrMask) | (type << GCAttrShift);
313 }
314 void removeObjCGCAttr() { setObjCGCAttr(GCNone); }
315 void addObjCGCAttr(GC type) {
316 assert(type)(static_cast <bool> (type) ? void (0) : __assert_fail (
"type", "clang/include/clang/AST/Type.h", 316, __extension__ __PRETTY_FUNCTION__
))
;
317 setObjCGCAttr(type);
318 }
319 Qualifiers withoutObjCGCAttr() const {
320 Qualifiers qs = *this;
321 qs.removeObjCGCAttr();
322 return qs;
323 }
324 Qualifiers withoutObjCLifetime() const {
325 Qualifiers qs = *this;
326 qs.removeObjCLifetime();
327 return qs;
328 }
329 Qualifiers withoutAddressSpace() const {
330 Qualifiers qs = *this;
331 qs.removeAddressSpace();
332 return qs;
333 }
334
335 bool hasObjCLifetime() const { return Mask & LifetimeMask; }
336 ObjCLifetime getObjCLifetime() const {
337 return ObjCLifetime((Mask & LifetimeMask) >> LifetimeShift);
338 }
339 void setObjCLifetime(ObjCLifetime type) {
340 Mask = (Mask & ~LifetimeMask) | (type << LifetimeShift);
341 }
342 void removeObjCLifetime() { setObjCLifetime(OCL_None); }
343 void addObjCLifetime(ObjCLifetime type) {
344 assert(type)(static_cast <bool> (type) ? void (0) : __assert_fail (
"type", "clang/include/clang/AST/Type.h", 344, __extension__ __PRETTY_FUNCTION__
))
;
345 assert(!hasObjCLifetime())(static_cast <bool> (!hasObjCLifetime()) ? void (0) : __assert_fail
("!hasObjCLifetime()", "clang/include/clang/AST/Type.h", 345
, __extension__ __PRETTY_FUNCTION__))
;
346 Mask |= (type << LifetimeShift);
347 }
348
349 /// True if the lifetime is neither None or ExplicitNone.
350 bool hasNonTrivialObjCLifetime() const {
351 ObjCLifetime lifetime = getObjCLifetime();
352 return (lifetime > OCL_ExplicitNone);
353 }
354
355 /// True if the lifetime is either strong or weak.
356 bool hasStrongOrWeakObjCLifetime() const {
357 ObjCLifetime lifetime = getObjCLifetime();
358 return (lifetime == OCL_Strong || lifetime == OCL_Weak);
359 }
360
361 bool hasAddressSpace() const { return Mask & AddressSpaceMask; }
362 LangAS getAddressSpace() const {
363 return static_cast<LangAS>(Mask >> AddressSpaceShift);
364 }
365 bool hasTargetSpecificAddressSpace() const {
366 return isTargetAddressSpace(getAddressSpace());
367 }
368 /// Get the address space attribute value to be printed by diagnostics.
369 unsigned getAddressSpaceAttributePrintValue() const {
370 auto Addr = getAddressSpace();
371 // This function is not supposed to be used with language specific
372 // address spaces. If that happens, the diagnostic message should consider
373 // printing the QualType instead of the address space value.
374 assert(Addr == LangAS::Default || hasTargetSpecificAddressSpace())(static_cast <bool> (Addr == LangAS::Default || hasTargetSpecificAddressSpace
()) ? void (0) : __assert_fail ("Addr == LangAS::Default || hasTargetSpecificAddressSpace()"
, "clang/include/clang/AST/Type.h", 374, __extension__ __PRETTY_FUNCTION__
))
;
375 if (Addr != LangAS::Default)
376 return toTargetAddressSpace(Addr);
377 // TODO: The diagnostic messages where Addr may be 0 should be fixed
378 // since it cannot differentiate the situation where 0 denotes the default
379 // address space or user specified __attribute__((address_space(0))).
380 return 0;
381 }
382 void setAddressSpace(LangAS space) {
383 assert((unsigned)space <= MaxAddressSpace)(static_cast <bool> ((unsigned)space <= MaxAddressSpace
) ? void (0) : __assert_fail ("(unsigned)space <= MaxAddressSpace"
, "clang/include/clang/AST/Type.h", 383, __extension__ __PRETTY_FUNCTION__
))
;
384 Mask = (Mask & ~AddressSpaceMask)
385 | (((uint32_t) space) << AddressSpaceShift);
386 }
387 void removeAddressSpace() { setAddressSpace(LangAS::Default); }
388 void addAddressSpace(LangAS space) {
389 assert(space != LangAS::Default)(static_cast <bool> (space != LangAS::Default) ? void (
0) : __assert_fail ("space != LangAS::Default", "clang/include/clang/AST/Type.h"
, 389, __extension__ __PRETTY_FUNCTION__))
;
390 setAddressSpace(space);
391 }
392
393 // Fast qualifiers are those that can be allocated directly
394 // on a QualType object.
395 bool hasFastQualifiers() const { return getFastQualifiers(); }
396 unsigned getFastQualifiers() const { return Mask & FastMask; }
397 void setFastQualifiers(unsigned mask) {
398 assert(!(mask & ~FastMask) && "bitmask contains non-fast qualifier bits")(static_cast <bool> (!(mask & ~FastMask) &&
"bitmask contains non-fast qualifier bits") ? void (0) : __assert_fail
("!(mask & ~FastMask) && \"bitmask contains non-fast qualifier bits\""
, "clang/include/clang/AST/Type.h", 398, __extension__ __PRETTY_FUNCTION__
))
;
399 Mask = (Mask & ~FastMask) | mask;
400 }
401 void removeFastQualifiers(unsigned mask) {
402 assert(!(mask & ~FastMask) && "bitmask contains non-fast qualifier bits")(static_cast <bool> (!(mask & ~FastMask) &&
"bitmask contains non-fast qualifier bits") ? void (0) : __assert_fail
("!(mask & ~FastMask) && \"bitmask contains non-fast qualifier bits\""
, "clang/include/clang/AST/Type.h", 402, __extension__ __PRETTY_FUNCTION__
))
;
403 Mask &= ~mask;
404 }
405 void removeFastQualifiers() {
406 removeFastQualifiers(FastMask);
407 }
408 void addFastQualifiers(unsigned mask) {
409 assert(!(mask & ~FastMask) && "bitmask contains non-fast qualifier bits")(static_cast <bool> (!(mask & ~FastMask) &&
"bitmask contains non-fast qualifier bits") ? void (0) : __assert_fail
("!(mask & ~FastMask) && \"bitmask contains non-fast qualifier bits\""
, "clang/include/clang/AST/Type.h", 409, __extension__ __PRETTY_FUNCTION__
))
;
410 Mask |= mask;
411 }
412
413 /// Return true if the set contains any qualifiers which require an ExtQuals
414 /// node to be allocated.
415 bool hasNonFastQualifiers() const { return Mask & ~FastMask; }
416 Qualifiers getNonFastQualifiers() const {
417 Qualifiers Quals = *this;
418 Quals.setFastQualifiers(0);
419 return Quals;
420 }
421
422 /// Return true if the set contains any qualifiers.
423 bool hasQualifiers() const { return Mask; }
424 bool empty() const { return !Mask; }
425
426 /// Add the qualifiers from the given set to this set.
427 void addQualifiers(Qualifiers Q) {
428 // If the other set doesn't have any non-boolean qualifiers, just
429 // bit-or it in.
430 if (!(Q.Mask & ~CVRMask))
431 Mask |= Q.Mask;
432 else {
433 Mask |= (Q.Mask & CVRMask);
434 if (Q.hasAddressSpace())
435 addAddressSpace(Q.getAddressSpace());
436 if (Q.hasObjCGCAttr())
437 addObjCGCAttr(Q.getObjCGCAttr());
438 if (Q.hasObjCLifetime())
439 addObjCLifetime(Q.getObjCLifetime());
440 }
441 }
442
443 /// Remove the qualifiers from the given set from this set.
444 void removeQualifiers(Qualifiers Q) {
445 // If the other set doesn't have any non-boolean qualifiers, just
446 // bit-and the inverse in.
447 if (!(Q.Mask & ~CVRMask))
448 Mask &= ~Q.Mask;
449 else {
450 Mask &= ~(Q.Mask & CVRMask);
451 if (getObjCGCAttr() == Q.getObjCGCAttr())
452 removeObjCGCAttr();
453 if (getObjCLifetime() == Q.getObjCLifetime())
454 removeObjCLifetime();
455 if (getAddressSpace() == Q.getAddressSpace())
456 removeAddressSpace();
457 }
458 }
459
460 /// Add the qualifiers from the given set to this set, given that
461 /// they don't conflict.
462 void addConsistentQualifiers(Qualifiers qs) {
463 assert(getAddressSpace() == qs.getAddressSpace() ||(static_cast <bool> (getAddressSpace() == qs.getAddressSpace
() || !hasAddressSpace() || !qs.hasAddressSpace()) ? void (0)
: __assert_fail ("getAddressSpace() == qs.getAddressSpace() || !hasAddressSpace() || !qs.hasAddressSpace()"
, "clang/include/clang/AST/Type.h", 464, __extension__ __PRETTY_FUNCTION__
))
464 !hasAddressSpace() || !qs.hasAddressSpace())(static_cast <bool> (getAddressSpace() == qs.getAddressSpace
() || !hasAddressSpace() || !qs.hasAddressSpace()) ? void (0)
: __assert_fail ("getAddressSpace() == qs.getAddressSpace() || !hasAddressSpace() || !qs.hasAddressSpace()"
, "clang/include/clang/AST/Type.h", 464, __extension__ __PRETTY_FUNCTION__
))
;
465 assert(getObjCGCAttr() == qs.getObjCGCAttr() ||(static_cast <bool> (getObjCGCAttr() == qs.getObjCGCAttr
() || !hasObjCGCAttr() || !qs.hasObjCGCAttr()) ? void (0) : __assert_fail
("getObjCGCAttr() == qs.getObjCGCAttr() || !hasObjCGCAttr() || !qs.hasObjCGCAttr()"
, "clang/include/clang/AST/Type.h", 466, __extension__ __PRETTY_FUNCTION__
))
466 !hasObjCGCAttr() || !qs.hasObjCGCAttr())(static_cast <bool> (getObjCGCAttr() == qs.getObjCGCAttr
() || !hasObjCGCAttr() || !qs.hasObjCGCAttr()) ? void (0) : __assert_fail
("getObjCGCAttr() == qs.getObjCGCAttr() || !hasObjCGCAttr() || !qs.hasObjCGCAttr()"
, "clang/include/clang/AST/Type.h", 466, __extension__ __PRETTY_FUNCTION__
))
;
467 assert(getObjCLifetime() == qs.getObjCLifetime() ||(static_cast <bool> (getObjCLifetime() == qs.getObjCLifetime
() || !hasObjCLifetime() || !qs.hasObjCLifetime()) ? void (0)
: __assert_fail ("getObjCLifetime() == qs.getObjCLifetime() || !hasObjCLifetime() || !qs.hasObjCLifetime()"
, "clang/include/clang/AST/Type.h", 468, __extension__ __PRETTY_FUNCTION__
))
468 !hasObjCLifetime() || !qs.hasObjCLifetime())(static_cast <bool> (getObjCLifetime() == qs.getObjCLifetime
() || !hasObjCLifetime() || !qs.hasObjCLifetime()) ? void (0)
: __assert_fail ("getObjCLifetime() == qs.getObjCLifetime() || !hasObjCLifetime() || !qs.hasObjCLifetime()"
, "clang/include/clang/AST/Type.h", 468, __extension__ __PRETTY_FUNCTION__
))
;
469 Mask |= qs.Mask;
470 }
471
472 /// Returns true if address space A is equal to or a superset of B.
473 /// OpenCL v2.0 defines conversion rules (OpenCLC v2.0 s6.5.5) and notion of
474 /// overlapping address spaces.
475 /// CL1.1 or CL1.2:
476 /// every address space is a superset of itself.
477 /// CL2.0 adds:
478 /// __generic is a superset of any address space except for __constant.
479 static bool isAddressSpaceSupersetOf(LangAS A, LangAS B) {
480 // Address spaces must match exactly.
481 return A == B ||
482 // Otherwise in OpenCLC v2.0 s6.5.5: every address space except
483 // for __constant can be used as __generic.
484 (A == LangAS::opencl_generic && B != LangAS::opencl_constant) ||
485 // We also define global_device and global_host address spaces,
486 // to distinguish global pointers allocated on host from pointers
487 // allocated on device, which are a subset of __global.
488 (A == LangAS::opencl_global && (B == LangAS::opencl_global_device ||
489 B == LangAS::opencl_global_host)) ||
490 (A == LangAS::sycl_global && (B == LangAS::sycl_global_device ||
491 B == LangAS::sycl_global_host)) ||
492 // Consider pointer size address spaces to be equivalent to default.
493 ((isPtrSizeAddressSpace(A) || A == LangAS::Default) &&
494 (isPtrSizeAddressSpace(B) || B == LangAS::Default)) ||
495 // Default is a superset of SYCL address spaces.
496 (A == LangAS::Default &&
497 (B == LangAS::sycl_private || B == LangAS::sycl_local ||
498 B == LangAS::sycl_global || B == LangAS::sycl_global_device ||
499 B == LangAS::sycl_global_host)) ||
500 // In HIP device compilation, any cuda address space is allowed
501 // to implicitly cast into the default address space.
502 (A == LangAS::Default &&
503 (B == LangAS::cuda_constant || B == LangAS::cuda_device ||
504 B == LangAS::cuda_shared));
505 }
506
507 /// Returns true if the address space in these qualifiers is equal to or
508 /// a superset of the address space in the argument qualifiers.
509 bool isAddressSpaceSupersetOf(Qualifiers other) const {
510 return isAddressSpaceSupersetOf(getAddressSpace(), other.getAddressSpace());
511 }
512
513 /// Determines if these qualifiers compatibly include another set.
514 /// Generally this answers the question of whether an object with the other
515 /// qualifiers can be safely used as an object with these qualifiers.
516 bool compatiblyIncludes(Qualifiers other) const {
517 return isAddressSpaceSupersetOf(other) &&
518 // ObjC GC qualifiers can match, be added, or be removed, but can't
519 // be changed.
520 (getObjCGCAttr() == other.getObjCGCAttr() || !hasObjCGCAttr() ||
521 !other.hasObjCGCAttr()) &&
522 // ObjC lifetime qualifiers must match exactly.
523 getObjCLifetime() == other.getObjCLifetime() &&
524 // CVR qualifiers may subset.
525 (((Mask & CVRMask) | (other.Mask & CVRMask)) == (Mask & CVRMask)) &&
526 // U qualifier may superset.
527 (!other.hasUnaligned() || hasUnaligned());
528 }
529
530 /// Determines if these qualifiers compatibly include another set of
531 /// qualifiers from the narrow perspective of Objective-C ARC lifetime.
532 ///
533 /// One set of Objective-C lifetime qualifiers compatibly includes the other
534 /// if the lifetime qualifiers match, or if both are non-__weak and the
535 /// including set also contains the 'const' qualifier, or both are non-__weak
536 /// and one is None (which can only happen in non-ARC modes).
537 bool compatiblyIncludesObjCLifetime(Qualifiers other) const {
538 if (getObjCLifetime() == other.getObjCLifetime())
539 return true;
540
541 if (getObjCLifetime() == OCL_Weak || other.getObjCLifetime() == OCL_Weak)
542 return false;
543
544 if (getObjCLifetime() == OCL_None || other.getObjCLifetime() == OCL_None)
545 return true;
546
547 return hasConst();
548 }
549
550 /// Determine whether this set of qualifiers is a strict superset of
551 /// another set of qualifiers, not considering qualifier compatibility.
552 bool isStrictSupersetOf(Qualifiers Other) const;
553
554 bool operator==(Qualifiers Other) const { return Mask == Other.Mask; }
555 bool operator!=(Qualifiers Other) const { return Mask != Other.Mask; }
556
557 explicit operator bool() const { return hasQualifiers(); }
558
559 Qualifiers &operator+=(Qualifiers R) {
560 addQualifiers(R);
561 return *this;
562 }
563
564 // Union two qualifier sets. If an enumerated qualifier appears
565 // in both sets, use the one from the right.
566 friend Qualifiers operator+(Qualifiers L, Qualifiers R) {
567 L += R;
568 return L;
569 }
570
571 Qualifiers &operator-=(Qualifiers R) {
572 removeQualifiers(R);
573 return *this;
574 }
575
576 /// Compute the difference between two qualifier sets.
577 friend Qualifiers operator-(Qualifiers L, Qualifiers R) {
578 L -= R;
579 return L;
580 }
581
582 std::string getAsString() const;
583 std::string getAsString(const PrintingPolicy &Policy) const;
584
585 static std::string getAddrSpaceAsString(LangAS AS);
586
587 bool isEmptyWhenPrinted(const PrintingPolicy &Policy) const;
588 void print(raw_ostream &OS, const PrintingPolicy &Policy,
589 bool appendSpaceIfNonEmpty = false) const;
590
591 void Profile(llvm::FoldingSetNodeID &ID) const {
592 ID.AddInteger(Mask);
593 }
594
595private:
596 // bits: |0 1 2|3|4 .. 5|6 .. 8|9 ... 31|
597 // |C R V|U|GCAttr|Lifetime|AddressSpace|
598 uint32_t Mask = 0;
599
600 static const uint32_t UMask = 0x8;
601 static const uint32_t UShift = 3;
602 static const uint32_t GCAttrMask = 0x30;
603 static const uint32_t GCAttrShift = 4;
604 static const uint32_t LifetimeMask = 0x1C0;
605 static const uint32_t LifetimeShift = 6;
606 static const uint32_t AddressSpaceMask =
607 ~(CVRMask | UMask | GCAttrMask | LifetimeMask);
608 static const uint32_t AddressSpaceShift = 9;
609};
610
611/// A std::pair-like structure for storing a qualified type split
612/// into its local qualifiers and its locally-unqualified type.
613struct SplitQualType {
614 /// The locally-unqualified type.
615 const Type *Ty = nullptr;
616
617 /// The local qualifiers.
618 Qualifiers Quals;
619
620 SplitQualType() = default;
621 SplitQualType(const Type *ty, Qualifiers qs) : Ty(ty), Quals(qs) {}
622
623 SplitQualType getSingleStepDesugaredType() const; // end of this file
624
625 // Make std::tie work.
626 std::pair<const Type *,Qualifiers> asPair() const {
627 return std::pair<const Type *, Qualifiers>(Ty, Quals);
628 }
629
630 friend bool operator==(SplitQualType a, SplitQualType b) {
631 return a.Ty == b.Ty && a.Quals == b.Quals;
632 }
633 friend bool operator!=(SplitQualType a, SplitQualType b) {
634 return a.Ty != b.Ty || a.Quals != b.Quals;
635 }
636};
637
638/// The kind of type we are substituting Objective-C type arguments into.
639///
640/// The kind of substitution affects the replacement of type parameters when
641/// no concrete type information is provided, e.g., when dealing with an
642/// unspecialized type.
643enum class ObjCSubstitutionContext {
644 /// An ordinary type.
645 Ordinary,
646
647 /// The result type of a method or function.
648 Result,
649
650 /// The parameter type of a method or function.
651 Parameter,
652
653 /// The type of a property.
654 Property,
655
656 /// The superclass of a type.
657 Superclass,
658};
659
660/// A (possibly-)qualified type.
661///
662/// For efficiency, we don't store CV-qualified types as nodes on their
663/// own: instead each reference to a type stores the qualifiers. This
664/// greatly reduces the number of nodes we need to allocate for types (for
665/// example we only need one for 'int', 'const int', 'volatile int',
666/// 'const volatile int', etc).
667///
668/// As an added efficiency bonus, instead of making this a pair, we
669/// just store the two bits we care about in the low bits of the
670/// pointer. To handle the packing/unpacking, we make QualType be a
671/// simple wrapper class that acts like a smart pointer. A third bit
672/// indicates whether there are extended qualifiers present, in which
673/// case the pointer points to a special structure.
674class QualType {
675 friend class QualifierCollector;
676
677 // Thankfully, these are efficiently composable.
678 llvm::PointerIntPair<llvm::PointerUnion<const Type *, const ExtQuals *>,
679 Qualifiers::FastWidth> Value;
680
681 const ExtQuals *getExtQualsUnsafe() const {
682 return Value.getPointer().get<const ExtQuals*>();
683 }
684
685 const Type *getTypePtrUnsafe() const {
686 return Value.getPointer().get<const Type*>();
687 }
688
689 const ExtQualsTypeCommonBase *getCommonPtr() const {
690 assert(!isNull() && "Cannot retrieve a NULL type pointer")(static_cast <bool> (!isNull() && "Cannot retrieve a NULL type pointer"
) ? void (0) : __assert_fail ("!isNull() && \"Cannot retrieve a NULL type pointer\""
, "clang/include/clang/AST/Type.h", 690, __extension__ __PRETTY_FUNCTION__
))
;
691 auto CommonPtrVal = reinterpret_cast<uintptr_t>(Value.getOpaqueValue());
692 CommonPtrVal &= ~(uintptr_t)((1 << TypeAlignmentInBits) - 1);
693 return reinterpret_cast<ExtQualsTypeCommonBase*>(CommonPtrVal);
694 }
695
696public:
697 QualType() = default;
698 QualType(const Type *Ptr, unsigned Quals) : Value(Ptr, Quals) {}
699 QualType(const ExtQuals *Ptr, unsigned Quals) : Value(Ptr, Quals) {}
700
701 unsigned getLocalFastQualifiers() const { return Value.getInt(); }
702 void setLocalFastQualifiers(unsigned Quals) { Value.setInt(Quals); }
703
704 /// Retrieves a pointer to the underlying (unqualified) type.
705 ///
706 /// This function requires that the type not be NULL. If the type might be
707 /// NULL, use the (slightly less efficient) \c getTypePtrOrNull().
708 const Type *getTypePtr() const;
709
710 const Type *getTypePtrOrNull() const;
711
712 /// Retrieves a pointer to the name of the base type.
713 const IdentifierInfo *getBaseTypeIdentifier() const;
714
715 /// Divides a QualType into its unqualified type and a set of local
716 /// qualifiers.
717 SplitQualType split() const;
718
719 void *getAsOpaquePtr() const { return Value.getOpaqueValue(); }
720
721 static QualType getFromOpaquePtr(const void *Ptr) {
722 QualType T;
723 T.Value.setFromOpaqueValue(const_cast<void*>(Ptr));
724 return T;
725 }
726
727 const Type &operator*() const {
728 return *getTypePtr();
729 }
730
731 const Type *operator->() const {
732 return getTypePtr();
733 }
734
735 bool isCanonical() const;
736 bool isCanonicalAsParam() const;
737
738 /// Return true if this QualType doesn't point to a type yet.
739 bool isNull() const {
740 return Value.getPointer().isNull();
741 }
742
743 /// Determine whether this particular QualType instance has the
744 /// "const" qualifier set, without looking through typedefs that may have
745 /// added "const" at a different level.
746 bool isLocalConstQualified() const {
747 return (getLocalFastQualifiers() & Qualifiers::Const);
748 }
749
750 /// Determine whether this type is const-qualified.
751 bool isConstQualified() const;
752
753 /// Determine whether this particular QualType instance has the
754 /// "restrict" qualifier set, without looking through typedefs that may have
755 /// added "restrict" at a different level.
756 bool isLocalRestrictQualified() const {
757 return (getLocalFastQualifiers() & Qualifiers::Restrict);
758 }
759
760 /// Determine whether this type is restrict-qualified.
761 bool isRestrictQualified() const;
762
763 /// Determine whether this particular QualType instance has the
764 /// "volatile" qualifier set, without looking through typedefs that may have
765 /// added "volatile" at a different level.
766 bool isLocalVolatileQualified() const {
767 return (getLocalFastQualifiers() & Qualifiers::Volatile);
768 }
769
770 /// Determine whether this type is volatile-qualified.
771 bool isVolatileQualified() const;
772
773 /// Determine whether this particular QualType instance has any
774 /// qualifiers, without looking through any typedefs that might add
775 /// qualifiers at a different level.
776 bool hasLocalQualifiers() const {
777 return getLocalFastQualifiers() || hasLocalNonFastQualifiers();
778 }
779
780 /// Determine whether this type has any qualifiers.
781 bool hasQualifiers() const;
782
783 /// Determine whether this particular QualType instance has any
784 /// "non-fast" qualifiers, e.g., those that are stored in an ExtQualType
785 /// instance.
786 bool hasLocalNonFastQualifiers() const {
787 return Value.getPointer().is<const ExtQuals*>();
788 }
789
790 /// Retrieve the set of qualifiers local to this particular QualType
791 /// instance, not including any qualifiers acquired through typedefs or
792 /// other sugar.
793 Qualifiers getLocalQualifiers() const;
794
795 /// Retrieve the set of qualifiers applied to this type.
796 Qualifiers getQualifiers() const;
797
798 /// Retrieve the set of CVR (const-volatile-restrict) qualifiers
799 /// local to this particular QualType instance, not including any qualifiers
800 /// acquired through typedefs or other sugar.
801 unsigned getLocalCVRQualifiers() const {
802 return getLocalFastQualifiers();
803 }
804
805 /// Retrieve the set of CVR (const-volatile-restrict) qualifiers
806 /// applied to this type.
807 unsigned getCVRQualifiers() const;
808
809 bool isConstant(const ASTContext& Ctx) const {
810 return QualType::isConstant(*this, Ctx);
811 }
812
813 /// Determine whether this is a Plain Old Data (POD) type (C++ 3.9p10).
814 bool isPODType(const ASTContext &Context) const;
815
816 /// Return true if this is a POD type according to the rules of the C++98
817 /// standard, regardless of the current compilation's language.
818 bool isCXX98PODType(const ASTContext &Context) const;
819
820 /// Return true if this is a POD type according to the more relaxed rules
821 /// of the C++11 standard, regardless of the current compilation's language.
822 /// (C++0x [basic.types]p9). Note that, unlike
823 /// CXXRecordDecl::isCXX11StandardLayout, this takes DRs into account.
824 bool isCXX11PODType(const ASTContext &Context) const;
825
826 /// Return true if this is a trivial type per (C++0x [basic.types]p9)
827 bool isTrivialType(const ASTContext &Context) const;
828
829 /// Return true if this is a trivially copyable type (C++0x [basic.types]p9)
830 bool isTriviallyCopyableType(const ASTContext &Context) const;
831
832
833 /// Returns true if it is a class and it might be dynamic.
834 bool mayBeDynamicClass() const;
835
836 /// Returns true if it is not a class or if the class might not be dynamic.
837 bool mayBeNotDynamicClass() const;
838
839 // Don't promise in the API that anything besides 'const' can be
840 // easily added.
841
842 /// Add the `const` type qualifier to this QualType.
843 void addConst() {
844 addFastQualifiers(Qualifiers::Const);
845 }
846 QualType withConst() const {
847 return withFastQualifiers(Qualifiers::Const);
848 }
849
850 /// Add the `volatile` type qualifier to this QualType.
851 void addVolatile() {
852 addFastQualifiers(Qualifiers::Volatile);
853 }
854 QualType withVolatile() const {
855 return withFastQualifiers(Qualifiers::Volatile);
856 }
857
858 /// Add the `restrict` qualifier to this QualType.
859 void addRestrict() {
860 addFastQualifiers(Qualifiers::Restrict);
861 }
862 QualType withRestrict() const {
863 return withFastQualifiers(Qualifiers::Restrict);
864 }
865
866 QualType withCVRQualifiers(unsigned CVR) const {
867 return withFastQualifiers(CVR);
868 }
869
870 void addFastQualifiers(unsigned TQs) {
871 assert(!(TQs & ~Qualifiers::FastMask)(static_cast <bool> (!(TQs & ~Qualifiers::FastMask)
&& "non-fast qualifier bits set in mask!") ? void (0
) : __assert_fail ("!(TQs & ~Qualifiers::FastMask) && \"non-fast qualifier bits set in mask!\""
, "clang/include/clang/AST/Type.h", 872, __extension__ __PRETTY_FUNCTION__
))
872 && "non-fast qualifier bits set in mask!")(static_cast <bool> (!(TQs & ~Qualifiers::FastMask)
&& "non-fast qualifier bits set in mask!") ? void (0
) : __assert_fail ("!(TQs & ~Qualifiers::FastMask) && \"non-fast qualifier bits set in mask!\""
, "clang/include/clang/AST/Type.h", 872, __extension__ __PRETTY_FUNCTION__
))
;
873 Value.setInt(Value.getInt() | TQs);
874 }
875
876 void removeLocalConst();
877 void removeLocalVolatile();
878 void removeLocalRestrict();
879 void removeLocalCVRQualifiers(unsigned Mask);
880
881 void removeLocalFastQualifiers() { Value.setInt(0); }
882 void removeLocalFastQualifiers(unsigned Mask) {
883 assert(!(Mask & ~Qualifiers::FastMask) && "mask has non-fast qualifiers")(static_cast <bool> (!(Mask & ~Qualifiers::FastMask
) && "mask has non-fast qualifiers") ? void (0) : __assert_fail
("!(Mask & ~Qualifiers::FastMask) && \"mask has non-fast qualifiers\""
, "clang/include/clang/AST/Type.h", 883, __extension__ __PRETTY_FUNCTION__
))
;
884 Value.setInt(Value.getInt() & ~Mask);
885 }
886
887 // Creates a type with the given qualifiers in addition to any
888 // qualifiers already on this type.
889 QualType withFastQualifiers(unsigned TQs) const {
890 QualType T = *this;
891 T.addFastQualifiers(TQs);
892 return T;
893 }
894
895 // Creates a type with exactly the given fast qualifiers, removing
896 // any existing fast qualifiers.
897 QualType withExactLocalFastQualifiers(unsigned TQs) const {
898 return withoutLocalFastQualifiers().withFastQualifiers(TQs);
899 }
900
901 // Removes fast qualifiers, but leaves any extended qualifiers in place.
902 QualType withoutLocalFastQualifiers() const {
903 QualType T = *this;
904 T.removeLocalFastQualifiers();
905 return T;
906 }
907
908 QualType getCanonicalType() const;
909
910 /// Return this type with all of the instance-specific qualifiers
911 /// removed, but without removing any qualifiers that may have been applied
912 /// through typedefs.
913 QualType getLocalUnqualifiedType() const { return QualType(getTypePtr(), 0); }
914
915 /// Retrieve the unqualified variant of the given type,
916 /// removing as little sugar as possible.
917 ///
918 /// This routine looks through various kinds of sugar to find the
919 /// least-desugared type that is unqualified. For example, given:
920 ///
921 /// \code
922 /// typedef int Integer;
923 /// typedef const Integer CInteger;
924 /// typedef CInteger DifferenceType;
925 /// \endcode
926 ///
927 /// Executing \c getUnqualifiedType() on the type \c DifferenceType will
928 /// desugar until we hit the type \c Integer, which has no qualifiers on it.
929 ///
930 /// The resulting type might still be qualified if it's sugar for an array
931 /// type. To strip qualifiers even from within a sugared array type, use
932 /// ASTContext::getUnqualifiedArrayType.
933 inline QualType getUnqualifiedType() const;
934
935 /// Retrieve the unqualified variant of the given type, removing as little
936 /// sugar as possible.
937 ///
938 /// Like getUnqualifiedType(), but also returns the set of
939 /// qualifiers that were built up.
940 ///
941 /// The resulting type might still be qualified if it's sugar for an array
942 /// type. To strip qualifiers even from within a sugared array type, use
943 /// ASTContext::getUnqualifiedArrayType.
944 inline SplitQualType getSplitUnqualifiedType() const;
945
946 /// Determine whether this type is more qualified than the other
947 /// given type, requiring exact equality for non-CVR qualifiers.
948 bool isMoreQualifiedThan(QualType Other) const;
949
950 /// Determine whether this type is at least as qualified as the other
951 /// given type, requiring exact equality for non-CVR qualifiers.
952 bool isAtLeastAsQualifiedAs(QualType Other) const;
953
954 QualType getNonReferenceType() const;
955
956 /// Determine the type of a (typically non-lvalue) expression with the
957 /// specified result type.
958 ///
959 /// This routine should be used for expressions for which the return type is
960 /// explicitly specified (e.g., in a cast or call) and isn't necessarily
961 /// an lvalue. It removes a top-level reference (since there are no
962 /// expressions of reference type) and deletes top-level cvr-qualifiers
963 /// from non-class types (in C++) or all types (in C).
964 QualType getNonLValueExprType(const ASTContext &Context) const;
965
966 /// Remove an outer pack expansion type (if any) from this type. Used as part
967 /// of converting the type of a declaration to the type of an expression that
968 /// references that expression. It's meaningless for an expression to have a
969 /// pack expansion type.
970 QualType getNonPackExpansionType() const;
971
972 /// Return the specified type with any "sugar" removed from
973 /// the type. This takes off typedefs, typeof's etc. If the outer level of
974 /// the type is already concrete, it returns it unmodified. This is similar
975 /// to getting the canonical type, but it doesn't remove *all* typedefs. For
976 /// example, it returns "T*" as "T*", (not as "int*"), because the pointer is
977 /// concrete.
978 ///
979 /// Qualifiers are left in place.
980 QualType getDesugaredType(const ASTContext &Context) const {
981 return getDesugaredType(*this, Context);
982 }
983
984 SplitQualType getSplitDesugaredType() const {
985 return getSplitDesugaredType(*this);
986 }
987
988 /// Return the specified type with one level of "sugar" removed from
989 /// the type.
990 ///
991 /// This routine takes off the first typedef, typeof, etc. If the outer level
992 /// of the type is already concrete, it returns it unmodified.
993 QualType getSingleStepDesugaredType(const ASTContext &Context) const {
994 return getSingleStepDesugaredTypeImpl(*this, Context);
995 }
996
997 /// Returns the specified type after dropping any
998 /// outer-level parentheses.
999 QualType IgnoreParens() const {
1000 if (isa<ParenType>(*this))
1001 return QualType::IgnoreParens(*this);
1002 return *this;
1003 }
1004
1005 /// Indicate whether the specified types and qualifiers are identical.
1006 friend bool operator==(const QualType &LHS, const QualType &RHS) {
1007 return LHS.Value == RHS.Value;
1008 }
1009 friend bool operator!=(const QualType &LHS, const QualType &RHS) {
1010 return LHS.Value != RHS.Value;
1011 }
1012 friend bool operator<(const QualType &LHS, const QualType &RHS) {
1013 return LHS.Value < RHS.Value;
1014 }
1015
1016 static std::string getAsString(SplitQualType split,
1017 const PrintingPolicy &Policy) {
1018 return getAsString(split.Ty, split.Quals, Policy);
1019 }
1020 static std::string getAsString(const Type *ty, Qualifiers qs,
1021 const PrintingPolicy &Policy);
1022
1023 std::string getAsString() const;
1024 std::string getAsString(const PrintingPolicy &Policy) const;
1025
1026 void print(raw_ostream &OS, const PrintingPolicy &Policy,
1027 const Twine &PlaceHolder = Twine(),
1028 unsigned Indentation = 0) const;
1029
1030 static void print(SplitQualType split, raw_ostream &OS,
1031 const PrintingPolicy &policy, const Twine &PlaceHolder,
1032 unsigned Indentation = 0) {
1033 return print(split.Ty, split.Quals, OS, policy, PlaceHolder, Indentation);
1034 }
1035
1036 static void print(const Type *ty, Qualifiers qs,
1037 raw_ostream &OS, const PrintingPolicy &policy,
1038 const Twine &PlaceHolder,
1039 unsigned Indentation = 0);
1040
1041 void getAsStringInternal(std::string &Str,
1042 const PrintingPolicy &Policy) const;
1043
1044 static void getAsStringInternal(SplitQualType split, std::string &out,
1045 const PrintingPolicy &policy) {
1046 return getAsStringInternal(split.Ty, split.Quals, out, policy);
1047 }
1048
1049 static void getAsStringInternal(const Type *ty, Qualifiers qs,
1050 std::string &out,
1051 const PrintingPolicy &policy);
1052
1053 class StreamedQualTypeHelper {
1054 const QualType &T;
1055 const PrintingPolicy &Policy;
1056 const Twine &PlaceHolder;
1057 unsigned Indentation;
1058
1059 public:
1060 StreamedQualTypeHelper(const QualType &T, const PrintingPolicy &Policy,
1061 const Twine &PlaceHolder, unsigned Indentation)
1062 : T(T), Policy(Policy), PlaceHolder(PlaceHolder),
1063 Indentation(Indentation) {}
1064
1065 friend raw_ostream &operator<<(raw_ostream &OS,
1066 const StreamedQualTypeHelper &SQT) {
1067 SQT.T.print(OS, SQT.Policy, SQT.PlaceHolder, SQT.Indentation);
1068 return OS;
1069 }
1070 };
1071
1072 StreamedQualTypeHelper stream(const PrintingPolicy &Policy,
1073 const Twine &PlaceHolder = Twine(),
1074 unsigned Indentation = 0) const {
1075 return StreamedQualTypeHelper(*this, Policy, PlaceHolder, Indentation);
1076 }
1077
1078 void dump(const char *s) const;
1079 void dump() const;
1080 void dump(llvm::raw_ostream &OS, const ASTContext &Context) const;
1081
1082 void Profile(llvm::FoldingSetNodeID &ID) const {
1083 ID.AddPointer(getAsOpaquePtr());
1084 }
1085
1086 /// Check if this type has any address space qualifier.
1087 inline bool hasAddressSpace() const;
1088
1089 /// Return the address space of this type.
1090 inline LangAS getAddressSpace() const;
1091
1092 /// Returns true if address space qualifiers overlap with T address space
1093 /// qualifiers.
1094 /// OpenCL C defines conversion rules for pointers to different address spaces
1095 /// and notion of overlapping address spaces.
1096 /// CL1.1 or CL1.2:
1097 /// address spaces overlap iff they are they same.
1098 /// OpenCL C v2.0 s6.5.5 adds:
1099 /// __generic overlaps with any address space except for __constant.
1100 bool isAddressSpaceOverlapping(QualType T) const {
1101 Qualifiers Q = getQualifiers();
1102 Qualifiers TQ = T.getQualifiers();
1103 // Address spaces overlap if at least one of them is a superset of another
1104 return Q.isAddressSpaceSupersetOf(TQ) || TQ.isAddressSpaceSupersetOf(Q);
1105 }
1106
1107 /// Returns gc attribute of this type.
1108 inline Qualifiers::GC getObjCGCAttr() const;
1109
1110 /// true when Type is objc's weak.
1111 bool isObjCGCWeak() const {
1112 return getObjCGCAttr() == Qualifiers::Weak;
1113 }
1114
1115 /// true when Type is objc's strong.
1116 bool isObjCGCStrong() const {
1117 return getObjCGCAttr() == Qualifiers::Strong;
1118 }
1119
1120 /// Returns lifetime attribute of this type.
1121 Qualifiers::ObjCLifetime getObjCLifetime() const {
1122 return getQualifiers().getObjCLifetime();
1123 }
1124
1125 bool hasNonTrivialObjCLifetime() const {
1126 return getQualifiers().hasNonTrivialObjCLifetime();
1127 }
1128
1129 bool hasStrongOrWeakObjCLifetime() const {
1130 return getQualifiers().hasStrongOrWeakObjCLifetime();
1131 }
1132
1133 // true when Type is objc's weak and weak is enabled but ARC isn't.
1134 bool isNonWeakInMRRWithObjCWeak(const ASTContext &Context) const;
1135
1136 enum PrimitiveDefaultInitializeKind {
1137 /// The type does not fall into any of the following categories. Note that
1138 /// this case is zero-valued so that values of this enum can be used as a
1139 /// boolean condition for non-triviality.
1140 PDIK_Trivial,
1141
1142 /// The type is an Objective-C retainable pointer type that is qualified
1143 /// with the ARC __strong qualifier.
1144 PDIK_ARCStrong,
1145
1146 /// The type is an Objective-C retainable pointer type that is qualified
1147 /// with the ARC __weak qualifier.
1148 PDIK_ARCWeak,
1149
1150 /// The type is a struct containing a field whose type is not PCK_Trivial.
1151 PDIK_Struct
1152 };
1153
1154 /// Functions to query basic properties of non-trivial C struct types.
1155
1156 /// Check if this is a non-trivial type that would cause a C struct
1157 /// transitively containing this type to be non-trivial to default initialize
1158 /// and return the kind.
1159 PrimitiveDefaultInitializeKind
1160 isNonTrivialToPrimitiveDefaultInitialize() const;
1161
1162 enum PrimitiveCopyKind {
1163 /// The type does not fall into any of the following categories. Note that
1164 /// this case is zero-valued so that values of this enum can be used as a
1165 /// boolean condition for non-triviality.
1166 PCK_Trivial,
1167
1168 /// The type would be trivial except that it is volatile-qualified. Types
1169 /// that fall into one of the other non-trivial cases may additionally be
1170 /// volatile-qualified.
1171 PCK_VolatileTrivial,
1172
1173 /// The type is an Objective-C retainable pointer type that is qualified
1174 /// with the ARC __strong qualifier.
1175 PCK_ARCStrong,
1176
1177 /// The type is an Objective-C retainable pointer type that is qualified
1178 /// with the ARC __weak qualifier.
1179 PCK_ARCWeak,
1180
1181 /// The type is a struct containing a field whose type is neither
1182 /// PCK_Trivial nor PCK_VolatileTrivial.
1183 /// Note that a C++ struct type does not necessarily match this; C++ copying
1184 /// semantics are too complex to express here, in part because they depend
1185 /// on the exact constructor or assignment operator that is chosen by
1186 /// overload resolution to do the copy.
1187 PCK_Struct
1188 };
1189
1190 /// Check if this is a non-trivial type that would cause a C struct
1191 /// transitively containing this type to be non-trivial to copy and return the
1192 /// kind.
1193 PrimitiveCopyKind isNonTrivialToPrimitiveCopy() const;
1194
1195 /// Check if this is a non-trivial type that would cause a C struct
1196 /// transitively containing this type to be non-trivial to destructively
1197 /// move and return the kind. Destructive move in this context is a C++-style
1198 /// move in which the source object is placed in a valid but unspecified state
1199 /// after it is moved, as opposed to a truly destructive move in which the
1200 /// source object is placed in an uninitialized state.
1201 PrimitiveCopyKind isNonTrivialToPrimitiveDestructiveMove() const;
1202
1203 enum DestructionKind {
1204 DK_none,
1205 DK_cxx_destructor,
1206 DK_objc_strong_lifetime,
1207 DK_objc_weak_lifetime,
1208 DK_nontrivial_c_struct
1209 };
1210
1211 /// Returns a nonzero value if objects of this type require
1212 /// non-trivial work to clean up after. Non-zero because it's
1213 /// conceivable that qualifiers (objc_gc(weak)?) could make
1214 /// something require destruction.
1215 DestructionKind isDestructedType() const {
1216 return isDestructedTypeImpl(*this);
1217 }
1218
1219 /// Check if this is or contains a C union that is non-trivial to
1220 /// default-initialize, which is a union that has a member that is non-trivial
1221 /// to default-initialize. If this returns true,
1222 /// isNonTrivialToPrimitiveDefaultInitialize returns PDIK_Struct.
1223 bool hasNonTrivialToPrimitiveDefaultInitializeCUnion() const;
1224
1225 /// Check if this is or contains a C union that is non-trivial to destruct,
1226 /// which is a union that has a member that is non-trivial to destruct. If
1227 /// this returns true, isDestructedType returns DK_nontrivial_c_struct.
1228 bool hasNonTrivialToPrimitiveDestructCUnion() const;
1229
1230 /// Check if this is or contains a C union that is non-trivial to copy, which
1231 /// is a union that has a member that is non-trivial to copy. If this returns
1232 /// true, isNonTrivialToPrimitiveCopy returns PCK_Struct.
1233 bool hasNonTrivialToPrimitiveCopyCUnion() const;
1234
1235 /// Determine whether expressions of the given type are forbidden
1236 /// from being lvalues in C.
1237 ///
1238 /// The expression types that are forbidden to be lvalues are:
1239 /// - 'void', but not qualified void
1240 /// - function types
1241 ///
1242 /// The exact rule here is C99 6.3.2.1:
1243 /// An lvalue is an expression with an object type or an incomplete
1244 /// type other than void.
1245 bool isCForbiddenLValueType() const;
1246
1247 /// Substitute type arguments for the Objective-C type parameters used in the
1248 /// subject type.
1249 ///
1250 /// \param ctx ASTContext in which the type exists.
1251 ///
1252 /// \param typeArgs The type arguments that will be substituted for the
1253 /// Objective-C type parameters in the subject type, which are generally
1254 /// computed via \c Type::getObjCSubstitutions. If empty, the type
1255 /// parameters will be replaced with their bounds or id/Class, as appropriate
1256 /// for the context.
1257 ///
1258 /// \param context The context in which the subject type was written.
1259 ///
1260 /// \returns the resulting type.
1261 QualType substObjCTypeArgs(ASTContext &ctx,
1262 ArrayRef<QualType> typeArgs,
1263 ObjCSubstitutionContext context) const;
1264
1265 /// Substitute type arguments from an object type for the Objective-C type
1266 /// parameters used in the subject type.
1267 ///
1268 /// This operation combines the computation of type arguments for
1269 /// substitution (\c Type::getObjCSubstitutions) with the actual process of
1270 /// substitution (\c QualType::substObjCTypeArgs) for the convenience of
1271 /// callers that need to perform a single substitution in isolation.
1272 ///
1273 /// \param objectType The type of the object whose member type we're
1274 /// substituting into. For example, this might be the receiver of a message
1275 /// or the base of a property access.
1276 ///
1277 /// \param dc The declaration context from which the subject type was
1278 /// retrieved, which indicates (for example) which type parameters should
1279 /// be substituted.
1280 ///
1281 /// \param context The context in which the subject type was written.
1282 ///
1283 /// \returns the subject type after replacing all of the Objective-C type
1284 /// parameters with their corresponding arguments.
1285 QualType substObjCMemberType(QualType objectType,
1286 const DeclContext *dc,
1287 ObjCSubstitutionContext context) const;
1288
1289 /// Strip Objective-C "__kindof" types from the given type.
1290 QualType stripObjCKindOfType(const ASTContext &ctx) const;
1291
1292 /// Remove all qualifiers including _Atomic.
1293 QualType getAtomicUnqualifiedType() const;
1294
1295private:
1296 // These methods are implemented in a separate translation unit;
1297 // "static"-ize them to avoid creating temporary QualTypes in the
1298 // caller.
1299 static bool isConstant(QualType T, const ASTContext& Ctx);
1300 static QualType getDesugaredType(QualType T, const ASTContext &Context);
1301 static SplitQualType getSplitDesugaredType(QualType T);
1302 static SplitQualType getSplitUnqualifiedTypeImpl(QualType type);
1303 static QualType getSingleStepDesugaredTypeImpl(QualType type,
1304 const ASTContext &C);
1305 static QualType IgnoreParens(QualType T);
1306 static DestructionKind isDestructedTypeImpl(QualType type);
1307
1308 /// Check if \param RD is or contains a non-trivial C union.
1309 static bool hasNonTrivialToPrimitiveDefaultInitializeCUnion(const RecordDecl *RD);
1310 static bool hasNonTrivialToPrimitiveDestructCUnion(const RecordDecl *RD);
1311 static bool hasNonTrivialToPrimitiveCopyCUnion(const RecordDecl *RD);
1312};
1313
1314} // namespace clang
1315
1316namespace llvm {
1317
1318/// Implement simplify_type for QualType, so that we can dyn_cast from QualType
1319/// to a specific Type class.
1320template<> struct simplify_type< ::clang::QualType> {
1321 using SimpleType = const ::clang::Type *;
1322
1323 static SimpleType getSimplifiedValue(::clang::QualType Val) {
1324 return Val.getTypePtr();
1325 }
1326};
1327
1328// Teach SmallPtrSet that QualType is "basically a pointer".
1329template<>
1330struct PointerLikeTypeTraits<clang::QualType> {
1331 static inline void *getAsVoidPointer(clang::QualType P) {
1332 return P.getAsOpaquePtr();
1333 }
1334
1335 static inline clang::QualType getFromVoidPointer(void *P) {
1336 return clang::QualType::getFromOpaquePtr(P);
1337 }
1338
1339 // Various qualifiers go in low bits.
1340 static constexpr int NumLowBitsAvailable = 0;
1341};
1342
1343} // namespace llvm
1344
1345namespace clang {
1346
1347/// Base class that is common to both the \c ExtQuals and \c Type
1348/// classes, which allows \c QualType to access the common fields between the
1349/// two.
1350class ExtQualsTypeCommonBase {
1351 friend class ExtQuals;
1352 friend class QualType;
1353 friend class Type;
1354
1355 /// The "base" type of an extended qualifiers type (\c ExtQuals) or
1356 /// a self-referential pointer (for \c Type).
1357 ///
1358 /// This pointer allows an efficient mapping from a QualType to its
1359 /// underlying type pointer.
1360 const Type *const BaseType;
1361
1362 /// The canonical type of this type. A QualType.
1363 QualType CanonicalType;
1364
1365 ExtQualsTypeCommonBase(const Type *baseType, QualType canon)
1366 : BaseType(baseType), CanonicalType(canon) {}
1367};
1368
1369/// We can encode up to four bits in the low bits of a
1370/// type pointer, but there are many more type qualifiers that we want
1371/// to be able to apply to an arbitrary type. Therefore we have this
1372/// struct, intended to be heap-allocated and used by QualType to
1373/// store qualifiers.
1374///
1375/// The current design tags the 'const', 'restrict', and 'volatile' qualifiers
1376/// in three low bits on the QualType pointer; a fourth bit records whether
1377/// the pointer is an ExtQuals node. The extended qualifiers (address spaces,
1378/// Objective-C GC attributes) are much more rare.
1379class ExtQuals : public ExtQualsTypeCommonBase, public llvm::FoldingSetNode {
1380 // NOTE: changing the fast qualifiers should be straightforward as
1381 // long as you don't make 'const' non-fast.
1382 // 1. Qualifiers:
1383 // a) Modify the bitmasks (Qualifiers::TQ and DeclSpec::TQ).
1384 // Fast qualifiers must occupy the low-order bits.
1385 // b) Update Qualifiers::FastWidth and FastMask.
1386 // 2. QualType:
1387 // a) Update is{Volatile,Restrict}Qualified(), defined inline.
1388 // b) Update remove{Volatile,Restrict}, defined near the end of
1389 // this header.
1390 // 3. ASTContext:
1391 // a) Update get{Volatile,Restrict}Type.
1392
1393 /// The immutable set of qualifiers applied by this node. Always contains
1394 /// extended qualifiers.
1395 Qualifiers Quals;
1396
1397 ExtQuals *this_() { return this; }
1398
1399public:
1400 ExtQuals(const Type *baseType, QualType canon, Qualifiers quals)
1401 : ExtQualsTypeCommonBase(baseType,
1402 canon.isNull() ? QualType(this_(), 0) : canon),
1403 Quals(quals) {
1404 assert(Quals.hasNonFastQualifiers()(static_cast <bool> (Quals.hasNonFastQualifiers() &&
"ExtQuals created with no fast qualifiers") ? void (0) : __assert_fail
("Quals.hasNonFastQualifiers() && \"ExtQuals created with no fast qualifiers\""
, "clang/include/clang/AST/Type.h", 1405, __extension__ __PRETTY_FUNCTION__
))
1405 && "ExtQuals created with no fast qualifiers")(static_cast <bool> (Quals.hasNonFastQualifiers() &&
"ExtQuals created with no fast qualifiers") ? void (0) : __assert_fail
("Quals.hasNonFastQualifiers() && \"ExtQuals created with no fast qualifiers\""
, "clang/include/clang/AST/Type.h", 1405, __extension__ __PRETTY_FUNCTION__
))
;
1406 assert(!Quals.hasFastQualifiers()(static_cast <bool> (!Quals.hasFastQualifiers() &&
"ExtQuals created with fast qualifiers") ? void (0) : __assert_fail
("!Quals.hasFastQualifiers() && \"ExtQuals created with fast qualifiers\""
, "clang/include/clang/AST/Type.h", 1407, __extension__ __PRETTY_FUNCTION__
))
1407 && "ExtQuals created with fast qualifiers")(static_cast <bool> (!Quals.hasFastQualifiers() &&
"ExtQuals created with fast qualifiers") ? void (0) : __assert_fail
("!Quals.hasFastQualifiers() && \"ExtQuals created with fast qualifiers\""
, "clang/include/clang/AST/Type.h", 1407, __extension__ __PRETTY_FUNCTION__
))
;
1408 }
1409
1410 Qualifiers getQualifiers() const { return Quals; }
1411
1412 bool hasObjCGCAttr() const { return Quals.hasObjCGCAttr(); }
1413 Qualifiers::GC getObjCGCAttr() const { return Quals.getObjCGCAttr(); }
1414
1415 bool hasObjCLifetime() const { return Quals.hasObjCLifetime(); }
1416 Qualifiers::ObjCLifetime getObjCLifetime() const {
1417 return Quals.getObjCLifetime();
1418 }
1419
1420 bool hasAddressSpace() const { return Quals.hasAddressSpace(); }
1421 LangAS getAddressSpace() const { return Quals.getAddressSpace(); }
1422
1423 const Type *getBaseType() const { return BaseType; }
1424
1425public:
1426 void Profile(llvm::FoldingSetNodeID &ID) const {
1427 Profile(ID, getBaseType(), Quals);
1428 }
1429
1430 static void Profile(llvm::FoldingSetNodeID &ID,
1431 const Type *BaseType,
1432 Qualifiers Quals) {
1433 assert(!Quals.hasFastQualifiers() && "fast qualifiers in ExtQuals hash!")(static_cast <bool> (!Quals.hasFastQualifiers() &&
"fast qualifiers in ExtQuals hash!") ? void (0) : __assert_fail
("!Quals.hasFastQualifiers() && \"fast qualifiers in ExtQuals hash!\""
, "clang/include/clang/AST/Type.h", 1433, __extension__ __PRETTY_FUNCTION__
))
;
1434 ID.AddPointer(BaseType);
1435 Quals.Profile(ID);
1436 }
1437};
1438
1439/// The kind of C++11 ref-qualifier associated with a function type.
1440/// This determines whether a member function's "this" object can be an
1441/// lvalue, rvalue, or neither.
1442enum RefQualifierKind {
1443 /// No ref-qualifier was provided.
1444 RQ_None = 0,
1445
1446 /// An lvalue ref-qualifier was provided (\c &).
1447 RQ_LValue,
1448
1449 /// An rvalue ref-qualifier was provided (\c &&).
1450 RQ_RValue
1451};
1452
1453/// Which keyword(s) were used to create an AutoType.
1454enum class AutoTypeKeyword {
1455 /// auto
1456 Auto,
1457
1458 /// decltype(auto)
1459 DecltypeAuto,
1460
1461 /// __auto_type (GNU extension)
1462 GNUAutoType
1463};
1464
1465/// The base class of the type hierarchy.
1466///
1467/// A central concept with types is that each type always has a canonical
1468/// type. A canonical type is the type with any typedef names stripped out
1469/// of it or the types it references. For example, consider:
1470///
1471/// typedef int foo;
1472/// typedef foo* bar;
1473/// 'int *' 'foo *' 'bar'
1474///
1475/// There will be a Type object created for 'int'. Since int is canonical, its
1476/// CanonicalType pointer points to itself. There is also a Type for 'foo' (a
1477/// TypedefType). Its CanonicalType pointer points to the 'int' Type. Next
1478/// there is a PointerType that represents 'int*', which, like 'int', is
1479/// canonical. Finally, there is a PointerType type for 'foo*' whose canonical
1480/// type is 'int*', and there is a TypedefType for 'bar', whose canonical type
1481/// is also 'int*'.
1482///
1483/// Non-canonical types are useful for emitting diagnostics, without losing
1484/// information about typedefs being used. Canonical types are useful for type
1485/// comparisons (they allow by-pointer equality tests) and useful for reasoning
1486/// about whether something has a particular form (e.g. is a function type),
1487/// because they implicitly, recursively, strip all typedefs out of a type.
1488///
1489/// Types, once created, are immutable.
1490///
1491class alignas(8) Type : public ExtQualsTypeCommonBase {
1492public:
1493 enum TypeClass {
1494#define TYPE(Class, Base) Class,
1495#define LAST_TYPE(Class) TypeLast = Class
1496#define ABSTRACT_TYPE(Class, Base)
1497#include "clang/AST/TypeNodes.inc"
1498 };
1499
1500private:
1501 /// Bitfields required by the Type class.
1502 class TypeBitfields {
1503 friend class Type;
1504 template <class T> friend class TypePropertyCache;
1505
1506 /// TypeClass bitfield - Enum that specifies what subclass this belongs to.
1507 unsigned TC : 8;
1508
1509 /// Store information on the type dependency.
1510 unsigned Dependence : llvm::BitWidth<TypeDependence>;
1511
1512 /// True if the cache (i.e. the bitfields here starting with
1513 /// 'Cache') is valid.
1514 mutable unsigned CacheValid : 1;
1515
1516 /// Linkage of this type.
1517 mutable unsigned CachedLinkage : 3;
1518
1519 /// Whether this type involves and local or unnamed types.
1520 mutable unsigned CachedLocalOrUnnamed : 1;
1521
1522 /// Whether this type comes from an AST file.
1523 mutable unsigned FromAST : 1;
1524
1525 bool isCacheValid() const {
1526 return CacheValid;
1527 }
1528
1529 Linkage getLinkage() const {
1530 assert(isCacheValid() && "getting linkage from invalid cache")(static_cast <bool> (isCacheValid() && "getting linkage from invalid cache"
) ? void (0) : __assert_fail ("isCacheValid() && \"getting linkage from invalid cache\""
, "clang/include/clang/AST/Type.h", 1530, __extension__ __PRETTY_FUNCTION__
))
;
1531 return static_cast<Linkage>(CachedLinkage);
1532 }
1533
1534 bool hasLocalOrUnnamedType() const {
1535 assert(isCacheValid() && "getting linkage from invalid cache")(static_cast <bool> (isCacheValid() && "getting linkage from invalid cache"
) ? void (0) : __assert_fail ("isCacheValid() && \"getting linkage from invalid cache\""
, "clang/include/clang/AST/Type.h", 1535, __extension__ __PRETTY_FUNCTION__
))
;
1536 return CachedLocalOrUnnamed;
1537 }
1538 };
1539 enum { NumTypeBits = 8 + llvm::BitWidth<TypeDependence> + 6 };
1540
1541protected:
1542 // These classes allow subclasses to somewhat cleanly pack bitfields
1543 // into Type.
1544
1545 class ArrayTypeBitfields {
1546 friend class ArrayType;
1547
1548 unsigned : NumTypeBits;
1549
1550 /// CVR qualifiers from declarations like
1551 /// 'int X[static restrict 4]'. For function parameters only.
1552 unsigned IndexTypeQuals : 3;
1553
1554 /// Storage class qualifiers from declarations like
1555 /// 'int X[static restrict 4]'. For function parameters only.
1556 /// Actually an ArrayType::ArraySizeModifier.
1557 unsigned SizeModifier : 3;
1558 };
1559
1560 class ConstantArrayTypeBitfields {
1561 friend class ConstantArrayType;
1562
1563 unsigned : NumTypeBits + 3 + 3;
1564
1565 /// Whether we have a stored size expression.
1566 unsigned HasStoredSizeExpr : 1;
1567 };
1568
1569 class BuiltinTypeBitfields {
1570 friend class BuiltinType;
1571
1572 unsigned : NumTypeBits;
1573
1574 /// The kind (BuiltinType::Kind) of builtin type this is.
1575 unsigned Kind : 8;
1576 };
1577
1578 /// FunctionTypeBitfields store various bits belonging to FunctionProtoType.
1579 /// Only common bits are stored here. Additional uncommon bits are stored
1580 /// in a trailing object after FunctionProtoType.
1581 class FunctionTypeBitfields {
1582 friend class FunctionProtoType;
1583 friend class FunctionType;
1584
1585 unsigned : NumTypeBits;
1586
1587 /// Extra information which affects how the function is called, like
1588 /// regparm and the calling convention.
1589 unsigned ExtInfo : 13;
1590
1591 /// The ref-qualifier associated with a \c FunctionProtoType.
1592 ///
1593 /// This is a value of type \c RefQualifierKind.
1594 unsigned RefQualifier : 2;
1595
1596 /// Used only by FunctionProtoType, put here to pack with the
1597 /// other bitfields.
1598 /// The qualifiers are part of FunctionProtoType because...
1599 ///
1600 /// C++ 8.3.5p4: The return type, the parameter type list and the
1601 /// cv-qualifier-seq, [...], are part of the function type.
1602 unsigned FastTypeQuals : Qualifiers::FastWidth;
1603 /// Whether this function has extended Qualifiers.
1604 unsigned HasExtQuals : 1;
1605
1606 /// The number of parameters this function has, not counting '...'.
1607 /// According to [implimits] 8 bits should be enough here but this is
1608 /// somewhat easy to exceed with metaprogramming and so we would like to
1609 /// keep NumParams as wide as reasonably possible.
1610 unsigned NumParams : 16;
1611
1612 /// The type of exception specification this function has.
1613 unsigned ExceptionSpecType : 4;
1614
1615 /// Whether this function has extended parameter information.
1616 unsigned HasExtParameterInfos : 1;
1617
1618 /// Whether the function is variadic.
1619 unsigned Variadic : 1;
1620
1621 /// Whether this function has a trailing return type.
1622 unsigned HasTrailingReturn : 1;
1623 };
1624
1625 class ObjCObjectTypeBitfields {
1626 friend class ObjCObjectType;
1627
1628 unsigned : NumTypeBits;
1629
1630 /// The number of type arguments stored directly on this object type.
1631 unsigned NumTypeArgs : 7;
1632
1633 /// The number of protocols stored directly on this object type.
1634 unsigned NumProtocols : 6;
1635
1636 /// Whether this is a "kindof" type.
1637 unsigned IsKindOf : 1;
1638 };
1639
1640 class ReferenceTypeBitfields {
1641 friend class ReferenceType;
1642
1643 unsigned : NumTypeBits;
1644
1645 /// True if the type was originally spelled with an lvalue sigil.
1646 /// This is never true of rvalue references but can also be false
1647 /// on lvalue references because of C++0x [dcl.typedef]p9,
1648 /// as follows:
1649 ///
1650 /// typedef int &ref; // lvalue, spelled lvalue
1651 /// typedef int &&rvref; // rvalue
1652 /// ref &a; // lvalue, inner ref, spelled lvalue
1653 /// ref &&a; // lvalue, inner ref
1654 /// rvref &a; // lvalue, inner ref, spelled lvalue
1655 /// rvref &&a; // rvalue, inner ref
1656 unsigned SpelledAsLValue : 1;
1657
1658 /// True if the inner type is a reference type. This only happens
1659 /// in non-canonical forms.
1660 unsigned InnerRef : 1;
1661 };
1662
1663 class TypeWithKeywordBitfields {
1664 friend class TypeWithKeyword;
1665
1666 unsigned : NumTypeBits;
1667
1668 /// An ElaboratedTypeKeyword. 8 bits for efficient access.
1669 unsigned Keyword : 8;
1670 };
1671
1672 enum { NumTypeWithKeywordBits = 8 };
1673
1674 class ElaboratedTypeBitfields {
1675 friend class ElaboratedType;
1676
1677 unsigned : NumTypeBits;
1678 unsigned : NumTypeWithKeywordBits;
1679
1680 /// Whether the ElaboratedType has a trailing OwnedTagDecl.
1681 unsigned HasOwnedTagDecl : 1;
1682 };
1683
1684 class VectorTypeBitfields {
1685 friend class VectorType;
1686 friend class DependentVectorType;
1687
1688 unsigned : NumTypeBits;
1689
1690 /// The kind of vector, either a generic vector type or some
1691 /// target-specific vector type such as for AltiVec or Neon.
1692 unsigned VecKind : 3;
1693 /// The number of elements in the vector.
1694 uint32_t NumElements;
1695 };
1696
1697 class AttributedTypeBitfields {
1698 friend class AttributedType;
1699
1700 unsigned : NumTypeBits;
1701
1702 /// An AttributedType::Kind
1703 unsigned AttrKind : 32 - NumTypeBits;
1704 };
1705
1706 class AutoTypeBitfields {
1707 friend class AutoType;
1708
1709 unsigned : NumTypeBits;
1710
1711 /// Was this placeholder type spelled as 'auto', 'decltype(auto)',
1712 /// or '__auto_type'? AutoTypeKeyword value.
1713 unsigned Keyword : 2;
1714
1715 /// The number of template arguments in the type-constraints, which is
1716 /// expected to be able to hold at least 1024 according to [implimits].
1717 /// However as this limit is somewhat easy to hit with template
1718 /// metaprogramming we'd prefer to keep it as large as possible.
1719 /// At the moment it has been left as a non-bitfield since this type
1720 /// safely fits in 64 bits as an unsigned, so there is no reason to
1721 /// introduce the performance impact of a bitfield.
1722 unsigned NumArgs;
1723 };
1724
1725 class SubstTemplateTypeParmPackTypeBitfields {
1726 friend class SubstTemplateTypeParmPackType;
1727
1728 unsigned : NumTypeBits;
1729
1730 /// The number of template arguments in \c Arguments, which is
1731 /// expected to be able to hold at least 1024 according to [implimits].
1732 /// However as this limit is somewhat easy to hit with template
1733 /// metaprogramming we'd prefer to keep it as large as possible.
1734 /// At the moment it has been left as a non-bitfield since this type
1735 /// safely fits in 64 bits as an unsigned, so there is no reason to
1736 /// introduce the performance impact of a bitfield.
1737 unsigned NumArgs;
1738 };
1739
1740 class TemplateSpecializationTypeBitfields {
1741 friend class TemplateSpecializationType;
1742
1743 unsigned : NumTypeBits;
1744
1745 /// Whether this template specialization type is a substituted type alias.
1746 unsigned TypeAlias : 1;
1747
1748 /// The number of template arguments named in this class template
1749 /// specialization, which is expected to be able to hold at least 1024
1750 /// according to [implimits]. However, as this limit is somewhat easy to
1751 /// hit with template metaprogramming we'd prefer to keep it as large
1752 /// as possible. At the moment it has been left as a non-bitfield since
1753 /// this type safely fits in 64 bits as an unsigned, so there is no reason
1754 /// to introduce the performance impact of a bitfield.
1755 unsigned NumArgs;
1756 };
1757
1758 class DependentTemplateSpecializationTypeBitfields {
1759 friend class DependentTemplateSpecializationType;
1760
1761 unsigned : NumTypeBits;
1762 unsigned : NumTypeWithKeywordBits;
1763
1764 /// The number of template arguments named in this class template
1765 /// specialization, which is expected to be able to hold at least 1024
1766 /// according to [implimits]. However, as this limit is somewhat easy to
1767 /// hit with template metaprogramming we'd prefer to keep it as large
1768 /// as possible. At the moment it has been left as a non-bitfield since
1769 /// this type safely fits in 64 bits as an unsigned, so there is no reason
1770 /// to introduce the performance impact of a bitfield.
1771 unsigned NumArgs;
1772 };
1773
1774 class PackExpansionTypeBitfields {
1775 friend class PackExpansionType;
1776
1777 unsigned : NumTypeBits;
1778
1779 /// The number of expansions that this pack expansion will
1780 /// generate when substituted (+1), which is expected to be able to
1781 /// hold at least 1024 according to [implimits]. However, as this limit
1782 /// is somewhat easy to hit with template metaprogramming we'd prefer to
1783 /// keep it as large as possible. At the moment it has been left as a
1784 /// non-bitfield since this type safely fits in 64 bits as an unsigned, so
1785 /// there is no reason to introduce the performance impact of a bitfield.
1786 ///
1787 /// This field will only have a non-zero value when some of the parameter
1788 /// packs that occur within the pattern have been substituted but others
1789 /// have not.
1790 unsigned NumExpansions;
1791 };
1792
1793 union {
1794 TypeBitfields TypeBits;
1795 ArrayTypeBitfields ArrayTypeBits;
1796 ConstantArrayTypeBitfields ConstantArrayTypeBits;
1797 AttributedTypeBitfields AttributedTypeBits;
1798 AutoTypeBitfields AutoTypeBits;
1799 BuiltinTypeBitfields BuiltinTypeBits;
1800 FunctionTypeBitfields FunctionTypeBits;
1801 ObjCObjectTypeBitfields ObjCObjectTypeBits;
1802 ReferenceTypeBitfields ReferenceTypeBits;
1803 TypeWithKeywordBitfields TypeWithKeywordBits;
1804 ElaboratedTypeBitfields ElaboratedTypeBits;
1805 VectorTypeBitfields VectorTypeBits;
1806 SubstTemplateTypeParmPackTypeBitfields SubstTemplateTypeParmPackTypeBits;
1807 TemplateSpecializationTypeBitfields TemplateSpecializationTypeBits;
1808 DependentTemplateSpecializationTypeBitfields
1809 DependentTemplateSpecializationTypeBits;
1810 PackExpansionTypeBitfields PackExpansionTypeBits;
1811 };
1812
1813private:
1814 template <class T> friend class TypePropertyCache;
1815
1816 /// Set whether this type comes from an AST file.
1817 void setFromAST(bool V = true) const {
1818 TypeBits.FromAST = V;
1819 }
1820
1821protected:
1822 friend class ASTContext;
1823
1824 Type(TypeClass tc, QualType canon, TypeDependence Dependence)
1825 : ExtQualsTypeCommonBase(this,
1826 canon.isNull() ? QualType(this_(), 0) : canon) {
1827 static_assert(sizeof(*this) <= 8 + sizeof(ExtQualsTypeCommonBase),
1828 "changing bitfields changed sizeof(Type)!");
1829 static_assert(alignof(decltype(*this)) % sizeof(void *) == 0,
1830 "Insufficient alignment!");
1831 TypeBits.TC = tc;
1832 TypeBits.Dependence = static_cast<unsigned>(Dependence);
1833 TypeBits.CacheValid = false;
1834 TypeBits.CachedLocalOrUnnamed = false;
1835 TypeBits.CachedLinkage = NoLinkage;
1836 TypeBits.FromAST = false;
1837 }
1838
1839 // silence VC++ warning C4355: 'this' : used in base member initializer list
1840 Type *this_() { return this; }
1841
1842 void setDependence(TypeDependence D) {
1843 TypeBits.Dependence = static_cast<unsigned>(D);
1844 }
1845
1846 void addDependence(TypeDependence D) { setDependence(getDependence() | D); }
1847
1848public:
1849 friend class ASTReader;
1850 friend class ASTWriter;
1851 template <class T> friend class serialization::AbstractTypeReader;
1852 template <class T> friend class serialization::AbstractTypeWriter;
1853
1854 Type(const Type &) = delete;
1855 Type(Type &&) = delete;
1856 Type &operator=(const Type &) = delete;
1857 Type &operator=(Type &&) = delete;
1858
1859 TypeClass getTypeClass() const { return static_cast<TypeClass>(TypeBits.TC); }
1860
1861 /// Whether this type comes from an AST file.
1862 bool isFromAST() const { return TypeBits.FromAST; }
1863
1864 /// Whether this type is or contains an unexpanded parameter
1865 /// pack, used to support C++0x variadic templates.
1866 ///
1867 /// A type that contains a parameter pack shall be expanded by the
1868 /// ellipsis operator at some point. For example, the typedef in the
1869 /// following example contains an unexpanded parameter pack 'T':
1870 ///
1871 /// \code
1872 /// template<typename ...T>
1873 /// struct X {
1874 /// typedef T* pointer_types; // ill-formed; T is a parameter pack.
1875 /// };
1876 /// \endcode
1877 ///
1878 /// Note that this routine does not specify which
1879 bool containsUnexpandedParameterPack() const {
1880 return getDependence() & TypeDependence::UnexpandedPack;
1881 }
1882
1883 /// Determines if this type would be canonical if it had no further
1884 /// qualification.
1885 bool isCanonicalUnqualified() const {
1886 return CanonicalType == QualType(this, 0);
1887 }
1888
1889 /// Pull a single level of sugar off of this locally-unqualified type.
1890 /// Users should generally prefer SplitQualType::getSingleStepDesugaredType()
1891 /// or QualType::getSingleStepDesugaredType(const ASTContext&).
1892 QualType getLocallyUnqualifiedSingleStepDesugaredType() const;
1893
1894 /// As an extension, we classify types as one of "sized" or "sizeless";
1895 /// every type is one or the other. Standard types are all sized;
1896 /// sizeless types are purely an extension.
1897 ///
1898 /// Sizeless types contain data with no specified size, alignment,
1899 /// or layout.
1900 bool isSizelessType() const;
1901 bool isSizelessBuiltinType() const;
1902
1903 /// Determines if this is a sizeless type supported by the
1904 /// 'arm_sve_vector_bits' type attribute, which can be applied to a single
1905 /// SVE vector or predicate, excluding tuple types such as svint32x4_t.
1906 bool isVLSTBuiltinType() const;
1907
1908 /// Returns the representative type for the element of an SVE builtin type.
1909 /// This is used to represent fixed-length SVE vectors created with the
1910 /// 'arm_sve_vector_bits' type attribute as VectorType.
1911 QualType getSveEltType(const ASTContext &Ctx) const;
1912
1913 /// Types are partitioned into 3 broad categories (C99 6.2.5p1):
1914 /// object types, function types, and incomplete types.
1915
1916 /// Return true if this is an incomplete type.
1917 /// A type that can describe objects, but which lacks information needed to
1918 /// determine its size (e.g. void, or a fwd declared struct). Clients of this
1919 /// routine will need to determine if the size is actually required.
1920 ///
1921 /// Def If non-null, and the type refers to some kind of declaration
1922 /// that can be completed (such as a C struct, C++ class, or Objective-C
1923 /// class), will be set to the declaration.
1924 bool isIncompleteType(NamedDecl **Def = nullptr) const;
1925
1926 /// Return true if this is an incomplete or object
1927 /// type, in other words, not a function type.
1928 bool isIncompleteOrObjectType() const {
1929 return !isFunctionType();
1930 }
1931
1932 /// Determine whether this type is an object type.
1933 bool isObjectType() const {
1934 // C++ [basic.types]p8:
1935 // An object type is a (possibly cv-qualified) type that is not a
1936 // function type, not a reference type, and not a void type.
1937 return !isReferenceType() && !isFunctionType() && !isVoidType();
1938 }
1939
1940 /// Return true if this is a literal type
1941 /// (C++11 [basic.types]p10)
1942 bool isLiteralType(const ASTContext &Ctx) const;
1943
1944 /// Determine if this type is a structural type, per C++20 [temp.param]p7.
1945 bool isStructuralType() const;
1946
1947 /// Test if this type is a standard-layout type.
1948 /// (C++0x [basic.type]p9)
1949 bool isStandardLayoutType() const;
1950
1951 /// Helper methods to distinguish type categories. All type predicates
1952 /// operate on the canonical type, ignoring typedefs and qualifiers.
1953
1954 /// Returns true if the type is a builtin type.
1955 bool isBuiltinType() const;
1956
1957 /// Test for a particular builtin type.
1958 bool isSpecificBuiltinType(unsigned K) const;
1959
1960 /// Test for a type which does not represent an actual type-system type but
1961 /// is instead used as a placeholder for various convenient purposes within
1962 /// Clang. All such types are BuiltinTypes.
1963 bool isPlaceholderType() const;
1964 const BuiltinType *getAsPlaceholderType() const;
1965
1966 /// Test for a specific placeholder type.
1967 bool isSpecificPlaceholderType(unsigned K) const;
1968
1969 /// Test for a placeholder type other than Overload; see
1970 /// BuiltinType::isNonOverloadPlaceholderType.
1971 bool isNonOverloadPlaceholderType() const;
1972
1973 /// isIntegerType() does *not* include complex integers (a GCC extension).
1974 /// isComplexIntegerType() can be used to test for complex integers.
1975 bool isIntegerType() const; // C99 6.2.5p17 (int, char, bool, enum)
1976 bool isEnumeralType() const;
1977
1978 /// Determine whether this type is a scoped enumeration type.
1979 bool isScopedEnumeralType() const;
1980 bool isBooleanType() const;
1981 bool isCharType() const;
1982 bool isWideCharType() const;
1983 bool isChar8Type() const;
1984 bool isChar16Type() const;
1985 bool isChar32Type() const;
1986 bool isAnyCharacterType() const;
1987 bool isIntegralType(const ASTContext &Ctx) const;
1988
1989 /// Determine whether this type is an integral or enumeration type.
1990 bool isIntegralOrEnumerationType() const;
1991
1992 /// Determine whether this type is an integral or unscoped enumeration type.
1993 bool isIntegralOrUnscopedEnumerationType() const;
1994 bool isUnscopedEnumerationType() const;
1995
1996 /// Floating point categories.
1997 bool isRealFloatingType() const; // C99 6.2.5p10 (float, double, long double)
1998 /// isComplexType() does *not* include complex integers (a GCC extension).
1999 /// isComplexIntegerType() can be used to test for complex integers.
2000 bool isComplexType() const; // C99 6.2.5p11 (complex)
2001 bool isAnyComplexType() const; // C99 6.2.5p11 (complex) + Complex Int.
2002 bool isFloatingType() const; // C99 6.2.5p11 (real floating + complex)
2003 bool isHalfType() const; // OpenCL 6.1.1.1, NEON (IEEE 754-2008 half)
2004 bool isFloat16Type() const; // C11 extension ISO/IEC TS 18661
2005 bool isBFloat16Type() const;
2006 bool isFloat128Type() const;
2007 bool isIbm128Type() const;
2008 bool isRealType() const; // C99 6.2.5p17 (real floating + integer)
2009 bool isArithmeticType() const; // C99 6.2.5p18 (integer + floating)
2010 bool isVoidType() const; // C99 6.2.5p19
2011 bool isScalarType() const; // C99 6.2.5p21 (arithmetic + pointers)
2012 bool isAggregateType() const;
2013 bool isFundamentalType() const;
2014 bool isCompoundType() const;
2015
2016 // Type Predicates: Check to see if this type is structurally the specified
2017 // type, ignoring typedefs and qualifiers.
2018 bool isFunctionType() const;
2019 bool isFunctionNoProtoType() const { return getAs<FunctionNoProtoType>(); }
2020 bool isFunctionProtoType() const { return getAs<FunctionProtoType>(); }
2021 bool isPointerType() const;
2022 bool isAnyPointerType() const; // Any C pointer or ObjC object pointer
2023 bool isBlockPointerType() const;
2024 bool isVoidPointerType() const;
2025 bool isReferenceType() const;
2026 bool isLValueReferenceType() const;
2027 bool isRValueReferenceType() const;
2028 bool isObjectPointerType() const;
2029 bool isFunctionPointerType() const;
2030 bool isFunctionReferenceType() const;
2031 bool isMemberPointerType() const;
2032 bool isMemberFunctionPointerType() const;
2033 bool isMemberDataPointerType() const;
2034 bool isArrayType() const;
2035 bool isConstantArrayType() const;
2036 bool isIncompleteArrayType() const;
2037 bool isVariableArrayType() const;
2038 bool isDependentSizedArrayType() const;
2039 bool isRecordType() const;
2040 bool isClassType() const;
2041 bool isStructureType() const;
2042 bool isObjCBoxableRecordType() const;
2043 bool isInterfaceType() const;
2044 bool isStructureOrClassType() const;
2045 bool isUnionType() const;
2046 bool isComplexIntegerType() const; // GCC _Complex integer type.
2047 bool isVectorType() const; // GCC vector type.
2048 bool isExtVectorType() const; // Extended vector type.
2049 bool isMatrixType() const; // Matrix type.
2050 bool isConstantMatrixType() const; // Constant matrix type.
2051 bool isDependentAddressSpaceType() const; // value-dependent address space qualifier
2052 bool isObjCObjectPointerType() const; // pointer to ObjC object
2053 bool isObjCRetainableType() const; // ObjC object or block pointer
2054 bool isObjCLifetimeType() const; // (array of)* retainable type
2055 bool isObjCIndirectLifetimeType() const; // (pointer to)* lifetime type
2056 bool isObjCNSObjectType() const; // __attribute__((NSObject))
2057 bool isObjCIndependentClassType() const; // __attribute__((objc_independent_class))
2058 // FIXME: change this to 'raw' interface type, so we can used 'interface' type
2059 // for the common case.
2060 bool isObjCObjectType() const; // NSString or typeof(*(id)0)
2061 bool isObjCQualifiedInterfaceType() const; // NSString<foo>
2062 bool isObjCQualifiedIdType() const; // id<foo>
2063 bool isObjCQualifiedClassType() const; // Class<foo>
2064 bool isObjCObjectOrInterfaceType() const;
2065 bool isObjCIdType() const; // id
2066 bool isDecltypeType() const;
2067 /// Was this type written with the special inert-in-ARC __unsafe_unretained
2068 /// qualifier?
2069 ///
2070 /// This approximates the answer to the following question: if this
2071 /// translation unit were compiled in ARC, would this type be qualified
2072 /// with __unsafe_unretained?
2073 bool isObjCInertUnsafeUnretainedType() const {
2074 return hasAttr(attr::ObjCInertUnsafeUnretained);
2075 }
2076
2077 /// Whether the type is Objective-C 'id' or a __kindof type of an
2078 /// object type, e.g., __kindof NSView * or __kindof id
2079 /// <NSCopying>.
2080 ///
2081 /// \param bound Will be set to the bound on non-id subtype types,
2082 /// which will be (possibly specialized) Objective-C class type, or
2083 /// null for 'id.
2084 bool isObjCIdOrObjectKindOfType(const ASTContext &ctx,
2085 const ObjCObjectType *&bound) const;
2086
2087 bool isObjCClassType() const; // Class
2088
2089 /// Whether the type is Objective-C 'Class' or a __kindof type of an
2090 /// Class type, e.g., __kindof Class <NSCopying>.
2091 ///
2092 /// Unlike \c isObjCIdOrObjectKindOfType, there is no relevant bound
2093 /// here because Objective-C's type system cannot express "a class
2094 /// object for a subclass of NSFoo".
2095 bool isObjCClassOrClassKindOfType() const;
2096
2097 bool isBlockCompatibleObjCPointerType(ASTContext &ctx) const;
2098 bool isObjCSelType() const; // Class
2099 bool isObjCBuiltinType() const; // 'id' or 'Class'
2100 bool isObjCARCBridgableType() const;
2101 bool isCARCBridgableType() const;
2102 bool isTemplateTypeParmType() const; // C++ template type parameter
2103 bool isNullPtrType() const; // C++11 std::nullptr_t
2104 bool isNothrowT() const; // C++ std::nothrow_t
2105 bool isAlignValT() const; // C++17 std::align_val_t
2106 bool isStdByteType() const; // C++17 std::byte
2107 bool isAtomicType() const; // C11 _Atomic()
2108 bool isUndeducedAutoType() const; // C++11 auto or
2109 // C++14 decltype(auto)
2110 bool isTypedefNameType() const; // typedef or alias template
2111
2112#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
2113 bool is##Id##Type() const;
2114#include "clang/Basic/OpenCLImageTypes.def"
2115
2116 bool isImageType() const; // Any OpenCL image type
2117
2118 bool isSamplerT() const; // OpenCL sampler_t
2119 bool isEventT() const; // OpenCL event_t
2120 bool isClkEventT() const; // OpenCL clk_event_t
2121 bool isQueueT() const; // OpenCL queue_t
2122 bool isReserveIDT() const; // OpenCL reserve_id_t
2123
2124#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
2125 bool is##Id##Type() const;
2126#include "clang/Basic/OpenCLExtensionTypes.def"
2127 // Type defined in cl_intel_device_side_avc_motion_estimation OpenCL extension
2128 bool isOCLIntelSubgroupAVCType() const;
2129 bool isOCLExtOpaqueType() const; // Any OpenCL extension type
2130
2131 bool isPipeType() const; // OpenCL pipe type
2132 bool isBitIntType() const; // Bit-precise integer type
2133 bool isOpenCLSpecificType() const; // Any OpenCL specific type
2134
2135 /// Determines if this type, which must satisfy
2136 /// isObjCLifetimeType(), is implicitly __unsafe_unretained rather
2137 /// than implicitly __strong.
2138 bool isObjCARCImplicitlyUnretainedType() const;
2139
2140 /// Check if the type is the CUDA device builtin surface type.
2141 bool isCUDADeviceBuiltinSurfaceType() const;
2142 /// Check if the type is the CUDA device builtin texture type.
2143 bool isCUDADeviceBuiltinTextureType() const;
2144
2145 /// Return the implicit lifetime for this type, which must not be dependent.
2146 Qualifiers::ObjCLifetime getObjCARCImplicitLifetime() const;
2147
2148 enum ScalarTypeKind {
2149 STK_CPointer,
2150 STK_BlockPointer,
2151 STK_ObjCObjectPointer,
2152 STK_MemberPointer,
2153 STK_Bool,
2154 STK_Integral,
2155 STK_Floating,
2156 STK_IntegralComplex,
2157 STK_FloatingComplex,
2158 STK_FixedPoint
2159 };
2160
2161 /// Given that this is a scalar type, classify it.
2162 ScalarTypeKind getScalarTypeKind() const;
2163
2164 TypeDependence getDependence() const {
2165 return static_cast<TypeDependence>(TypeBits.Dependence);
2166 }
2167
2168 /// Whether this type is an error type.
2169 bool containsErrors() const {
2170 return getDependence() & TypeDependence::Error;
2171 }
2172
2173 /// Whether this type is a dependent type, meaning that its definition
2174 /// somehow depends on a template parameter (C++ [temp.dep.type]).
2175 bool isDependentType() const {
2176 return getDependence() & TypeDependence::Dependent;
2177 }
2178
2179 /// Determine whether this type is an instantiation-dependent type,
2180 /// meaning that the type involves a template parameter (even if the
2181 /// definition does not actually depend on the type substituted for that
2182 /// template parameter).
2183 bool isInstantiationDependentType() const {
2184 return getDependence() & TypeDependence::Instantiation;
2185 }
2186
2187 /// Determine whether this type is an undeduced type, meaning that
2188 /// it somehow involves a C++11 'auto' type or similar which has not yet been
2189 /// deduced.
2190 bool isUndeducedType() const;
2191
2192 /// Whether this type is a variably-modified type (C99 6.7.5).
2193 bool isVariablyModifiedType() const {
2194 return getDependence() & TypeDependence::VariablyModified;
2195 }
2196
2197 /// Whether this type involves a variable-length array type
2198 /// with a definite size.
2199 bool hasSizedVLAType() const;
2200
2201 /// Whether this type is or contains a local or unnamed type.
2202 bool hasUnnamedOrLocalType() const;
2203
2204 bool isOverloadableType() const;
2205
2206 /// Determine wither this type is a C++ elaborated-type-specifier.
2207 bool isElaboratedTypeSpecifier() const;
2208
2209 bool canDecayToPointerType() const;
2210
2211 /// Whether this type is represented natively as a pointer. This includes
2212 /// pointers, references, block pointers, and Objective-C interface,
2213 /// qualified id, and qualified interface types, as well as nullptr_t.
2214 bool hasPointerRepresentation() const;
2215
2216 /// Whether this type can represent an objective pointer type for the
2217 /// purpose of GC'ability
2218 bool hasObjCPointerRepresentation() const;
2219
2220 /// Determine whether this type has an integer representation
2221 /// of some sort, e.g., it is an integer type or a vector.
2222 bool hasIntegerRepresentation() const;
2223
2224 /// Determine whether this type has an signed integer representation
2225 /// of some sort, e.g., it is an signed integer type or a vector.
2226 bool hasSignedIntegerRepresentation() const;
2227
2228 /// Determine whether this type has an unsigned integer representation
2229 /// of some sort, e.g., it is an unsigned integer type or a vector.
2230 bool hasUnsignedIntegerRepresentation() const;
2231
2232 /// Determine whether this type has a floating-point representation
2233 /// of some sort, e.g., it is a floating-point type or a vector thereof.
2234 bool hasFloatingRepresentation() const;
2235
2236 // Type Checking Functions: Check to see if this type is structurally the
2237 // specified type, ignoring typedefs and qualifiers, and return a pointer to
2238 // the best type we can.
2239 const RecordType *getAsStructureType() const;
2240 /// NOTE: getAs*ArrayType are methods on ASTContext.
2241 const RecordType *getAsUnionType() const;
2242 const ComplexType *getAsComplexIntegerType() const; // GCC complex int type.
2243 const ObjCObjectType *getAsObjCInterfaceType() const;
2244
2245 // The following is a convenience method that returns an ObjCObjectPointerType
2246 // for object declared using an interface.
2247 const ObjCObjectPointerType *getAsObjCInterfacePointerType() const;
2248 const ObjCObjectPointerType *getAsObjCQualifiedIdType() const;
2249 const ObjCObjectPointerType *getAsObjCQualifiedClassType() const;
2250 const ObjCObjectType *getAsObjCQualifiedInterfaceType() const;
2251
2252 /// Retrieves the CXXRecordDecl that this type refers to, either
2253 /// because the type is a RecordType or because it is the injected-class-name
2254 /// type of a class template or class template partial specialization.
2255 CXXRecordDecl *getAsCXXRecordDecl() const;
2256
2257 /// Retrieves the RecordDecl this type refers to.
2258 RecordDecl *getAsRecordDecl() const;
2259
2260 /// Retrieves the TagDecl that this type refers to, either
2261 /// because the type is a TagType or because it is the injected-class-name
2262 /// type of a class template or class template partial specialization.
2263 TagDecl *getAsTagDecl() const;
2264
2265 /// If this is a pointer or reference to a RecordType, return the
2266 /// CXXRecordDecl that the type refers to.
2267 ///
2268 /// If this is not a pointer or reference, or the type being pointed to does
2269 /// not refer to a CXXRecordDecl, returns NULL.
2270 const CXXRecordDecl *getPointeeCXXRecordDecl() const;
2271
2272 /// Get the DeducedType whose type will be deduced for a variable with
2273 /// an initializer of this type. This looks through declarators like pointer
2274 /// types, but not through decltype or typedefs.
2275 DeducedType *getContainedDeducedType() const;
2276
2277 /// Get the AutoType whose type will be deduced for a variable with
2278 /// an initializer of this type. This looks through declarators like pointer
2279 /// types, but not through decltype or typedefs.
2280 AutoType *getContainedAutoType() const {
2281 return dyn_cast_or_null<AutoType>(getContainedDeducedType());
2282 }
2283
2284 /// Determine whether this type was written with a leading 'auto'
2285 /// corresponding to a trailing return type (possibly for a nested
2286 /// function type within a pointer to function type or similar).
2287 bool hasAutoForTrailingReturnType() const;
2288
2289 /// Member-template getAs<specific type>'. Look through sugar for
2290 /// an instance of \<specific type>. This scheme will eventually
2291 /// replace the specific getAsXXXX methods above.
2292 ///
2293 /// There are some specializations of this member template listed
2294 /// immediately following this class.
2295 template <typename T> const T *getAs() const;
2296
2297 /// Member-template getAsAdjusted<specific type>. Look through specific kinds
2298 /// of sugar (parens, attributes, etc) for an instance of \<specific type>.
2299 /// This is used when you need to walk over sugar nodes that represent some
2300 /// kind of type adjustment from a type that was written as a \<specific type>
2301 /// to another type that is still canonically a \<specific type>.
2302 template <typename T> const T *getAsAdjusted() const;
2303
2304 /// A variant of getAs<> for array types which silently discards
2305 /// qualifiers from the outermost type.
2306 const ArrayType *getAsArrayTypeUnsafe() const;
2307
2308 /// Member-template castAs<specific type>. Look through sugar for
2309 /// the underlying instance of \<specific type>.
2310 ///
2311 /// This method has the same relationship to getAs<T> as cast<T> has
2312 /// to dyn_cast<T>; which is to say, the underlying type *must*
2313 /// have the intended type, and this method will never return null.
2314 template <typename T> const T *castAs() const;
2315
2316 /// A variant of castAs<> for array type which silently discards
2317 /// qualifiers from the outermost type.
2318 const ArrayType *castAsArrayTypeUnsafe() const;
2319
2320 /// Determine whether this type had the specified attribute applied to it
2321 /// (looking through top-level type sugar).
2322 bool hasAttr(attr::Kind AK) const;
2323
2324 /// Get the base element type of this type, potentially discarding type
2325 /// qualifiers. This should never be used when type qualifiers
2326 /// are meaningful.
2327 const Type *getBaseElementTypeUnsafe() const;
2328
2329 /// If this is an array type, return the element type of the array,
2330 /// potentially with type qualifiers missing.
2331 /// This should never be used when type qualifiers are meaningful.
2332 const Type *getArrayElementTypeNoTypeQual() const;
2333
2334 /// If this is a pointer type, return the pointee type.
2335 /// If this is an array type, return the array element type.
2336 /// This should never be used when type qualifiers are meaningful.
2337 const Type *getPointeeOrArrayElementType() const;
2338
2339 /// If this is a pointer, ObjC object pointer, or block
2340 /// pointer, this returns the respective pointee.
2341 QualType getPointeeType() const;
2342
2343 /// Return the specified type with any "sugar" removed from the type,
2344 /// removing any typedefs, typeofs, etc., as well as any qualifiers.
2345 const Type *getUnqualifiedDesugaredType() const;
2346
2347 /// More type predicates useful for type checking/promotion
2348 bool isPromotableIntegerType() const; // C99 6.3.1.1p2
2349
2350 /// Return true if this is an integer type that is
2351 /// signed, according to C99 6.2.5p4 [char, signed char, short, int, long..],
2352 /// or an enum decl which has a signed representation.
2353 bool isSignedIntegerType() const;
2354
2355 /// Return true if this is an integer type that is
2356 /// unsigned, according to C99 6.2.5p6 [which returns true for _Bool],
2357 /// or an enum decl which has an unsigned representation.
2358 bool isUnsignedIntegerType() const;
2359
2360 /// Determines whether this is an integer type that is signed or an
2361 /// enumeration types whose underlying type is a signed integer type.
2362 bool isSignedIntegerOrEnumerationType() const;
2363
2364 /// Determines whether this is an integer type that is unsigned or an
2365 /// enumeration types whose underlying type is a unsigned integer type.
2366 bool isUnsignedIntegerOrEnumerationType() const;
2367
2368 /// Return true if this is a fixed point type according to
2369 /// ISO/IEC JTC1 SC22 WG14 N1169.
2370 bool isFixedPointType() const;
2371
2372 /// Return true if this is a fixed point or integer type.
2373 bool isFixedPointOrIntegerType() const;
2374
2375 /// Return true if this is a saturated fixed point type according to
2376 /// ISO/IEC JTC1 SC22 WG14 N1169. This type can be signed or unsigned.
2377 bool isSaturatedFixedPointType() const;
2378
2379 /// Return true if this is a saturated fixed point type according to
2380 /// ISO/IEC JTC1 SC22 WG14 N1169. This type can be signed or unsigned.
2381 bool isUnsaturatedFixedPointType() const;
2382
2383 /// Return true if this is a fixed point type that is signed according
2384 /// to ISO/IEC JTC1 SC22 WG14 N1169. This type can also be saturated.
2385 bool isSignedFixedPointType() const;
2386
2387 /// Return true if this is a fixed point type that is unsigned according
2388 /// to ISO/IEC JTC1 SC22 WG14 N1169. This type can also be saturated.
2389 bool isUnsignedFixedPointType() const;
2390
2391 /// Return true if this is not a variable sized type,
2392 /// according to the rules of C99 6.7.5p3. It is not legal to call this on
2393 /// incomplete types.
2394 bool isConstantSizeType() const;
2395
2396 /// Returns true if this type can be represented by some
2397 /// set of type specifiers.
2398 bool isSpecifierType() const;
2399
2400 /// Determine the linkage of this type.
2401 Linkage getLinkage() const;
2402
2403 /// Determine the visibility of this type.
2404 Visibility getVisibility() const {
2405 return getLinkageAndVisibility().getVisibility();
2406 }
2407
2408 /// Return true if the visibility was explicitly set is the code.
2409 bool isVisibilityExplicit() const {
2410 return getLinkageAndVisibility().isVisibilityExplicit();
2411 }
2412
2413 /// Determine the linkage and visibility of this type.
2414 LinkageInfo getLinkageAndVisibility() const;
2415
2416 /// True if the computed linkage is valid. Used for consistency
2417 /// checking. Should always return true.
2418 bool isLinkageValid() const;
2419
2420 /// Determine the nullability of the given type.
2421 ///
2422 /// Note that nullability is only captured as sugar within the type
2423 /// system, not as part of the canonical type, so nullability will
2424 /// be lost by canonicalization and desugaring.
2425 Optional<NullabilityKind> getNullability(const ASTContext &context) const;
2426
2427 /// Determine whether the given type can have a nullability
2428 /// specifier applied to it, i.e., if it is any kind of pointer type.
2429 ///
2430 /// \param ResultIfUnknown The value to return if we don't yet know whether
2431 /// this type can have nullability because it is dependent.
2432 bool canHaveNullability(bool ResultIfUnknown = true) const;
2433
2434 /// Retrieve the set of substitutions required when accessing a member
2435 /// of the Objective-C receiver type that is declared in the given context.
2436 ///
2437 /// \c *this is the type of the object we're operating on, e.g., the
2438 /// receiver for a message send or the base of a property access, and is
2439 /// expected to be of some object or object pointer type.
2440 ///
2441 /// \param dc The declaration context for which we are building up a
2442 /// substitution mapping, which should be an Objective-C class, extension,
2443 /// category, or method within.
2444 ///
2445 /// \returns an array of type arguments that can be substituted for
2446 /// the type parameters of the given declaration context in any type described
2447 /// within that context, or an empty optional to indicate that no
2448 /// substitution is required.
2449 Optional<ArrayRef<QualType>>
2450 getObjCSubstitutions(const DeclContext *dc) const;
2451
2452 /// Determines if this is an ObjC interface type that may accept type
2453 /// parameters.
2454 bool acceptsObjCTypeParams() const;
2455
2456 const char *getTypeClassName() const;
2457
2458 QualType getCanonicalTypeInternal() const {
2459 return CanonicalType;
2460 }
2461
2462 CanQualType getCanonicalTypeUnqualified() const; // in CanonicalType.h
2463 void dump() const;
2464 void dump(llvm::raw_ostream &OS, const ASTContext &Context) const;
2465};
2466
2467/// This will check for a TypedefType by removing any existing sugar
2468/// until it reaches a TypedefType or a non-sugared type.
2469template <> const TypedefType *Type::getAs() const;
2470
2471/// This will check for a TemplateSpecializationType by removing any
2472/// existing sugar until it reaches a TemplateSpecializationType or a
2473/// non-sugared type.
2474template <> const TemplateSpecializationType *Type::getAs() const;
2475
2476/// This will check for an AttributedType by removing any existing sugar
2477/// until it reaches an AttributedType or a non-sugared type.
2478template <> const AttributedType *Type::getAs() const;
2479
2480// We can do canonical leaf types faster, because we don't have to
2481// worry about preserving child type decoration.
2482#define TYPE(Class, Base)
2483#define LEAF_TYPE(Class) \
2484template <> inline const Class##Type *Type::getAs() const { \
2485 return dyn_cast<Class##Type>(CanonicalType); \
2486} \
2487template <> inline const Class##Type *Type::castAs() const { \
2488 return cast<Class##Type>(CanonicalType); \
2489}
2490#include "clang/AST/TypeNodes.inc"
2491
2492/// This class is used for builtin types like 'int'. Builtin
2493/// types are always canonical and have a literal name field.
2494class BuiltinType : public Type {
2495public:
2496 enum Kind {
2497// OpenCL image types
2498#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) Id,
2499#include "clang/Basic/OpenCLImageTypes.def"
2500// OpenCL extension types
2501#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) Id,
2502#include "clang/Basic/OpenCLExtensionTypes.def"
2503// SVE Types
2504#define SVE_TYPE(Name, Id, SingletonId) Id,
2505#include "clang/Basic/AArch64SVEACLETypes.def"
2506// PPC MMA Types
2507#define PPC_VECTOR_TYPE(Name, Id, Size) Id,
2508#include "clang/Basic/PPCTypes.def"
2509// RVV Types
2510#define RVV_TYPE(Name, Id, SingletonId) Id,
2511#include "clang/Basic/RISCVVTypes.def"
2512// All other builtin types
2513#define BUILTIN_TYPE(Id, SingletonId) Id,
2514#define LAST_BUILTIN_TYPE(Id) LastKind = Id
2515#include "clang/AST/BuiltinTypes.def"
2516 };
2517
2518private:
2519 friend class ASTContext; // ASTContext creates these.
2520
2521 BuiltinType(Kind K)
2522 : Type(Builtin, QualType(),
2523 K == Dependent ? TypeDependence::DependentInstantiation
2524 : TypeDependence::None) {
2525 BuiltinTypeBits.Kind = K;
2526 }
2527
2528public:
2529 Kind getKind() const { return static_cast<Kind>(BuiltinTypeBits.Kind); }
2530 StringRef getName(const PrintingPolicy &Policy) const;
2531
2532 const char *getNameAsCString(const PrintingPolicy &Policy) const {
2533 // The StringRef is null-terminated.
2534 StringRef str = getName(Policy);
2535 assert(!str.empty() && str.data()[str.size()] == '\0')(static_cast <bool> (!str.empty() && str.data()
[str.size()] == '\0') ? void (0) : __assert_fail ("!str.empty() && str.data()[str.size()] == '\\0'"
, "clang/include/clang/AST/Type.h", 2535, __extension__ __PRETTY_FUNCTION__
))
;
2536 return str.data();
2537 }
2538
2539 bool isSugared() const { return false; }
2540 QualType desugar() const { return QualType(this, 0); }
2541
2542 bool isInteger() const {
2543 return getKind() >= Bool && getKind() <= Int128;
2544 }
2545
2546 bool isSignedInteger() const {
2547 return getKind() >= Char_S && getKind() <= Int128;
2548 }
2549
2550 bool isUnsignedInteger() const {
2551 return getKind() >= Bool && getKind() <= UInt128;
2552 }
2553
2554 bool isFloatingPoint() const {
2555 return getKind() >= Half && getKind() <= Ibm128;
2556 }
2557
2558 /// Determines whether the given kind corresponds to a placeholder type.
2559 static bool isPlaceholderTypeKind(Kind K) {
2560 return K >= Overload;
2561 }
2562
2563 /// Determines whether this type is a placeholder type, i.e. a type
2564 /// which cannot appear in arbitrary positions in a fully-formed
2565 /// expression.
2566 bool isPlaceholderType() const {
2567 return isPlaceholderTypeKind(getKind());
2568 }
2569
2570 /// Determines whether this type is a placeholder type other than
2571 /// Overload. Most placeholder types require only syntactic
2572 /// information about their context in order to be resolved (e.g.
2573 /// whether it is a call expression), which means they can (and
2574 /// should) be resolved in an earlier "phase" of analysis.
2575 /// Overload expressions sometimes pick up further information
2576 /// from their context, like whether the context expects a
2577 /// specific function-pointer type, and so frequently need
2578 /// special treatment.
2579 bool isNonOverloadPlaceholderType() const {
2580 return getKind() > Overload;
2581 }
2582
2583 static bool classof(const Type *T) { return T->getTypeClass() == Builtin; }
2584};
2585
2586/// Complex values, per C99 6.2.5p11. This supports the C99 complex
2587/// types (_Complex float etc) as well as the GCC integer complex extensions.
2588class ComplexType : public Type, public llvm::FoldingSetNode {
2589 friend class ASTContext; // ASTContext creates these.
2590
2591 QualType ElementType;
2592
2593 ComplexType(QualType Element, QualType CanonicalPtr)
2594 : Type(Complex, CanonicalPtr, Element->getDependence()),
2595 ElementType(Element) {}
2596
2597public:
2598 QualType getElementType() const { return ElementType; }
2599
2600 bool isSugared() const { return false; }
2601 QualType desugar() const { return QualType(this, 0); }
2602
2603 void Profile(llvm::FoldingSetNodeID &ID) {
2604 Profile(ID, getElementType());
2605 }
2606
2607 static void Profile(llvm::FoldingSetNodeID &ID, QualType Element) {
2608 ID.AddPointer(Element.getAsOpaquePtr());
2609 }
2610
2611 static bool classof(const Type *T) { return T->getTypeClass() == Complex; }
2612};
2613
2614/// Sugar for parentheses used when specifying types.
2615class ParenType : public Type, public llvm::FoldingSetNode {
2616 friend class ASTContext; // ASTContext creates these.
2617
2618 QualType Inner;
2619
2620 ParenType(QualType InnerType, QualType CanonType)
2621 : Type(Paren, CanonType, InnerType->getDependence()), Inner(InnerType) {}
2622
2623public:
2624 QualType getInnerType() const { return Inner; }
2625
2626 bool isSugared() const { return true; }
2627 QualType desugar() const { return getInnerType(); }
2628
2629 void Profile(llvm::FoldingSetNodeID &ID) {
2630 Profile(ID, getInnerType());
2631 }
2632
2633 static void Profile(llvm::FoldingSetNodeID &ID, QualType Inner) {
2634 Inner.Profile(ID);
2635 }
2636
2637 static bool classof(const Type *T) { return T->getTypeClass() == Paren; }
2638};
2639
2640/// PointerType - C99 6.7.5.1 - Pointer Declarators.
2641class PointerType : public Type, public llvm::FoldingSetNode {
2642 friend class ASTContext; // ASTContext creates these.
2643
2644 QualType PointeeType;
2645
2646 PointerType(QualType Pointee, QualType CanonicalPtr)
2647 : Type(Pointer, CanonicalPtr, Pointee->getDependence()),
2648 PointeeType(Pointee) {}
2649
2650public:
2651 QualType getPointeeType() const { return PointeeType; }
2652
2653 bool isSugared() const { return false; }
2654 QualType desugar() const { return QualType(this, 0); }
2655
2656 void Profile(llvm::FoldingSetNodeID &ID) {
2657 Profile(ID, getPointeeType());
2658 }
2659
2660 static void Profile(llvm::FoldingSetNodeID &ID, QualType Pointee) {
2661 ID.AddPointer(Pointee.getAsOpaquePtr());
2662 }
2663
2664 static bool classof(const Type *T) { return T->getTypeClass() == Pointer; }
2665};
2666
2667/// Represents a type which was implicitly adjusted by the semantic
2668/// engine for arbitrary reasons. For example, array and function types can
2669/// decay, and function types can have their calling conventions adjusted.
2670class AdjustedType : public Type, public llvm::FoldingSetNode {
2671 QualType OriginalTy;
2672 QualType AdjustedTy;
2673
2674protected:
2675 friend class ASTContext; // ASTContext creates these.
2676
2677 AdjustedType(TypeClass TC, QualType OriginalTy, QualType AdjustedTy,
2678 QualType CanonicalPtr)
2679 : Type(TC, CanonicalPtr, OriginalTy->getDependence()),
2680 OriginalTy(OriginalTy), AdjustedTy(AdjustedTy) {}
2681
2682public:
2683 QualType getOriginalType() const { return OriginalTy; }
2684 QualType getAdjustedType() const { return AdjustedTy; }
2685
2686 bool isSugared() const { return true; }
2687 QualType desugar() const { return AdjustedTy; }
2688
2689 void Profile(llvm::FoldingSetNodeID &ID) {
2690 Profile(ID, OriginalTy, AdjustedTy);
2691 }
2692
2693 static void Profile(llvm::FoldingSetNodeID &ID, QualType Orig, QualType New) {
2694 ID.AddPointer(Orig.getAsOpaquePtr());
2695 ID.AddPointer(New.getAsOpaquePtr());
2696 }
2697
2698 static bool classof(const Type *T) {
2699 return T->getTypeClass() == Adjusted || T->getTypeClass() == Decayed;
2700 }
2701};
2702
2703/// Represents a pointer type decayed from an array or function type.
2704class DecayedType : public AdjustedType {
2705 friend class ASTContext; // ASTContext creates these.
2706
2707 inline
2708 DecayedType(QualType OriginalType, QualType Decayed, QualType Canonical);
2709
2710public:
2711 QualType getDecayedType() const { return getAdjustedType(); }
2712
2713 inline QualType getPointeeType() const;
2714
2715 static bool classof(const Type *T) { return T->getTypeClass() == Decayed; }
2716};
2717
2718/// Pointer to a block type.
2719/// This type is to represent types syntactically represented as
2720/// "void (^)(int)", etc. Pointee is required to always be a function type.
2721class BlockPointerType : public Type, public llvm::FoldingSetNode {
2722 friend class ASTContext; // ASTContext creates these.
2723
2724 // Block is some kind of pointer type
2725 QualType PointeeType;
2726
2727 BlockPointerType(QualType Pointee, QualType CanonicalCls)
2728 : Type(BlockPointer, CanonicalCls, Pointee->getDependence()),
2729 PointeeType(Pointee) {}
2730
2731public:
2732 // Get the pointee type. Pointee is required to always be a function type.
2733 QualType getPointeeType() const { return PointeeType; }
2734
2735 bool isSugared() const { return false; }
2736 QualType desugar() const { return QualType(this, 0); }
2737
2738 void Profile(llvm::FoldingSetNodeID &ID) {
2739 Profile(ID, getPointeeType());
2740 }
2741
2742 static void Profile(llvm::FoldingSetNodeID &ID, QualType Pointee) {
2743 ID.AddPointer(Pointee.getAsOpaquePtr());
2744 }
2745
2746 static bool classof(const Type *T) {
2747 return T->getTypeClass() == BlockPointer;
2748 }
2749};
2750
2751/// Base for LValueReferenceType and RValueReferenceType
2752class ReferenceType : public Type, public llvm::FoldingSetNode {
2753 QualType PointeeType;
2754
2755protected:
2756 ReferenceType(TypeClass tc, QualType Referencee, QualType CanonicalRef,
2757 bool SpelledAsLValue)
2758 : Type(tc, CanonicalRef, Referencee->getDependence()),
2759 PointeeType(Referencee) {
2760 ReferenceTypeBits.SpelledAsLValue = SpelledAsLValue;
2761 ReferenceTypeBits.InnerRef = Referencee->isReferenceType();
2762 }
2763
2764public:
2765 bool isSpelledAsLValue() const { return ReferenceTypeBits.SpelledAsLValue; }
2766 bool isInnerRef() const { return ReferenceTypeBits.InnerRef; }
2767
2768 QualType getPointeeTypeAsWritten() const { return PointeeType; }
2769
2770 QualType getPointeeType() const {
2771 // FIXME: this might strip inner qualifiers; okay?
2772 const ReferenceType *T = this;
2773 while (T->isInnerRef())
2774 T = T->PointeeType->castAs<ReferenceType>();
2775 return T->PointeeType;
2776 }
2777
2778 void Profile(llvm::FoldingSetNodeID &ID) {
2779 Profile(ID, PointeeType, isSpelledAsLValue());
2780 }
2781
2782 static void Profile(llvm::FoldingSetNodeID &ID,
2783 QualType Referencee,
2784 bool SpelledAsLValue) {
2785 ID.AddPointer(Referencee.getAsOpaquePtr());
2786 ID.AddBoolean(SpelledAsLValue);
2787 }
2788
2789 static bool classof(const Type *T) {
2790 return T->getTypeClass() == LValueReference ||
2791 T->getTypeClass() == RValueReference;
2792 }
2793};
2794
2795/// An lvalue reference type, per C++11 [dcl.ref].
2796class LValueReferenceType : public ReferenceType {
2797 friend class ASTContext; // ASTContext creates these
2798
2799 LValueReferenceType(QualType Referencee, QualType CanonicalRef,
2800 bool SpelledAsLValue)
2801 : ReferenceType(LValueReference, Referencee, CanonicalRef,
2802 SpelledAsLValue) {}
2803
2804public:
2805 bool isSugared() const { return false; }
2806 QualType desugar() const { return QualType(this, 0); }
2807
2808 static bool classof(const Type *T) {
2809 return T->getTypeClass() == LValueReference;
2810 }
2811};
2812
2813/// An rvalue reference type, per C++11 [dcl.ref].
2814class RValueReferenceType : public ReferenceType {
2815 friend class ASTContext; // ASTContext creates these
2816
2817 RValueReferenceType(QualType Referencee, QualType CanonicalRef)
2818 : ReferenceType(RValueReference, Referencee, CanonicalRef, false) {}
2819
2820public:
2821 bool isSugared() const { return false; }
2822 QualType desugar() const { return QualType(this, 0); }
2823
2824 static bool classof(const Type *T) {
2825 return T->getTypeClass() == RValueReference;
2826 }
2827};
2828
2829/// A pointer to member type per C++ 8.3.3 - Pointers to members.
2830///
2831/// This includes both pointers to data members and pointer to member functions.
2832class MemberPointerType : public Type, public llvm::FoldingSetNode {
2833 friend class ASTContext; // ASTContext creates these.
2834
2835 QualType PointeeType;
2836
2837 /// The class of which the pointee is a member. Must ultimately be a
2838 /// RecordType, but could be a typedef or a template parameter too.
2839 const Type *Class;
2840
2841 MemberPointerType(QualType Pointee, const Type *Cls, QualType CanonicalPtr)
2842 : Type(MemberPointer, CanonicalPtr,
2843 (Cls->getDependence() & ~TypeDependence::VariablyModified) |
2844 Pointee->getDependence()),
2845 PointeeType(Pointee), Class(Cls) {}
2846
2847public:
2848 QualType getPointeeType() const { return PointeeType; }
2849
2850 /// Returns true if the member type (i.e. the pointee type) is a
2851 /// function type rather than a data-member type.
2852 bool isMemberFunctionPointer() const {
2853 return PointeeType->isFunctionProtoType();
2854 }
2855
2856 /// Returns true if the member type (i.e. the pointee type) is a
2857 /// data type rather than a function type.
2858 bool isMemberDataPointer() const {
2859 return !PointeeType->isFunctionProtoType();
2860 }
2861
2862 const Type *getClass() const { return Class; }
2863 CXXRecordDecl *getMostRecentCXXRecordDecl() const;
2864
2865 bool isSugared() const { return false; }
2866 QualType desugar() const { return QualType(this, 0); }
2867
2868 void Profile(llvm::FoldingSetNodeID &ID) {
2869 Profile(ID, getPointeeType(), getClass());
2870 }
2871
2872 static void Profile(llvm::FoldingSetNodeID &ID, QualType Pointee,
2873 const Type *Class) {
2874 ID.AddPointer(Pointee.getAsOpaquePtr());
2875 ID.AddPointer(Class);
2876 }
2877
2878 static bool classof(const Type *T) {
2879 return T->getTypeClass() == MemberPointer;
2880 }
2881};
2882
2883/// Represents an array type, per C99 6.7.5.2 - Array Declarators.
2884class ArrayType : public Type, public llvm::FoldingSetNode {
2885public:
2886 /// Capture whether this is a normal array (e.g. int X[4])
2887 /// an array with a static size (e.g. int X[static 4]), or an array
2888 /// with a star size (e.g. int X[*]).
2889 /// 'static' is only allowed on function parameters.
2890 enum ArraySizeModifier {
2891 Normal, Static, Star
2892 };
2893
2894private:
2895 /// The element type of the array.
2896 QualType ElementType;
2897
2898protected:
2899 friend class ASTContext; // ASTContext creates these.
2900
2901 ArrayType(TypeClass tc, QualType et, QualType can, ArraySizeModifier sm,
2902 unsigned tq, const Expr *sz = nullptr);
2903
2904public:
2905 QualType getElementType() const { return ElementType; }
2906
2907 ArraySizeModifier getSizeModifier() const {
2908 return ArraySizeModifier(ArrayTypeBits.SizeModifier);
2909 }
2910
2911 Qualifiers getIndexTypeQualifiers() const {
2912 return Qualifiers::fromCVRMask(getIndexTypeCVRQualifiers());
2913 }
2914
2915 unsigned getIndexTypeCVRQualifiers() const {
2916 return ArrayTypeBits.IndexTypeQuals;
2917 }
2918
2919 static bool classof(const Type *T) {
2920 return T->getTypeClass() == ConstantArray ||
2921 T->getTypeClass() == VariableArray ||
2922 T->getTypeClass() == IncompleteArray ||
2923 T->getTypeClass() == DependentSizedArray;
2924 }
2925};
2926
2927/// Represents the canonical version of C arrays with a specified constant size.
2928/// For example, the canonical type for 'int A[4 + 4*100]' is a
2929/// ConstantArrayType where the element type is 'int' and the size is 404.
2930class ConstantArrayType final
2931 : public ArrayType,
2932 private llvm::TrailingObjects<ConstantArrayType, const Expr *> {
2933 friend class ASTContext; // ASTContext creates these.
2934 friend TrailingObjects;
2935
2936 llvm::APInt Size; // Allows us to unique the type.
2937
2938 ConstantArrayType(QualType et, QualType can, const llvm::APInt &size,
2939 const Expr *sz, ArraySizeModifier sm, unsigned tq)
2940 : ArrayType(ConstantArray, et, can, sm, tq, sz), Size(size) {
2941 ConstantArrayTypeBits.HasStoredSizeExpr = sz != nullptr;
2942 if (ConstantArrayTypeBits.HasStoredSizeExpr) {
2943 assert(!can.isNull() && "canonical constant array should not have size")(static_cast <bool> (!can.isNull() && "canonical constant array should not have size"
) ? void (0) : __assert_fail ("!can.isNull() && \"canonical constant array should not have size\""
, "clang/include/clang/AST/Type.h", 2943, __extension__ __PRETTY_FUNCTION__
))
;
2944 *getTrailingObjects<const Expr*>() = sz;
2945 }
2946 }
2947
2948 unsigned numTrailingObjects(OverloadToken<const Expr*>) const {
2949 return ConstantArrayTypeBits.HasStoredSizeExpr;
2950 }
2951
2952public:
2953 const llvm::APInt &getSize() const { return Size; }
2954 const Expr *getSizeExpr() const {
2955 return ConstantArrayTypeBits.HasStoredSizeExpr
2956 ? *getTrailingObjects<const Expr *>()
2957 : nullptr;
2958 }
2959 bool isSugared() const { return false; }
2960 QualType desugar() const { return QualType(this, 0); }
2961
2962 /// Determine the number of bits required to address a member of
2963 // an array with the given element type and number of elements.
2964 static unsigned getNumAddressingBits(const ASTContext &Context,
2965 QualType ElementType,
2966 const llvm::APInt &NumElements);
2967
2968 /// Determine the maximum number of active bits that an array's size
2969 /// can require, which limits the maximum size of the array.
2970 static unsigned getMaxSizeBits(const ASTContext &Context);
2971
2972 void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Ctx) {
2973 Profile(ID, Ctx, getElementType(), getSize(), getSizeExpr(),
2974 getSizeModifier(), getIndexTypeCVRQualifiers());
2975 }
2976
2977 static void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Ctx,
2978 QualType ET, const llvm::APInt &ArraySize,
2979 const Expr *SizeExpr, ArraySizeModifier SizeMod,
2980 unsigned TypeQuals);
2981
2982 static bool classof(const Type *T) {
2983 return T->getTypeClass() == ConstantArray;
2984 }
2985};
2986
2987/// Represents a C array with an unspecified size. For example 'int A[]' has
2988/// an IncompleteArrayType where the element type is 'int' and the size is
2989/// unspecified.
2990class IncompleteArrayType : public ArrayType {
2991 friend class ASTContext; // ASTContext creates these.
2992
2993 IncompleteArrayType(QualType et, QualType can,
2994 ArraySizeModifier sm, unsigned tq)
2995 : ArrayType(IncompleteArray, et, can, sm, tq) {}
2996
2997public:
2998 friend class StmtIteratorBase;
2999
3000 bool isSugared() const { return false; }
3001 QualType desugar() const { return QualType(this, 0); }
3002
3003 static bool classof(const Type *T) {
3004 return T->getTypeClass() == IncompleteArray;
3005 }
3006
3007 void Profile(llvm::FoldingSetNodeID &ID) {
3008 Profile(ID, getElementType(), getSizeModifier(),
3009 getIndexTypeCVRQualifiers());
3010 }
3011
3012 static void Profile(llvm::FoldingSetNodeID &ID, QualType ET,
3013 ArraySizeModifier SizeMod, unsigned TypeQuals) {
3014 ID.AddPointer(ET.getAsOpaquePtr());
3015 ID.AddInteger(SizeMod);
3016 ID.AddInteger(TypeQuals);
3017 }
3018};
3019
3020/// Represents a C array with a specified size that is not an
3021/// integer-constant-expression. For example, 'int s[x+foo()]'.
3022/// Since the size expression is an arbitrary expression, we store it as such.
3023///
3024/// Note: VariableArrayType's aren't uniqued (since the expressions aren't) and
3025/// should not be: two lexically equivalent variable array types could mean
3026/// different things, for example, these variables do not have the same type
3027/// dynamically:
3028///
3029/// void foo(int x) {
3030/// int Y[x];
3031/// ++x;
3032/// int Z[x];
3033/// }
3034class VariableArrayType : public ArrayType {
3035 friend class ASTContext; // ASTContext creates these.
3036
3037 /// An assignment-expression. VLA's are only permitted within
3038 /// a function block.
3039 Stmt *SizeExpr;
3040
3041 /// The range spanned by the left and right array brackets.
3042 SourceRange Brackets;
3043
3044 VariableArrayType(QualType et, QualType can, Expr *e,
3045 ArraySizeModifier sm, unsigned tq,
3046 SourceRange brackets)
3047 : ArrayType(VariableArray, et, can, sm, tq, e),
3048 SizeExpr((Stmt*) e), Brackets(brackets) {}
3049
3050public:
3051 friend class StmtIteratorBase;
3052
3053 Expr *getSizeExpr() const {
3054 // We use C-style casts instead of cast<> here because we do not wish
3055 // to have a dependency of Type.h on Stmt.h/Expr.h.
3056 return (Expr*) SizeExpr;
3057 }
3058
3059 SourceRange getBracketsRange() const { return Brackets; }
3060 SourceLocation getLBracketLoc() const { return Brackets.getBegin(); }
3061 SourceLocation getRBracketLoc() const { return Brackets.getEnd(); }
3062
3063 bool isSugared() const { return false; }
3064 QualType desugar() const { return QualType(this, 0); }
3065
3066 static bool classof(const Type *T) {
3067 return T->getTypeClass() == VariableArray;
3068 }
3069
3070 void Profile(llvm::FoldingSetNodeID &ID) {
3071 llvm_unreachable("Cannot unique VariableArrayTypes.")::llvm::llvm_unreachable_internal("Cannot unique VariableArrayTypes."
, "clang/include/clang/AST/Type.h", 3071)
;
3072 }
3073};
3074
3075/// Represents an array type in C++ whose size is a value-dependent expression.
3076///
3077/// For example:
3078/// \code
3079/// template<typename T, int Size>
3080/// class array {
3081/// T data[Size];
3082/// };
3083/// \endcode
3084///
3085/// For these types, we won't actually know what the array bound is
3086/// until template instantiation occurs, at which point this will
3087/// become either a ConstantArrayType or a VariableArrayType.
3088class DependentSizedArrayType : public ArrayType {
3089 friend class ASTContext; // ASTContext creates these.
3090
3091 const ASTContext &Context;
3092
3093 /// An assignment expression that will instantiate to the
3094 /// size of the array.
3095 ///
3096 /// The expression itself might be null, in which case the array
3097 /// type will have its size deduced from an initializer.
3098 Stmt *SizeExpr;
3099
3100 /// The range spanned by the left and right array brackets.
3101 SourceRange Brackets;
3102
3103 DependentSizedArrayType(const ASTContext &Context, QualType et, QualType can,
3104 Expr *e, ArraySizeModifier sm, unsigned tq,
3105 SourceRange brackets);
3106
3107public:
3108 friend class StmtIteratorBase;
3109
3110 Expr *getSizeExpr() const {
3111 // We use C-style casts instead of cast<> here because we do not wish
3112 // to have a dependency of Type.h on Stmt.h/Expr.h.
3113 return (Expr*) SizeExpr;
3114 }
3115
3116 SourceRange getBracketsRange() const { return Brackets; }
3117 SourceLocation getLBracketLoc() const { return Brackets.getBegin(); }
3118 SourceLocation getRBracketLoc() const { return Brackets.getEnd(); }
3119
3120 bool isSugared() const { return false; }
3121 QualType desugar() const { return QualType(this, 0); }
3122
3123 static bool classof(const Type *T) {
3124 return T->getTypeClass() == DependentSizedArray;
3125 }
3126
3127 void Profile(llvm::FoldingSetNodeID &ID) {
3128 Profile(ID, Context, getElementType(),
3129 getSizeModifier(), getIndexTypeCVRQualifiers(), getSizeExpr());
3130 }
3131
3132 static void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context,
3133 QualType ET, ArraySizeModifier SizeMod,
3134 unsigned TypeQuals, Expr *E);
3135};
3136
3137/// Represents an extended address space qualifier where the input address space
3138/// value is dependent. Non-dependent address spaces are not represented with a
3139/// special Type subclass; they are stored on an ExtQuals node as part of a QualType.
3140///
3141/// For example:
3142/// \code
3143/// template<typename T, int AddrSpace>
3144/// class AddressSpace {
3145/// typedef T __attribute__((address_space(AddrSpace))) type;
3146/// }
3147/// \endcode
3148class DependentAddressSpaceType : public Type, public llvm::FoldingSetNode {
3149 friend class ASTContext;
3150
3151 const ASTContext &Context;
3152 Expr *AddrSpaceExpr;
3153 QualType PointeeType;
3154 SourceLocation loc;
3155
3156 DependentAddressSpaceType(const ASTContext &Context, QualType PointeeType,
3157 QualType can, Expr *AddrSpaceExpr,
3158 SourceLocation loc);
3159
3160public:
3161 Expr *getAddrSpaceExpr() const { return AddrSpaceExpr; }
3162 QualType getPointeeType() const { return PointeeType; }
3163 SourceLocation getAttributeLoc() const { return loc; }
3164
3165 bool isSugared() const { return false; }
3166 QualType desugar() const { return QualType(this, 0); }
3167
3168 static bool classof(const Type *T) {
3169 return T->getTypeClass() == DependentAddressSpace;
3170 }
3171
3172 void Profile(llvm::FoldingSetNodeID &ID) {
3173 Profile(ID, Context, getPointeeType(), getAddrSpaceExpr());
3174 }
3175
3176 static void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context,
3177 QualType PointeeType, Expr *AddrSpaceExpr);
3178};
3179
3180/// Represents an extended vector type where either the type or size is
3181/// dependent.
3182///
3183/// For example:
3184/// \code
3185/// template<typename T, int Size>
3186/// class vector {
3187/// typedef T __attribute__((ext_vector_type(Size))) type;
3188/// }
3189/// \endcode
3190class DependentSizedExtVectorType : public Type, public llvm::FoldingSetNode {
3191 friend class ASTContext;
3192
3193 const ASTContext &Context;
3194 Expr *SizeExpr;
3195
3196 /// The element type of the array.
3197 QualType ElementType;
3198
3199 SourceLocation loc;
3200
3201 DependentSizedExtVectorType(const ASTContext &Context, QualType ElementType,
3202 QualType can, Expr *SizeExpr, SourceLocation loc);
3203
3204public:
3205 Expr *getSizeExpr() const { return SizeExpr; }
3206 QualType getElementType() const { return ElementType; }
3207 SourceLocation getAttributeLoc() const { return loc; }
3208
3209 bool isSugared() const { return false; }
3210 QualType desugar() const { return QualType(this, 0); }
3211
3212 static bool classof(const Type *T) {
3213 return T->getTypeClass() == DependentSizedExtVector;
3214 }
3215
3216 void Profile(llvm::FoldingSetNodeID &ID) {
3217 Profile(ID, Context, getElementType(), getSizeExpr());
3218 }
3219
3220 static void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context,
3221 QualType ElementType, Expr *SizeExpr);
3222};
3223
3224
3225/// Represents a GCC generic vector type. This type is created using
3226/// __attribute__((vector_size(n)), where "n" specifies the vector size in
3227/// bytes; or from an Altivec __vector or vector declaration.
3228/// Since the constructor takes the number of vector elements, the
3229/// client is responsible for converting the size into the number of elements.
3230class VectorType : public Type, public llvm::FoldingSetNode {
3231public:
3232 enum VectorKind {
3233 /// not a target-specific vector type
3234 GenericVector,
3235
3236 /// is AltiVec vector
3237 AltiVecVector,
3238
3239 /// is AltiVec 'vector Pixel'
3240 AltiVecPixel,
3241
3242 /// is AltiVec 'vector bool ...'
3243 AltiVecBool,
3244
3245 /// is ARM Neon vector
3246 NeonVector,
3247
3248 /// is ARM Neon polynomial vector
3249 NeonPolyVector,
3250
3251 /// is AArch64 SVE fixed-length data vector
3252 SveFixedLengthDataVector,
3253
3254 /// is AArch64 SVE fixed-length predicate vector
3255 SveFixedLengthPredicateVector
3256 };
3257
3258protected:
3259 friend class ASTContext; // ASTContext creates these.
3260
3261 /// The element type of the vector.
3262 QualType ElementType;
3263
3264 VectorType(QualType vecType, unsigned nElements, QualType canonType,
3265 VectorKind vecKind);
3266
3267 VectorType(TypeClass tc, QualType vecType, unsigned nElements,
3268 QualType canonType, VectorKind vecKind);
3269
3270public:
3271 QualType getElementType() const { return ElementType; }
3272 unsigned getNumElements() const { return VectorTypeBits.NumElements; }
3273
3274 bool isSugared() const { return false; }
3275 QualType desugar() const { return QualType(this, 0); }
3276
3277 VectorKind getVectorKind() const {
3278 return VectorKind(VectorTypeBits.VecKind);
3279 }
3280
3281 void Profile(llvm::FoldingSetNodeID &ID) {
3282 Profile(ID, getElementType(), getNumElements(),
3283 getTypeClass(), getVectorKind());
3284 }
3285
3286 static void Profile(llvm::FoldingSetNodeID &ID, QualType ElementType,
3287 unsigned NumElements, TypeClass TypeClass,
3288 VectorKind VecKind) {
3289 ID.AddPointer(ElementType.getAsOpaquePtr());
3290 ID.AddInteger(NumElements);
3291 ID.AddInteger(TypeClass);
3292 ID.AddInteger(VecKind);
3293 }
3294
3295 static bool classof(const Type *T) {
3296 return T->getTypeClass() == Vector || T->getTypeClass() == ExtVector;
3297 }
3298};
3299
3300/// Represents a vector type where either the type or size is dependent.
3301////
3302/// For example:
3303/// \code
3304/// template<typename T, int Size>
3305/// class vector {
3306/// typedef T __attribute__((vector_size(Size))) type;
3307/// }
3308/// \endcode
3309class DependentVectorType : public Type, public llvm::FoldingSetNode {
3310 friend class ASTContext;
3311
3312 const ASTContext &Context;
3313 QualType ElementType;
3314 Expr *SizeExpr;
3315 SourceLocation Loc;
3316
3317 DependentVectorType(const ASTContext &Context, QualType ElementType,
3318 QualType CanonType, Expr *SizeExpr,
3319 SourceLocation Loc, VectorType::VectorKind vecKind);
3320
3321public:
3322 Expr *getSizeExpr() const { return SizeExpr; }
3323 QualType getElementType() const { return ElementType; }
3324 SourceLocation getAttributeLoc() const { return Loc; }
3325 VectorType::VectorKind getVectorKind() const {
3326 return VectorType::VectorKind(VectorTypeBits.VecKind);
3327 }
3328
3329 bool isSugared() const { return false; }
3330 QualType desugar() const { return QualType(this, 0); }
3331
3332 static bool classof(const Type *T) {
3333 return T->getTypeClass() == DependentVector;
3334 }
3335
3336 void Profile(llvm::FoldingSetNodeID &ID) {
3337 Profile(ID, Context, getElementType(), getSizeExpr(), getVectorKind());
3338 }
3339
3340 static void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context,
3341 QualType ElementType, const Expr *SizeExpr,
3342 VectorType::VectorKind VecKind);
3343};
3344
3345/// ExtVectorType - Extended vector type. This type is created using
3346/// __attribute__((ext_vector_type(n)), where "n" is the number of elements.
3347/// Unlike vector_size, ext_vector_type is only allowed on typedef's. This
3348/// class enables syntactic extensions, like Vector Components for accessing
3349/// points (as .xyzw), colors (as .rgba), and textures (modeled after OpenGL
3350/// Shading Language).
3351class ExtVectorType : public VectorType {
3352 friend class ASTContext; // ASTContext creates these.
3353
3354 ExtVectorType(QualType vecType, unsigned nElements, QualType canonType)
3355 : VectorType(ExtVector, vecType, nElements, canonType, GenericVector) {}
3356
3357public:
3358 static int getPointAccessorIdx(char c) {
3359 switch (c) {
3360 default: return -1;
3361 case 'x': case 'r': return 0;
3362 case 'y': case 'g': return 1;
3363 case 'z': case 'b': return 2;
3364 case 'w': case 'a': return 3;
3365 }
3366 }
3367
3368 static int getNumericAccessorIdx(char c) {
3369 switch (c) {
3370 default: return -1;
3371 case '0': return 0;
3372 case '1': return 1;
3373 case '2': return 2;
3374 case '3': return 3;
3375 case '4': return 4;
3376 case '5': return 5;
3377 case '6': return 6;
3378 case '7': return 7;
3379 case '8': return 8;
3380 case '9': return 9;
3381 case 'A':
3382 case 'a': return 10;
3383 case 'B':
3384 case 'b': return 11;
3385 case 'C':
3386 case 'c': return 12;
3387 case 'D':
3388 case 'd': return 13;
3389 case 'E':
3390 case 'e': return 14;
3391 case 'F':
3392 case 'f': return 15;
3393 }
3394 }
3395
3396 static int getAccessorIdx(char c, bool isNumericAccessor) {
3397 if (isNumericAccessor)
3398 return getNumericAccessorIdx(c);
3399 else
3400 return getPointAccessorIdx(c);
3401 }
3402
3403 bool isAccessorWithinNumElements(char c, bool isNumericAccessor) const {
3404 if (int idx = getAccessorIdx(c, isNumericAccessor)+1)
3405 return unsigned(idx-1) < getNumElements();
3406 return false;
3407 }
3408
3409 bool isSugared() const { return false; }
3410 QualType desugar() const { return QualType(this, 0); }
3411
3412 static bool classof(const Type *T) {
3413 return T->getTypeClass() == ExtVector;
3414 }
3415};
3416
3417/// Represents a matrix type, as defined in the Matrix Types clang extensions.
3418/// __attribute__((matrix_type(rows, columns))), where "rows" specifies
3419/// number of rows and "columns" specifies the number of columns.
3420class MatrixType : public Type, public llvm::FoldingSetNode {
3421protected:
3422 friend class ASTContext;
3423
3424 /// The element type of the matrix.
3425 QualType ElementType;
3426
3427 MatrixType(QualType ElementTy, QualType CanonElementTy);
3428
3429 MatrixType(TypeClass TypeClass, QualType ElementTy, QualType CanonElementTy,
3430 const Expr *RowExpr = nullptr, const Expr *ColumnExpr = nullptr);
3431
3432public:
3433 /// Returns type of the elements being stored in the matrix
3434 QualType getElementType() const { return ElementType; }
3435
3436 /// Valid elements types are the following:
3437 /// * an integer type (as in C2x 6.2.5p19), but excluding enumerated types
3438 /// and _Bool
3439 /// * the standard floating types float or double
3440 /// * a half-precision floating point type, if one is supported on the target
3441 static bool isValidElementType(QualType T) {
3442 return T->isDependentType() ||
3443 (T->isRealType() && !T->isBooleanType() && !T->isEnumeralType());
3444 }
3445
3446 bool isSugared() const { return false; }
3447 QualType desugar() const { return QualType(this, 0); }
3448
3449 static bool classof(const Type *T) {
3450 return T->getTypeClass() == ConstantMatrix ||
3451 T->getTypeClass() == DependentSizedMatrix;
3452 }
3453};
3454
3455/// Represents a concrete matrix type with constant number of rows and columns
3456class ConstantMatrixType final : public MatrixType {
3457protected:
3458 friend class ASTContext;
3459
3460 /// Number of rows and columns.
3461 unsigned NumRows;
3462 unsigned NumColumns;
3463
3464 static constexpr unsigned MaxElementsPerDimension = (1 << 20) - 1;
3465
3466 ConstantMatrixType(QualType MatrixElementType, unsigned NRows,
3467 unsigned NColumns, QualType CanonElementType);
3468
3469 ConstantMatrixType(TypeClass typeClass, QualType MatrixType, unsigned NRows,
3470 unsigned NColumns, QualType CanonElementType);
3471
3472public:
3473 /// Returns the number of rows in the matrix.
3474 unsigned getNumRows() const { return NumRows; }
3475
3476 /// Returns the number of columns in the matrix.
3477 unsigned getNumColumns() const { return NumColumns; }
3478
3479 /// Returns the number of elements required to embed the matrix into a vector.
3480 unsigned getNumElementsFlattened() const {
3481 return getNumRows() * getNumColumns();
3482 }
3483
3484 /// Returns true if \p NumElements is a valid matrix dimension.
3485 static constexpr bool isDimensionValid(size_t NumElements) {
3486 return NumElements > 0 && NumElements <= MaxElementsPerDimension;
3487 }
3488
3489 /// Returns the maximum number of elements per dimension.
3490 static constexpr unsigned getMaxElementsPerDimension() {
3491 return MaxElementsPerDimension;
3492 }
3493
3494 void Profile(llvm::FoldingSetNodeID &ID) {
3495 Profile(ID, getElementType(), getNumRows(), getNumColumns(),
3496 getTypeClass());
3497 }
3498
3499 static void Profile(llvm::FoldingSetNodeID &ID, QualType ElementType,
3500 unsigned NumRows, unsigned NumColumns,
3501 TypeClass TypeClass) {
3502 ID.AddPointer(ElementType.getAsOpaquePtr());
3503 ID.AddInteger(NumRows);
3504 ID.AddInteger(NumColumns);
3505 ID.AddInteger(TypeClass);
3506 }
3507
3508 static bool classof(const Type *T) {
3509 return T->getTypeClass() == ConstantMatrix;
3510 }
3511};
3512
3513/// Represents a matrix type where the type and the number of rows and columns
3514/// is dependent on a template.
3515class DependentSizedMatrixType final : public MatrixType {
3516 friend class ASTContext;
3517
3518 const ASTContext &Context;
3519 Expr *RowExpr;
3520 Expr *ColumnExpr;
3521
3522 SourceLocation loc;
3523
3524 DependentSizedMatrixType(const ASTContext &Context, QualType ElementType,
3525 QualType CanonicalType, Expr *RowExpr,
3526 Expr *ColumnExpr, SourceLocation loc);
3527
3528public:
3529 Expr *getRowExpr() const { return RowExpr; }
3530 Expr *getColumnExpr() const { return ColumnExpr; }
3531 SourceLocation getAttributeLoc() const { return loc; }
3532
3533 static bool classof(const Type *T) {
3534 return T->getTypeClass() == DependentSizedMatrix;
3535 }
3536
3537 void Profile(llvm::FoldingSetNodeID &ID) {
3538 Profile(ID, Context, getElementType(), getRowExpr(), getColumnExpr());
3539 }
3540
3541 static void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context,
3542 QualType ElementType, Expr *RowExpr, Expr *ColumnExpr);
3543};
3544
3545/// FunctionType - C99 6.7.5.3 - Function Declarators. This is the common base
3546/// class of FunctionNoProtoType and FunctionProtoType.
3547class FunctionType : public Type {
3548 // The type returned by the function.
3549 QualType ResultType;
3550
3551public:
3552 /// Interesting information about a specific parameter that can't simply
3553 /// be reflected in parameter's type. This is only used by FunctionProtoType
3554 /// but is in FunctionType to make this class available during the
3555 /// specification of the bases of FunctionProtoType.
3556 ///
3557 /// It makes sense to model language features this way when there's some
3558 /// sort of parameter-specific override (such as an attribute) that
3559 /// affects how the function is called. For example, the ARC ns_consumed
3560 /// attribute changes whether a parameter is passed at +0 (the default)
3561 /// or +1 (ns_consumed). This must be reflected in the function type,
3562 /// but isn't really a change to the parameter type.
3563 ///
3564 /// One serious disadvantage of modelling language features this way is
3565 /// that they generally do not work with language features that attempt
3566 /// to destructure types. For example, template argument deduction will
3567 /// not be able to match a parameter declared as
3568 /// T (*)(U)
3569 /// against an argument of type
3570 /// void (*)(__attribute__((ns_consumed)) id)
3571 /// because the substitution of T=void, U=id into the former will
3572 /// not produce the latter.
3573 class ExtParameterInfo {
3574 enum {
3575 ABIMask = 0x0F,
3576 IsConsumed = 0x10,
3577 HasPassObjSize = 0x20,
3578 IsNoEscape = 0x40,
3579 };
3580 unsigned char Data = 0;
3581
3582 public:
3583 ExtParameterInfo() = default;
3584
3585 /// Return the ABI treatment of this parameter.
3586 ParameterABI getABI() const { return ParameterABI(Data & ABIMask); }
3587 ExtParameterInfo withABI(ParameterABI kind) const {
3588 ExtParameterInfo copy = *this;
3589 copy.Data = (copy.Data & ~ABIMask) | unsigned(kind);
3590 return copy;
3591 }
3592
3593 /// Is this parameter considered "consumed" by Objective-C ARC?
3594 /// Consumed parameters must have retainable object type.
3595 bool isConsumed() const { return (Data & IsConsumed); }
3596 ExtParameterInfo withIsConsumed(bool consumed) const {
3597 ExtParameterInfo copy = *this;
3598 if (consumed)
3599 copy.Data |= IsConsumed;
3600 else
3601 copy.Data &= ~IsConsumed;
3602 return copy;
3603 }
3604
3605 bool hasPassObjectSize() const { return Data & HasPassObjSize; }
3606 ExtParameterInfo withHasPassObjectSize() const {
3607 ExtParameterInfo Copy = *this;
3608 Copy.Data |= HasPassObjSize;
3609 return Copy;
3610 }
3611
3612 bool isNoEscape() const { return Data & IsNoEscape; }
3613 ExtParameterInfo withIsNoEscape(bool NoEscape) const {
3614 ExtParameterInfo Copy = *this;
3615 if (NoEscape)
3616 Copy.Data |= IsNoEscape;
3617 else
3618 Copy.Data &= ~IsNoEscape;
3619 return Copy;
3620 }
3621
3622 unsigned char getOpaqueValue() const { return Data; }
3623 static ExtParameterInfo getFromOpaqueValue(unsigned char data) {
3624 ExtParameterInfo result;
3625 result.Data = data;
3626 return result;
3627 }
3628
3629 friend bool operator==(ExtParameterInfo lhs, ExtParameterInfo rhs) {
3630 return lhs.Data == rhs.Data;
3631 }
3632
3633 friend bool operator!=(ExtParameterInfo lhs, ExtParameterInfo rhs) {
3634 return lhs.Data != rhs.Data;
3635 }
3636 };
3637
3638 /// A class which abstracts out some details necessary for
3639 /// making a call.
3640 ///
3641 /// It is not actually used directly for storing this information in
3642 /// a FunctionType, although FunctionType does currently use the
3643 /// same bit-pattern.
3644 ///
3645 // If you add a field (say Foo), other than the obvious places (both,
3646 // constructors, compile failures), what you need to update is
3647 // * Operator==
3648 // * getFoo
3649 // * withFoo
3650 // * functionType. Add Foo, getFoo.
3651 // * ASTContext::getFooType
3652 // * ASTContext::mergeFunctionTypes
3653 // * FunctionNoProtoType::Profile
3654 // * FunctionProtoType::Profile
3655 // * TypePrinter::PrintFunctionProto
3656 // * AST read and write
3657 // * Codegen
3658 class ExtInfo {
3659 friend class FunctionType;
3660
3661 // Feel free to rearrange or add bits, but if you go over 16, you'll need to
3662 // adjust the Bits field below, and if you add bits, you'll need to adjust
3663 // Type::FunctionTypeBitfields::ExtInfo as well.
3664
3665 // | CC |noreturn|produces|nocallersavedregs|regparm|nocfcheck|cmsenscall|
3666 // |0 .. 4| 5 | 6 | 7 |8 .. 10| 11 | 12 |
3667 //
3668 // regparm is either 0 (no regparm attribute) or the regparm value+1.
3669 enum { CallConvMask = 0x1F };
3670 enum { NoReturnMask = 0x20 };
3671 enum { ProducesResultMask = 0x40 };
3672 enum { NoCallerSavedRegsMask = 0x80 };
3673 enum {
3674 RegParmMask = 0x700,
3675 RegParmOffset = 8
3676 };
3677 enum { NoCfCheckMask = 0x800 };
3678 enum { CmseNSCallMask = 0x1000 };
3679 uint16_t Bits = CC_C;
3680
3681 ExtInfo(unsigned Bits) : Bits(static_cast<uint16_t>(Bits)) {}
3682
3683 public:
3684 // Constructor with no defaults. Use this when you know that you
3685 // have all the elements (when reading an AST file for example).
3686 ExtInfo(bool noReturn, bool hasRegParm, unsigned regParm, CallingConv cc,
3687 bool producesResult, bool noCallerSavedRegs, bool NoCfCheck,
3688 bool cmseNSCall) {
3689 assert((!hasRegParm || regParm < 7) && "Invalid regparm value")(static_cast <bool> ((!hasRegParm || regParm < 7) &&
"Invalid regparm value") ? void (0) : __assert_fail ("(!hasRegParm || regParm < 7) && \"Invalid regparm value\""
, "clang/include/clang/AST/Type.h", 3689, __extension__ __PRETTY_FUNCTION__
))
;
3690 Bits = ((unsigned)cc) | (noReturn ? NoReturnMask : 0) |
3691 (producesResult ? ProducesResultMask : 0) |
3692 (noCallerSavedRegs ? NoCallerSavedRegsMask : 0) |
3693 (hasRegParm ? ((regParm + 1) << RegParmOffset) : 0) |
3694 (NoCfCheck ? NoCfCheckMask : 0) |
3695 (cmseNSCall ? CmseNSCallMask : 0);
3696 }
3697
3698 // Constructor with all defaults. Use when for example creating a
3699 // function known to use defaults.
3700 ExtInfo() = default;
3701
3702 // Constructor with just the calling convention, which is an important part
3703 // of the canonical type.
3704 ExtInfo(CallingConv CC) : Bits(CC) {}
3705
3706 bool getNoReturn() const { return Bits & NoReturnMask; }
3707 bool getProducesResult() const { return Bits & ProducesResultMask; }
3708 bool getCmseNSCall() const { return Bits & CmseNSCallMask; }
3709 bool getNoCallerSavedRegs() const { return Bits & NoCallerSavedRegsMask; }
3710 bool getNoCfCheck() const { return Bits & NoCfCheckMask; }
3711 bool getHasRegParm() const { return ((Bits & RegParmMask) >> RegParmOffset) != 0; }
3712
3713 unsigned getRegParm() const {
3714 unsigned RegParm = (Bits & RegParmMask) >> RegParmOffset;
3715 if (RegParm > 0)
3716 --RegParm;
3717 return RegParm;
3718 }
3719
3720 CallingConv getCC() const { return CallingConv(Bits & CallConvMask); }
3721
3722 bool operator==(ExtInfo Other) const {
3723 return Bits == Other.Bits;
3724 }
3725 bool operator!=(ExtInfo Other) const {
3726 return Bits != Other.Bits;
3727 }
3728
3729 // Note that we don't have setters. That is by design, use
3730 // the following with methods instead of mutating these objects.
3731
3732 ExtInfo withNoReturn(bool noReturn) const {
3733 if (noReturn)
3734 return ExtInfo(Bits | NoReturnMask);
3735 else
3736 return ExtInfo(Bits & ~NoReturnMask);
3737 }
3738
3739 ExtInfo withProducesResult(bool producesResult) const {
3740 if (producesResult)
3741 return ExtInfo(Bits | ProducesResultMask);
3742 else
3743 return ExtInfo(Bits & ~ProducesResultMask);
3744 }
3745
3746 ExtInfo withCmseNSCall(bool cmseNSCall) const {
3747 if (cmseNSCall)
3748 return ExtInfo(Bits | CmseNSCallMask);
3749 else
3750 return ExtInfo(Bits & ~CmseNSCallMask);
3751 }
3752
3753 ExtInfo withNoCallerSavedRegs(bool noCallerSavedRegs) const {
3754 if (noCallerSavedRegs)
3755 return ExtInfo(Bits | NoCallerSavedRegsMask);
3756 else
3757 return ExtInfo(Bits & ~NoCallerSavedRegsMask);
3758 }
3759
3760 ExtInfo withNoCfCheck(bool noCfCheck) const {
3761 if (noCfCheck)
3762 return ExtInfo(Bits | NoCfCheckMask);
3763 else
3764 return ExtInfo(Bits & ~NoCfCheckMask);
3765 }
3766
3767 ExtInfo withRegParm(unsigned RegParm) const {
3768 assert(RegParm < 7 && "Invalid regparm value")(static_cast <bool> (RegParm < 7 && "Invalid regparm value"
) ? void (0) : __assert_fail ("RegParm < 7 && \"Invalid regparm value\""
, "clang/include/clang/AST/Type.h", 3768, __extension__ __PRETTY_FUNCTION__
))
;
3769 return ExtInfo((Bits & ~RegParmMask) |
3770 ((RegParm + 1) << RegParmOffset));
3771 }
3772
3773 ExtInfo withCallingConv(CallingConv cc) const {
3774 return ExtInfo((Bits & ~CallConvMask) | (unsigned) cc);
3775 }
3776
3777 void Profile(llvm::FoldingSetNodeID &ID) const {
3778 ID.AddInteger(Bits);
3779 }
3780 };
3781
3782 /// A simple holder for a QualType representing a type in an
3783 /// exception specification. Unfortunately needed by FunctionProtoType
3784 /// because TrailingObjects cannot handle repeated types.
3785 struct ExceptionType { QualType Type; };
3786
3787 /// A simple holder for various uncommon bits which do not fit in
3788 /// FunctionTypeBitfields. Aligned to alignof(void *) to maintain the
3789 /// alignment of subsequent objects in TrailingObjects. You must update
3790 /// hasExtraBitfields in FunctionProtoType after adding extra data here.
3791 struct alignas(void *) FunctionTypeExtraBitfields {
3792 /// The number of types in the exception specification.
3793 /// A whole unsigned is not needed here and according to
3794 /// [implimits] 8 bits would be enough here.
3795 unsigned NumExceptionType;
3796 };
3797
3798protected:
3799 FunctionType(TypeClass tc, QualType res, QualType Canonical,
3800 TypeDependence Dependence, ExtInfo Info)
3801 : Type(tc, Canonical, Dependence), ResultType(res) {
3802 FunctionTypeBits.ExtInfo = Info.Bits;
3803 }
3804
3805 Qualifiers getFastTypeQuals() const {
3806 return Qualifiers::fromFastMask(FunctionTypeBits.FastTypeQuals);
3807 }
3808
3809public:
3810 QualType getReturnType() const { return ResultType; }
3811
3812 bool getHasRegParm() const { return getExtInfo().getHasRegParm(); }
3813 unsigned getRegParmType() const { return getExtInfo().getRegParm(); }
3814
3815 /// Determine whether this function type includes the GNU noreturn
3816 /// attribute. The C++11 [[noreturn]] attribute does not affect the function
3817 /// type.
3818 bool getNoReturnAttr() const { return getExtInfo().getNoReturn(); }
3819
3820 bool getCmseNSCallAttr() const { return getExtInfo().getCmseNSCall(); }
3821 CallingConv getCallConv() const { return getExtInfo().getCC(); }
3822 ExtInfo getExtInfo() const { return ExtInfo(FunctionTypeBits.ExtInfo); }
3823
3824 static_assert((~Qualifiers::FastMask & Qualifiers::CVRMask) == 0,
3825 "Const, volatile and restrict are assumed to be a subset of "
3826 "the fast qualifiers.");
3827
3828 bool isConst() const { return getFastTypeQuals().hasConst(); }
3829 bool isVolatile() const { return getFastTypeQuals().hasVolatile(); }
3830 bool isRestrict() const { return getFastTypeQuals().hasRestrict(); }
3831
3832 /// Determine the type of an expression that calls a function of
3833 /// this type.
3834 QualType getCallResultType(const ASTContext &Context) const {
3835 return getReturnType().getNonLValueExprType(Context);
3836 }
3837
3838 static StringRef getNameForCallConv(CallingConv CC);
3839
3840 static bool classof(const Type *T) {
3841 return T->getTypeClass() == FunctionNoProto ||
3842 T->getTypeClass() == FunctionProto;
3843 }
3844};
3845
3846/// Represents a K&R-style 'int foo()' function, which has
3847/// no information available about its arguments.
3848class FunctionNoProtoType : public FunctionType, public llvm::FoldingSetNode {
3849 friend class ASTContext; // ASTContext creates these.
3850
3851 FunctionNoProtoType(QualType Result, QualType Canonical, ExtInfo Info)
3852 : FunctionType(FunctionNoProto, Result, Canonical,
3853 Result->getDependence() &
3854 ~(TypeDependence::DependentInstantiation |
3855 TypeDependence::UnexpandedPack),
3856 Info) {}
3857
3858public:
3859 // No additional state past what FunctionType provides.
3860
3861 bool isSugared() const { return false; }
3862 QualType desugar() const { return QualType(this, 0); }
3863
3864 void Profile(llvm::FoldingSetNodeID &ID) {
3865 Profile(ID, getReturnType(), getExtInfo());
3866 }
3867
3868 static void Profile(llvm::FoldingSetNodeID &ID, QualType ResultType,
3869 ExtInfo Info) {
3870 Info.Profile(ID);
3871 ID.AddPointer(ResultType.getAsOpaquePtr());
3872 }
3873
3874 static bool classof(const Type *T) {
3875 return T->getTypeClass() == FunctionNoProto;
3876 }
3877};
3878
3879/// Represents a prototype with parameter type info, e.g.
3880/// 'int foo(int)' or 'int foo(void)'. 'void' is represented as having no
3881/// parameters, not as having a single void parameter. Such a type can have
3882/// an exception specification, but this specification is not part of the
3883/// canonical type. FunctionProtoType has several trailing objects, some of
3884/// which optional. For more information about the trailing objects see
3885/// the first comment inside FunctionProtoType.
3886class FunctionProtoType final
3887 : public FunctionType,
3888 public llvm::FoldingSetNode,
3889 private llvm::TrailingObjects<
3890 FunctionProtoType, QualType, SourceLocation,
3891 FunctionType::FunctionTypeExtraBitfields, FunctionType::ExceptionType,
3892 Expr *, FunctionDecl *, FunctionType::ExtParameterInfo, Qualifiers> {
3893 friend class ASTContext; // ASTContext creates these.
3894 friend TrailingObjects;
3895
3896 // FunctionProtoType is followed by several trailing objects, some of
3897 // which optional. They are in order:
3898 //
3899 // * An array of getNumParams() QualType holding the parameter types.
3900 // Always present. Note that for the vast majority of FunctionProtoType,
3901 // these will be the only trailing objects.
3902 //
3903 // * Optionally if the function is variadic, the SourceLocation of the
3904 // ellipsis.
3905 //
3906 // * Optionally if some extra data is stored in FunctionTypeExtraBitfields
3907 // (see FunctionTypeExtraBitfields and FunctionTypeBitfields):
3908 // a single FunctionTypeExtraBitfields. Present if and only if
3909 // hasExtraBitfields() is true.
3910 //
3911 // * Optionally exactly one of:
3912 // * an array of getNumExceptions() ExceptionType,
3913 // * a single Expr *,
3914 // * a pair of FunctionDecl *,
3915 // * a single FunctionDecl *
3916 // used to store information about the various types of exception
3917 // specification. See getExceptionSpecSize for the details.
3918 //
3919 // * Optionally an array of getNumParams() ExtParameterInfo holding
3920 // an ExtParameterInfo for each of the parameters. Present if and
3921 // only if hasExtParameterInfos() is true.
3922 //
3923 // * Optionally a Qualifiers object to represent extra qualifiers that can't
3924 // be represented by FunctionTypeBitfields.FastTypeQuals. Present if and only
3925 // if hasExtQualifiers() is true.
3926 //
3927 // The optional FunctionTypeExtraBitfields has to be before the data
3928 // related to the exception specification since it contains the number
3929 // of exception types.
3930 //
3931 // We put the ExtParameterInfos last. If all were equal, it would make
3932 // more sense to put these before the exception specification, because
3933 // it's much easier to skip past them compared to the elaborate switch
3934 // required to skip the exception specification. However, all is not
3935 // equal; ExtParameterInfos are used to model very uncommon features,
3936 // and it's better not to burden the more common paths.
3937
3938public:
3939 /// Holds information about the various types of exception specification.
3940 /// ExceptionSpecInfo is not stored as such in FunctionProtoType but is
3941 /// used to group together the various bits of information about the
3942 /// exception specification.
3943 struct ExceptionSpecInfo {
3944 /// The kind of exception specification this is.
3945 ExceptionSpecificationType Type = EST_None;
3946
3947 /// Explicitly-specified list of exception types.
3948 ArrayRef<QualType> Exceptions;
3949
3950 /// Noexcept expression, if this is a computed noexcept specification.
3951 Expr *NoexceptExpr = nullptr;
3952
3953 /// The function whose exception specification this is, for
3954 /// EST_Unevaluated and EST_Uninstantiated.
3955 FunctionDecl *SourceDecl = nullptr;
3956
3957 /// The function template whose exception specification this is instantiated
3958 /// from, for EST_Uninstantiated.
3959 FunctionDecl *SourceTemplate = nullptr;
3960
3961 ExceptionSpecInfo() = default;
3962
3963 ExceptionSpecInfo(ExceptionSpecificationType EST) : Type(EST) {}
3964 };
3965
3966 /// Extra information about a function prototype. ExtProtoInfo is not
3967 /// stored as such in FunctionProtoType but is used to group together
3968 /// the various bits of extra information about a function prototype.
3969 struct ExtProtoInfo {
3970 FunctionType::ExtInfo ExtInfo;
3971 bool Variadic : 1;
3972 bool HasTrailingReturn : 1;
3973 Qualifiers TypeQuals;
3974 RefQualifierKind RefQualifier = RQ_None;
3975 ExceptionSpecInfo ExceptionSpec;
3976 const ExtParameterInfo *ExtParameterInfos = nullptr;
3977 SourceLocation EllipsisLoc;
3978
3979 ExtProtoInfo() : Variadic(false), HasTrailingReturn(false) {}
3980
3981 ExtProtoInfo(CallingConv CC)
3982 : ExtInfo(CC), Variadic(false), HasTrailingReturn(false) {}
3983
3984 ExtProtoInfo withExceptionSpec(const ExceptionSpecInfo &ESI) {
3985 ExtProtoInfo Result(*this);
3986 Result.ExceptionSpec = ESI;
3987 return Result;
3988 }
3989 };
3990
3991private:
3992 unsigned numTrailingObjects(OverloadToken<QualType>) const {
3993 return getNumParams();
3994 }
3995
3996 unsigned numTrailingObjects(OverloadToken<SourceLocation>) const {
3997 return isVariadic();
3998 }
3999
4000 unsigned numTrailingObjects(OverloadToken<FunctionTypeExtraBitfields>) const {
4001 return hasExtraBitfields();
4002 }
4003
4004 unsigned numTrailingObjects(OverloadToken<ExceptionType>) const {
4005 return getExceptionSpecSize().NumExceptionType;
4006 }
4007
4008 unsigned numTrailingObjects(OverloadToken<Expr *>) const {
4009 return getExceptionSpecSize().NumExprPtr;
4010 }
4011
4012 unsigned numTrailingObjects(OverloadToken<FunctionDecl *>) const {
4013 return getExceptionSpecSize().NumFunctionDeclPtr;
4014 }
4015
4016 unsigned numTrailingObjects(OverloadToken<ExtParameterInfo>) const {
4017 return hasExtParameterInfos() ? getNumParams() : 0;
4018 }
4019
4020 /// Determine whether there are any argument types that
4021 /// contain an unexpanded parameter pack.
4022 static bool containsAnyUnexpandedParameterPack(const QualType *ArgArray,
4023 unsigned numArgs) {
4024 for (unsigned Idx = 0; Idx < numArgs; ++Idx)
4025 if (ArgArray[Idx]->containsUnexpandedParameterPack())
4026 return true;
4027
4028 return false;
4029 }
4030
4031 FunctionProtoType(QualType result, ArrayRef<QualType> params,
4032 QualType canonical, const ExtProtoInfo &epi);
4033
4034 /// This struct is returned by getExceptionSpecSize and is used to
4035 /// translate an ExceptionSpecificationType to the number and kind
4036 /// of trailing objects related to the exception specification.
4037 struct ExceptionSpecSizeHolder {
4038 unsigned NumExceptionType;
4039 unsigned NumExprPtr;
4040 unsigned NumFunctionDeclPtr;
4041 };
4042
4043 /// Return the number and kind of trailing objects
4044 /// related to the exception specification.
4045 static ExceptionSpecSizeHolder
4046 getExceptionSpecSize(ExceptionSpecificationType EST, unsigned NumExceptions) {
4047 switch (EST) {
4048 case EST_None:
4049 case EST_DynamicNone:
4050 case EST_MSAny:
4051 case EST_BasicNoexcept:
4052 case EST_Unparsed:
4053 case EST_NoThrow:
4054 return {0, 0, 0};
4055
4056 case EST_Dynamic:
4057 return {NumExceptions, 0, 0};
4058
4059 case EST_DependentNoexcept:
4060 case EST_NoexceptFalse:
4061 case EST_NoexceptTrue:
4062 return {0, 1, 0};
4063
4064 case EST_Uninstantiated:
4065 return {0, 0, 2};
4066
4067 case EST_Unevaluated:
4068 return {0, 0, 1};
4069 }
4070 llvm_unreachable("bad exception specification kind")::llvm::llvm_unreachable_internal("bad exception specification kind"
, "clang/include/clang/AST/Type.h", 4070)
;
4071 }
4072
4073 /// Return the number and kind of trailing objects
4074 /// related to the exception specification.
4075 ExceptionSpecSizeHolder getExceptionSpecSize() const {
4076 return getExceptionSpecSize(getExceptionSpecType(), getNumExceptions());
4077 }
4078
4079 /// Whether the trailing FunctionTypeExtraBitfields is present.
4080 static bool hasExtraBitfields(ExceptionSpecificationType EST) {
4081 // If the exception spec type is EST_Dynamic then we have > 0 exception
4082 // types and the exact number is stored in FunctionTypeExtraBitfields.
4083 return EST == EST_Dynamic;
4084 }
4085
4086 /// Whether the trailing FunctionTypeExtraBitfields is present.
4087 bool hasExtraBitfields() const {
4088 return hasExtraBitfields(getExceptionSpecType());
4089 }
4090
4091 bool hasExtQualifiers() const {
4092 return FunctionTypeBits.HasExtQuals;
4093 }
4094
4095public:
4096 unsigned getNumParams() const { return FunctionTypeBits.NumParams; }
4097
4098 QualType getParamType(unsigned i) const {
4099 assert(i < getNumParams() && "invalid parameter index")(static_cast <bool> (i < getNumParams() && "invalid parameter index"
) ? void (0) : __assert_fail ("i < getNumParams() && \"invalid parameter index\""
, "clang/include/clang/AST/Type.h", 4099, __extension__ __PRETTY_FUNCTION__
))
;
4100 return param_type_begin()[i];
4101 }
4102
4103 ArrayRef<QualType> getParamTypes() const {
4104 return llvm::makeArrayRef(param_type_begin(), param_type_end());
4105 }
4106
4107 ExtProtoInfo getExtProtoInfo() const {
4108 ExtProtoInfo EPI;
4109 EPI.ExtInfo = getExtInfo();
4110 EPI.Variadic = isVariadic();
4111 EPI.EllipsisLoc = getEllipsisLoc();
4112 EPI.HasTrailingReturn = hasTrailingReturn();
4113 EPI.ExceptionSpec = getExceptionSpecInfo();
4114 EPI.TypeQuals = getMethodQuals();
4115 EPI.RefQualifier = getRefQualifier();
4116 EPI.ExtParameterInfos = getExtParameterInfosOrNull();
4117 return EPI;
4118 }
4119
4120 /// Get the kind of exception specification on this function.
4121 ExceptionSpecificationType getExceptionSpecType() const {
4122 return static_cast<ExceptionSpecificationType>(
4123 FunctionTypeBits.ExceptionSpecType);
4124 }
4125
4126 /// Return whether this function has any kind of exception spec.
4127 bool hasExceptionSpec() const { return getExceptionSpecType() != EST_None; }
4128
4129 /// Return whether this function has a dynamic (throw) exception spec.
4130 bool hasDynamicExceptionSpec() const {
4131 return isDynamicExceptionSpec(getExceptionSpecType());
4132 }
4133
4134 /// Return whether this function has a noexcept exception spec.
4135 bool hasNoexceptExceptionSpec() const {
4136 return isNoexceptExceptionSpec(getExceptionSpecType());
4137 }
4138
4139 /// Return whether this function has a dependent exception spec.
4140 bool hasDependentExceptionSpec() const;
4141
4142 /// Return whether this function has an instantiation-dependent exception
4143 /// spec.
4144 bool hasInstantiationDependentExceptionSpec() const;
4145
4146 /// Return all the available information about this type's exception spec.
4147 ExceptionSpecInfo getExceptionSpecInfo() const {
4148 ExceptionSpecInfo Result;
4149 Result.Type = getExceptionSpecType();
4150 if (Result.Type == EST_Dynamic) {
4151 Result.Exceptions = exceptions();
4152 } else if (isComputedNoexcept(Result.Type)) {
4153 Result.NoexceptExpr = getNoexceptExpr();
4154 } else if (Result.Type == EST_Uninstantiated) {
4155 Result.SourceDecl = getExceptionSpecDecl();
4156 Result.SourceTemplate = getExceptionSpecTemplate();
4157 } else if (Result.Type == EST_Unevaluated) {
4158 Result.SourceDecl = getExceptionSpecDecl();
4159 }
4160 return Result;
4161 }
4162
4163 /// Return the number of types in the exception specification.
4164 unsigned getNumExceptions() const {
4165 return getExceptionSpecType() == EST_Dynamic
4166 ? getTrailingObjects<FunctionTypeExtraBitfields>()
4167 ->NumExceptionType
4168 : 0;
4169 }
4170
4171 /// Return the ith exception type, where 0 <= i < getNumExceptions().
4172 QualType getExceptionType(unsigned i) const {
4173 assert(i < getNumExceptions() && "Invalid exception number!")(static_cast <bool> (i < getNumExceptions() &&
"Invalid exception number!") ? void (0) : __assert_fail ("i < getNumExceptions() && \"Invalid exception number!\""
, "clang/include/clang/AST/Type.h", 4173, __extension__ __PRETTY_FUNCTION__
))
;
4174 return exception_begin()[i];
4175 }
4176
4177 /// Return the expression inside noexcept(expression), or a null pointer
4178 /// if there is none (because the exception spec is not of this form).
4179 Expr *getNoexceptExpr() const {
4180 if (!isComputedNoexcept(getExceptionSpecType()))
4181 return nullptr;
4182 return *getTrailingObjects<Expr *>();
4183 }
4184
4185 /// If this function type has an exception specification which hasn't
4186 /// been determined yet (either because it has not been evaluated or because
4187 /// it has not been instantiated), this is the function whose exception
4188 /// specification is represented by this type.
4189 FunctionDecl *getExceptionSpecDecl() const {
4190 if (getExceptionSpecType() != EST_Uninstantiated &&
4191 getExceptionSpecType() != EST_Unevaluated)
4192 return nullptr;
4193 return getTrailingObjects<FunctionDecl *>()[0];
4194 }
4195
4196 /// If this function type has an uninstantiated exception
4197 /// specification, this is the function whose exception specification
4198 /// should be instantiated to find the exception specification for
4199 /// this type.
4200 FunctionDecl *getExceptionSpecTemplate() const {
4201 if (getExceptionSpecType() != EST_Uninstantiated)
4202 return nullptr;
4203 return getTrailingObjects<FunctionDecl *>()[1];
4204 }
4205
4206 /// Determine whether this function type has a non-throwing exception
4207 /// specification.
4208 CanThrowResult canThrow() const;
4209
4210 /// Determine whether this function type has a non-throwing exception
4211 /// specification. If this depends on template arguments, returns
4212 /// \c ResultIfDependent.
4213 bool isNothrow(bool ResultIfDependent = false) const {
4214 return ResultIfDependent ? canThrow() != CT_Can : canThrow() == CT_Cannot;
4215 }
4216
4217 /// Whether this function prototype is variadic.
4218 bool isVariadic() const { return FunctionTypeBits.Variadic; }
4219
4220 SourceLocation getEllipsisLoc() const {
4221 return isVariadic() ? *getTrailingObjects<SourceLocation>()
4222 : SourceLocation();
4223 }
4224
4225 /// Determines whether this function prototype contains a
4226 /// parameter pack at the end.
4227 ///
4228 /// A function template whose last parameter is a parameter pack can be
4229 /// called with an arbitrary number of arguments, much like a variadic
4230 /// function.
4231 bool isTemplateVariadic() const;
4232
4233 /// Whether this function prototype has a trailing return type.
4234 bool hasTrailingReturn() const { return FunctionTypeBits.HasTrailingReturn; }
4235
4236 Qualifiers getMethodQuals() const {
4237 if (hasExtQualifiers())
4238 return *getTrailingObjects<Qualifiers>();
4239 else
4240 return getFastTypeQuals();
4241 }
4242
4243 /// Retrieve the ref-qualifier associated with this function type.
4244 RefQualifierKind getRefQualifier() const {
4245 return static_cast<RefQualifierKind>(FunctionTypeBits.RefQualifier);
4246 }
4247
4248 using param_type_iterator = const QualType *;
4249 using param_type_range = llvm::iterator_range<param_type_iterator>;
4250
4251 param_type_range param_types() const {
4252 return param_type_range(param_type_begin(), param_type_end());
4253 }
4254
4255 param_type_iterator param_type_begin() const {
4256 return getTrailingObjects<QualType>();
4257 }
4258
4259 param_type_iterator param_type_end() const {
4260 return param_type_begin() + getNumParams();
4261 }
4262
4263 using exception_iterator = const QualType *;
4264
4265 ArrayRef<QualType> exceptions() const {
4266 return llvm::makeArrayRef(exception_begin(), exception_end());
4267 }
4268
4269 exception_iterator exception_begin() const {
4270 return reinterpret_cast<exception_iterator>(
4271 getTrailingObjects<ExceptionType>());
4272 }
4273
4274 exception_iterator exception_end() const {
4275 return exception_begin() + getNumExceptions();
4276 }
4277
4278 /// Is there any interesting extra information for any of the parameters
4279 /// of this function type?
4280 bool hasExtParameterInfos() const {
4281 return FunctionTypeBits.HasExtParameterInfos;
4282 }
4283
4284 ArrayRef<ExtParameterInfo> getExtParameterInfos() const {
4285 assert(hasExtParameterInfos())(static_cast <bool> (hasExtParameterInfos()) ? void (0)
: __assert_fail ("hasExtParameterInfos()", "clang/include/clang/AST/Type.h"
, 4285, __extension__ __PRETTY_FUNCTION__))
;
4286 return ArrayRef<ExtParameterInfo>(getTrailingObjects<ExtParameterInfo>(),
4287 getNumParams());
4288 }
4289
4290 /// Return a pointer to the beginning of the array of extra parameter
4291 /// information, if present, or else null if none of the parameters
4292 /// carry it. This is equivalent to getExtProtoInfo().ExtParameterInfos.
4293 const ExtParameterInfo *getExtParameterInfosOrNull() const {
4294 if (!hasExtParameterInfos())
4295 return nullptr;
4296 return getTrailingObjects<ExtParameterInfo>();
4297 }
4298
4299 ExtParameterInfo getExtParameterInfo(unsigned I) const {
4300 assert(I < getNumParams() && "parameter index out of range")(static_cast <bool> (I < getNumParams() && "parameter index out of range"
) ? void (0) : __assert_fail ("I < getNumParams() && \"parameter index out of range\""
, "clang/include/clang/AST/Type.h", 4300, __extension__ __PRETTY_FUNCTION__
))
;
4301 if (hasExtParameterInfos())
4302 return getTrailingObjects<ExtParameterInfo>()[I];
4303 return ExtParameterInfo();
4304 }
4305
4306 ParameterABI getParameterABI(unsigned I) const {
4307 assert(I < getNumParams() && "parameter index out of range")(static_cast <bool> (I < getNumParams() && "parameter index out of range"
) ? void (0) : __assert_fail ("I < getNumParams() && \"parameter index out of range\""
, "clang/include/clang/AST/Type.h", 4307, __extension__ __PRETTY_FUNCTION__
))
;
4308 if (hasExtParameterInfos())
4309 return getTrailingObjects<ExtParameterInfo>()[I].getABI();
4310 return ParameterABI::Ordinary;
4311 }
4312
4313 bool isParamConsumed(unsigned I) const {
4314 assert(I < getNumParams() && "parameter index out of range")(static_cast <bool> (I < getNumParams() && "parameter index out of range"
) ? void (0) : __assert_fail ("I < getNumParams() && \"parameter index out of range\""
, "clang/include/clang/AST/Type.h", 4314, __extension__ __PRETTY_FUNCTION__
))
;
4315 if (hasExtParameterInfos())
4316 return getTrailingObjects<ExtParameterInfo>()[I].isConsumed();
4317 return false;
4318 }
4319
4320 bool isSugared() const { return false; }
4321 QualType desugar() const { return QualType(this, 0); }
4322
4323 void printExceptionSpecification(raw_ostream &OS,
4324 const PrintingPolicy &Policy) const;
4325
4326 static bool classof(const Type *T) {
4327 return T->getTypeClass() == FunctionProto;
4328 }
4329
4330 void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Ctx);
4331 static void Profile(llvm::FoldingSetNodeID &ID, QualType Result,
4332 param_type_iterator ArgTys, unsigned NumArgs,
4333 const ExtProtoInfo &EPI, const ASTContext &Context,
4334 bool Canonical);
4335};
4336
4337/// Represents the dependent type named by a dependently-scoped
4338/// typename using declaration, e.g.
4339/// using typename Base<T>::foo;
4340///
4341/// Template instantiation turns these into the underlying type.
4342class UnresolvedUsingType : public Type {
4343 friend class ASTContext; // ASTContext creates these.
4344
4345 UnresolvedUsingTypenameDecl *Decl;
4346
4347 UnresolvedUsingType(const UnresolvedUsingTypenameDecl *D)
4348 : Type(UnresolvedUsing, QualType(),
4349 TypeDependence::DependentInstantiation),
4350 Decl(const_cast<UnresolvedUsingTypenameDecl *>(D)) {}
4351
4352public:
4353 UnresolvedUsingTypenameDecl *getDecl() const { return Decl; }
4354
4355 bool isSugared() const { return false; }
4356 QualType desugar() const { return QualType(this, 0); }
4357
4358 static bool classof(const Type *T) {
4359 return T->getTypeClass() == UnresolvedUsing;
4360 }
4361
4362 void Profile(llvm::FoldingSetNodeID &ID) {
4363 return Profile(ID, Decl);
4364 }
4365
4366 static void Profile(llvm::FoldingSetNodeID &ID,
4367 UnresolvedUsingTypenameDecl *D) {
4368 ID.AddPointer(D);
4369 }
4370};
4371
4372class UsingType : public Type, public llvm::FoldingSetNode {
4373 UsingShadowDecl *Found;
4374 friend class ASTContext; // ASTContext creates these.
4375
4376 UsingType(const UsingShadowDecl *Found, QualType Underlying, QualType Canon);
4377
4378public:
4379 UsingShadowDecl *getFoundDecl() const { return Found; }
4380 QualType getUnderlyingType() const;
4381
4382 bool isSugared() const { return true; }
4383 QualType desugar() const { return getUnderlyingType(); }
4384
4385 void Profile(llvm::FoldingSetNodeID &ID) { Profile(ID, Found); }
4386 static void Profile(llvm::FoldingSetNodeID &ID,
4387 const UsingShadowDecl *Found) {
4388 ID.AddPointer(Found);
4389 }
4390 static bool classof(const Type *T) { return T->getTypeClass() == Using; }
4391};
4392
4393class TypedefType : public Type {
4394 TypedefNameDecl *Decl;
4395
4396private:
4397 friend class ASTContext; // ASTContext creates these.
4398
4399 TypedefType(TypeClass tc, const TypedefNameDecl *D, QualType underlying,
4400 QualType can);
4401
4402public:
4403 TypedefNameDecl *getDecl() const { return Decl; }
4404
4405 bool isSugared() const { return true; }
4406 QualType desugar() const;
4407
4408 static bool classof(const Type *T) { return T->getTypeClass() == Typedef; }
4409};
4410
4411/// Sugar type that represents a type that was qualified by a qualifier written
4412/// as a macro invocation.
4413class MacroQualifiedType : public Type {
4414 friend class ASTContext; // ASTContext creates these.
4415
4416 QualType UnderlyingTy;
4417 const IdentifierInfo *MacroII;
4418
4419 MacroQualifiedType(QualType UnderlyingTy, QualType CanonTy,
4420 const IdentifierInfo *MacroII)
4421 : Type(MacroQualified, CanonTy, UnderlyingTy->getDependence()),
4422 UnderlyingTy(UnderlyingTy), MacroII(MacroII) {
4423 assert(isa<AttributedType>(UnderlyingTy) &&(static_cast <bool> (isa<AttributedType>(UnderlyingTy
) && "Expected a macro qualified type to only wrap attributed types."
) ? void (0) : __assert_fail ("isa<AttributedType>(UnderlyingTy) && \"Expected a macro qualified type to only wrap attributed types.\""
, "clang/include/clang/AST/Type.h", 4424, __extension__ __PRETTY_FUNCTION__
))
4424 "Expected a macro qualified type to only wrap attributed types.")(static_cast <bool> (isa<AttributedType>(UnderlyingTy
) && "Expected a macro qualified type to only wrap attributed types."
) ? void (0) : __assert_fail ("isa<AttributedType>(UnderlyingTy) && \"Expected a macro qualified type to only wrap attributed types.\""
, "clang/include/clang/AST/Type.h", 4424, __extension__ __PRETTY_FUNCTION__
))
;
4425 }
4426
4427public:
4428 const IdentifierInfo *getMacroIdentifier() const { return MacroII; }
4429 QualType getUnderlyingType() const { return UnderlyingTy; }
4430
4431 /// Return this attributed type's modified type with no qualifiers attached to
4432 /// it.
4433 QualType getModifiedType() const;
4434
4435 bool isSugared() const { return true; }
4436 QualType desugar() const;
4437
4438 static bool classof(const Type *T) {
4439 return T->getTypeClass() == MacroQualified;
4440 }
4441};
4442
4443/// Represents a `typeof` (or __typeof__) expression (a GCC extension).
4444class TypeOfExprType : public Type {
4445 Expr *TOExpr;
4446
4447protected:
4448 friend class ASTContext; // ASTContext creates these.
4449
4450 TypeOfExprType(Expr *E, QualType can = QualType());
4451
4452public:
4453 Expr *getUnderlyingExpr() const { return TOExpr; }
4454
4455 /// Remove a single level of sugar.
4456 QualType desugar() const;
4457
4458 /// Returns whether this type directly provides sugar.
4459 bool isSugared() const;
4460
4461 static bool classof(const Type *T) { return T->getTypeClass() == TypeOfExpr; }
4462};
4463
4464/// Internal representation of canonical, dependent
4465/// `typeof(expr)` types.
4466///
4467/// This class is used internally by the ASTContext to manage
4468/// canonical, dependent types, only. Clients will only see instances
4469/// of this class via TypeOfExprType nodes.
4470class DependentTypeOfExprType
4471 : public TypeOfExprType, public llvm::FoldingSetNode {
4472 const ASTContext &Context;
4473
4474public:
4475 DependentTypeOfExprType(const ASTContext &Context, Expr *E)
4476 : TypeOfExprType(E), Context(Context) {}
4477
4478 void Profile(llvm::FoldingSetNodeID &ID) {
4479 Profile(ID, Context, getUnderlyingExpr());
4480 }
4481
4482 static void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context,
4483 Expr *E);
4484};
4485
4486/// Represents `typeof(type)`, a GCC extension.
4487class TypeOfType : public Type {
4488 friend class ASTContext; // ASTContext creates these.
4489
4490 QualType TOType;
4491
4492 TypeOfType(QualType T, QualType can)
4493 : Type(TypeOf, can, T->getDependence()), TOType(T) {
4494 assert(!isa<TypedefType>(can) && "Invalid canonical type")(static_cast <bool> (!isa<TypedefType>(can) &&
"Invalid canonical type") ? void (0) : __assert_fail ("!isa<TypedefType>(can) && \"Invalid canonical type\""
, "clang/include/clang/AST/Type.h", 4494, __extension__ __PRETTY_FUNCTION__
))
;
4495 }
4496
4497public:
4498 QualType getUnderlyingType() const { return TOType; }
4499
4500 /// Remove a single level of sugar.
4501 QualType desugar() const { return getUnderlyingType(); }
4502
4503 /// Returns whether this type directly provides sugar.
4504 bool isSugared() const { return true; }
4505
4506 static bool classof(const Type *T) { return T->getTypeClass() == TypeOf; }
4507};
4508
4509/// Represents the type `decltype(expr)` (C++11).
4510class DecltypeType : public Type {
4511 Expr *E;
4512 QualType UnderlyingType;
4513
4514protected:
4515 friend class ASTContext; // ASTContext creates these.
4516
4517 DecltypeType(Expr *E, QualType underlyingType, QualType can = QualType());
4518
4519public:
4520 Expr *getUnderlyingExpr() const { return E; }
4521 QualType getUnderlyingType() const { return UnderlyingType; }
4522
4523 /// Remove a single level of sugar.
4524 QualType desugar() const;
4525
4526 /// Returns whether this type directly provides sugar.
4527 bool isSugared() const;
4528
4529 static bool classof(const Type *T) { return T->getTypeClass() == Decltype; }
4530};
4531
4532/// Internal representation of canonical, dependent
4533/// decltype(expr) types.
4534///
4535/// This class is used internally by the ASTContext to manage
4536/// canonical, dependent types, only. Clients will only see instances
4537/// of this class via DecltypeType nodes.
4538class DependentDecltypeType : public DecltypeType, public llvm::FoldingSetNode {
4539 const ASTContext &Context;
4540
4541public:
4542 DependentDecltypeType(const ASTContext &Context, Expr *E);
4543
4544 void Profile(llvm::FoldingSetNodeID &ID) {
4545 Profile(ID, Context, getUnderlyingExpr());
4546 }
4547
4548 static void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context,
4549 Expr *E);
4550};
4551
4552/// A unary type transform, which is a type constructed from another.
4553class UnaryTransformType : public Type {
4554public:
4555 enum UTTKind {
4556 EnumUnderlyingType
4557 };
4558
4559private:
4560 /// The untransformed type.
4561 QualType BaseType;
4562
4563 /// The transformed type if not dependent, otherwise the same as BaseType.
4564 QualType UnderlyingType;
4565
4566 UTTKind UKind;
4567
4568protected:
4569 friend class ASTContext;
4570
4571 UnaryTransformType(QualType BaseTy, QualType UnderlyingTy, UTTKind UKind,
4572 QualType CanonicalTy);
4573
4574public:
4575 bool isSugared() const { return !isDependentType(); }
4576 QualType desugar() const { return UnderlyingType; }
4577
4578 QualType getUnderlyingType() const { return UnderlyingType; }
4579 QualType getBaseType() const { return BaseType; }
4580
4581 UTTKind getUTTKind() const { return UKind; }
4582
4583 static bool classof(const Type *T) {
4584 return T->getTypeClass() == UnaryTransform;
4585 }
4586};
4587
4588/// Internal representation of canonical, dependent
4589/// __underlying_type(type) types.
4590///
4591/// This class is used internally by the ASTContext to manage
4592/// canonical, dependent types, only. Clients will only see instances
4593/// of this class via UnaryTransformType nodes.
4594class DependentUnaryTransformType : public UnaryTransformType,
4595 public llvm::FoldingSetNode {
4596public:
4597 DependentUnaryTransformType(const ASTContext &C, QualType BaseType,
4598 UTTKind UKind);
4599
4600 void Profile(llvm::FoldingSetNodeID &ID) {
4601 Profile(ID, getBaseType(), getUTTKind());
4602 }
4603
4604 static void Profile(llvm::FoldingSetNodeID &ID, QualType BaseType,
4605 UTTKind UKind) {
4606 ID.AddPointer(BaseType.getAsOpaquePtr());
4607 ID.AddInteger((unsigned)UKind);
4608 }
4609};
4610
4611class TagType : public Type {
4612 friend class ASTReader;
4613 template <class T> friend class serialization::AbstractTypeReader;
4614
4615 /// Stores the TagDecl associated with this type. The decl may point to any
4616 /// TagDecl that declares the entity.
4617 TagDecl *decl;
4618
4619protected:
4620 TagType(TypeClass TC, const TagDecl *D, QualType can);
4621
4622public:
4623 TagDecl *getDecl() const;
4624
4625 /// Determines whether this type is in the process of being defined.
4626 bool isBeingDefined() const;
4627
4628 static bool classof(const Type *T) {
4629 return T->getTypeClass() == Enum || T->getTypeClass() == Record;
4630 }
4631};
4632
4633/// A helper class that allows the use of isa/cast/dyncast
4634/// to detect TagType objects of structs/unions/classes.
4635class RecordType : public TagType {
4636protected:
4637 friend class ASTContext; // ASTContext creates these.
4638
4639 explicit RecordType(const RecordDecl *D)
4640 : TagType(Record, reinterpret_cast<const TagDecl*>(D), QualType()) {}
4641 explicit RecordType(TypeClass TC, RecordDecl *D)
4642 : TagType(TC, reinterpret_cast<const TagDecl*>(D), QualType()) {}
4643
4644public:
4645 RecordDecl *getDecl() const {
4646 return reinterpret_cast<RecordDecl*>(TagType::getDecl());
4647 }
4648
4649 /// Recursively check all fields in the record for const-ness. If any field
4650 /// is declared const, return true. Otherwise, return false.
4651 bool hasConstFields() const;
4652
4653 bool isSugared() const { return false; }
4654 QualType desugar() const { return QualType(this, 0); }
4655
4656 static bool classof(const Type *T) { return T->getTypeClass() == Record; }
4657};
4658
4659/// A helper class that allows the use of isa/cast/dyncast
4660/// to detect TagType objects of enums.
4661class EnumType : public TagType {
4662 friend class ASTContext; // ASTContext creates these.
4663
4664 explicit EnumType(const EnumDecl *D)
4665 : TagType(Enum, reinterpret_cast<const TagDecl*>(D), QualType()) {}
4666
4667public:
4668 EnumDecl *getDecl() const {
4669 return reinterpret_cast<EnumDecl*>(TagType::getDecl());
4670 }
4671
4672 bool isSugared() const { return false; }
4673 QualType desugar() const { return QualType(this, 0); }
4674
4675 static bool classof(const Type *T) { return T->getTypeClass() == Enum; }
4676};
4677
4678/// An attributed type is a type to which a type attribute has been applied.
4679///
4680/// The "modified type" is the fully-sugared type to which the attributed
4681/// type was applied; generally it is not canonically equivalent to the
4682/// attributed type. The "equivalent type" is the minimally-desugared type
4683/// which the type is canonically equivalent to.
4684///
4685/// For example, in the following attributed type:
4686/// int32_t __attribute__((vector_size(16)))
4687/// - the modified type is the TypedefType for int32_t
4688/// - the equivalent type is VectorType(16, int32_t)
4689/// - the canonical type is VectorType(16, int)
4690class AttributedType : public Type, public llvm::FoldingSetNode {
4691public:
4692 using Kind = attr::Kind;
4693
4694private:
4695 friend class ASTContext; // ASTContext creates these
4696
4697 QualType ModifiedType;
4698 QualType EquivalentType;
4699
4700 AttributedType(QualType canon, attr::Kind attrKind, QualType modified,
4701 QualType equivalent)
4702 : Type(Attributed, canon, equivalent->getDependence()),
4703 ModifiedType(modified), EquivalentType(equivalent) {
4704 AttributedTypeBits.AttrKind = attrKind;
4705 }
4706
4707public:
4708 Kind getAttrKind() const {
4709 return static_cast<Kind>(AttributedTypeBits.AttrKind);
4710 }
4711
4712 QualType getModifiedType() const { return ModifiedType; }
4713 QualType getEquivalentType() const { return EquivalentType; }
4714
4715 bool isSugared() const { return true; }
4716 QualType desugar() const { return getEquivalentType(); }
4717
4718 /// Does this attribute behave like a type qualifier?
4719 ///
4720 /// A type qualifier adjusts a type to provide specialized rules for
4721 /// a specific object, like the standard const and volatile qualifiers.
4722 /// This includes attributes controlling things like nullability,
4723 /// address spaces, and ARC ownership. The value of the object is still
4724 /// largely described by the modified type.
4725 ///
4726 /// In contrast, many type attributes "rewrite" their modified type to
4727 /// produce a fundamentally different type, not necessarily related in any
4728 /// formalizable way to the original type. For example, calling convention
4729 /// and vector attributes are not simple type qualifiers.
4730 ///
4731 /// Type qualifiers are often, but not always, reflected in the canonical
4732 /// type.
4733 bool isQualifier() const;
4734
4735 bool isMSTypeSpec() const;
4736
4737 bool isCallingConv() const;
4738
4739 llvm::Optional<NullabilityKind> getImmediateNullability() const;
4740
4741 /// Retrieve the attribute kind corresponding to the given
4742 /// nullability kind.
4743 static Kind getNullabilityAttrKind(NullabilityKind kind) {
4744 switch (kind) {
4745 case NullabilityKind::NonNull:
4746 return attr::TypeNonNull;
4747
4748 case NullabilityKind::Nullable:
4749 return attr::TypeNullable;
4750
4751 case NullabilityKind::NullableResult:
4752 return attr::TypeNullableResult;
4753
4754 case NullabilityKind::Unspecified:
4755 return attr::TypeNullUnspecified;
4756 }
4757 llvm_unreachable("Unknown nullability kind.")::llvm::llvm_unreachable_internal("Unknown nullability kind."
, "clang/include/clang/AST/Type.h", 4757)
;
4758 }
4759
4760 /// Strip off the top-level nullability annotation on the given
4761 /// type, if it's there.
4762 ///
4763 /// \param T The type to strip. If the type is exactly an
4764 /// AttributedType specifying nullability (without looking through
4765 /// type sugar), the nullability is returned and this type changed
4766 /// to the underlying modified type.
4767 ///
4768 /// \returns the top-level nullability, if present.
4769 static Optional<NullabilityKind> stripOuterNullability(QualType &T);
4770
4771 void Profile(llvm::FoldingSetNodeID &ID) {
4772 Profile(ID, getAttrKind(), ModifiedType, EquivalentType);
4773 }
4774
4775 static void Profile(llvm::FoldingSetNodeID &ID, Kind attrKind,
4776 QualType modified, QualType equivalent) {
4777 ID.AddInteger(attrKind);
4778 ID.AddPointer(modified.getAsOpaquePtr());
4779 ID.AddPointer(equivalent.getAsOpaquePtr());
4780 }
4781
4782 static bool classof(const Type *T) {
4783 return T->getTypeClass() == Attributed;
4784 }
4785};
4786
4787class TemplateTypeParmType : public Type, public llvm::FoldingSetNode {
4788 friend class ASTContext; // ASTContext creates these
4789
4790 // Helper data collector for canonical types.
4791 struct CanonicalTTPTInfo {
4792 unsigned Depth : 15;
4793 unsigned ParameterPack : 1;
4794 unsigned Index : 16;
4795 };
4796
4797 union {
4798 // Info for the canonical type.
4799 CanonicalTTPTInfo CanTTPTInfo;
4800
4801 // Info for the non-canonical type.
4802 TemplateTypeParmDecl *TTPDecl;
4803 };
4804
4805 /// Build a non-canonical type.
4806 TemplateTypeParmType(TemplateTypeParmDecl *TTPDecl, QualType Canon)
4807 : Type(TemplateTypeParm, Canon,
4808 TypeDependence::DependentInstantiation |
4809 (Canon->getDependence() & TypeDependence::UnexpandedPack)),
4810 TTPDecl(TTPDecl) {}
4811
4812 /// Build the canonical type.
4813 TemplateTypeParmType(unsigned D, unsigned I, bool PP)
4814 : Type(TemplateTypeParm, QualType(this, 0),
4815 TypeDependence::DependentInstantiation |
4816 (PP ? TypeDependence::UnexpandedPack : TypeDependence::None)) {
4817 CanTTPTInfo.Depth = D;
4818 CanTTPTInfo.Index = I;
4819 CanTTPTInfo.ParameterPack = PP;
4820 }
4821
4822 const CanonicalTTPTInfo& getCanTTPTInfo() const {
4823 QualType Can = getCanonicalTypeInternal();
4824 return Can->castAs<TemplateTypeParmType>()->CanTTPTInfo;
4825 }
4826
4827public:
4828 unsigned getDepth() const { return getCanTTPTInfo().Depth; }
4829 unsigned getIndex() const { return getCanTTPTInfo().Index; }
4830 bool isParameterPack() const { return getCanTTPTInfo().ParameterPack; }
4831
4832 TemplateTypeParmDecl *getDecl() const {
4833 return isCanonicalUnqualified() ? nullptr : TTPDecl;
4834 }
4835
4836 IdentifierInfo *getIdentifier() const;
4837
4838 bool isSugared() const { return false; }
4839 QualType desugar() const { return QualType(this, 0); }
4840
4841 void Profile(llvm::FoldingSetNodeID &ID) {
4842 Profile(ID, getDepth(), getIndex(), isParameterPack(), getDecl());
4843 }
4844
4845 static void Profile(llvm::FoldingSetNodeID &ID, unsigned Depth,
4846 unsigned Index, bool ParameterPack,
4847 TemplateTypeParmDecl *TTPDecl) {
4848 ID.AddInteger(Depth);
4849 ID.AddInteger(Index);
4850 ID.AddBoolean(ParameterPack);
4851 ID.AddPointer(TTPDecl);
4852 }
4853
4854 static bool classof(const Type *T) {
4855 return T->getTypeClass() == TemplateTypeParm;
4856 }
4857};
4858
4859/// Represents the result of substituting a type for a template
4860/// type parameter.
4861///
4862/// Within an instantiated template, all template type parameters have
4863/// been replaced with these. They are used solely to record that a
4864/// type was originally written as a template type parameter;
4865/// therefore they are never canonical.
4866class SubstTemplateTypeParmType : public Type, public llvm::FoldingSetNode {
4867 friend class ASTContext;
4868
4869 // The original type parameter.
4870 const TemplateTypeParmType *Replaced;
4871
4872 SubstTemplateTypeParmType(const TemplateTypeParmType *Param, QualType Canon)
4873 : Type(SubstTemplateTypeParm, Canon, Canon->getDependence()),
4874 Replaced(Param) {}
4875
4876public:
4877 /// Gets the template parameter that was substituted for.
4878 const TemplateTypeParmType *getReplacedParameter() const {
4879 return Replaced;
4880 }
4881
4882 /// Gets the type that was substituted for the template
4883 /// parameter.
4884 QualType getReplacementType() const {
4885 return getCanonicalTypeInternal();
4886 }
4887
4888 bool isSugared() const { return true; }
4889 QualType desugar() const { return getReplacementType(); }
4890
4891 void Profile(llvm::FoldingSetNodeID &ID) {
4892 Profile(ID, getReplacedParameter(), getReplacementType());
4893 }
4894
4895 static void Profile(llvm::FoldingSetNodeID &ID,
4896 const TemplateTypeParmType *Replaced,
4897 QualType Replacement) {
4898 ID.AddPointer(Replaced);
4899 ID.AddPointer(Replacement.getAsOpaquePtr());
4900 }
4901
4902 static bool classof(const Type *T) {
4903 return T->getTypeClass() == SubstTemplateTypeParm;
4904 }
4905};
4906
4907/// Represents the result of substituting a set of types for a template
4908/// type parameter pack.
4909///
4910/// When a pack expansion in the source code contains multiple parameter packs
4911/// and those parameter packs correspond to different levels of template
4912/// parameter lists, this type node is used to represent a template type
4913/// parameter pack from an outer level, which has already had its argument pack
4914/// substituted but that still lives within a pack expansion that itself
4915/// could not be instantiated. When actually performing a substitution into
4916/// that pack expansion (e.g., when all template parameters have corresponding
4917/// arguments), this type will be replaced with the \c SubstTemplateTypeParmType
4918/// at the current pack substitution index.
4919class SubstTemplateTypeParmPackType : public Type, public llvm::FoldingSetNode {
4920 friend class ASTContext;
4921
4922 /// The original type parameter.
4923 const TemplateTypeParmType *Replaced;
4924
4925 /// A pointer to the set of template arguments that this
4926 /// parameter pack is instantiated with.
4927 const TemplateArgument *Arguments;
4928
4929 SubstTemplateTypeParmPackType(const TemplateTypeParmType *Param,
4930 QualType Canon,
4931 const TemplateArgument &ArgPack);
4932
4933public:
4934 IdentifierInfo *getIdentifier() const { return Replaced->getIdentifier(); }
4935
4936 /// Gets the template parameter that was substituted for.
4937 const TemplateTypeParmType *getReplacedParameter() const {
4938 return Replaced;
4939 }
4940
4941 unsigned getNumArgs() const {
4942 return SubstTemplateTypeParmPackTypeBits.NumArgs;
4943 }
4944
4945 bool isSugared() const { return false; }
4946 QualType desugar() const { return QualType(this, 0); }
4947
4948 TemplateArgument getArgumentPack() const;
4949
4950 void Profile(llvm::FoldingSetNodeID &ID);
4951 static void Profile(llvm::FoldingSetNodeID &ID,
4952 const TemplateTypeParmType *Replaced,
4953 const TemplateArgument &ArgPack);
4954
4955 static bool classof(const Type *T) {
4956 return T->getTypeClass() == SubstTemplateTypeParmPack;
4957 }
4958};
4959
4960/// Common base class for placeholders for types that get replaced by
4961/// placeholder type deduction: C++11 auto, C++14 decltype(auto), C++17 deduced
4962/// class template types, and constrained type names.
4963///
4964/// These types are usually a placeholder for a deduced type. However, before
4965/// the initializer is attached, or (usually) if the initializer is
4966/// type-dependent, there is no deduced type and the type is canonical. In
4967/// the latter case, it is also a dependent type.
4968class DeducedType : public Type {
4969 QualType DeducedAsType;
4970
4971protected:
4972 DeducedType(TypeClass TC, QualType DeducedAsType,
4973 TypeDependence ExtraDependence, QualType Canon)
4974 : Type(TC, Canon,
4975 ExtraDependence | (DeducedAsType.isNull()
4976 ? TypeDependence::None
4977 : DeducedAsType->getDependence() &
4978 ~TypeDependence::VariablyModified)),
4979 DeducedAsType(DeducedAsType) {}
4980
4981public:
4982 bool isSugared() const { return !DeducedAsType.isNull(); }
4983 QualType desugar() const {
4984 return isSugared() ? DeducedAsType : QualType(this, 0);
4985 }
4986
4987 /// Get the type deduced for this placeholder type, or null if it
4988 /// has not been deduced.
4989 QualType getDeducedType() const { return DeducedAsType; }
4990 bool isDeduced() const {
4991 return !DeducedAsType.isNull() || isDependentType();
4992 }
4993
4994 static bool classof(const Type *T) {
4995 return T->getTypeClass() == Auto ||
4996 T->getTypeClass() == DeducedTemplateSpecialization;
4997 }
4998};
4999
5000/// Represents a C++11 auto or C++14 decltype(auto) type, possibly constrained
5001/// by a type-constraint.
5002class alignas(8) AutoType : public DeducedType, public llvm::FoldingSetNode {
5003 friend class ASTContext; // ASTContext creates these
5004
5005 ConceptDecl *TypeConstraintConcept;
5006
5007 AutoType(QualType DeducedAsType, AutoTypeKeyword Keyword,
5008 TypeDependence ExtraDependence, QualType Canon, ConceptDecl *CD,
5009 ArrayRef<TemplateArgument> TypeConstraintArgs);
5010
5011 const TemplateArgument *getArgBuffer() const {
5012 return reinterpret_cast<const TemplateArgument*>(this+1);
5013 }
5014
5015 TemplateArgument *getArgBuffer() {
5016 return reinterpret_cast<TemplateArgument*>(this+1);
5017 }
5018
5019public:
5020 /// Retrieve the template arguments.
5021 const TemplateArgument *getArgs() const {
5022 return getArgBuffer();
5023 }
5024
5025 /// Retrieve the number of template arguments.
5026 unsigned getNumArgs() const {
5027 return AutoTypeBits.NumArgs;
5028 }
5029
5030 const TemplateArgument &getArg(unsigned Idx) const; // in TemplateBase.h
5031
5032 ArrayRef<TemplateArgument> getTypeConstraintArguments() const {
5033 return {getArgs(), getNumArgs()};
5034 }
5035
5036 ConceptDecl *getTypeConstraintConcept() const {
5037 return TypeConstraintConcept;
5038 }
5039
5040 bool isConstrained() const {
5041 return TypeConstraintConcept != nullptr;
5042 }
5043
5044 bool isDecltypeAuto() const {
5045 return getKeyword() == AutoTypeKeyword::DecltypeAuto;
5046 }
5047
5048 AutoTypeKeyword getKeyword() const {
5049 return (AutoTypeKeyword)AutoTypeBits.Keyword;
5050 }
5051
5052 void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context) {
5053 Profile(ID, Context, getDeducedType(), getKeyword(), isDependentType(),
5054 getTypeConstraintConcept(), getTypeConstraintArguments());
5055 }
5056
5057 static void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context,
5058 QualType Deduced, AutoTypeKeyword Keyword,
5059 bool IsDependent, ConceptDecl *CD,
5060 ArrayRef<TemplateArgument> Arguments);
5061
5062 static bool classof(const Type *T) {
5063 return T->getTypeClass() == Auto;
5064 }
5065};
5066
5067/// Represents a C++17 deduced template specialization type.
5068class DeducedTemplateSpecializationType : public DeducedType,
5069 public llvm::FoldingSetNode {
5070 friend class ASTContext; // ASTContext creates these
5071
5072 /// The name of the template whose arguments will be deduced.
5073 TemplateName Template;
5074
5075 DeducedTemplateSpecializationType(TemplateName Template,
5076 QualType DeducedAsType,
5077 bool IsDeducedAsDependent)
5078 : DeducedType(DeducedTemplateSpecialization, DeducedAsType,
5079 toTypeDependence(Template.getDependence()) |
5080 (IsDeducedAsDependent
5081 ? TypeDependence::DependentInstantiation
5082 : TypeDependence::None),
5083 DeducedAsType.isNull() ? QualType(this, 0)
5084 : DeducedAsType.getCanonicalType()),
5085 Template(Template) {}
5086
5087public:
5088 /// Retrieve the name of the template that we are deducing.
5089 TemplateName getTemplateName() const { return Template;}
5090
5091 void Profile(llvm::FoldingSetNodeID &ID) {
5092 Profile(ID, getTemplateName(), getDeducedType(), isDependentType());
5093 }
5094
5095 static void Profile(llvm::FoldingSetNodeID &ID, TemplateName Template,
5096 QualType Deduced, bool IsDependent) {
5097 Template.Profile(ID);
5098 QualType CanonicalType =
5099 Deduced.isNull() ? Deduced : Deduced.getCanonicalType();
5100 ID.AddPointer(CanonicalType.getAsOpaquePtr());
5101 ID.AddBoolean(IsDependent || Template.isDependent());
5102 }
5103
5104 static bool classof(const Type *T) {
5105 return T->getTypeClass() == DeducedTemplateSpecialization;
5106 }
5107};
5108
5109/// Represents a type template specialization; the template
5110/// must be a class template, a type alias template, or a template
5111/// template parameter. A template which cannot be resolved to one of
5112/// these, e.g. because it is written with a dependent scope
5113/// specifier, is instead represented as a
5114/// @c DependentTemplateSpecializationType.
5115///
5116/// A non-dependent template specialization type is always "sugar",
5117/// typically for a \c RecordType. For example, a class template
5118/// specialization type of \c vector<int> will refer to a tag type for
5119/// the instantiation \c std::vector<int, std::allocator<int>>
5120///
5121/// Template specializations are dependent if either the template or
5122/// any of the template arguments are dependent, in which case the
5123/// type may also be canonical.
5124///
5125/// Instances of this type are allocated with a trailing array of
5126/// TemplateArguments, followed by a QualType representing the
5127/// non-canonical aliased type when the template is a type alias
5128/// template.
5129class alignas(8) TemplateSpecializationType
5130 : public Type,
5131 public llvm::FoldingSetNode {
5132 friend class ASTContext; // ASTContext creates these
5133
5134 /// The name of the template being specialized. This is
5135 /// either a TemplateName::Template (in which case it is a
5136 /// ClassTemplateDecl*, a TemplateTemplateParmDecl*, or a
5137 /// TypeAliasTemplateDecl*), a
5138 /// TemplateName::SubstTemplateTemplateParmPack, or a
5139 /// TemplateName::SubstTemplateTemplateParm (in which case the
5140 /// replacement must, recursively, be one of these).
5141 TemplateName Template;
5142
5143 TemplateSpecializationType(TemplateName T,
5144 ArrayRef<TemplateArgument> Args,
5145 QualType Canon,
5146 QualType Aliased);
5147
5148public:
5149 /// Determine whether any of the given template arguments are dependent.
5150 ///
5151 /// The converted arguments should be supplied when known; whether an
5152 /// argument is dependent can depend on the conversions performed on it
5153 /// (for example, a 'const int' passed as a template argument might be
5154 /// dependent if the parameter is a reference but non-dependent if the
5155 /// parameter is an int).
5156 ///
5157 /// Note that the \p Args parameter is unused: this is intentional, to remind
5158 /// the caller that they need to pass in the converted arguments, not the
5159 /// specified arguments.
5160 static bool
5161 anyDependentTemplateArguments(ArrayRef<TemplateArgumentLoc> Args,
5162 ArrayRef<TemplateArgument> Converted);
5163 static bool
5164 anyDependentTemplateArguments(const TemplateArgumentListInfo &,
5165 ArrayRef<TemplateArgument> Converted);
5166 static bool anyInstantiationDependentTemplateArguments(
5167 ArrayRef<TemplateArgumentLoc> Args);
5168
5169 /// True if this template specialization type matches a current
5170 /// instantiation in the context in which it is found.
5171 bool isCurrentInstantiation() const {
5172 return isa<InjectedClassNameType>(getCanonicalTypeInternal());
5173 }
5174
5175 /// Determine if this template specialization type is for a type alias
5176 /// template that has been substituted.
5177 ///
5178 /// Nearly every template specialization type whose template is an alias
5179 /// template will be substituted. However, this is not the case when
5180 /// the specialization contains a pack expansion but the template alias
5181 /// does not have a corresponding parameter pack, e.g.,
5182 ///
5183 /// \code
5184 /// template<typename T, typename U, typename V> struct S;
5185 /// template<typename T, typename U> using A = S<T, int, U>;
5186 /// template<typename... Ts> struct X {
5187 /// typedef A<Ts...> type; // not a type alias
5188 /// };
5189 /// \endcode
5190 bool isTypeAlias() const { return TemplateSpecializationTypeBits.TypeAlias; }
5191
5192 /// Get the aliased type, if this is a specialization of a type alias
5193 /// template.
5194 QualType getAliasedType() const {
5195 assert(isTypeAlias() && "not a type alias template specialization")(static_cast <bool> (isTypeAlias() && "not a type alias template specialization"
) ? void (0) : __assert_fail ("isTypeAlias() && \"not a type alias template specialization\""
, "clang/include/clang/AST/Type.h", 5195, __extension__ __PRETTY_FUNCTION__
))
;
5196 return *reinterpret_cast<const QualType*>(end());
5197 }
5198
5199 using iterator = const TemplateArgument *;
5200
5201 iterator begin() const { return getArgs(); }
5202 iterator end() const; // defined inline in TemplateBase.h
5203
5204 /// Retrieve the name of the template that we are specializing.
5205 TemplateName getTemplateName() const { return Template; }
5206
5207 /// Retrieve the template arguments.
5208 const TemplateArgument *getArgs() const {
5209 return reinterpret_cast<const TemplateArgument *>(this + 1);
5210 }
5211
5212 /// Retrieve the number of template arguments.
5213 unsigned getNumArgs() const {
5214 return TemplateSpecializationTypeBits.NumArgs;
5215 }
5216
5217 /// Retrieve a specific template argument as a type.
5218 /// \pre \c isArgType(Arg)
5219 const TemplateArgument &getArg(unsigned Idx) const; // in TemplateBase.h
5220
5221 ArrayRef<TemplateArgument> template_arguments() const {
5222 return {getArgs(), getNumArgs()};
5223 }
5224
5225 bool isSugared() const {
5226 return !isDependentType() || isCurrentInstantiation() || isTypeAlias();
5227 }
5228
5229 QualType desugar() const {
5230 return isTypeAlias() ? getAliasedType() : getCanonicalTypeInternal();
5231 }
5232
5233 void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Ctx) {
5234 Profile(ID, Template, template_arguments(), Ctx);
5235 if (isTypeAlias())
5236 getAliasedType().Profile(ID);
5237 }
5238
5239 static void Profile(llvm::FoldingSetNodeID &ID, TemplateName T,
5240 ArrayRef<TemplateArgument> Args,
5241 const ASTContext &Context);
5242
5243 static bool classof(const Type *T) {
5244 return T->getTypeClass() == TemplateSpecialization;
5245 }
5246};
5247
5248/// Print a template argument list, including the '<' and '>'
5249/// enclosing the template arguments.
5250void printTemplateArgumentList(raw_ostream &OS,
5251 ArrayRef<TemplateArgument> Args,
5252 const PrintingPolicy &Policy,
5253 const TemplateParameterList *TPL = nullptr);
5254
5255void printTemplateArgumentList(raw_ostream &OS,
5256 ArrayRef<TemplateArgumentLoc> Args,
5257 const PrintingPolicy &Policy,
5258 const TemplateParameterList *TPL = nullptr);
5259
5260void printTemplateArgumentList(raw_ostream &OS,
5261 const TemplateArgumentListInfo &Args,
5262 const PrintingPolicy &Policy,
5263 const TemplateParameterList *TPL = nullptr);
5264
5265/// The injected class name of a C++ class template or class
5266/// template partial specialization. Used to record that a type was
5267/// spelled with a bare identifier rather than as a template-id; the
5268/// equivalent for non-templated classes is just RecordType.
5269///
5270/// Injected class name types are always dependent. Template
5271/// instantiation turns these into RecordTypes.
5272///
5273/// Injected class name types are always canonical. This works
5274/// because it is impossible to compare an injected class name type
5275/// with the corresponding non-injected template type, for the same
5276/// reason that it is impossible to directly compare template
5277/// parameters from different dependent contexts: injected class name
5278/// types can only occur within the scope of a particular templated
5279/// declaration, and within that scope every template specialization
5280/// will canonicalize to the injected class name (when appropriate
5281/// according to the rules of the language).
5282class InjectedClassNameType : public Type {
5283 friend class ASTContext; // ASTContext creates these.
5284 friend class ASTNodeImporter;
5285 friend class ASTReader; // FIXME: ASTContext::getInjectedClassNameType is not
5286 // currently suitable for AST reading, too much
5287 // interdependencies.
5288 template <class T> friend class serialization::AbstractTypeReader;
5289
5290 CXXRecordDecl *Decl;
5291
5292 /// The template specialization which this type represents.
5293 /// For example, in
5294 /// template <class T> class A { ... };
5295 /// this is A<T>, whereas in
5296 /// template <class X, class Y> class A<B<X,Y> > { ... };
5297 /// this is A<B<X,Y> >.
5298 ///
5299 /// It is always unqualified, always a template specialization type,
5300 /// and always dependent.
5301 QualType InjectedType;
5302
5303 InjectedClassNameType(CXXRecordDecl *D, QualType TST)
5304 : Type(InjectedClassName, QualType(),
5305 TypeDependence::DependentInstantiation),
5306 Decl(D), InjectedType(TST) {
5307 assert(isa<TemplateSpecializationType>(TST))(static_cast <bool> (isa<TemplateSpecializationType>
(TST)) ? void (0) : __assert_fail ("isa<TemplateSpecializationType>(TST)"
, "clang/include/clang/AST/Type.h", 5307, __extension__ __PRETTY_FUNCTION__
))
;
5308 assert(!TST.hasQualifiers())(static_cast <bool> (!TST.hasQualifiers()) ? void (0) :
__assert_fail ("!TST.hasQualifiers()", "clang/include/clang/AST/Type.h"
, 5308, __extension__ __PRETTY_FUNCTION__))
;
5309 assert(TST->isDependentType())(static_cast <bool> (TST->isDependentType()) ? void (
0) : __assert_fail ("TST->isDependentType()", "clang/include/clang/AST/Type.h"
, 5309, __extension__ __PRETTY_FUNCTION__))
;
5310 }
5311
5312public:
5313 QualType getInjectedSpecializationType() const { return InjectedType; }
5314
5315 const TemplateSpecializationType *getInjectedTST() const {
5316 return cast<TemplateSpecializationType>(InjectedType.getTypePtr());
5317 }
5318
5319 TemplateName getTemplateName() const {
5320 return getInjectedTST()->getTemplateName();
5321 }
5322
5323 CXXRecordDecl *getDecl() const;
5324
5325 bool isSugared() const { return false; }
5326 QualType desugar() const { return QualType(this, 0); }
5327
5328 static bool classof(const Type *T) {
5329 return T->getTypeClass() == InjectedClassName;
5330 }
5331};
5332
5333/// The kind of a tag type.
5334enum TagTypeKind {
5335 /// The "struct" keyword.
5336 TTK_Struct,
5337
5338 /// The "__interface" keyword.
5339 TTK_Interface,
5340
5341 /// The "union" keyword.
5342 TTK_Union,
5343
5344 /// The "class" keyword.
5345 TTK_Class,
5346
5347 /// The "enum" keyword.
5348 TTK_Enum
5349};
5350
5351/// The elaboration keyword that precedes a qualified type name or
5352/// introduces an elaborated-type-specifier.
5353enum ElaboratedTypeKeyword {
5354 /// The "struct" keyword introduces the elaborated-type-specifier.
5355 ETK_Struct,
5356
5357 /// The "__interface" keyword introduces the elaborated-type-specifier.
5358 ETK_Interface,
5359
5360 /// The "union" keyword introduces the elaborated-type-specifier.
5361 ETK_Union,
5362
5363 /// The "class" keyword introduces the elaborated-type-specifier.
5364 ETK_Class,
5365
5366 /// The "enum" keyword introduces the elaborated-type-specifier.
5367 ETK_Enum,
5368
5369 /// The "typename" keyword precedes the qualified type name, e.g.,
5370 /// \c typename T::type.
5371 ETK_Typename,
5372
5373 /// No keyword precedes the qualified type name.
5374 ETK_None
5375};
5376
5377/// A helper class for Type nodes having an ElaboratedTypeKeyword.
5378/// The keyword in stored in the free bits of the base class.
5379/// Also provides a few static helpers for converting and printing
5380/// elaborated type keyword and tag type kind enumerations.
5381class TypeWithKeyword : public Type {
5382protected:
5383 TypeWithKeyword(ElaboratedTypeKeyword Keyword, TypeClass tc,
5384 QualType Canonical, TypeDependence Dependence)
5385 : Type(tc, Canonical, Dependence) {
5386 TypeWithKeywordBits.Keyword = Keyword;
5387 }
5388
5389public:
5390 ElaboratedTypeKeyword getKeyword() const {
5391 return static_cast<ElaboratedTypeKeyword>(TypeWithKeywordBits.Keyword);
5392 }
5393
5394 /// Converts a type specifier (DeclSpec::TST) into an elaborated type keyword.
5395 static ElaboratedTypeKeyword getKeywordForTypeSpec(unsigned TypeSpec);
5396
5397 /// Converts a type specifier (DeclSpec::TST) into a tag type kind.
5398 /// It is an error to provide a type specifier which *isn't* a tag kind here.
5399 static TagTypeKind getTagTypeKindForTypeSpec(unsigned TypeSpec);
5400
5401 /// Converts a TagTypeKind into an elaborated type keyword.
5402 static ElaboratedTypeKeyword getKeywordForTagTypeKind(TagTypeKind Tag);
5403
5404 /// Converts an elaborated type keyword into a TagTypeKind.
5405 /// It is an error to provide an elaborated type keyword
5406 /// which *isn't* a tag kind here.
5407 static TagTypeKind getTagTypeKindForKeyword(ElaboratedTypeKeyword Keyword);
5408
5409 static bool KeywordIsTagTypeKind(ElaboratedTypeKeyword Keyword);
5410
5411 static StringRef getKeywordName(ElaboratedTypeKeyword Keyword);
5412
5413 static StringRef getTagTypeKindName(TagTypeKind Kind) {
5414 return getKeywordName(getKeywordForTagTypeKind(Kind));
5415 }
5416
5417 class CannotCastToThisType {};
5418 static CannotCastToThisType classof(const Type *);
5419};
5420
5421/// Represents a type that was referred to using an elaborated type
5422/// keyword, e.g., struct S, or via a qualified name, e.g., N::M::type,
5423/// or both.
5424///
5425/// This type is used to keep track of a type name as written in the
5426/// source code, including tag keywords and any nested-name-specifiers.
5427/// The type itself is always "sugar", used to express what was written
5428/// in the source code but containing no additional semantic information.
5429class ElaboratedType final
5430 : public TypeWithKeyword,
5431 public llvm::FoldingSetNode,
5432 private llvm::TrailingObjects<ElaboratedType, TagDecl *> {
5433 friend class ASTContext; // ASTContext creates these
5434 friend TrailingObjects;
5435
5436 /// The nested name specifier containing the qualifier.
5437 NestedNameSpecifier *NNS;
5438
5439 /// The type that this qualified name refers to.
5440 QualType NamedType;
5441
5442 /// The (re)declaration of this tag type owned by this occurrence is stored
5443 /// as a trailing object if there is one. Use getOwnedTagDecl to obtain
5444 /// it, or obtain a null pointer if there is none.
5445
5446 ElaboratedType(ElaboratedTypeKeyword Keyword, NestedNameSpecifier *NNS,
5447 QualType NamedType, QualType CanonType, TagDecl *OwnedTagDecl)
5448 : TypeWithKeyword(Keyword, Elaborated, CanonType,
5449 // Any semantic dependence on the qualifier will have
5450 // been incorporated into NamedType. We still need to
5451 // track syntactic (instantiation / error / pack)
5452 // dependence on the qualifier.
5453 NamedType->getDependence() |
5454 (NNS ? toSyntacticDependence(
5455 toTypeDependence(NNS->getDependence()))
5456 : TypeDependence::None)),
5457 NNS(NNS), NamedType(NamedType) {
5458 ElaboratedTypeBits.HasOwnedTagDecl = false;
5459 if (OwnedTagDecl) {
5460 ElaboratedTypeBits.HasOwnedTagDecl = true;
5461 *getTrailingObjects<TagDecl *>() = OwnedTagDecl;
5462 }
5463 assert(!(Keyword == ETK_None && NNS == nullptr) &&(static_cast <bool> (!(Keyword == ETK_None && NNS
== nullptr) && "ElaboratedType cannot have elaborated type keyword "
"and name qualifier both null.") ? void (0) : __assert_fail (
"!(Keyword == ETK_None && NNS == nullptr) && \"ElaboratedType cannot have elaborated type keyword \" \"and name qualifier both null.\""
, "clang/include/clang/AST/Type.h", 5465, __extension__ __PRETTY_FUNCTION__
))
5464 "ElaboratedType cannot have elaborated type keyword "(static_cast <bool> (!(Keyword == ETK_None && NNS
== nullptr) && "ElaboratedType cannot have elaborated type keyword "
"and name qualifier both null.") ? void (0) : __assert_fail (
"!(Keyword == ETK_None && NNS == nullptr) && \"ElaboratedType cannot have elaborated type keyword \" \"and name qualifier both null.\""
, "clang/include/clang/AST/Type.h", 5465, __extension__ __PRETTY_FUNCTION__
))
5465 "and name qualifier both null.")(static_cast <bool> (!(Keyword == ETK_None && NNS
== nullptr) && "ElaboratedType cannot have elaborated type keyword "
"and name qualifier both null.") ? void (0) : __assert_fail (
"!(Keyword == ETK_None && NNS == nullptr) && \"ElaboratedType cannot have elaborated type keyword \" \"and name qualifier both null.\""
, "clang/include/clang/AST/Type.h", 5465, __extension__ __PRETTY_FUNCTION__
))
;
5466 }
5467
5468public:
5469 /// Retrieve the qualification on this type.
5470 NestedNameSpecifier *getQualifier() const { return NNS; }
5471
5472 /// Retrieve the type named by the qualified-id.
5473 QualType getNamedType() const { return NamedType; }
5474
5475 /// Remove a single level of sugar.
5476 QualType desugar() const { return getNamedType(); }
5477
5478 /// Returns whether this type directly provides sugar.
5479 bool isSugared() const { return true; }
5480
5481 /// Return the (re)declaration of this type owned by this occurrence of this
5482 /// type, or nullptr if there is none.
5483 TagDecl *getOwnedTagDecl() const {
5484 return ElaboratedTypeBits.HasOwnedTagDecl ? *getTrailingObjects<TagDecl *>()
5485 : nullptr;
5486 }
5487
5488 void Profile(llvm::FoldingSetNodeID &ID) {
5489 Profile(ID, getKeyword(), NNS, NamedType, getOwnedTagDecl());
5490 }
5491
5492 static void Profile(llvm::FoldingSetNodeID &ID, ElaboratedTypeKeyword Keyword,
5493 NestedNameSpecifier *NNS, QualType NamedType,
5494 TagDecl *OwnedTagDecl) {
5495 ID.AddInteger(Keyword);
5496 ID.AddPointer(NNS);
5497 NamedType.Profile(ID);
5498 ID.AddPointer(OwnedTagDecl);
5499 }
5500
5501 static bool classof(const Type *T) { return T->getTypeClass() == Elaborated; }
5502};
5503
5504/// Represents a qualified type name for which the type name is
5505/// dependent.
5506///
5507/// DependentNameType represents a class of dependent types that involve a
5508/// possibly dependent nested-name-specifier (e.g., "T::") followed by a
5509/// name of a type. The DependentNameType may start with a "typename" (for a
5510/// typename-specifier), "class", "struct", "union", or "enum" (for a
5511/// dependent elaborated-type-specifier), or nothing (in contexts where we
5512/// know that we must be referring to a type, e.g., in a base class specifier).
5513/// Typically the nested-name-specifier is dependent, but in MSVC compatibility
5514/// mode, this type is used with non-dependent names to delay name lookup until
5515/// instantiation.
5516class DependentNameType : public TypeWithKeyword, public llvm::FoldingSetNode {
5517 friend class ASTContext; // ASTContext creates these
5518
5519 /// The nested name specifier containing the qualifier.
5520 NestedNameSpecifier *NNS;
5521
5522 /// The type that this typename specifier refers to.
5523 const IdentifierInfo *Name;
5524
5525 DependentNameType(ElaboratedTypeKeyword Keyword, NestedNameSpecifier *NNS,
5526 const IdentifierInfo *Name, QualType CanonType)
5527 : TypeWithKeyword(Keyword, DependentName, CanonType,
5528 TypeDependence::DependentInstantiation |
5529 toTypeDependence(NNS->getDependence())),
5530 NNS(NNS), Name(Name) {}
5531
5532public:
5533 /// Retrieve the qualification on this type.
5534 NestedNameSpecifier *getQualifier() const { return NNS; }
5535
5536 /// Retrieve the type named by the typename specifier as an identifier.
5537 ///
5538 /// This routine will return a non-NULL identifier pointer when the
5539 /// form of the original typename was terminated by an identifier,
5540 /// e.g., "typename T::type".
5541 const IdentifierInfo *getIdentifier() const {
5542 return Name;
5543 }
5544
5545 bool isSugared() const { return false; }
5546 QualType desugar() const { return QualType(this, 0); }
5547
5548 void Profile(llvm::FoldingSetNodeID &ID) {
5549 Profile(ID, getKeyword(), NNS, Name);
5550 }
5551
5552 static void Profile(llvm::FoldingSetNodeID &ID, ElaboratedTypeKeyword Keyword,
5553 NestedNameSpecifier *NNS, const IdentifierInfo *Name) {
5554 ID.AddInteger(Keyword);
5555 ID.AddPointer(NNS);
5556 ID.AddPointer(Name);
5557 }
5558
5559 static bool classof(const Type *T) {
5560 return T->getTypeClass() == DependentName;
5561 }
5562};
5563
5564/// Represents a template specialization type whose template cannot be
5565/// resolved, e.g.
5566/// A<T>::template B<T>
5567class alignas(8) DependentTemplateSpecializationType
5568 : public TypeWithKeyword,
5569 public llvm::FoldingSetNode {
5570 friend class ASTContext; // ASTContext creates these
5571
5572 /// The nested name specifier containing the qualifier.
5573 NestedNameSpecifier *NNS;
5574
5575 /// The identifier of the template.
5576 const IdentifierInfo *Name;
5577
5578 DependentTemplateSpecializationType(ElaboratedTypeKeyword Keyword,
5579 NestedNameSpecifier *NNS,
5580 const IdentifierInfo *Name,
5581 ArrayRef<TemplateArgument> Args,
5582 QualType Canon);
5583
5584 const TemplateArgument *getArgBuffer() const {
5585 return reinterpret_cast<const TemplateArgument*>(this+1);
5586 }
5587
5588 TemplateArgument *getArgBuffer() {
5589 return reinterpret_cast<TemplateArgument*>(this+1);
5590 }
5591
5592public:
5593 NestedNameSpecifier *getQualifier() const { return NNS; }
5594 const IdentifierInfo *getIdentifier() const { return Name; }
5595
5596 /// Retrieve the template arguments.
5597 const TemplateArgument *getArgs() const {
5598 return getArgBuffer();
5599 }
5600
5601 /// Retrieve the number of template arguments.
5602 unsigned getNumArgs() const {
5603 return DependentTemplateSpecializationTypeBits.NumArgs;
5604 }
5605
5606 const TemplateArgument &getArg(unsigned Idx) const; // in TemplateBase.h
5607
5608 ArrayRef<TemplateArgument> template_arguments() const {
5609 return {getArgs(), getNumArgs()};
5610 }
5611
5612 using iterator = const TemplateArgument *;
5613
5614 iterator begin() const { return getArgs(); }
5615 iterator end() const; // inline in TemplateBase.h
5616
5617 bool isSugared() const { return false; }
5618 QualType desugar() const { return QualType(this, 0); }
5619
5620 void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context) {
5621 Profile(ID, Context, getKeyword(), NNS, Name, {getArgs(), getNumArgs()});
5622 }
5623
5624 static void Profile(llvm::FoldingSetNodeID &ID,
5625 const ASTContext &Context,
5626 ElaboratedTypeKeyword Keyword,
5627 NestedNameSpecifier *Qualifier,
5628 const IdentifierInfo *Name,
5629 ArrayRef<TemplateArgument> Args);
5630
5631 static bool classof(const Type *T) {
5632 return T->getTypeClass() == DependentTemplateSpecialization;
5633 }
5634};
5635
5636/// Represents a pack expansion of types.
5637///
5638/// Pack expansions are part of C++11 variadic templates. A pack
5639/// expansion contains a pattern, which itself contains one or more
5640/// "unexpanded" parameter packs. When instantiated, a pack expansion
5641/// produces a series of types, each instantiated from the pattern of
5642/// the expansion, where the Ith instantiation of the pattern uses the
5643/// Ith arguments bound to each of the unexpanded parameter packs. The
5644/// pack expansion is considered to "expand" these unexpanded
5645/// parameter packs.
5646///
5647/// \code
5648/// template<typename ...Types> struct tuple;
5649///
5650/// template<typename ...Types>
5651/// struct tuple_of_references {
5652/// typedef tuple<Types&...> type;
5653/// };
5654/// \endcode
5655///
5656/// Here, the pack expansion \c Types&... is represented via a
5657/// PackExpansionType whose pattern is Types&.
5658class PackExpansionType : public Type, public llvm::FoldingSetNode {
5659 friend class ASTContext; // ASTContext creates these
5660
5661 /// The pattern of the pack expansion.
5662 QualType Pattern;
5663
5664 PackExpansionType(QualType Pattern, QualType Canon,
5665 Optional<unsigned> NumExpansions)
5666 : Type(PackExpansion, Canon,
5667 (Pattern->getDependence() | TypeDependence::Dependent |
5668 TypeDependence::Instantiation) &
5669 ~TypeDependence::UnexpandedPack),
5670 Pattern(Pattern) {
5671 PackExpansionTypeBits.NumExpansions =
5672 NumExpansions ? *NumExpansions + 1 : 0;
5673 }
5674
5675public:
5676 /// Retrieve the pattern of this pack expansion, which is the
5677 /// type that will be repeatedly instantiated when instantiating the
5678 /// pack expansion itself.
5679 QualType getPattern() const { return Pattern; }
5680
5681 /// Retrieve the number of expansions that this pack expansion will
5682 /// generate, if known.
5683 Optional<unsigned> getNumExpansions() const {
5684 if (PackExpansionTypeBits.NumExpansions)
5685 return PackExpansionTypeBits.NumExpansions - 1;
5686 return None;
5687 }
5688
5689 bool isSugared() const { return false; }
5690 QualType desugar() const { return QualType(this, 0); }
5691
5692 void Profile(llvm::FoldingSetNodeID &ID) {
5693 Profile(ID, getPattern(), getNumExpansions());
5694 }
5695
5696 static void Profile(llvm::FoldingSetNodeID &ID, QualType Pattern,
5697 Optional<unsigned> NumExpansions) {
5698 ID.AddPointer(Pattern.getAsOpaquePtr());
5699 ID.AddBoolean(NumExpansions.hasValue());
5700 if (NumExpansions)
5701 ID.AddInteger(*NumExpansions);
5702 }
5703
5704 static bool classof(const Type *T) {
5705 return T->getTypeClass() == PackExpansion;
5706 }
5707};
5708
5709/// This class wraps the list of protocol qualifiers. For types that can
5710/// take ObjC protocol qualifers, they can subclass this class.
5711template <class T>
5712class ObjCProtocolQualifiers {
5713protected:
5714 ObjCProtocolQualifiers() = default;
5715
5716 ObjCProtocolDecl * const *getProtocolStorage() const {
5717 return const_cast<ObjCProtocolQualifiers*>(this)->getProtocolStorage();
5718 }
5719
5720 ObjCProtocolDecl **getProtocolStorage() {
5721 return static_cast<T*>(this)->getProtocolStorageImpl();
5722 }
5723
5724 void setNumProtocols(unsigned N) {
5725 static_cast<T*>(this)->setNumProtocolsImpl(N);
5726 }
5727
5728 void initialize(ArrayRef<ObjCProtocolDecl *> protocols) {
5729 setNumProtocols(protocols.size());
5730 assert(getNumProtocols() == protocols.size() &&(static_cast <bool> (getNumProtocols() == protocols.size
() && "bitfield overflow in protocol count") ? void (
0) : __assert_fail ("getNumProtocols() == protocols.size() && \"bitfield overflow in protocol count\""
, "clang/include/clang/AST/Type.h", 5731, __extension__ __PRETTY_FUNCTION__
))
5731 "bitfield overflow in protocol count")(static_cast <bool> (getNumProtocols() == protocols.size
() && "bitfield overflow in protocol count") ? void (
0) : __assert_fail ("getNumProtocols() == protocols.size() && \"bitfield overflow in protocol count\""
, "clang/include/clang/AST/Type.h", 5731, __extension__ __PRETTY_FUNCTION__
))
;
5732 if (!protocols.empty())
5733 memcpy(getProtocolStorage(), protocols.data(),
5734 protocols.size() * sizeof(ObjCProtocolDecl*));
5735 }
5736
5737public:
5738 using qual_iterator = ObjCProtocolDecl * const *;
5739 using qual_range = llvm::iterator_range<qual_iterator>;
5740
5741 qual_range quals() const { return qual_range(qual_begin(), qual_end()); }
5742 qual_iterator qual_begin() const { return getProtocolStorage(); }
5743 qual_iterator qual_end() const { return qual_begin() + getNumProtocols(); }
5744
5745 bool qual_empty() const { return getNumProtocols() == 0; }
5746
5747 /// Return the number of qualifying protocols in this type, or 0 if
5748 /// there are none.
5749 unsigned getNumProtocols() const {
5750 return static_cast<const T*>(this)->getNumProtocolsImpl();
5751 }
5752
5753 /// Fetch a protocol by index.
5754 ObjCProtocolDecl *getProtocol(unsigned I) const {
5755 assert(I < getNumProtocols() && "Out-of-range protocol access")(static_cast <bool> (I < getNumProtocols() &&
"Out-of-range protocol access") ? void (0) : __assert_fail (
"I < getNumProtocols() && \"Out-of-range protocol access\""
, "clang/include/clang/AST/Type.h", 5755, __extension__ __PRETTY_FUNCTION__
))
;
5756 return qual_begin()[I];
5757 }
5758
5759 /// Retrieve all of the protocol qualifiers.
5760 ArrayRef<ObjCProtocolDecl *> getProtocols() const {
5761 return ArrayRef<ObjCProtocolDecl *>(qual_begin(), getNumProtocols());
5762 }
5763};
5764
5765/// Represents a type parameter type in Objective C. It can take
5766/// a list of protocols.
5767class ObjCTypeParamType : public Type,
5768 public ObjCProtocolQualifiers<ObjCTypeParamType>,
5769 public llvm::FoldingSetNode {
5770 friend class ASTContext;
5771 friend class ObjCProtocolQualifiers<ObjCTypeParamType>;
5772
5773 /// The number of protocols stored on this type.
5774 unsigned NumProtocols : 6;
5775
5776 ObjCTypeParamDecl *OTPDecl;
5777
5778 /// The protocols are stored after the ObjCTypeParamType node. In the
5779 /// canonical type, the list of protocols are sorted alphabetically
5780 /// and uniqued.
5781 ObjCProtocolDecl **getProtocolStorageImpl();
5782
5783 /// Return the number of qualifying protocols in this interface type,
5784 /// or 0 if there are none.
5785 unsigned getNumProtocolsImpl() const {
5786 return NumProtocols;
5787 }
5788
5789 void setNumProtocolsImpl(unsigned N) {
5790 NumProtocols = N;
5791 }
5792
5793 ObjCTypeParamType(const ObjCTypeParamDecl *D,
5794 QualType can,
5795 ArrayRef<ObjCProtocolDecl *> protocols);
5796
5797public:
5798 bool isSugared() const { return true; }
5799 QualType desugar() const { return getCanonicalTypeInternal(); }
5800
5801 static bool classof(const Type *T) {
5802 return T->getTypeClass() == ObjCTypeParam;
5803 }
5804
5805 void Profile(llvm::FoldingSetNodeID &ID);
5806 static void Profile(llvm::FoldingSetNodeID &ID,
5807 const ObjCTypeParamDecl *OTPDecl,
5808 QualType CanonicalType,
5809 ArrayRef<ObjCProtocolDecl *> protocols);
5810
5811 ObjCTypeParamDecl *getDecl() const { return OTPDecl; }
5812};
5813
5814/// Represents a class type in Objective C.
5815///
5816/// Every Objective C type is a combination of a base type, a set of
5817/// type arguments (optional, for parameterized classes) and a list of
5818/// protocols.
5819///
5820/// Given the following declarations:
5821/// \code
5822/// \@class C<T>;
5823/// \@protocol P;
5824/// \endcode
5825///
5826/// 'C' is an ObjCInterfaceType C. It is sugar for an ObjCObjectType
5827/// with base C and no protocols.
5828///
5829/// 'C<P>' is an unspecialized ObjCObjectType with base C and protocol list [P].
5830/// 'C<C*>' is a specialized ObjCObjectType with type arguments 'C*' and no
5831/// protocol list.
5832/// 'C<C*><P>' is a specialized ObjCObjectType with base C, type arguments 'C*',
5833/// and protocol list [P].
5834///
5835/// 'id' is a TypedefType which is sugar for an ObjCObjectPointerType whose
5836/// pointee is an ObjCObjectType with base BuiltinType::ObjCIdType
5837/// and no protocols.
5838///
5839/// 'id<P>' is an ObjCObjectPointerType whose pointee is an ObjCObjectType
5840/// with base BuiltinType::ObjCIdType and protocol list [P]. Eventually
5841/// this should get its own sugar class to better represent the source.
5842class ObjCObjectType : public Type,
5843 public ObjCProtocolQualifiers<ObjCObjectType> {
5844 friend class ObjCProtocolQualifiers<ObjCObjectType>;
5845
5846 // ObjCObjectType.NumTypeArgs - the number of type arguments stored
5847 // after the ObjCObjectPointerType node.
5848 // ObjCObjectType.NumProtocols - the number of protocols stored
5849 // after the type arguments of ObjCObjectPointerType node.
5850 //
5851 // These protocols are those written directly on the type. If
5852 // protocol qualifiers ever become additive, the iterators will need
5853 // to get kindof complicated.
5854 //
5855 // In the canonical object type, these are sorted alphabetically
5856 // and uniqued.
5857
5858 /// Either a BuiltinType or an InterfaceType or sugar for either.
5859 QualType BaseType;
5860
5861 /// Cached superclass type.
5862 mutable llvm::PointerIntPair<const ObjCObjectType *, 1, bool>
5863 CachedSuperClassType;
5864
5865 QualType *getTypeArgStorage();
5866 const QualType *getTypeArgStorage() const {
5867 return const_cast<ObjCObjectType *>(this)->getTypeArgStorage();
5868 }
5869
5870 ObjCProtocolDecl **getProtocolStorageImpl();
5871 /// Return the number of qualifying protocols in this interface type,
5872 /// or 0 if there are none.
5873 unsigned getNumProtocolsImpl() const {
5874 return ObjCObjectTypeBits.NumProtocols;
5875 }
5876 void setNumProtocolsImpl(unsigned N) {
5877 ObjCObjectTypeBits.NumProtocols = N;
5878 }
5879
5880protected:
5881 enum Nonce_ObjCInterface { Nonce_ObjCInterface };
5882
5883 ObjCObjectType(QualType Canonical, QualType Base,
5884 ArrayRef<QualType> typeArgs,
5885 ArrayRef<ObjCProtocolDecl *> protocols,
5886 bool isKindOf);
5887
5888 ObjCObjectType(enum Nonce_ObjCInterface)
5889 : Type(ObjCInterface, QualType(), TypeDependence::None),
5890 BaseType(QualType(this_(), 0)) {
5891 ObjCObjectTypeBits.NumProtocols = 0;
5892 ObjCObjectTypeBits.NumTypeArgs = 0;
5893 ObjCObjectTypeBits.IsKindOf = 0;
5894 }
5895
5896 void computeSuperClassTypeSlow() const;
5897
5898public:
5899 /// Gets the base type of this object type. This is always (possibly
5900 /// sugar for) one of:
5901 /// - the 'id' builtin type (as opposed to the 'id' type visible to the
5902 /// user, which is a typedef for an ObjCObjectPointerType)
5903 /// - the 'Class' builtin type (same caveat)
5904 /// - an ObjCObjectType (currently always an ObjCInterfaceType)
5905 QualType getBaseType() const { return BaseType; }
5906
5907 bool isObjCId() const {
5908 return getBaseType()->isSpecificBuiltinType(BuiltinType::ObjCId);
5909 }
5910
5911 bool isObjCClass() const {
5912 return getBaseType()->isSpecificBuiltinType(BuiltinType::ObjCClass);
5913 }
5914
5915 bool isObjCUnqualifiedId() const { return qual_empty() && isObjCId(); }
5916 bool isObjCUnqualifiedClass() const { return qual_empty() && isObjCClass(); }
5917 bool isObjCUnqualifiedIdOrClass() const {
5918 if (!qual_empty()) return false;
5919 if (const BuiltinType *T = getBaseType()->getAs<BuiltinType>())
5920 return T->getKind() == BuiltinType::ObjCId ||
5921 T->getKind() == BuiltinType::ObjCClass;
5922 return false;
5923 }
5924 bool isObjCQualifiedId() const { return !qual_empty() && isObjCId(); }
5925 bool isObjCQualifiedClass() const { return !qual_empty() && isObjCClass(); }
5926
5927 /// Gets the interface declaration for this object type, if the base type
5928 /// really is an interface.
5929 ObjCInterfaceDecl *getInterface() const;
5930
5931 /// Determine whether this object type is "specialized", meaning
5932 /// that it has type arguments.
5933 bool isSpecialized() const;
5934
5935 /// Determine whether this object type was written with type arguments.
5936 bool isSpecializedAsWritten() const {
5937 return ObjCObjectTypeBits.NumTypeArgs > 0;
5938 }
5939
5940 /// Determine whether this object type is "unspecialized", meaning
5941 /// that it has no type arguments.
5942 bool isUnspecialized() const { return !isSpecialized(); }
5943
5944 /// Determine whether this object type is "unspecialized" as
5945 /// written, meaning that it has no type arguments.
5946 bool isUnspecializedAsWritten() const { return !isSpecializedAsWritten(); }
5947
5948 /// Retrieve the type arguments of this object type (semantically).
5949 ArrayRef<QualType> getTypeArgs() const;
5950
5951 /// Retrieve the type arguments of this object type as they were
5952 /// written.
5953 ArrayRef<QualType> getTypeArgsAsWritten() const {
5954 return llvm::makeArrayRef(getTypeArgStorage(),
5955 ObjCObjectTypeBits.NumTypeArgs);
5956 }
5957
5958 /// Whether this is a "__kindof" type as written.
5959 bool isKindOfTypeAsWritten() const { return ObjCObjectTypeBits.IsKindOf; }
5960
5961 /// Whether this ia a "__kindof" type (semantically).
5962 bool isKindOfType() const;
5963
5964 /// Retrieve the type of the superclass of this object type.
5965 ///
5966 /// This operation substitutes any type arguments into the
5967 /// superclass of the current class type, potentially producing a
5968 /// specialization of the superclass type. Produces a null type if
5969 /// there is no superclass.
5970 QualType getSuperClassType() const {
5971 if (!CachedSuperClassType.getInt())
5972 computeSuperClassTypeSlow();
5973
5974 assert(CachedSuperClassType.getInt() && "Superclass not set?")(static_cast <bool> (CachedSuperClassType.getInt() &&
"Superclass not set?") ? void (0) : __assert_fail ("CachedSuperClassType.getInt() && \"Superclass not set?\""
, "clang/include/clang/AST/Type.h", 5974, __extension__ __PRETTY_FUNCTION__
))
;
5975 return QualType(CachedSuperClassType.getPointer(), 0);
5976 }
5977
5978 /// Strip off the Objective-C "kindof" type and (with it) any
5979 /// protocol qualifiers.
5980 QualType stripObjCKindOfTypeAndQuals(const ASTContext &ctx) const;
5981
5982 bool isSugared() const { return false; }
5983 QualType desugar() const { return QualType(this, 0); }
5984
5985 static bool classof(const Type *T) {
5986 return T->getTypeClass() == ObjCObject ||
5987 T->getTypeClass() == ObjCInterface;
5988 }
5989};
5990
5991/// A class providing a concrete implementation
5992/// of ObjCObjectType, so as to not increase the footprint of
5993/// ObjCInterfaceType. Code outside of ASTContext and the core type
5994/// system should not reference this type.
5995class ObjCObjectTypeImpl : public ObjCObjectType, public llvm::FoldingSetNode {
5996 friend class ASTContext;
5997
5998 // If anyone adds fields here, ObjCObjectType::getProtocolStorage()
5999 // will need to be modified.
6000
6001 ObjCObjectTypeImpl(QualType Canonical, QualType Base,
6002 ArrayRef<QualType> typeArgs,
6003 ArrayRef<ObjCProtocolDecl *> protocols,
6004 bool isKindOf)
6005 : ObjCObjectType(Canonical, Base, typeArgs, protocols, isKindOf) {}
6006
6007public:
6008 void Profile(llvm::FoldingSetNodeID &ID);
6009 static void Profile(llvm::FoldingSetNodeID &ID,
6010 QualType Base,
6011 ArrayRef<QualType> typeArgs,
6012 ArrayRef<ObjCProtocolDecl *> protocols,
6013 bool isKindOf);
6014};
6015
6016inline QualType *ObjCObjectType::getTypeArgStorage() {
6017 return reinterpret_cast<QualType *>(static_cast<ObjCObjectTypeImpl*>(this)+1);
6018}
6019
6020inline ObjCProtocolDecl **ObjCObjectType::getProtocolStorageImpl() {
6021 return reinterpret_cast<ObjCProtocolDecl**>(
6022 getTypeArgStorage() + ObjCObjectTypeBits.NumTypeArgs);
6023}
6024
6025inline ObjCProtocolDecl **ObjCTypeParamType::getProtocolStorageImpl() {
6026 return reinterpret_cast<ObjCProtocolDecl**>(
6027 static_cast<ObjCTypeParamType*>(this)+1);
6028}
6029
6030/// Interfaces are the core concept in Objective-C for object oriented design.
6031/// They basically correspond to C++ classes. There are two kinds of interface
6032/// types: normal interfaces like `NSString`, and qualified interfaces, which
6033/// are qualified with a protocol list like `NSString<NSCopyable, NSAmazing>`.
6034///
6035/// ObjCInterfaceType guarantees the following properties when considered
6036/// as a subtype of its superclass, ObjCObjectType:
6037/// - There are no protocol qualifiers. To reinforce this, code which
6038/// tries to invoke the protocol methods via an ObjCInterfaceType will
6039/// fail to compile.
6040/// - It is its own base type. That is, if T is an ObjCInterfaceType*,
6041/// T->getBaseType() == QualType(T, 0).
6042class ObjCInterfaceType : public ObjCObjectType {
6043 friend class ASTContext; // ASTContext creates these.
6044 friend class ASTReader;
6045 template <class T> friend class serialization::AbstractTypeReader;
6046
6047 ObjCInterfaceDecl *Decl;
6048
6049 ObjCInterfaceType(const ObjCInterfaceDecl *D)
6050 : ObjCObjectType(Nonce_ObjCInterface),
6051 Decl(const_cast<ObjCInterfaceDecl*>(D)) {}
6052
6053public:
6054 /// Get the declaration of this interface.
6055 ObjCInterfaceDecl *getDecl() const;
6056
6057 bool isSugared() const { return false; }
6058 QualType desugar() const { return QualType(this, 0); }
6059
6060 static bool classof(const Type *T) {
6061 return T->getTypeClass() == ObjCInterface;
6062 }
6063
6064 // Nonsense to "hide" certain members of ObjCObjectType within this
6065 // class. People asking for protocols on an ObjCInterfaceType are
6066 // not going to get what they want: ObjCInterfaceTypes are
6067 // guaranteed to have no protocols.
6068 enum {
6069 qual_iterator,
6070 qual_begin,
6071 qual_end,
6072 getNumProtocols,
6073 getProtocol
6074 };
6075};
6076
6077inline ObjCInterfaceDecl *ObjCObjectType::getInterface() const {
6078 QualType baseType = getBaseType();
6079 while (const auto *ObjT = baseType->getAs<ObjCObjectType>()) {
6080 if (const auto *T = dyn_cast<ObjCInterfaceType>(ObjT))
6081 return T->getDecl();
6082
6083 baseType = ObjT->getBaseType();
6084 }
6085
6086 return nullptr;
6087}
6088
6089/// Represents a pointer to an Objective C object.
6090///
6091/// These are constructed from pointer declarators when the pointee type is
6092/// an ObjCObjectType (or sugar for one). In addition, the 'id' and 'Class'
6093/// types are typedefs for these, and the protocol-qualified types 'id<P>'
6094/// and 'Class<P>' are translated into these.
6095///
6096/// Pointers to pointers to Objective C objects are still PointerTypes;
6097/// only the first level of pointer gets it own type implementation.
6098class ObjCObjectPointerType : public Type, public llvm::FoldingSetNode {
6099 friend class ASTContext; // ASTContext creates these.
6100
6101 QualType PointeeType;
6102
6103 ObjCObjectPointerType(QualType Canonical, QualType Pointee)
6104 : Type(ObjCObjectPointer, Canonical, Pointee->getDependence()),
6105 PointeeType(Pointee) {}
6106
6107public:
6108 /// Gets the type pointed to by this ObjC pointer.
6109 /// The result will always be an ObjCObjectType or sugar thereof.
6110 QualType getPointeeType() const { return PointeeType; }
6111
6112 /// Gets the type pointed to by this ObjC pointer. Always returns non-null.
6113 ///
6114 /// This method is equivalent to getPointeeType() except that
6115 /// it discards any typedefs (or other sugar) between this
6116 /// type and the "outermost" object type. So for:
6117 /// \code
6118 /// \@class A; \@protocol P; \@protocol Q;
6119 /// typedef A<P> AP;
6120 /// typedef A A1;
6121 /// typedef A1<P> A1P;
6122 /// typedef A1P<Q> A1PQ;
6123 /// \endcode
6124 /// For 'A*', getObjectType() will return 'A'.
6125 /// For 'A<P>*', getObjectType() will return 'A<P>'.
6126 /// For 'AP*', getObjectType() will return 'A<P>'.
6127 /// For 'A1*', getObjectType() will return 'A'.
6128 /// For 'A1<P>*', getObjectType() will return 'A1<P>'.
6129 /// For 'A1P*', getObjectType() will return 'A1<P>'.
6130 /// For 'A1PQ*', getObjectType() will return 'A1<Q>', because
6131 /// adding protocols to a protocol-qualified base discards the
6132 /// old qualifiers (for now). But if it didn't, getObjectType()
6133 /// would return 'A1P<Q>' (and we'd have to make iterating over
6134 /// qualifiers more complicated).
6135 const ObjCObjectType *getObjectType() const {
6136 return PointeeType->castAs<ObjCObjectType>();
6137 }
6138
6139 /// If this pointer points to an Objective C
6140 /// \@interface type, gets the type for that interface. Any protocol
6141 /// qualifiers on the interface are ignored.
6142 ///
6143 /// \return null if the base type for this pointer is 'id' or 'Class'
6144 const ObjCInterfaceType *getInterfaceType() const;
6145
6146 /// If this pointer points to an Objective \@interface
6147 /// type, gets the declaration for that interface.
6148 ///
6149 /// \return null if the base type for this pointer is 'id' or 'Class'
6150 ObjCInterfaceDecl *getInterfaceDecl() const {
6151 return getObjectType()->getInterface();
6152 }
6153
6154 /// True if this is equivalent to the 'id' type, i.e. if
6155 /// its object type is the primitive 'id' type with no protocols.
6156 bool isObjCIdType() const {
6157 return getObjectType()->isObjCUnqualifiedId();
6158 }
6159
6160 /// True if this is equivalent to the 'Class' type,
6161 /// i.e. if its object tive is the primitive 'Class' type with no protocols.
6162 bool isObjCClassType() const {
6163 return getObjectType()->isObjCUnqualifiedClass();
6164 }
6165
6166 /// True if this is equivalent to the 'id' or 'Class' type,
6167 bool isObjCIdOrClassType() const {
6168 return getObjectType()->isObjCUnqualifiedIdOrClass();
6169 }
6170
6171 /// True if this is equivalent to 'id<P>' for some non-empty set of
6172 /// protocols.
6173 bool isObjCQualifiedIdType() const {
6174 return getObjectType()->isObjCQualifiedId();
6175 }
6176
6177 /// True if this is equivalent to 'Class<P>' for some non-empty set of
6178 /// protocols.
6179 bool isObjCQualifiedClassType() const {
6180 return getObjectType()->isObjCQualifiedClass();
6181 }
6182
6183 /// Whether this is a "__kindof" type.
6184 bool isKindOfType() const { return getObjectType()->isKindOfType(); }
6185
6186 /// Whether this type is specialized, meaning that it has type arguments.
6187 bool isSpecialized() const { return getObjectType()->isSpecialized(); }
6188
6189 /// Whether this type is specialized, meaning that it has type arguments.
6190 bool isSpecializedAsWritten() const {
6191 return getObjectType()->isSpecializedAsWritten();
6192 }
6193
6194 /// Whether this type is unspecialized, meaning that is has no type arguments.
6195 bool isUnspecialized() const { return getObjectType()->isUnspecialized(); }
6196
6197 /// Determine whether this object type is "unspecialized" as
6198 /// written, meaning that it has no type arguments.
6199 bool isUnspecializedAsWritten() const { return !isSpecializedAsWritten(); }
6200
6201 /// Retrieve the type arguments for this type.
6202 ArrayRef<QualType> getTypeArgs() const {
6203 return getObjectType()->getTypeArgs();
6204 }
6205
6206 /// Retrieve the type arguments for this type.
6207 ArrayRef<QualType> getTypeArgsAsWritten() const {
6208 return getObjectType()->getTypeArgsAsWritten();
6209 }
6210
6211 /// An iterator over the qualifiers on the object type. Provided
6212 /// for convenience. This will always iterate over the full set of
6213 /// protocols on a type, not just those provided directly.
6214 using qual_iterator = ObjCObjectType::qual_iterator;
6215 using qual_range = llvm::iterator_range<qual_iterator>;
6216
6217 qual_range quals() const { return qual_range(qual_begin(), qual_end()); }
6218
6219 qual_iterator qual_begin() const {
6220 return getObjectType()->qual_begin();
6221 }
6222
6223 qual_iterator qual_end() const {
6224 return getObjectType()->qual_end();
6225 }
6226
6227 bool qual_empty() const { return getObjectType()->qual_empty(); }
6228
6229 /// Return the number of qualifying protocols on the object type.
6230 unsigned getNumProtocols() const {
6231 return getObjectType()->getNumProtocols();
6232 }
6233
6234 /// Retrieve a qualifying protocol by index on the object type.
6235 ObjCProtocolDecl *getProtocol(unsigned I) const {
6236 return getObjectType()->getProtocol(I);
6237 }
6238
6239 bool isSugared() const { return false; }
6240 QualType desugar() const { return QualType(this, 0); }
6241
6242 /// Retrieve the type of the superclass of this object pointer type.
6243 ///
6244 /// This operation substitutes any type arguments into the
6245 /// superclass of the current class type, potentially producing a
6246 /// pointer to a specialization of the superclass type. Produces a
6247 /// null type if there is no superclass.
6248 QualType getSuperClassType() const;
6249
6250 /// Strip off the Objective-C "kindof" type and (with it) any
6251 /// protocol qualifiers.
6252 const ObjCObjectPointerType *stripObjCKindOfTypeAndQuals(
6253 const ASTContext &ctx) const;
6254
6255 void Profile(llvm::FoldingSetNodeID &ID) {
6256 Profile(ID, getPointeeType());
6257 }
6258
6259 static void Profile(llvm::FoldingSetNodeID &ID, QualType T) {
6260 ID.AddPointer(T.getAsOpaquePtr());
6261 }
6262
6263 static bool classof(const Type *T) {
6264 return T->getTypeClass() == ObjCObjectPointer;
6265 }
6266};
6267
6268class AtomicType : public Type, public llvm::FoldingSetNode {
6269 friend class ASTContext; // ASTContext creates these.
6270
6271 QualType ValueType;
6272
6273 AtomicType(QualType ValTy, QualType Canonical)
6274 : Type(Atomic, Canonical, ValTy->getDependence()), ValueType(ValTy) {}
6275
6276public:
6277 /// Gets the type contained by this atomic type, i.e.
6278 /// the type returned by performing an atomic load of this atomic type.
6279 QualType getValueType() const { return ValueType; }
6280
6281 bool isSugared() const { return false; }
6282 QualType desugar() const { return QualType(this, 0); }
6283
6284 void Profile(llvm::FoldingSetNodeID &ID) {
6285 Profile(ID, getValueType());
6286 }
6287
6288 static void Profile(llvm::FoldingSetNodeID &ID, QualType T) {
6289 ID.AddPointer(T.getAsOpaquePtr());
6290 }
6291
6292 static bool classof(const Type *T) {
6293 return T->getTypeClass() == Atomic;
6294 }
6295};
6296
6297/// PipeType - OpenCL20.
6298class PipeType : public Type, public llvm::FoldingSetNode {
6299 friend class ASTContext; // ASTContext creates these.
6300
6301 QualType ElementType;
6302 bool isRead;
6303
6304 PipeType(QualType elemType, QualType CanonicalPtr, bool isRead)
6305 : Type(Pipe, CanonicalPtr, elemType->getDependence()),
6306 ElementType(elemType), isRead(isRead) {}
6307
6308public:
6309 QualType getElementType() const { return ElementType; }
6310
6311 bool isSugared() const { return false; }
6312
6313 QualType desugar() const { return QualType(this, 0); }
6314
6315 void Profile(llvm::FoldingSetNodeID &ID) {
6316 Profile(ID, getElementType(), isReadOnly());
6317 }
6318
6319 static void Profile(llvm::FoldingSetNodeID &ID, QualType T, bool isRead) {
6320 ID.AddPointer(T.getAsOpaquePtr());
6321 ID.AddBoolean(isRead);
6322 }
6323
6324 static bool classof(const Type *T) {
6325 return T->getTypeClass() == Pipe;
6326 }
6327
6328 bool isReadOnly() const { return isRead; }
6329};
6330
6331/// A fixed int type of a specified bitwidth.
6332class BitIntType final : public Type, public llvm::FoldingSetNode {
6333 friend class ASTContext;
6334 unsigned IsUnsigned : 1;
6335 unsigned NumBits : 24;
6336
6337protected:
6338 BitIntType(bool isUnsigned, unsigned NumBits);
6339
6340public:
6341 bool isUnsigned() const { return IsUnsigned; }
6342 bool isSigned() const { return !IsUnsigned; }
6343 unsigned getNumBits() const { return NumBits; }
6344
6345 bool isSugared() const { return false; }
6346 QualType desugar() const { return QualType(this, 0); }
6347
6348 void Profile(llvm::FoldingSetNodeID &ID) {
6349 Profile(ID, isUnsigned(), getNumBits());
6350 }
6351
6352 static void Profile(llvm::FoldingSetNodeID &ID, bool IsUnsigned,
6353 unsigned NumBits) {
6354 ID.AddBoolean(IsUnsigned);
6355 ID.AddInteger(NumBits);
6356 }
6357
6358 static bool classof(const Type *T) { return T->getTypeClass() == BitInt; }
6359};
6360
6361class DependentBitIntType final : public Type, public llvm::FoldingSetNode {
6362 friend class ASTContext;
6363 const ASTContext &Context;
6364 llvm::PointerIntPair<Expr*, 1, bool> ExprAndUnsigned;
6365
6366protected:
6367 DependentBitIntType(const ASTContext &Context, bool IsUnsigned,
6368 Expr *NumBits);
6369
6370public:
6371 bool isUnsigned() const;
6372 bool isSigned() const { return !isUnsigned(); }
6373 Expr *getNumBitsExpr() const;
6374
6375 bool isSugared() const { return false; }
6376 QualType desugar() const { return QualType(this, 0); }
6377
6378 void Profile(llvm::FoldingSetNodeID &ID) {
6379 Profile(ID, Context, isUnsigned(), getNumBitsExpr());
6380 }
6381 static void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context,
6382 bool IsUnsigned, Expr *NumBitsExpr);
6383
6384 static bool classof(const Type *T) {
6385 return T->getTypeClass() == DependentBitInt;
6386 }
6387};
6388
6389/// A qualifier set is used to build a set of qualifiers.
6390class QualifierCollector : public Qualifiers {
6391public:
6392 QualifierCollector(Qualifiers Qs = Qualifiers()) : Qualifiers(Qs) {}
6393
6394 /// Collect any qualifiers on the given type and return an
6395 /// unqualified type. The qualifiers are assumed to be consistent
6396 /// with those already in the type.
6397 const Type *strip(QualType type) {
6398 addFastQualifiers(type.getLocalFastQualifiers());
6399 if (!type.hasLocalNonFastQualifiers())
6400 return type.getTypePtrUnsafe();
6401
6402 const ExtQuals *extQuals = type.getExtQualsUnsafe();
6403 addConsistentQualifiers(extQuals->getQualifiers());
6404 return extQuals->getBaseType();
6405 }
6406
6407 /// Apply the collected qualifiers to the given type.
6408 QualType apply(const ASTContext &Context, QualType QT) const;
6409
6410 /// Apply the collected qualifiers to the given type.
6411 QualType apply(const ASTContext &Context, const Type* T) const;
6412};
6413
6414/// A container of type source information.
6415///
6416/// A client can read the relevant info using TypeLoc wrappers, e.g:
6417/// @code
6418/// TypeLoc TL = TypeSourceInfo->getTypeLoc();
6419/// TL.getBeginLoc().print(OS, SrcMgr);
6420/// @endcode
6421class alignas(8) TypeSourceInfo {
6422 // Contains a memory block after the class, used for type source information,
6423 // allocated by ASTContext.
6424 friend class ASTContext;
6425
6426 QualType Ty;
6427
6428 TypeSourceInfo(QualType ty) : Ty(ty) {}
6429
6430public:
6431 /// Return the type wrapped by this type source info.
6432 QualType getType() const { return Ty; }
6433
6434 /// Return the TypeLoc wrapper for the type source info.
6435 TypeLoc getTypeLoc() const; // implemented in TypeLoc.h
6436
6437 /// Override the type stored in this TypeSourceInfo. Use with caution!
6438 void overrideType(QualType T) { Ty = T; }
6439};
6440
6441// Inline function definitions.
6442
6443inline SplitQualType SplitQualType::getSingleStepDesugaredType() const {
6444 SplitQualType desugar =
6445 Ty->getLocallyUnqualifiedSingleStepDesugaredType().split();
6446 desugar.Quals.addConsistentQualifiers(Quals);
6447 return desugar;
6448}
6449
6450inline const Type *QualType::getTypePtr() const {
6451 return getCommonPtr()->BaseType;
6452}
6453
6454inline const Type *QualType::getTypePtrOrNull() const {
6455 return (isNull() ? nullptr : getCommonPtr()->BaseType);
6456}
6457
6458inline SplitQualType QualType::split() const {
6459 if (!hasLocalNonFastQualifiers())
6460 return SplitQualType(getTypePtrUnsafe(),
6461 Qualifiers::fromFastMask(getLocalFastQualifiers()));
6462
6463 const ExtQuals *eq = getExtQualsUnsafe();
6464 Qualifiers qs = eq->getQualifiers();
6465 qs.addFastQualifiers(getLocalFastQualifiers());
6466 return SplitQualType(eq->getBaseType(), qs);
6467}
6468
6469inline Qualifiers QualType::getLocalQualifiers() const {
6470 Qualifiers Quals;
6471 if (hasLocalNonFastQualifiers())
6472 Quals = getExtQualsUnsafe()->getQualifiers();
6473 Quals.addFastQualifiers(getLocalFastQualifiers());
6474 return Quals;
6475}
6476
6477inline Qualifiers QualType::getQualifiers() const {
6478 Qualifiers quals = getCommonPtr()->CanonicalType.getLocalQualifiers();
6479 quals.addFastQualifiers(getLocalFastQualifiers());
6480 return quals;
6481}
6482
6483inline unsigned QualType::getCVRQualifiers() const {
6484 unsigned cvr = getCommonPtr()->CanonicalType.getLocalCVRQualifiers();
6485 cvr |= getLocalCVRQualifiers();
6486 return cvr;
6487}
6488
6489inline QualType QualType::getCanonicalType() const {
6490 QualType canon = getCommonPtr()->CanonicalType;
6491 return canon.withFastQualifiers(getLocalFastQualifiers());
6492}
6493
6494inline bool QualType::isCanonical() const {
6495 return getTypePtr()->isCanonicalUnqualified();
6496}
6497
6498inline bool QualType::isCanonicalAsParam() const {
6499 if (!isCanonical()) return false;
6500 if (hasLocalQualifiers()) return false;
6501
6502 const Type *T = getTypePtr();
6503 if (T->isVariablyModifiedType() && T->hasSizedVLAType())
6504 return false;
6505
6506 return !isa<FunctionType>(T) && !isa<ArrayType>(T);
6507}
6508
6509inline bool QualType::isConstQualified() const {
6510 return isLocalConstQualified() ||
6511 getCommonPtr()->CanonicalType.isLocalConstQualified();
6512}
6513
6514inline bool QualType::isRestrictQualified() const {
6515 return isLocalRestrictQualified() ||
6516 getCommonPtr()->CanonicalType.isLocalRestrictQualified();
6517}
6518
6519
6520inline bool QualType::isVolatileQualified() const {
6521 return isLocalVolatileQualified() ||
6522 getCommonPtr()->CanonicalType.isLocalVolatileQualified();
6523}
6524
6525inline bool QualType::hasQualifiers() const {
6526 return hasLocalQualifiers() ||
6527 getCommonPtr()->CanonicalType.hasLocalQualifiers();
6528}
6529
6530inline QualType QualType::getUnqualifiedType() const {
6531 if (!getTypePtr()->getCanonicalTypeInternal().hasLocalQualifiers())
6532 return QualType(getTypePtr(), 0);
6533
6534 return QualType(getSplitUnqualifiedTypeImpl(*this).Ty, 0);
6535}
6536
6537inline SplitQualType QualType::getSplitUnqualifiedType() const {
6538 if (!getTypePtr()->getCanonicalTypeInternal().hasLocalQualifiers())
6539 return split();
6540
6541 return getSplitUnqualifiedTypeImpl(*this);
6542}
6543
6544inline void QualType::removeLocalConst() {
6545 removeLocalFastQualifiers(Qualifiers::Const);
6546}
6547
6548inline void QualType::removeLocalRestrict() {
6549 removeLocalFastQualifiers(Qualifiers::Restrict);
6550}
6551
6552inline void QualType::removeLocalVolatile() {
6553 removeLocalFastQualifiers(Qualifiers::Volatile);
6554}
6555
6556inline void QualType::removeLocalCVRQualifiers(unsigned Mask) {
6557 assert(!(Mask & ~Qualifiers::CVRMask) && "mask has non-CVR bits")(static_cast <bool> (!(Mask & ~Qualifiers::CVRMask)
&& "mask has non-CVR bits") ? void (0) : __assert_fail
("!(Mask & ~Qualifiers::CVRMask) && \"mask has non-CVR bits\""
, "clang/include/clang/AST/Type.h", 6557, __extension__ __PRETTY_FUNCTION__
))
;
6558 static_assert((int)Qualifiers::CVRMask == (int)Qualifiers::FastMask,
6559 "Fast bits differ from CVR bits!");
6560
6561 // Fast path: we don't need to touch the slow qualifiers.
6562 removeLocalFastQualifiers(Mask);
6563}
6564
6565/// Check if this type has any address space qualifier.
6566inline bool QualType::hasAddressSpace() const {
6567 return getQualifiers().hasAddressSpace();
6568}
6569
6570/// Return the address space of this type.
6571inline LangAS QualType::getAddressSpace() const {
6572 return getQualifiers().getAddressSpace();
6573}
6574
6575/// Return the gc attribute of this type.
6576inline Qualifiers::GC QualType::getObjCGCAttr() const {
6577 return getQualifiers().getObjCGCAttr();
6578}
6579
6580inline bool QualType::hasNonTrivialToPrimitiveDefaultInitializeCUnion() const {
6581 if (auto *RD = getTypePtr()->getBaseElementTypeUnsafe()->getAsRecordDecl())
6582 return hasNonTrivialToPrimitiveDefaultInitializeCUnion(RD);
6583 return false;
6584}
6585
6586inline bool QualType::hasNonTrivialToPrimitiveDestructCUnion() const {
6587 if (auto *RD = getTypePtr()->getBaseElementTypeUnsafe()->getAsRecordDecl())
6588 return hasNonTrivialToPrimitiveDestructCUnion(RD);
6589 return false;
6590}
6591
6592inline bool QualType::hasNonTrivialToPrimitiveCopyCUnion() const {
6593 if (auto *RD = getTypePtr()->getBaseElementTypeUnsafe()->getAsRecordDecl())
6594 return hasNonTrivialToPrimitiveCopyCUnion(RD);
6595 return false;
6596}
6597
6598inline FunctionType::ExtInfo getFunctionExtInfo(const Type &t) {
6599 if (const auto *PT = t.getAs<PointerType>()) {
6600 if (const auto *FT = PT->getPointeeType()->getAs<FunctionType>())
6601 return FT->getExtInfo();
6602 } else if (const auto *FT = t.getAs<FunctionType>())
6603 return FT->getExtInfo();
6604
6605 return FunctionType::ExtInfo();
6606}
6607
6608inline FunctionType::ExtInfo getFunctionExtInfo(QualType t) {
6609 return getFunctionExtInfo(*t);
6610}
6611
6612/// Determine whether this type is more
6613/// qualified than the Other type. For example, "const volatile int"
6614/// is more qualified than "const int", "volatile int", and
6615/// "int". However, it is not more qualified than "const volatile
6616/// int".
6617inline bool QualType::isMoreQualifiedThan(QualType other) const {
6618 Qualifiers MyQuals = getQualifiers();
6619 Qualifiers OtherQuals = other.getQualifiers();
6620 return (MyQuals != OtherQuals && MyQuals.compatiblyIncludes(OtherQuals));
6621}
6622
6623/// Determine whether this type is at last
6624/// as qualified as the Other type. For example, "const volatile
6625/// int" is at least as qualified as "const int", "volatile int",
6626/// "int", and "const volatile int".
6627inline bool QualType::isAtLeastAsQualifiedAs(QualType other) const {
6628 Qualifiers OtherQuals = other.getQualifiers();
6629
6630 // Ignore __unaligned qualifier if this type is a void.
6631 if (getUnqualifiedType()->isVoidType())
6632 OtherQuals.removeUnaligned();
6633
6634 return getQualifiers().compatiblyIncludes(OtherQuals);
6635}
6636
6637/// If Type is a reference type (e.g., const
6638/// int&), returns the type that the reference refers to ("const
6639/// int"). Otherwise, returns the type itself. This routine is used
6640/// throughout Sema to implement C++ 5p6:
6641///
6642/// If an expression initially has the type "reference to T" (8.3.2,
6643/// 8.5.3), the type is adjusted to "T" prior to any further
6644/// analysis, the expression designates the object or function
6645/// denoted by the reference, and the expression is an lvalue.
6646inline QualType QualType::getNonReferenceType() const {
6647 if (const auto *RefType = (*this)->getAs<ReferenceType>())
6648 return RefType->getPointeeType();
6649 else
6650 return *this;
6651}
6652
6653inline bool QualType::isCForbiddenLValueType() const {
6654 return ((getTypePtr()->isVoidType() && !hasQualifiers()) ||
6655 getTypePtr()->isFunctionType());
6656}
6657
6658/// Tests whether the type is categorized as a fundamental type.
6659///
6660/// \returns True for types specified in C++0x [basic.fundamental].
6661inline bool Type::isFundamentalType() const {
6662 return isVoidType() ||
6663 isNullPtrType() ||
6664 // FIXME: It's really annoying that we don't have an
6665 // 'isArithmeticType()' which agrees with the standard definition.
6666 (isArithmeticType() && !isEnumeralType());
6667}
6668
6669/// Tests whether the type is categorized as a compound type.
6670///
6671/// \returns True for types specified in C++0x [basic.compound].
6672inline bool Type::isCompoundType() const {
6673 // C++0x [basic.compound]p1:
6674 // Compound types can be constructed in the following ways:
6675 // -- arrays of objects of a given type [...];
6676 return isArrayType() ||
6677 // -- functions, which have parameters of given types [...];
6678 isFunctionType() ||
6679 // -- pointers to void or objects or functions [...];
6680 isPointerType() ||
6681 // -- references to objects or functions of a given type. [...]
6682 isReferenceType() ||
6683 // -- classes containing a sequence of objects of various types, [...];
6684 isRecordType() ||
6685 // -- unions, which are classes capable of containing objects of different
6686 // types at different times;
6687 isUnionType() ||
6688 // -- enumerations, which comprise a set of named constant values. [...];
6689 isEnumeralType() ||
6690 // -- pointers to non-static class members, [...].
6691 isMemberPointerType();
6692}
6693
6694inline bool Type::isFunctionType() const {
6695 return isa<FunctionType>(CanonicalType);
6696}
6697
6698inline bool Type::isPointerType() const {
6699 return isa<PointerType>(CanonicalType);
6700}
6701
6702inline bool Type::isAnyPointerType() const {
6703 return isPointerType() || isObjCObjectPointerType();
6704}
6705
6706inline bool Type::isBlockPointerType() const {
6707 return isa<BlockPointerType>(CanonicalType);
6708}
6709
6710inline bool Type::isReferenceType() const {
6711 return isa<ReferenceType>(CanonicalType);
6712}
6713
6714inline bool Type::isLValueReferenceType() const {
6715 return isa<LValueReferenceType>(CanonicalType);
6716}
6717
6718inline bool Type::isRValueReferenceType() const {
6719 return isa<RValueReferenceType>(CanonicalType);
6720}
6721
6722inline bool Type::isObjectPointerType() const {
6723 // Note: an "object pointer type" is not the same thing as a pointer to an
6724 // object type; rather, it is a pointer to an object type or a pointer to cv
6725 // void.
6726 if (const auto *T = getAs<PointerType>())
6727 return !T->getPointeeType()->isFunctionType();
6728 else
6729 return false;
6730}
6731
6732inline bool Type::isFunctionPointerType() const {
6733 if (const auto *T = getAs<PointerType>())
6734 return T->getPointeeType()->isFunctionType();
6735 else
6736 return false;
6737}
6738
6739inline bool Type::isFunctionReferenceType() const {
6740 if (const auto *T = getAs<ReferenceType>())
6741 return T->getPointeeType()->isFunctionType();
6742 else
6743 return false;
6744}
6745
6746inline bool Type::isMemberPointerType() const {
6747 return isa<MemberPointerType>(CanonicalType);
6748}
6749
6750inline bool Type::isMemberFunctionPointerType() const {
6751 if (const auto *T = getAs<MemberPointerType>())
6752 return T->isMemberFunctionPointer();
6753 else
6754 return false;
6755}
6756
6757inline bool Type::isMemberDataPointerType() const {
6758 if (const auto *T = getAs<MemberPointerType>())
6759 return T->isMemberDataPointer();
6760 else
6761 return false;
6762}
6763
6764inline bool Type::isArrayType() const {
6765 return isa<ArrayType>(CanonicalType);
6766}
6767
6768inline bool Type::isConstantArrayType() const {
6769 return isa<ConstantArrayType>(CanonicalType);
6770}
6771
6772inline bool Type::isIncompleteArrayType() const {
6773 return isa<IncompleteArrayType>(CanonicalType);
6774}
6775
6776inline bool Type::isVariableArrayType() const {
6777 return isa<VariableArrayType>(CanonicalType);
6778}
6779
6780inline bool Type::isDependentSizedArrayType() const {
6781 return isa<DependentSizedArrayType>(CanonicalType);
6782}
6783
6784inline bool Type::isBuiltinType() const {
6785 return isa<BuiltinType>(CanonicalType);
6786}
6787
6788inline bool Type::isRecordType() const {
6789 return isa<RecordType>(CanonicalType);
18
Assuming field 'CanonicalType' is a 'RecordType'
19
Returning the value 1, which participates in a condition later
6790}
6791
6792inline bool Type::isEnumeralType() const {
6793 return isa<EnumType>(CanonicalType);
6794}
6795
6796inline bool Type::isAnyComplexType() const {
6797 return isa<ComplexType>(CanonicalType);
6798}
6799
6800inline bool Type::isVectorType() const {
6801 return isa<VectorType>(CanonicalType);
6802}
6803
6804inline bool Type::isExtVectorType() const {
6805 return isa<ExtVectorType>(CanonicalType);
6806}
6807
6808inline bool Type::isMatrixType() const {
6809 return isa<MatrixType>(CanonicalType);
6810}
6811
6812inline bool Type::isConstantMatrixType() const {
6813 return isa<ConstantMatrixType>(CanonicalType);
6814}
6815
6816inline bool Type::isDependentAddressSpaceType() const {
6817 return isa<DependentAddressSpaceType>(CanonicalType);
6818}
6819
6820inline bool Type::isObjCObjectPointerType() const {
6821 return isa<ObjCObjectPointerType>(CanonicalType);
6822}
6823
6824inline bool Type::isObjCObjectType() const {
6825 return isa<ObjCObjectType>(CanonicalType);
6826}
6827
6828inline bool Type::isObjCObjectOrInterfaceType() const {
6829 return isa<ObjCInterfaceType>(CanonicalType) ||
6830 isa<ObjCObjectType>(CanonicalType);
6831}
6832
6833inline bool Type::isAtomicType() const {
6834 return isa<AtomicType>(CanonicalType);
6835}
6836
6837inline bool Type::isUndeducedAutoType() const {
6838 return isa<AutoType>(CanonicalType);
6839}
6840
6841inline bool Type::isObjCQualifiedIdType() const {
6842 if (const auto *OPT = getAs<ObjCObjectPointerType>())
6843 return OPT->isObjCQualifiedIdType();
6844 return false;
6845}
6846
6847inline bool Type::isObjCQualifiedClassType() const {
6848 if (const auto *OPT = getAs<ObjCObjectPointerType>())
6849 return OPT->isObjCQualifiedClassType();
6850 return false;
6851}
6852
6853inline bool Type::isObjCIdType() const {
6854 if (const auto *OPT = getAs<ObjCObjectPointerType>())
6855 return OPT->isObjCIdType();
6856 return false;
6857}
6858
6859inline bool Type::isObjCClassType() const {
6860 if (const auto *OPT = getAs<ObjCObjectPointerType>())
6861 return OPT->isObjCClassType();
6862 return false;
6863}
6864
6865inline bool Type::isObjCSelType() const {
6866 if (const auto *OPT = getAs<PointerType>())
6867 return OPT->getPointeeType()->isSpecificBuiltinType(BuiltinType::ObjCSel);
6868 return false;
6869}
6870
6871inline bool Type::isObjCBuiltinType() const {
6872 return isObjCIdType() || isObjCClassType() || isObjCSelType();
6873}
6874
6875inline bool Type::isDecltypeType() const {
6876 return isa<DecltypeType>(this);
6877}
6878
6879#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
6880 inline bool Type::is##Id##Type() const { \
6881 return isSpecificBuiltinType(BuiltinType::Id); \
6882 }
6883#include "clang/Basic/OpenCLImageTypes.def"
6884
6885inline bool Type::isSamplerT() const {
6886 return isSpecificBuiltinType(BuiltinType::OCLSampler);
6887}
6888
6889inline bool Type::isEventT() const {
6890 return isSpecificBuiltinType(BuiltinType::OCLEvent);
6891}
6892
6893inline bool Type::isClkEventT() const {
6894 return isSpecificBuiltinType(BuiltinType::OCLClkEvent);
6895}
6896
6897inline bool Type::isQueueT() const {
6898 return isSpecificBuiltinType(BuiltinType::OCLQueue);
6899}
6900
6901inline bool Type::isReserveIDT() const {
6902 return isSpecificBuiltinType(BuiltinType::OCLReserveID);
6903}
6904
6905inline bool Type::isImageType() const {
6906#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) is##Id##Type() ||
6907 return
6908#include "clang/Basic/OpenCLImageTypes.def"
6909 false; // end boolean or operation
6910}
6911
6912inline bool Type::isPipeType() const {
6913 return isa<PipeType>(CanonicalType);
6914}
6915
6916inline bool Type::isBitIntType() const {
6917 return isa<BitIntType>(CanonicalType);
6918}
6919
6920#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
6921 inline bool Type::is##Id##Type() const { \
6922 return isSpecificBuiltinType(BuiltinType::Id); \
6923 }
6924#include "clang/Basic/OpenCLExtensionTypes.def"
6925
6926inline bool Type::isOCLIntelSubgroupAVCType() const {
6927#define INTEL_SUBGROUP_AVC_TYPE(ExtType, Id) \
6928 isOCLIntelSubgroupAVC##Id##Type() ||
6929 return
6930#include "clang/Basic/OpenCLExtensionTypes.def"
6931 false; // end of boolean or operation
6932}
6933
6934inline bool Type::isOCLExtOpaqueType() const {
6935#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) is##Id##Type() ||
6936 return
6937#include "clang/Basic/OpenCLExtensionTypes.def"
6938 false; // end of boolean or operation
6939}
6940
6941inline bool Type::isOpenCLSpecificType() const {
6942 return isSamplerT() || isEventT() || isImageType() || isClkEventT() ||
6943 isQueueT() || isReserveIDT() || isPipeType() || isOCLExtOpaqueType();
6944}
6945
6946inline bool Type::isTemplateTypeParmType() const {
6947 return isa<TemplateTypeParmType>(CanonicalType);
6948}
6949
6950inline bool Type::isSpecificBuiltinType(unsigned K) const {
6951 if (const BuiltinType *BT = getAs<BuiltinType>()) {
6952 return BT->getKind() == static_cast<BuiltinType::Kind>(K);
6953 }
6954 return false;
6955}
6956
6957inline bool Type::isPlaceholderType() const {
6958 if (const auto *BT = dyn_cast<BuiltinType>(this))
6959 return BT->isPlaceholderType();
6960 return false;
6961}
6962
6963inline const BuiltinType *Type::getAsPlaceholderType() const {
6964 if (const auto *BT = dyn_cast<BuiltinType>(this))
6965 if (BT->isPlaceholderType())
6966 return BT;
6967 return nullptr;
6968}
6969
6970inline bool Type::isSpecificPlaceholderType(unsigned K) const {
6971 assert(BuiltinType::isPlaceholderTypeKind((BuiltinType::Kind) K))(static_cast <bool> (BuiltinType::isPlaceholderTypeKind
((BuiltinType::Kind) K)) ? void (0) : __assert_fail ("BuiltinType::isPlaceholderTypeKind((BuiltinType::Kind) K)"
, "clang/include/clang/AST/Type.h", 6971, __extension__ __PRETTY_FUNCTION__
))
;
6972 return isSpecificBuiltinType(K);
6973}
6974
6975inline bool Type::isNonOverloadPlaceholderType() const {
6976 if (const auto *BT = dyn_cast<BuiltinType>(this))
6977 return BT->isNonOverloadPlaceholderType();
6978 return false;
6979}
6980
6981inline bool Type::isVoidType() const {
6982 return isSpecificBuiltinType(BuiltinType::Void);
6983}
6984
6985inline bool Type::isHalfType() const {
6986 // FIXME: Should we allow complex __fp16? Probably not.
6987 return isSpecificBuiltinType(BuiltinType::Half);
6988}
6989
6990inline bool Type::isFloat16Type() const {
6991 return isSpecificBuiltinType(BuiltinType::Float16);
6992}
6993
6994inline bool Type::isBFloat16Type() const {
6995 return isSpecificBuiltinType(BuiltinType::BFloat16);
6996}
6997
6998inline bool Type::isFloat128Type() const {
6999 return isSpecificBuiltinType(BuiltinType::Float128);
7000}
7001
7002inline bool Type::isIbm128Type() const {
7003 return isSpecificBuiltinType(BuiltinType::Ibm128);
7004}
7005
7006inline bool Type::isNullPtrType() const {
7007 return isSpecificBuiltinType(BuiltinType::NullPtr);
7008}
7009
7010bool IsEnumDeclComplete(EnumDecl *);
7011bool IsEnumDeclScoped(EnumDecl *);
7012
7013inline bool Type::isIntegerType() const {
7014 if (const auto *BT = dyn_cast<BuiltinType>(CanonicalType))
7015 return BT->getKind() >= BuiltinType::Bool &&
7016 BT->getKind() <= BuiltinType::Int128;
7017 if (const EnumType *ET = dyn_cast<EnumType>(CanonicalType)) {
7018 // Incomplete enum types are not treated as integer types.
7019 // FIXME: In C++, enum types are never integer types.
7020 return IsEnumDeclComplete(ET->getDecl()) &&
7021 !IsEnumDeclScoped(ET->getDecl());
7022 }
7023 return isBitIntType();
7024}
7025
7026inline bool Type::isFixedPointType() const {
7027 if (const auto *BT = dyn_cast<BuiltinType>(CanonicalType)) {
7028 return BT->getKind() >= BuiltinType::ShortAccum &&
7029 BT->getKind() <= BuiltinType::SatULongFract;
7030 }
7031 return false;
7032}
7033
7034inline bool Type::isFixedPointOrIntegerType() const {
7035 return isFixedPointType() || isIntegerType();
7036}
7037
7038inline bool Type::isSaturatedFixedPointType() const {
7039 if (const auto *BT = dyn_cast<BuiltinType>(CanonicalType)) {
7040 return BT->getKind() >= BuiltinType::SatShortAccum &&
7041 BT->getKind() <= BuiltinType::SatULongFract;
7042 }
7043 return false;
7044}
7045
7046inline bool Type::isUnsaturatedFixedPointType() const {
7047 return isFixedPointType() && !isSaturatedFixedPointType();
7048}
7049
7050inline bool Type::isSignedFixedPointType() const {
7051 if (const auto *BT = dyn_cast<BuiltinType>(CanonicalType)) {
7052 return ((BT->getKind() >= BuiltinType::ShortAccum &&
7053 BT->getKind() <= BuiltinType::LongAccum) ||
7054 (BT->getKind() >= BuiltinType::ShortFract &&
7055 BT->getKind() <= BuiltinType::LongFract) ||
7056 (BT->getKind() >= BuiltinType::SatShortAccum &&
7057 BT->getKind() <= BuiltinType::SatLongAccum) ||
7058 (BT->getKind() >= BuiltinType::SatShortFract &&
7059 BT->getKind() <= BuiltinType::SatLongFract));
7060 }
7061 return false;
7062}
7063
7064inline bool Type::isUnsignedFixedPointType() const {
7065 return isFixedPointType() && !isSignedFixedPointType();
7066}
7067
7068inline bool Type::isScalarType() const {
7069 if (const auto *BT = dyn_cast<BuiltinType>(CanonicalType))
7070 return BT->getKind() > BuiltinType::Void &&
7071 BT->getKind() <= BuiltinType::NullPtr;
7072 if (const EnumType *ET = dyn_cast<EnumType>(CanonicalType))
7073 // Enums are scalar types, but only if they are defined. Incomplete enums
7074 // are not treated as scalar types.
7075 return IsEnumDeclComplete(ET->getDecl());
7076 return isa<PointerType>(CanonicalType) ||
7077 isa<BlockPointerType>(CanonicalType) ||
7078 isa<MemberPointerType>(CanonicalType) ||
7079 isa<ComplexType>(CanonicalType) ||
7080 isa<ObjCObjectPointerType>(CanonicalType) ||
7081 isBitIntType();
7082}
7083
7084inline bool Type::isIntegralOrEnumerationType() const {
7085 if (const auto *BT = dyn_cast<BuiltinType>(CanonicalType))
7086 return BT->getKind() >= BuiltinType::Bool &&
7087 BT->getKind() <= BuiltinType::Int128;
7088
7089 // Check for a complete enum type; incomplete enum types are not properly an
7090 // enumeration type in the sense required here.
7091 if (const auto *ET = dyn_cast<EnumType>(CanonicalType))
7092 return IsEnumDeclComplete(ET->getDecl());
7093
7094 return isBitIntType();
7095}
7096
7097inline bool Type::isBooleanType() const {
7098 if (const auto *BT = dyn_cast<BuiltinType>(CanonicalType))
7099 return BT->getKind() == BuiltinType::Bool;
7100 return false;
7101}
7102
7103inline bool Type::isUndeducedType() const {
7104 auto *DT = getContainedDeducedType();
7105 return DT && !DT->isDeduced();
7106}
7107
7108/// Determines whether this is a type for which one can define
7109/// an overloaded operator.
7110inline bool Type::isOverloadableType() const {
7111 return isDependentType() || isRecordType() || isEnumeralType();
7112}
7113
7114/// Determines whether this type is written as a typedef-name.
7115inline bool Type::isTypedefNameType() const {
7116 if (getAs<TypedefType>())
7117 return true;
7118 if (auto *TST = getAs<TemplateSpecializationType>())
7119 return TST->isTypeAlias();
7120 return false;
7121}
7122
7123/// Determines whether this type can decay to a pointer type.
7124inline bool Type::canDecayToPointerType() const {
7125 return isFunctionType() || isArrayType();
7126}
7127
7128inline bool Type::hasPointerRepresentation() const {
7129 return (isPointerType() || isReferenceType() || isBlockPointerType() ||
7130 isObjCObjectPointerType() || isNullPtrType());
7131}
7132
7133inline bool Type::hasObjCPointerRepresentation() const {
7134 return isObjCObjectPointerType();
7135}
7136
7137inline const Type *Type::getBaseElementTypeUnsafe() const {
7138 const Type *type = this;
7139 while (const ArrayType *arrayType = type->getAsArrayTypeUnsafe())
7140 type = arrayType->getElementType().getTypePtr();
7141 return type;
7142}
7143
7144inline const Type *Type::getPointeeOrArrayElementType() const {
7145 const Type *type = this;
7146 if (type->isAnyPointerType())
7147 return type->getPointeeType().getTypePtr();
7148 else if (type->isArrayType())
7149 return type->getBaseElementTypeUnsafe();
7150 return type;
7151}
7152/// Insertion operator for partial diagnostics. This allows sending adress
7153/// spaces into a diagnostic with <<.
7154inline const StreamingDiagnostic &operator<<(const StreamingDiagnostic &PD,
7155 LangAS AS) {
7156 PD.AddTaggedVal(static_cast<std::underlying_type_t<LangAS>>(AS),
7157 DiagnosticsEngine::ArgumentKind::ak_addrspace);
7158 return PD;
7159}
7160
7161/// Insertion operator for partial diagnostics. This allows sending Qualifiers
7162/// into a diagnostic with <<.
7163inline const StreamingDiagnostic &operator<<(const StreamingDiagnostic &PD,
7164 Qualifiers Q) {
7165 PD.AddTaggedVal(Q.getAsOpaqueValue(),
7166 DiagnosticsEngine::ArgumentKind::ak_qual);
7167 return PD;
7168}
7169
7170/// Insertion operator for partial diagnostics. This allows sending QualType's
7171/// into a diagnostic with <<.
7172inline const StreamingDiagnostic &operator<<(const StreamingDiagnostic &PD,
7173 QualType T) {
7174 PD.AddTaggedVal(reinterpret_cast<uint64_t>(T.getAsOpaquePtr()),
7175 DiagnosticsEngine::ak_qualtype);
7176 return PD;
7177}
7178
7179// Helper class template that is used by Type::getAs to ensure that one does
7180// not try to look through a qualified type to get to an array type.
7181template <typename T>
7182using TypeIsArrayType =
7183 std::integral_constant<bool, std::is_same<T, ArrayType>::value ||
7184 std::is_base_of<ArrayType, T>::value>;
7185
7186// Member-template getAs<specific type>'.
7187template <typename T> const T *Type::getAs() const {
7188 static_assert(!TypeIsArrayType<T>::value,
7189 "ArrayType cannot be used with getAs!");
7190
7191 // If this is directly a T type, return it.
7192 if (const auto *Ty = dyn_cast<T>(this))
7193 return Ty;
7194
7195 // If the canonical form of this type isn't the right kind, reject it.
7196 if (!isa<T>(CanonicalType))
7197 return nullptr;
7198
7199 // If this is a typedef for the type, strip the typedef off without
7200 // losing all typedef information.
7201 return cast<T>(getUnqualifiedDesugaredType());
7202}
7203
7204template <typename T> const T *Type::getAsAdjusted() const {
7205 static_assert(!TypeIsArrayType<T>::value, "ArrayType cannot be used with getAsAdjusted!");
7206
7207 // If this is directly a T type, return it.
7208 if (const auto *Ty = dyn_cast<T>(this))
7209 return Ty;
7210
7211 // If the canonical form of this type isn't the right kind, reject it.
7212 if (!isa<T>(CanonicalType))
7213 return nullptr;
7214
7215 // Strip off type adjustments that do not modify the underlying nature of the
7216 // type.
7217 const Type *Ty = this;
7218 while (Ty) {
7219 if (const auto *A = dyn_cast<AttributedType>(Ty))
7220 Ty = A->getModifiedType().getTypePtr();
7221 else if (const auto *E = dyn_cast<ElaboratedType>(Ty))
7222 Ty = E->desugar().getTypePtr();
7223 else if (const auto *P = dyn_cast<ParenType>(Ty))
7224 Ty = P->desugar().getTypePtr();
7225 else if (const auto *A = dyn_cast<AdjustedType>(Ty))
7226 Ty = A->desugar().getTypePtr();
7227 else if (const auto *M = dyn_cast<MacroQualifiedType>(Ty))
7228 Ty = M->desugar().getTypePtr();
7229 else
7230 break;
7231 }
7232
7233 // Just because the canonical type is correct does not mean we can use cast<>,
7234 // since we may not have stripped off all the sugar down to the base type.
7235 return dyn_cast<T>(Ty);
7236}
7237
7238inline const ArrayType *Type::getAsArrayTypeUnsafe() const {
7239 // If this is directly an array type, return it.
7240 if (const auto *arr = dyn_cast<ArrayType>(this))
7241 return arr;
7242
7243 // If the canonical form of this type isn't the right kind, reject it.
7244 if (!isa<ArrayType>(CanonicalType))
7245 return nullptr;
7246
7247 // If this is a typedef for the type, strip the typedef off without
7248 // losing all typedef information.
7249 return cast<ArrayType>(getUnqualifiedDesugaredType());
7250}
7251
7252template <typename T> const T *Type::castAs() const {
7253 static_assert(!TypeIsArrayType<T>::value,
7254 "ArrayType cannot be used with castAs!");
7255
7256 if (const auto *ty = dyn_cast<T>(this)) return ty;
7257 assert(isa<T>(CanonicalType))(static_cast <bool> (isa<T>(CanonicalType)) ? void
(0) : __assert_fail ("isa<T>(CanonicalType)", "clang/include/clang/AST/Type.h"
, 7257, __extension__ __PRETTY_FUNCTION__))
;
7258 return cast<T>(getUnqualifiedDesugaredType());
7259}
7260
7261inline const ArrayType *Type::castAsArrayTypeUnsafe() const {
7262 assert(isa<ArrayType>(CanonicalType))(static_cast <bool> (isa<ArrayType>(CanonicalType
)) ? void (0) : __assert_fail ("isa<ArrayType>(CanonicalType)"
, "clang/include/clang/AST/Type.h", 7262, __extension__ __PRETTY_FUNCTION__
))
;
7263 if (const auto *arr = dyn_cast<ArrayType>(this)) return arr;
7264 return cast<ArrayType>(getUnqualifiedDesugaredType());
7265}
7266
7267DecayedType::DecayedType(QualType OriginalType, QualType DecayedPtr,
7268 QualType CanonicalPtr)
7269 : AdjustedType(Decayed, OriginalType, DecayedPtr, CanonicalPtr) {
7270#ifndef NDEBUG
7271 QualType Adjusted = getAdjustedType();
7272 (void)AttributedType::stripOuterNullability(Adjusted);
7273 assert(isa<PointerType>(Adjusted))(static_cast <bool> (isa<PointerType>(Adjusted)) ?
void (0) : __assert_fail ("isa<PointerType>(Adjusted)"
, "clang/include/clang/AST/Type.h", 7273, __extension__ __PRETTY_FUNCTION__
))
;
7274#endif
7275}
7276
7277QualType DecayedType::getPointeeType() const {
7278 QualType Decayed = getDecayedType();
7279 (void)AttributedType::stripOuterNullability(Decayed);
7280 return cast<PointerType>(Decayed)->getPointeeType();
7281}
7282
7283// Get the decimal string representation of a fixed point type, represented
7284// as a scaled integer.
7285// TODO: At some point, we should change the arguments to instead just accept an
7286// APFixedPoint instead of APSInt and scale.
7287void FixedPointValueToString(SmallVectorImpl<char> &Str, llvm::APSInt Val,
7288 unsigned Scale);
7289
7290} // namespace clang
7291
7292#endif // LLVM_CLANG_AST_TYPE_H