1 //===------- CGObjCMac.cpp - Interface to Apple Objective-C Runtime -------===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
9 // This provides Objective-C code generation targeting the Apple runtime.
11 //===----------------------------------------------------------------------===//
14 #include "CGCleanup.h"
15 #include "CGObjCRuntime.h"
16 #include "CGRecordLayout.h"
17 #include "CodeGenFunction.h"
18 #include "CodeGenModule.h"
19 #include "clang/CodeGen/ConstantInitBuilder.h"
20 #include "clang/AST/ASTContext.h"
21 #include "clang/AST/Decl.h"
22 #include "clang/AST/DeclObjC.h"
23 #include "clang/AST/RecordLayout.h"
24 #include "clang/AST/StmtObjC.h"
25 #include "clang/Basic/CodeGenOptions.h"
26 #include "clang/Basic/LangOptions.h"
27 #include "clang/CodeGen/CGFunctionInfo.h"
28 #include "llvm/ADT/CachedHashString.h"
29 #include "llvm/ADT/DenseSet.h"
30 #include "llvm/ADT/SetVector.h"
31 #include "llvm/ADT/SmallPtrSet.h"
32 #include "llvm/ADT/SmallString.h"
33 #include "llvm/IR/DataLayout.h"
34 #include "llvm/IR/InlineAsm.h"
35 #include "llvm/IR/IntrinsicInst.h"
36 #include "llvm/IR/LLVMContext.h"
37 #include "llvm/IR/Module.h"
38 #include "llvm/Support/ScopedPrinter.h"
39 #include "llvm/Support/raw_ostream.h"
42 using namespace clang;
43 using namespace CodeGen;
47 // FIXME: We should find a nicer way to make the labels for metadata, string
48 // concatenation is lame.
50 class ObjCCommonTypesHelper {
52 llvm::LLVMContext &VMContext;
55 // The types of these functions don't really matter because we
56 // should always bitcast before calling them.
58 /// id objc_msgSend (id, SEL, ...)
60 /// The default messenger, used for sends whose ABI is unchanged from
61 /// the all-integer/pointer case.
62 llvm::FunctionCallee getMessageSendFn() const {
63 // Add the non-lazy-bind attribute, since objc_msgSend is likely to
65 llvm::Type *params[] = { ObjectPtrTy, SelectorPtrTy };
66 return CGM.CreateRuntimeFunction(
67 llvm::FunctionType::get(ObjectPtrTy, params, true), "objc_msgSend",
68 llvm::AttributeList::get(CGM.getLLVMContext(),
69 llvm::AttributeList::FunctionIndex,
70 llvm::Attribute::NonLazyBind));
73 /// void objc_msgSend_stret (id, SEL, ...)
75 /// The messenger used when the return value is an aggregate returned
76 /// by indirect reference in the first argument, and therefore the
77 /// self and selector parameters are shifted over by one.
78 llvm::FunctionCallee getMessageSendStretFn() const {
79 llvm::Type *params[] = { ObjectPtrTy, SelectorPtrTy };
80 return CGM.CreateRuntimeFunction(llvm::FunctionType::get(CGM.VoidTy,
82 "objc_msgSend_stret");
85 /// [double | long double] objc_msgSend_fpret(id self, SEL op, ...)
87 /// The messenger used when the return value is returned on the x87
88 /// floating-point stack; without a special entrypoint, the nil case
89 /// would be unbalanced.
90 llvm::FunctionCallee getMessageSendFpretFn() const {
91 llvm::Type *params[] = { ObjectPtrTy, SelectorPtrTy };
92 return CGM.CreateRuntimeFunction(llvm::FunctionType::get(CGM.DoubleTy,
94 "objc_msgSend_fpret");
97 /// _Complex long double objc_msgSend_fp2ret(id self, SEL op, ...)
99 /// The messenger used when the return value is returned in two values on the
100 /// x87 floating point stack; without a special entrypoint, the nil case
101 /// would be unbalanced. Only used on 64-bit X86.
102 llvm::FunctionCallee getMessageSendFp2retFn() const {
103 llvm::Type *params[] = { ObjectPtrTy, SelectorPtrTy };
104 llvm::Type *longDoubleType = llvm::Type::getX86_FP80Ty(VMContext);
105 llvm::Type *resultType =
106 llvm::StructType::get(longDoubleType, longDoubleType);
108 return CGM.CreateRuntimeFunction(llvm::FunctionType::get(resultType,
110 "objc_msgSend_fp2ret");
113 /// id objc_msgSendSuper(struct objc_super *super, SEL op, ...)
115 /// The messenger used for super calls, which have different dispatch
116 /// semantics. The class passed is the superclass of the current
118 llvm::FunctionCallee getMessageSendSuperFn() const {
119 llvm::Type *params[] = { SuperPtrTy, SelectorPtrTy };
120 return CGM.CreateRuntimeFunction(llvm::FunctionType::get(ObjectPtrTy,
122 "objc_msgSendSuper");
125 /// id objc_msgSendSuper2(struct objc_super *super, SEL op, ...)
127 /// A slightly different messenger used for super calls. The class
128 /// passed is the current class.
129 llvm::FunctionCallee getMessageSendSuperFn2() const {
130 llvm::Type *params[] = { SuperPtrTy, SelectorPtrTy };
131 return CGM.CreateRuntimeFunction(llvm::FunctionType::get(ObjectPtrTy,
133 "objc_msgSendSuper2");
136 /// void objc_msgSendSuper_stret(void *stretAddr, struct objc_super *super,
139 /// The messenger used for super calls which return an aggregate indirectly.
140 llvm::FunctionCallee getMessageSendSuperStretFn() const {
141 llvm::Type *params[] = { Int8PtrTy, SuperPtrTy, SelectorPtrTy };
142 return CGM.CreateRuntimeFunction(
143 llvm::FunctionType::get(CGM.VoidTy, params, true),
144 "objc_msgSendSuper_stret");
147 /// void objc_msgSendSuper2_stret(void * stretAddr, struct objc_super *super,
150 /// objc_msgSendSuper_stret with the super2 semantics.
151 llvm::FunctionCallee getMessageSendSuperStretFn2() const {
152 llvm::Type *params[] = { Int8PtrTy, SuperPtrTy, SelectorPtrTy };
153 return CGM.CreateRuntimeFunction(
154 llvm::FunctionType::get(CGM.VoidTy, params, true),
155 "objc_msgSendSuper2_stret");
158 llvm::FunctionCallee getMessageSendSuperFpretFn() const {
159 // There is no objc_msgSendSuper_fpret? How can that work?
160 return getMessageSendSuperFn();
163 llvm::FunctionCallee getMessageSendSuperFpretFn2() const {
164 // There is no objc_msgSendSuper_fpret? How can that work?
165 return getMessageSendSuperFn2();
169 CodeGen::CodeGenModule &CGM;
172 llvm::IntegerType *ShortTy, *IntTy, *LongTy;
173 llvm::PointerType *Int8PtrTy, *Int8PtrPtrTy;
174 llvm::Type *IvarOffsetVarTy;
176 /// ObjectPtrTy - LLVM type for object handles (typeof(id))
177 llvm::PointerType *ObjectPtrTy;
179 /// PtrObjectPtrTy - LLVM type for id *
180 llvm::PointerType *PtrObjectPtrTy;
182 /// SelectorPtrTy - LLVM type for selector handles (typeof(SEL))
183 llvm::PointerType *SelectorPtrTy;
186 /// ProtocolPtrTy - LLVM type for external protocol handles
187 /// (typeof(Protocol))
188 llvm::Type *ExternalProtocolPtrTy;
191 llvm::Type *getExternalProtocolPtrTy() {
192 if (!ExternalProtocolPtrTy) {
193 // FIXME: It would be nice to unify this with the opaque type, so that the
194 // IR comes out a bit cleaner.
195 CodeGen::CodeGenTypes &Types = CGM.getTypes();
196 ASTContext &Ctx = CGM.getContext();
197 llvm::Type *T = Types.ConvertType(Ctx.getObjCProtoType());
198 ExternalProtocolPtrTy = llvm::PointerType::getUnqual(T);
201 return ExternalProtocolPtrTy;
204 // SuperCTy - clang type for struct objc_super.
206 // SuperPtrCTy - clang type for struct objc_super *.
207 QualType SuperPtrCTy;
209 /// SuperTy - LLVM type for struct objc_super.
210 llvm::StructType *SuperTy;
211 /// SuperPtrTy - LLVM type for struct objc_super *.
212 llvm::PointerType *SuperPtrTy;
214 /// PropertyTy - LLVM type for struct objc_property (struct _prop_t
215 /// in GCC parlance).
216 llvm::StructType *PropertyTy;
218 /// PropertyListTy - LLVM type for struct objc_property_list
219 /// (_prop_list_t in GCC parlance).
220 llvm::StructType *PropertyListTy;
221 /// PropertyListPtrTy - LLVM type for struct objc_property_list*.
222 llvm::PointerType *PropertyListPtrTy;
224 // MethodTy - LLVM type for struct objc_method.
225 llvm::StructType *MethodTy;
227 /// CacheTy - LLVM type for struct objc_cache.
229 /// CachePtrTy - LLVM type for struct objc_cache *.
230 llvm::PointerType *CachePtrTy;
232 llvm::FunctionCallee getGetPropertyFn() {
233 CodeGen::CodeGenTypes &Types = CGM.getTypes();
234 ASTContext &Ctx = CGM.getContext();
235 // id objc_getProperty (id, SEL, ptrdiff_t, bool)
236 CanQualType IdType = Ctx.getCanonicalParamType(Ctx.getObjCIdType());
237 CanQualType SelType = Ctx.getCanonicalParamType(Ctx.getObjCSelType());
238 CanQualType Params[] = {
240 Ctx.getPointerDiffType()->getCanonicalTypeUnqualified(), Ctx.BoolTy};
241 llvm::FunctionType *FTy =
242 Types.GetFunctionType(
243 Types.arrangeBuiltinFunctionDeclaration(IdType, Params));
244 return CGM.CreateRuntimeFunction(FTy, "objc_getProperty");
247 llvm::FunctionCallee getSetPropertyFn() {
248 CodeGen::CodeGenTypes &Types = CGM.getTypes();
249 ASTContext &Ctx = CGM.getContext();
250 // void objc_setProperty (id, SEL, ptrdiff_t, id, bool, bool)
251 CanQualType IdType = Ctx.getCanonicalParamType(Ctx.getObjCIdType());
252 CanQualType SelType = Ctx.getCanonicalParamType(Ctx.getObjCSelType());
253 CanQualType Params[] = {
256 Ctx.getPointerDiffType()->getCanonicalTypeUnqualified(),
260 llvm::FunctionType *FTy =
261 Types.GetFunctionType(
262 Types.arrangeBuiltinFunctionDeclaration(Ctx.VoidTy, Params));
263 return CGM.CreateRuntimeFunction(FTy, "objc_setProperty");
266 llvm::FunctionCallee getOptimizedSetPropertyFn(bool atomic, bool copy) {
267 CodeGen::CodeGenTypes &Types = CGM.getTypes();
268 ASTContext &Ctx = CGM.getContext();
269 // void objc_setProperty_atomic(id self, SEL _cmd,
270 // id newValue, ptrdiff_t offset);
271 // void objc_setProperty_nonatomic(id self, SEL _cmd,
272 // id newValue, ptrdiff_t offset);
273 // void objc_setProperty_atomic_copy(id self, SEL _cmd,
274 // id newValue, ptrdiff_t offset);
275 // void objc_setProperty_nonatomic_copy(id self, SEL _cmd,
276 // id newValue, ptrdiff_t offset);
278 SmallVector<CanQualType,4> Params;
279 CanQualType IdType = Ctx.getCanonicalParamType(Ctx.getObjCIdType());
280 CanQualType SelType = Ctx.getCanonicalParamType(Ctx.getObjCSelType());
281 Params.push_back(IdType);
282 Params.push_back(SelType);
283 Params.push_back(IdType);
284 Params.push_back(Ctx.getPointerDiffType()->getCanonicalTypeUnqualified());
285 llvm::FunctionType *FTy =
286 Types.GetFunctionType(
287 Types.arrangeBuiltinFunctionDeclaration(Ctx.VoidTy, Params));
290 name = "objc_setProperty_atomic_copy";
291 else if (atomic && !copy)
292 name = "objc_setProperty_atomic";
293 else if (!atomic && copy)
294 name = "objc_setProperty_nonatomic_copy";
296 name = "objc_setProperty_nonatomic";
298 return CGM.CreateRuntimeFunction(FTy, name);
301 llvm::FunctionCallee getCopyStructFn() {
302 CodeGen::CodeGenTypes &Types = CGM.getTypes();
303 ASTContext &Ctx = CGM.getContext();
304 // void objc_copyStruct (void *, const void *, size_t, bool, bool)
305 SmallVector<CanQualType,5> Params;
306 Params.push_back(Ctx.VoidPtrTy);
307 Params.push_back(Ctx.VoidPtrTy);
308 Params.push_back(Ctx.getSizeType());
309 Params.push_back(Ctx.BoolTy);
310 Params.push_back(Ctx.BoolTy);
311 llvm::FunctionType *FTy =
312 Types.GetFunctionType(
313 Types.arrangeBuiltinFunctionDeclaration(Ctx.VoidTy, Params));
314 return CGM.CreateRuntimeFunction(FTy, "objc_copyStruct");
317 /// This routine declares and returns address of:
318 /// void objc_copyCppObjectAtomic(
319 /// void *dest, const void *src,
320 /// void (*copyHelper) (void *dest, const void *source));
321 llvm::FunctionCallee getCppAtomicObjectFunction() {
322 CodeGen::CodeGenTypes &Types = CGM.getTypes();
323 ASTContext &Ctx = CGM.getContext();
324 /// void objc_copyCppObjectAtomic(void *dest, const void *src, void *helper);
325 SmallVector<CanQualType,3> Params;
326 Params.push_back(Ctx.VoidPtrTy);
327 Params.push_back(Ctx.VoidPtrTy);
328 Params.push_back(Ctx.VoidPtrTy);
329 llvm::FunctionType *FTy =
330 Types.GetFunctionType(
331 Types.arrangeBuiltinFunctionDeclaration(Ctx.VoidTy, Params));
332 return CGM.CreateRuntimeFunction(FTy, "objc_copyCppObjectAtomic");
335 llvm::FunctionCallee getEnumerationMutationFn() {
336 CodeGen::CodeGenTypes &Types = CGM.getTypes();
337 ASTContext &Ctx = CGM.getContext();
338 // void objc_enumerationMutation (id)
339 SmallVector<CanQualType,1> Params;
340 Params.push_back(Ctx.getCanonicalParamType(Ctx.getObjCIdType()));
341 llvm::FunctionType *FTy =
342 Types.GetFunctionType(
343 Types.arrangeBuiltinFunctionDeclaration(Ctx.VoidTy, Params));
344 return CGM.CreateRuntimeFunction(FTy, "objc_enumerationMutation");
347 llvm::FunctionCallee getLookUpClassFn() {
348 CodeGen::CodeGenTypes &Types = CGM.getTypes();
349 ASTContext &Ctx = CGM.getContext();
350 // Class objc_lookUpClass (const char *)
351 SmallVector<CanQualType,1> Params;
353 Ctx.getCanonicalType(Ctx.getPointerType(Ctx.CharTy.withConst())));
354 llvm::FunctionType *FTy =
355 Types.GetFunctionType(Types.arrangeBuiltinFunctionDeclaration(
356 Ctx.getCanonicalType(Ctx.getObjCClassType()),
358 return CGM.CreateRuntimeFunction(FTy, "objc_lookUpClass");
361 /// GcReadWeakFn -- LLVM objc_read_weak (id *src) function.
362 llvm::FunctionCallee getGcReadWeakFn() {
363 // id objc_read_weak (id *)
364 llvm::Type *args[] = { ObjectPtrTy->getPointerTo() };
365 llvm::FunctionType *FTy =
366 llvm::FunctionType::get(ObjectPtrTy, args, false);
367 return CGM.CreateRuntimeFunction(FTy, "objc_read_weak");
370 /// GcAssignWeakFn -- LLVM objc_assign_weak function.
371 llvm::FunctionCallee getGcAssignWeakFn() {
372 // id objc_assign_weak (id, id *)
373 llvm::Type *args[] = { ObjectPtrTy, ObjectPtrTy->getPointerTo() };
374 llvm::FunctionType *FTy =
375 llvm::FunctionType::get(ObjectPtrTy, args, false);
376 return CGM.CreateRuntimeFunction(FTy, "objc_assign_weak");
379 /// GcAssignGlobalFn -- LLVM objc_assign_global function.
380 llvm::FunctionCallee getGcAssignGlobalFn() {
381 // id objc_assign_global(id, id *)
382 llvm::Type *args[] = { ObjectPtrTy, ObjectPtrTy->getPointerTo() };
383 llvm::FunctionType *FTy =
384 llvm::FunctionType::get(ObjectPtrTy, args, false);
385 return CGM.CreateRuntimeFunction(FTy, "objc_assign_global");
388 /// GcAssignThreadLocalFn -- LLVM objc_assign_threadlocal function.
389 llvm::FunctionCallee getGcAssignThreadLocalFn() {
390 // id objc_assign_threadlocal(id src, id * dest)
391 llvm::Type *args[] = { ObjectPtrTy, ObjectPtrTy->getPointerTo() };
392 llvm::FunctionType *FTy =
393 llvm::FunctionType::get(ObjectPtrTy, args, false);
394 return CGM.CreateRuntimeFunction(FTy, "objc_assign_threadlocal");
397 /// GcAssignIvarFn -- LLVM objc_assign_ivar function.
398 llvm::FunctionCallee getGcAssignIvarFn() {
399 // id objc_assign_ivar(id, id *, ptrdiff_t)
400 llvm::Type *args[] = { ObjectPtrTy, ObjectPtrTy->getPointerTo(),
402 llvm::FunctionType *FTy =
403 llvm::FunctionType::get(ObjectPtrTy, args, false);
404 return CGM.CreateRuntimeFunction(FTy, "objc_assign_ivar");
407 /// GcMemmoveCollectableFn -- LLVM objc_memmove_collectable function.
408 llvm::FunctionCallee GcMemmoveCollectableFn() {
409 // void *objc_memmove_collectable(void *dst, const void *src, size_t size)
410 llvm::Type *args[] = { Int8PtrTy, Int8PtrTy, LongTy };
411 llvm::FunctionType *FTy = llvm::FunctionType::get(Int8PtrTy, args, false);
412 return CGM.CreateRuntimeFunction(FTy, "objc_memmove_collectable");
415 /// GcAssignStrongCastFn -- LLVM objc_assign_strongCast function.
416 llvm::FunctionCallee getGcAssignStrongCastFn() {
417 // id objc_assign_strongCast(id, id *)
418 llvm::Type *args[] = { ObjectPtrTy, ObjectPtrTy->getPointerTo() };
419 llvm::FunctionType *FTy =
420 llvm::FunctionType::get(ObjectPtrTy, args, false);
421 return CGM.CreateRuntimeFunction(FTy, "objc_assign_strongCast");
424 /// ExceptionThrowFn - LLVM objc_exception_throw function.
425 llvm::FunctionCallee getExceptionThrowFn() {
426 // void objc_exception_throw(id)
427 llvm::Type *args[] = { ObjectPtrTy };
428 llvm::FunctionType *FTy =
429 llvm::FunctionType::get(CGM.VoidTy, args, false);
430 return CGM.CreateRuntimeFunction(FTy, "objc_exception_throw");
433 /// ExceptionRethrowFn - LLVM objc_exception_rethrow function.
434 llvm::FunctionCallee getExceptionRethrowFn() {
435 // void objc_exception_rethrow(void)
436 llvm::FunctionType *FTy = llvm::FunctionType::get(CGM.VoidTy, false);
437 return CGM.CreateRuntimeFunction(FTy, "objc_exception_rethrow");
440 /// SyncEnterFn - LLVM object_sync_enter function.
441 llvm::FunctionCallee getSyncEnterFn() {
442 // int objc_sync_enter (id)
443 llvm::Type *args[] = { ObjectPtrTy };
444 llvm::FunctionType *FTy =
445 llvm::FunctionType::get(CGM.IntTy, args, false);
446 return CGM.CreateRuntimeFunction(FTy, "objc_sync_enter");
449 /// SyncExitFn - LLVM object_sync_exit function.
450 llvm::FunctionCallee getSyncExitFn() {
451 // int objc_sync_exit (id)
452 llvm::Type *args[] = { ObjectPtrTy };
453 llvm::FunctionType *FTy =
454 llvm::FunctionType::get(CGM.IntTy, args, false);
455 return CGM.CreateRuntimeFunction(FTy, "objc_sync_exit");
458 llvm::FunctionCallee getSendFn(bool IsSuper) const {
459 return IsSuper ? getMessageSendSuperFn() : getMessageSendFn();
462 llvm::FunctionCallee getSendFn2(bool IsSuper) const {
463 return IsSuper ? getMessageSendSuperFn2() : getMessageSendFn();
466 llvm::FunctionCallee getSendStretFn(bool IsSuper) const {
467 return IsSuper ? getMessageSendSuperStretFn() : getMessageSendStretFn();
470 llvm::FunctionCallee getSendStretFn2(bool IsSuper) const {
471 return IsSuper ? getMessageSendSuperStretFn2() : getMessageSendStretFn();
474 llvm::FunctionCallee getSendFpretFn(bool IsSuper) const {
475 return IsSuper ? getMessageSendSuperFpretFn() : getMessageSendFpretFn();
478 llvm::FunctionCallee getSendFpretFn2(bool IsSuper) const {
479 return IsSuper ? getMessageSendSuperFpretFn2() : getMessageSendFpretFn();
482 llvm::FunctionCallee getSendFp2retFn(bool IsSuper) const {
483 return IsSuper ? getMessageSendSuperFn() : getMessageSendFp2retFn();
486 llvm::FunctionCallee getSendFp2RetFn2(bool IsSuper) const {
487 return IsSuper ? getMessageSendSuperFn2() : getMessageSendFp2retFn();
490 ObjCCommonTypesHelper(CodeGen::CodeGenModule &cgm);
493 /// ObjCTypesHelper - Helper class that encapsulates lazy
494 /// construction of varies types used during ObjC generation.
495 class ObjCTypesHelper : public ObjCCommonTypesHelper {
497 /// SymtabTy - LLVM type for struct objc_symtab.
498 llvm::StructType *SymtabTy;
499 /// SymtabPtrTy - LLVM type for struct objc_symtab *.
500 llvm::PointerType *SymtabPtrTy;
501 /// ModuleTy - LLVM type for struct objc_module.
502 llvm::StructType *ModuleTy;
504 /// ProtocolTy - LLVM type for struct objc_protocol.
505 llvm::StructType *ProtocolTy;
506 /// ProtocolPtrTy - LLVM type for struct objc_protocol *.
507 llvm::PointerType *ProtocolPtrTy;
508 /// ProtocolExtensionTy - LLVM type for struct
509 /// objc_protocol_extension.
510 llvm::StructType *ProtocolExtensionTy;
511 /// ProtocolExtensionTy - LLVM type for struct
512 /// objc_protocol_extension *.
513 llvm::PointerType *ProtocolExtensionPtrTy;
514 /// MethodDescriptionTy - LLVM type for struct
515 /// objc_method_description.
516 llvm::StructType *MethodDescriptionTy;
517 /// MethodDescriptionListTy - LLVM type for struct
518 /// objc_method_description_list.
519 llvm::StructType *MethodDescriptionListTy;
520 /// MethodDescriptionListPtrTy - LLVM type for struct
521 /// objc_method_description_list *.
522 llvm::PointerType *MethodDescriptionListPtrTy;
523 /// ProtocolListTy - LLVM type for struct objc_property_list.
524 llvm::StructType *ProtocolListTy;
525 /// ProtocolListPtrTy - LLVM type for struct objc_property_list*.
526 llvm::PointerType *ProtocolListPtrTy;
527 /// CategoryTy - LLVM type for struct objc_category.
528 llvm::StructType *CategoryTy;
529 /// ClassTy - LLVM type for struct objc_class.
530 llvm::StructType *ClassTy;
531 /// ClassPtrTy - LLVM type for struct objc_class *.
532 llvm::PointerType *ClassPtrTy;
533 /// ClassExtensionTy - LLVM type for struct objc_class_ext.
534 llvm::StructType *ClassExtensionTy;
535 /// ClassExtensionPtrTy - LLVM type for struct objc_class_ext *.
536 llvm::PointerType *ClassExtensionPtrTy;
537 // IvarTy - LLVM type for struct objc_ivar.
538 llvm::StructType *IvarTy;
539 /// IvarListTy - LLVM type for struct objc_ivar_list.
540 llvm::StructType *IvarListTy;
541 /// IvarListPtrTy - LLVM type for struct objc_ivar_list *.
542 llvm::PointerType *IvarListPtrTy;
543 /// MethodListTy - LLVM type for struct objc_method_list.
544 llvm::StructType *MethodListTy;
545 /// MethodListPtrTy - LLVM type for struct objc_method_list *.
546 llvm::PointerType *MethodListPtrTy;
548 /// ExceptionDataTy - LLVM type for struct _objc_exception_data.
549 llvm::StructType *ExceptionDataTy;
551 /// ExceptionTryEnterFn - LLVM objc_exception_try_enter function.
552 llvm::FunctionCallee getExceptionTryEnterFn() {
553 llvm::Type *params[] = { ExceptionDataTy->getPointerTo() };
554 return CGM.CreateRuntimeFunction(
555 llvm::FunctionType::get(CGM.VoidTy, params, false),
556 "objc_exception_try_enter");
559 /// ExceptionTryExitFn - LLVM objc_exception_try_exit function.
560 llvm::FunctionCallee getExceptionTryExitFn() {
561 llvm::Type *params[] = { ExceptionDataTy->getPointerTo() };
562 return CGM.CreateRuntimeFunction(
563 llvm::FunctionType::get(CGM.VoidTy, params, false),
564 "objc_exception_try_exit");
567 /// ExceptionExtractFn - LLVM objc_exception_extract function.
568 llvm::FunctionCallee getExceptionExtractFn() {
569 llvm::Type *params[] = { ExceptionDataTy->getPointerTo() };
570 return CGM.CreateRuntimeFunction(llvm::FunctionType::get(ObjectPtrTy,
572 "objc_exception_extract");
575 /// ExceptionMatchFn - LLVM objc_exception_match function.
576 llvm::FunctionCallee getExceptionMatchFn() {
577 llvm::Type *params[] = { ClassPtrTy, ObjectPtrTy };
578 return CGM.CreateRuntimeFunction(
579 llvm::FunctionType::get(CGM.Int32Ty, params, false),
580 "objc_exception_match");
583 /// SetJmpFn - LLVM _setjmp function.
584 llvm::FunctionCallee getSetJmpFn() {
585 // This is specifically the prototype for x86.
586 llvm::Type *params[] = { CGM.Int32Ty->getPointerTo() };
587 return CGM.CreateRuntimeFunction(
588 llvm::FunctionType::get(CGM.Int32Ty, params, false), "_setjmp",
589 llvm::AttributeList::get(CGM.getLLVMContext(),
590 llvm::AttributeList::FunctionIndex,
591 llvm::Attribute::NonLazyBind));
595 ObjCTypesHelper(CodeGen::CodeGenModule &cgm);
598 /// ObjCNonFragileABITypesHelper - will have all types needed by objective-c's
600 class ObjCNonFragileABITypesHelper : public ObjCCommonTypesHelper {
602 // MethodListnfABITy - LLVM for struct _method_list_t
603 llvm::StructType *MethodListnfABITy;
605 // MethodListnfABIPtrTy - LLVM for struct _method_list_t*
606 llvm::PointerType *MethodListnfABIPtrTy;
608 // ProtocolnfABITy = LLVM for struct _protocol_t
609 llvm::StructType *ProtocolnfABITy;
611 // ProtocolnfABIPtrTy = LLVM for struct _protocol_t*
612 llvm::PointerType *ProtocolnfABIPtrTy;
614 // ProtocolListnfABITy - LLVM for struct _objc_protocol_list
615 llvm::StructType *ProtocolListnfABITy;
617 // ProtocolListnfABIPtrTy - LLVM for struct _objc_protocol_list*
618 llvm::PointerType *ProtocolListnfABIPtrTy;
620 // ClassnfABITy - LLVM for struct _class_t
621 llvm::StructType *ClassnfABITy;
623 // ClassnfABIPtrTy - LLVM for struct _class_t*
624 llvm::PointerType *ClassnfABIPtrTy;
626 // IvarnfABITy - LLVM for struct _ivar_t
627 llvm::StructType *IvarnfABITy;
629 // IvarListnfABITy - LLVM for struct _ivar_list_t
630 llvm::StructType *IvarListnfABITy;
632 // IvarListnfABIPtrTy = LLVM for struct _ivar_list_t*
633 llvm::PointerType *IvarListnfABIPtrTy;
635 // ClassRonfABITy - LLVM for struct _class_ro_t
636 llvm::StructType *ClassRonfABITy;
638 // ImpnfABITy - LLVM for id (*)(id, SEL, ...)
639 llvm::PointerType *ImpnfABITy;
641 // CategorynfABITy - LLVM for struct _category_t
642 llvm::StructType *CategorynfABITy;
644 // New types for nonfragile abi messaging.
646 // MessageRefTy - LLVM for:
647 // struct _message_ref_t {
651 llvm::StructType *MessageRefTy;
652 // MessageRefCTy - clang type for struct _message_ref_t
653 QualType MessageRefCTy;
655 // MessageRefPtrTy - LLVM for struct _message_ref_t*
656 llvm::Type *MessageRefPtrTy;
657 // MessageRefCPtrTy - clang type for struct _message_ref_t*
658 QualType MessageRefCPtrTy;
660 // SuperMessageRefTy - LLVM for:
661 // struct _super_message_ref_t {
662 // SUPER_IMP messenger;
665 llvm::StructType *SuperMessageRefTy;
667 // SuperMessageRefPtrTy - LLVM for struct _super_message_ref_t*
668 llvm::PointerType *SuperMessageRefPtrTy;
670 llvm::FunctionCallee getMessageSendFixupFn() {
671 // id objc_msgSend_fixup(id, struct message_ref_t*, ...)
672 llvm::Type *params[] = { ObjectPtrTy, MessageRefPtrTy };
673 return CGM.CreateRuntimeFunction(llvm::FunctionType::get(ObjectPtrTy,
675 "objc_msgSend_fixup");
678 llvm::FunctionCallee getMessageSendFpretFixupFn() {
679 // id objc_msgSend_fpret_fixup(id, struct message_ref_t*, ...)
680 llvm::Type *params[] = { ObjectPtrTy, MessageRefPtrTy };
681 return CGM.CreateRuntimeFunction(llvm::FunctionType::get(ObjectPtrTy,
683 "objc_msgSend_fpret_fixup");
686 llvm::FunctionCallee getMessageSendStretFixupFn() {
687 // id objc_msgSend_stret_fixup(id, struct message_ref_t*, ...)
688 llvm::Type *params[] = { ObjectPtrTy, MessageRefPtrTy };
689 return CGM.CreateRuntimeFunction(llvm::FunctionType::get(ObjectPtrTy,
691 "objc_msgSend_stret_fixup");
694 llvm::FunctionCallee getMessageSendSuper2FixupFn() {
695 // id objc_msgSendSuper2_fixup (struct objc_super *,
696 // struct _super_message_ref_t*, ...)
697 llvm::Type *params[] = { SuperPtrTy, SuperMessageRefPtrTy };
698 return CGM.CreateRuntimeFunction(llvm::FunctionType::get(ObjectPtrTy,
700 "objc_msgSendSuper2_fixup");
703 llvm::FunctionCallee getMessageSendSuper2StretFixupFn() {
704 // id objc_msgSendSuper2_stret_fixup(struct objc_super *,
705 // struct _super_message_ref_t*, ...)
706 llvm::Type *params[] = { SuperPtrTy, SuperMessageRefPtrTy };
707 return CGM.CreateRuntimeFunction(llvm::FunctionType::get(ObjectPtrTy,
709 "objc_msgSendSuper2_stret_fixup");
712 llvm::FunctionCallee getObjCEndCatchFn() {
713 return CGM.CreateRuntimeFunction(llvm::FunctionType::get(CGM.VoidTy, false),
717 llvm::FunctionCallee getObjCBeginCatchFn() {
718 llvm::Type *params[] = { Int8PtrTy };
719 return CGM.CreateRuntimeFunction(llvm::FunctionType::get(Int8PtrTy,
724 /// Class objc_loadClassref (void *)
726 /// Loads from a classref. For Objective-C stub classes, this invokes the
727 /// initialization callback stored inside the stub. For all other classes
728 /// this simply dereferences the pointer.
729 llvm::FunctionCallee getLoadClassrefFn() const {
730 // Add the non-lazy-bind attribute, since objc_loadClassref is likely to
733 // Also it is safe to make it readnone, since we never load or store the
734 // classref except by calling this function.
735 llvm::Type *params[] = { Int8PtrPtrTy };
736 llvm::FunctionCallee F = CGM.CreateRuntimeFunction(
737 llvm::FunctionType::get(ClassnfABIPtrTy, params, false),
739 llvm::AttributeList::get(CGM.getLLVMContext(),
740 llvm::AttributeList::FunctionIndex,
741 {llvm::Attribute::NonLazyBind,
742 llvm::Attribute::ReadNone,
743 llvm::Attribute::NoUnwind}));
744 if (!CGM.getTriple().isOSBinFormatCOFF())
745 cast<llvm::Function>(F.getCallee())->setLinkage(
746 llvm::Function::ExternalWeakLinkage);
751 llvm::StructType *EHTypeTy;
752 llvm::Type *EHTypePtrTy;
754 ObjCNonFragileABITypesHelper(CodeGen::CodeGenModule &cgm);
757 enum class ObjCLabelType {
764 class CGObjCCommonMac : public CodeGen::CGObjCRuntime {
770 SKIP_SCAN(unsigned _skip = 0, unsigned _scan = 0)
771 : skip(_skip), scan(_scan) {}
774 /// opcode for captured block variables layout 'instructions'.
775 /// In the following descriptions, 'I' is the value of the immediate field.
776 /// (field following the opcode).
778 enum BLOCK_LAYOUT_OPCODE {
779 /// An operator which affects how the following layout should be
781 /// I == 0: Halt interpretation and treat everything else as
782 /// a non-pointer. Note that this instruction is equal
784 /// I != 0: Currently unused.
785 BLOCK_LAYOUT_OPERATOR = 0,
787 /// The next I+1 bytes do not contain a value of object pointer type.
788 /// Note that this can leave the stream unaligned, meaning that
789 /// subsequent word-size instructions do not begin at a multiple of
790 /// the pointer size.
791 BLOCK_LAYOUT_NON_OBJECT_BYTES = 1,
793 /// The next I+1 words do not contain a value of object pointer type.
794 /// This is simply an optimized version of BLOCK_LAYOUT_BYTES for
795 /// when the required skip quantity is a multiple of the pointer size.
796 BLOCK_LAYOUT_NON_OBJECT_WORDS = 2,
798 /// The next I+1 words are __strong pointers to Objective-C
799 /// objects or blocks.
800 BLOCK_LAYOUT_STRONG = 3,
802 /// The next I+1 words are pointers to __block variables.
803 BLOCK_LAYOUT_BYREF = 4,
805 /// The next I+1 words are __weak pointers to Objective-C
806 /// objects or blocks.
807 BLOCK_LAYOUT_WEAK = 5,
809 /// The next I+1 words are __unsafe_unretained pointers to
810 /// Objective-C objects or blocks.
811 BLOCK_LAYOUT_UNRETAINED = 6
813 /// The next I+1 words are block or object pointers with some
814 /// as-yet-unspecified ownership semantics. If we add more
815 /// flavors of ownership semantics, values will be taken from
818 /// This is included so that older tools can at least continue
819 /// processing the layout past such things.
820 //BLOCK_LAYOUT_OWNERSHIP_UNKNOWN = 7..10,
822 /// All other opcodes are reserved. Halt interpretation and
823 /// treat everything else as opaque.
828 enum BLOCK_LAYOUT_OPCODE opcode;
829 CharUnits block_var_bytepos;
830 CharUnits block_var_size;
831 RUN_SKIP(enum BLOCK_LAYOUT_OPCODE Opcode = BLOCK_LAYOUT_OPERATOR,
832 CharUnits BytePos = CharUnits::Zero(),
833 CharUnits Size = CharUnits::Zero())
834 : opcode(Opcode), block_var_bytepos(BytePos), block_var_size(Size) {}
836 // Allow sorting based on byte pos.
837 bool operator<(const RUN_SKIP &b) const {
838 return block_var_bytepos < b.block_var_bytepos;
843 llvm::LLVMContext &VMContext;
844 // FIXME! May not be needing this after all.
847 // arc/mrr layout of captured block literal variables.
848 SmallVector<RUN_SKIP, 16> RunSkipBlockVars;
850 /// LazySymbols - Symbols to generate a lazy reference for. See
851 /// DefinedSymbols and FinishModule().
852 llvm::SetVector<IdentifierInfo*> LazySymbols;
854 /// DefinedSymbols - External symbols which are defined by this
855 /// module. The symbols in this list and LazySymbols are used to add
856 /// special linker symbols which ensure that Objective-C modules are
858 llvm::SetVector<IdentifierInfo*> DefinedSymbols;
860 /// ClassNames - uniqued class names.
861 llvm::StringMap<llvm::GlobalVariable*> ClassNames;
863 /// MethodVarNames - uniqued method variable names.
864 llvm::DenseMap<Selector, llvm::GlobalVariable*> MethodVarNames;
866 /// DefinedCategoryNames - list of category names in form Class_Category.
867 llvm::SmallSetVector<llvm::CachedHashString, 16> DefinedCategoryNames;
869 /// MethodVarTypes - uniqued method type signatures. We have to use
870 /// a StringMap here because have no other unique reference.
871 llvm::StringMap<llvm::GlobalVariable*> MethodVarTypes;
873 /// MethodDefinitions - map of methods which have been defined in
874 /// this translation unit.
875 llvm::DenseMap<const ObjCMethodDecl*, llvm::Function*> MethodDefinitions;
877 /// PropertyNames - uniqued method variable names.
878 llvm::DenseMap<IdentifierInfo*, llvm::GlobalVariable*> PropertyNames;
880 /// ClassReferences - uniqued class references.
881 llvm::DenseMap<IdentifierInfo*, llvm::GlobalVariable*> ClassReferences;
883 /// SelectorReferences - uniqued selector references.
884 llvm::DenseMap<Selector, llvm::GlobalVariable*> SelectorReferences;
886 /// Protocols - Protocols for which an objc_protocol structure has
887 /// been emitted. Forward declarations are handled by creating an
888 /// empty structure whose initializer is filled in when/if defined.
889 llvm::DenseMap<IdentifierInfo*, llvm::GlobalVariable*> Protocols;
891 /// DefinedProtocols - Protocols which have actually been
892 /// defined. We should not need this, see FIXME in GenerateProtocol.
893 llvm::DenseSet<IdentifierInfo*> DefinedProtocols;
895 /// DefinedClasses - List of defined classes.
896 SmallVector<llvm::GlobalValue*, 16> DefinedClasses;
898 /// ImplementedClasses - List of @implemented classes.
899 SmallVector<const ObjCInterfaceDecl*, 16> ImplementedClasses;
901 /// DefinedNonLazyClasses - List of defined "non-lazy" classes.
902 SmallVector<llvm::GlobalValue*, 16> DefinedNonLazyClasses;
904 /// DefinedCategories - List of defined categories.
905 SmallVector<llvm::GlobalValue*, 16> DefinedCategories;
907 /// DefinedStubCategories - List of defined categories on class stubs.
908 SmallVector<llvm::GlobalValue*, 16> DefinedStubCategories;
910 /// DefinedNonLazyCategories - List of defined "non-lazy" categories.
911 SmallVector<llvm::GlobalValue*, 16> DefinedNonLazyCategories;
913 /// Cached reference to the class for constant strings. This value has type
914 /// int * but is actually an Obj-C class pointer.
915 llvm::WeakTrackingVH ConstantStringClassRef;
917 /// The LLVM type corresponding to NSConstantString.
918 llvm::StructType *NSConstantStringType = nullptr;
920 llvm::StringMap<llvm::GlobalVariable *> NSConstantStringMap;
922 /// GetNameForMethod - Return a name for the given method.
923 /// \param[out] NameOut - The return value.
924 void GetNameForMethod(const ObjCMethodDecl *OMD,
925 const ObjCContainerDecl *CD,
926 SmallVectorImpl<char> &NameOut);
928 /// GetMethodVarName - Return a unique constant for the given
929 /// selector's name. The return value has type char *.
930 llvm::Constant *GetMethodVarName(Selector Sel);
931 llvm::Constant *GetMethodVarName(IdentifierInfo *Ident);
933 /// GetMethodVarType - Return a unique constant for the given
934 /// method's type encoding string. The return value has type char *.
936 // FIXME: This is a horrible name.
937 llvm::Constant *GetMethodVarType(const ObjCMethodDecl *D,
938 bool Extended = false);
939 llvm::Constant *GetMethodVarType(const FieldDecl *D);
941 /// GetPropertyName - Return a unique constant for the given
942 /// name. The return value has type char *.
943 llvm::Constant *GetPropertyName(IdentifierInfo *Ident);
945 // FIXME: This can be dropped once string functions are unified.
946 llvm::Constant *GetPropertyTypeString(const ObjCPropertyDecl *PD,
947 const Decl *Container);
949 /// GetClassName - Return a unique constant for the given selector's
950 /// runtime name (which may change via use of objc_runtime_name attribute on
951 /// class or protocol definition. The return value has type char *.
952 llvm::Constant *GetClassName(StringRef RuntimeName);
954 llvm::Function *GetMethodDefinition(const ObjCMethodDecl *MD);
956 /// BuildIvarLayout - Builds ivar layout bitmap for the class
957 /// implementation for the __strong or __weak case.
959 /// \param hasMRCWeakIvars - Whether we are compiling in MRC and there
960 /// are any weak ivars defined directly in the class. Meaningless unless
961 /// building a weak layout. Does not guarantee that the layout will
962 /// actually have any entries, because the ivar might be under-aligned.
963 llvm::Constant *BuildIvarLayout(const ObjCImplementationDecl *OI,
964 CharUnits beginOffset,
966 bool forStrongLayout,
967 bool hasMRCWeakIvars);
969 llvm::Constant *BuildStrongIvarLayout(const ObjCImplementationDecl *OI,
970 CharUnits beginOffset,
971 CharUnits endOffset) {
972 return BuildIvarLayout(OI, beginOffset, endOffset, true, false);
975 llvm::Constant *BuildWeakIvarLayout(const ObjCImplementationDecl *OI,
976 CharUnits beginOffset,
978 bool hasMRCWeakIvars) {
979 return BuildIvarLayout(OI, beginOffset, endOffset, false, hasMRCWeakIvars);
982 Qualifiers::ObjCLifetime getBlockCaptureLifetime(QualType QT, bool ByrefLayout);
984 void UpdateRunSkipBlockVars(bool IsByref,
985 Qualifiers::ObjCLifetime LifeTime,
986 CharUnits FieldOffset,
987 CharUnits FieldSize);
989 void BuildRCBlockVarRecordLayout(const RecordType *RT,
990 CharUnits BytePos, bool &HasUnion,
991 bool ByrefLayout=false);
993 void BuildRCRecordLayout(const llvm::StructLayout *RecLayout,
994 const RecordDecl *RD,
995 ArrayRef<const FieldDecl*> RecFields,
996 CharUnits BytePos, bool &HasUnion,
999 uint64_t InlineLayoutInstruction(SmallVectorImpl<unsigned char> &Layout);
1001 llvm::Constant *getBitmapBlockLayout(bool ComputeByrefLayout);
1003 /// GetIvarLayoutName - Returns a unique constant for the given
1004 /// ivar layout bitmap.
1005 llvm::Constant *GetIvarLayoutName(IdentifierInfo *Ident,
1006 const ObjCCommonTypesHelper &ObjCTypes);
1008 /// EmitPropertyList - Emit the given property list. The return
1009 /// value has type PropertyListPtrTy.
1010 llvm::Constant *EmitPropertyList(Twine Name,
1011 const Decl *Container,
1012 const ObjCContainerDecl *OCD,
1013 const ObjCCommonTypesHelper &ObjCTypes,
1014 bool IsClassProperty);
1016 /// EmitProtocolMethodTypes - Generate the array of extended method type
1017 /// strings. The return value has type Int8PtrPtrTy.
1018 llvm::Constant *EmitProtocolMethodTypes(Twine Name,
1019 ArrayRef<llvm::Constant*> MethodTypes,
1020 const ObjCCommonTypesHelper &ObjCTypes);
1022 /// GetProtocolRef - Return a reference to the internal protocol
1023 /// description, creating an empty one if it has not been
1024 /// defined. The return value has type ProtocolPtrTy.
1025 llvm::Constant *GetProtocolRef(const ObjCProtocolDecl *PD);
1027 /// Return a reference to the given Class using runtime calls rather than
1028 /// by a symbol reference.
1029 llvm::Value *EmitClassRefViaRuntime(CodeGenFunction &CGF,
1030 const ObjCInterfaceDecl *ID,
1031 ObjCCommonTypesHelper &ObjCTypes);
1033 std::string GetSectionName(StringRef Section, StringRef MachOAttributes);
1036 /// CreateMetadataVar - Create a global variable with internal
1037 /// linkage for use by the Objective-C runtime.
1039 /// This is a convenience wrapper which not only creates the
1040 /// variable, but also sets the section and alignment and adds the
1041 /// global to the "llvm.used" list.
1043 /// \param Name - The variable name.
1044 /// \param Init - The variable initializer; this is also used to
1045 /// define the type of the variable.
1046 /// \param Section - The section the variable should go into, or empty.
1047 /// \param Align - The alignment for the variable, or 0.
1048 /// \param AddToUsed - Whether the variable should be added to
1050 llvm::GlobalVariable *CreateMetadataVar(Twine Name,
1051 ConstantStructBuilder &Init,
1052 StringRef Section, CharUnits Align,
1054 llvm::GlobalVariable *CreateMetadataVar(Twine Name,
1055 llvm::Constant *Init,
1056 StringRef Section, CharUnits Align,
1059 llvm::GlobalVariable *CreateCStringLiteral(StringRef Name,
1060 ObjCLabelType LabelType,
1061 bool ForceNonFragileABI = false,
1062 bool NullTerminate = true);
1065 CodeGen::RValue EmitMessageSend(CodeGen::CodeGenFunction &CGF,
1066 ReturnValueSlot Return,
1067 QualType ResultType,
1072 const CallArgList &CallArgs,
1073 const ObjCMethodDecl *OMD,
1074 const ObjCInterfaceDecl *ClassReceiver,
1075 const ObjCCommonTypesHelper &ObjCTypes);
1077 /// EmitImageInfo - Emit the image info marker used to encode some module
1078 /// level information.
1079 void EmitImageInfo();
1082 CGObjCCommonMac(CodeGen::CodeGenModule &cgm) :
1083 CGObjCRuntime(cgm), VMContext(cgm.getLLVMContext()) { }
1085 bool isNonFragileABI() const {
1086 return ObjCABI == 2;
1089 ConstantAddress GenerateConstantString(const StringLiteral *SL) override;
1090 ConstantAddress GenerateConstantNSString(const StringLiteral *SL);
1092 llvm::Function *GenerateMethod(const ObjCMethodDecl *OMD,
1093 const ObjCContainerDecl *CD=nullptr) override;
1095 void GenerateProtocol(const ObjCProtocolDecl *PD) override;
1097 /// GetOrEmitProtocol - Get the protocol object for the given
1098 /// declaration, emitting it if necessary. The return value has type
1100 virtual llvm::Constant *GetOrEmitProtocol(const ObjCProtocolDecl *PD)=0;
1102 /// GetOrEmitProtocolRef - Get a forward reference to the protocol
1103 /// object for the given declaration, emitting it if needed. These
1104 /// forward references will be filled in with empty bodies if no
1105 /// definition is seen. The return value has type ProtocolPtrTy.
1106 virtual llvm::Constant *GetOrEmitProtocolRef(const ObjCProtocolDecl *PD)=0;
1108 virtual llvm::Constant *getNSConstantStringClassRef() = 0;
1110 llvm::Constant *BuildGCBlockLayout(CodeGen::CodeGenModule &CGM,
1111 const CGBlockInfo &blockInfo) override;
1112 llvm::Constant *BuildRCBlockLayout(CodeGen::CodeGenModule &CGM,
1113 const CGBlockInfo &blockInfo) override;
1114 std::string getRCBlockLayoutStr(CodeGen::CodeGenModule &CGM,
1115 const CGBlockInfo &blockInfo) override;
1117 llvm::Constant *BuildByrefLayout(CodeGen::CodeGenModule &CGM,
1118 QualType T) override;
1121 void fillRunSkipBlockVars(CodeGenModule &CGM, const CGBlockInfo &blockInfo);
1126 enum class MethodListType {
1127 CategoryInstanceMethods,
1128 CategoryClassMethods,
1131 ProtocolInstanceMethods,
1132 ProtocolClassMethods,
1133 OptionalProtocolInstanceMethods,
1134 OptionalProtocolClassMethods,
1137 /// A convenience class for splitting the methods of a protocol into
1138 /// the four interesting groups.
1139 class ProtocolMethodLists {
1142 RequiredInstanceMethods,
1143 RequiredClassMethods,
1144 OptionalInstanceMethods,
1145 OptionalClassMethods
1148 NumProtocolMethodLists = 4
1151 static MethodListType getMethodListKind(Kind kind) {
1153 case RequiredInstanceMethods:
1154 return MethodListType::ProtocolInstanceMethods;
1155 case RequiredClassMethods:
1156 return MethodListType::ProtocolClassMethods;
1157 case OptionalInstanceMethods:
1158 return MethodListType::OptionalProtocolInstanceMethods;
1159 case OptionalClassMethods:
1160 return MethodListType::OptionalProtocolClassMethods;
1162 llvm_unreachable("bad kind");
1165 SmallVector<const ObjCMethodDecl *, 4> Methods[NumProtocolMethodLists];
1167 static ProtocolMethodLists get(const ObjCProtocolDecl *PD) {
1168 ProtocolMethodLists result;
1170 for (auto MD : PD->methods()) {
1171 size_t index = (2 * size_t(MD->isOptional()))
1172 + (size_t(MD->isClassMethod()));
1173 result.Methods[index].push_back(MD);
1179 template <class Self>
1180 SmallVector<llvm::Constant*, 8> emitExtendedTypesArray(Self *self) const {
1181 // In both ABIs, the method types list is parallel with the
1182 // concatenation of the methods arrays in the following order:
1185 // optional instance methods
1186 // optional class methods
1187 SmallVector<llvm::Constant*, 8> result;
1189 // Methods is already in the correct order for both ABIs.
1190 for (auto &list : Methods) {
1191 for (auto MD : list) {
1192 result.push_back(self->GetMethodVarType(MD, true));
1199 template <class Self>
1200 llvm::Constant *emitMethodList(Self *self, const ObjCProtocolDecl *PD,
1202 return self->emitMethodList(PD->getObjCRuntimeNameAsString(),
1203 getMethodListKind(kind), Methods[kind]);
1207 } // end anonymous namespace
1209 class CGObjCMac : public CGObjCCommonMac {
1211 friend ProtocolMethodLists;
1213 ObjCTypesHelper ObjCTypes;
1215 /// EmitModuleInfo - Another marker encoding module level
1217 void EmitModuleInfo();
1219 /// EmitModuleSymols - Emit module symbols, the list of defined
1220 /// classes and categories. The result has type SymtabPtrTy.
1221 llvm::Constant *EmitModuleSymbols();
1223 /// FinishModule - Write out global data structures at the end of
1224 /// processing a translation unit.
1225 void FinishModule();
1227 /// EmitClassExtension - Generate the class extension structure used
1228 /// to store the weak ivar layout and properties. The return value
1229 /// has type ClassExtensionPtrTy.
1230 llvm::Constant *EmitClassExtension(const ObjCImplementationDecl *ID,
1231 CharUnits instanceSize,
1232 bool hasMRCWeakIvars,
1235 /// EmitClassRef - Return a Value*, of type ObjCTypes.ClassPtrTy,
1236 /// for the given class.
1237 llvm::Value *EmitClassRef(CodeGenFunction &CGF,
1238 const ObjCInterfaceDecl *ID);
1240 llvm::Value *EmitClassRefFromId(CodeGenFunction &CGF,
1241 IdentifierInfo *II);
1243 llvm::Value *EmitNSAutoreleasePoolClassRef(CodeGenFunction &CGF) override;
1245 /// EmitSuperClassRef - Emits reference to class's main metadata class.
1246 llvm::Value *EmitSuperClassRef(const ObjCInterfaceDecl *ID);
1248 /// EmitIvarList - Emit the ivar list for the given
1249 /// implementation. If ForClass is true the list of class ivars
1250 /// (i.e. metaclass ivars) is emitted, otherwise the list of
1251 /// interface ivars will be emitted. The return value has type
1253 llvm::Constant *EmitIvarList(const ObjCImplementationDecl *ID,
1256 /// EmitMetaClass - Emit a forward reference to the class structure
1257 /// for the metaclass of the given interface. The return value has
1258 /// type ClassPtrTy.
1259 llvm::Constant *EmitMetaClassRef(const ObjCInterfaceDecl *ID);
1261 /// EmitMetaClass - Emit a class structure for the metaclass of the
1262 /// given implementation. The return value has type ClassPtrTy.
1263 llvm::Constant *EmitMetaClass(const ObjCImplementationDecl *ID,
1264 llvm::Constant *Protocols,
1265 ArrayRef<const ObjCMethodDecl *> Methods);
1267 void emitMethodConstant(ConstantArrayBuilder &builder,
1268 const ObjCMethodDecl *MD);
1270 void emitMethodDescriptionConstant(ConstantArrayBuilder &builder,
1271 const ObjCMethodDecl *MD);
1273 /// EmitMethodList - Emit the method list for the given
1274 /// implementation. The return value has type MethodListPtrTy.
1275 llvm::Constant *emitMethodList(Twine Name, MethodListType MLT,
1276 ArrayRef<const ObjCMethodDecl *> Methods);
1278 /// GetOrEmitProtocol - Get the protocol object for the given
1279 /// declaration, emitting it if necessary. The return value has type
1281 llvm::Constant *GetOrEmitProtocol(const ObjCProtocolDecl *PD) override;
1283 /// GetOrEmitProtocolRef - Get a forward reference to the protocol
1284 /// object for the given declaration, emitting it if needed. These
1285 /// forward references will be filled in with empty bodies if no
1286 /// definition is seen. The return value has type ProtocolPtrTy.
1287 llvm::Constant *GetOrEmitProtocolRef(const ObjCProtocolDecl *PD) override;
1289 /// EmitProtocolExtension - Generate the protocol extension
1290 /// structure used to store optional instance and class methods, and
1291 /// protocol properties. The return value has type
1292 /// ProtocolExtensionPtrTy.
1294 EmitProtocolExtension(const ObjCProtocolDecl *PD,
1295 const ProtocolMethodLists &methodLists);
1297 /// EmitProtocolList - Generate the list of referenced
1298 /// protocols. The return value has type ProtocolListPtrTy.
1299 llvm::Constant *EmitProtocolList(Twine Name,
1300 ObjCProtocolDecl::protocol_iterator begin,
1301 ObjCProtocolDecl::protocol_iterator end);
1303 /// EmitSelector - Return a Value*, of type ObjCTypes.SelectorPtrTy,
1304 /// for the given selector.
1305 llvm::Value *EmitSelector(CodeGenFunction &CGF, Selector Sel);
1306 Address EmitSelectorAddr(CodeGenFunction &CGF, Selector Sel);
1309 CGObjCMac(CodeGen::CodeGenModule &cgm);
1311 llvm::Constant *getNSConstantStringClassRef() override;
1313 llvm::Function *ModuleInitFunction() override;
1315 CodeGen::RValue GenerateMessageSend(CodeGen::CodeGenFunction &CGF,
1316 ReturnValueSlot Return,
1317 QualType ResultType,
1318 Selector Sel, llvm::Value *Receiver,
1319 const CallArgList &CallArgs,
1320 const ObjCInterfaceDecl *Class,
1321 const ObjCMethodDecl *Method) override;
1324 GenerateMessageSendSuper(CodeGen::CodeGenFunction &CGF,
1325 ReturnValueSlot Return, QualType ResultType,
1326 Selector Sel, const ObjCInterfaceDecl *Class,
1327 bool isCategoryImpl, llvm::Value *Receiver,
1328 bool IsClassMessage, const CallArgList &CallArgs,
1329 const ObjCMethodDecl *Method) override;
1331 llvm::Value *GetClass(CodeGenFunction &CGF,
1332 const ObjCInterfaceDecl *ID) override;
1334 llvm::Value *GetSelector(CodeGenFunction &CGF, Selector Sel) override;
1335 Address GetAddrOfSelector(CodeGenFunction &CGF, Selector Sel) override;
1337 /// The NeXT/Apple runtimes do not support typed selectors; just emit an
1339 llvm::Value *GetSelector(CodeGenFunction &CGF,
1340 const ObjCMethodDecl *Method) override;
1342 llvm::Constant *GetEHType(QualType T) override;
1344 void GenerateCategory(const ObjCCategoryImplDecl *CMD) override;
1346 void GenerateClass(const ObjCImplementationDecl *ClassDecl) override;
1348 void RegisterAlias(const ObjCCompatibleAliasDecl *OAD) override {}
1350 llvm::Value *GenerateProtocolRef(CodeGenFunction &CGF,
1351 const ObjCProtocolDecl *PD) override;
1353 llvm::FunctionCallee GetPropertyGetFunction() override;
1354 llvm::FunctionCallee GetPropertySetFunction() override;
1355 llvm::FunctionCallee GetOptimizedPropertySetFunction(bool atomic,
1356 bool copy) override;
1357 llvm::FunctionCallee GetGetStructFunction() override;
1358 llvm::FunctionCallee GetSetStructFunction() override;
1359 llvm::FunctionCallee GetCppAtomicObjectGetFunction() override;
1360 llvm::FunctionCallee GetCppAtomicObjectSetFunction() override;
1361 llvm::FunctionCallee EnumerationMutationFunction() override;
1363 void EmitTryStmt(CodeGen::CodeGenFunction &CGF,
1364 const ObjCAtTryStmt &S) override;
1365 void EmitSynchronizedStmt(CodeGen::CodeGenFunction &CGF,
1366 const ObjCAtSynchronizedStmt &S) override;
1367 void EmitTryOrSynchronizedStmt(CodeGen::CodeGenFunction &CGF, const Stmt &S);
1368 void EmitThrowStmt(CodeGen::CodeGenFunction &CGF, const ObjCAtThrowStmt &S,
1369 bool ClearInsertionPoint=true) override;
1370 llvm::Value * EmitObjCWeakRead(CodeGen::CodeGenFunction &CGF,
1371 Address AddrWeakObj) override;
1372 void EmitObjCWeakAssign(CodeGen::CodeGenFunction &CGF,
1373 llvm::Value *src, Address dst) override;
1374 void EmitObjCGlobalAssign(CodeGen::CodeGenFunction &CGF,
1375 llvm::Value *src, Address dest,
1376 bool threadlocal = false) override;
1377 void EmitObjCIvarAssign(CodeGen::CodeGenFunction &CGF,
1378 llvm::Value *src, Address dest,
1379 llvm::Value *ivarOffset) override;
1380 void EmitObjCStrongCastAssign(CodeGen::CodeGenFunction &CGF,
1381 llvm::Value *src, Address dest) override;
1382 void EmitGCMemmoveCollectable(CodeGen::CodeGenFunction &CGF,
1383 Address dest, Address src,
1384 llvm::Value *size) override;
1386 LValue EmitObjCValueForIvar(CodeGen::CodeGenFunction &CGF, QualType ObjectTy,
1387 llvm::Value *BaseValue, const ObjCIvarDecl *Ivar,
1388 unsigned CVRQualifiers) override;
1389 llvm::Value *EmitIvarOffset(CodeGen::CodeGenFunction &CGF,
1390 const ObjCInterfaceDecl *Interface,
1391 const ObjCIvarDecl *Ivar) override;
1394 class CGObjCNonFragileABIMac : public CGObjCCommonMac {
1396 friend ProtocolMethodLists;
1397 ObjCNonFragileABITypesHelper ObjCTypes;
1398 llvm::GlobalVariable* ObjCEmptyCacheVar;
1399 llvm::Constant* ObjCEmptyVtableVar;
1401 /// SuperClassReferences - uniqued super class references.
1402 llvm::DenseMap<IdentifierInfo*, llvm::GlobalVariable*> SuperClassReferences;
1404 /// MetaClassReferences - uniqued meta class references.
1405 llvm::DenseMap<IdentifierInfo*, llvm::GlobalVariable*> MetaClassReferences;
1407 /// EHTypeReferences - uniqued class ehtype references.
1408 llvm::DenseMap<IdentifierInfo*, llvm::GlobalVariable*> EHTypeReferences;
1410 /// VTableDispatchMethods - List of methods for which we generate
1411 /// vtable-based message dispatch.
1412 llvm::DenseSet<Selector> VTableDispatchMethods;
1414 /// DefinedMetaClasses - List of defined meta-classes.
1415 std::vector<llvm::GlobalValue*> DefinedMetaClasses;
1417 /// isVTableDispatchedSelector - Returns true if SEL is a
1418 /// vtable-based selector.
1419 bool isVTableDispatchedSelector(Selector Sel);
1421 /// FinishNonFragileABIModule - Write out global data structures at the end of
1422 /// processing a translation unit.
1423 void FinishNonFragileABIModule();
1425 /// AddModuleClassList - Add the given list of class pointers to the
1426 /// module with the provided symbol and section names.
1427 void AddModuleClassList(ArrayRef<llvm::GlobalValue *> Container,
1428 StringRef SymbolName, StringRef SectionName);
1430 llvm::GlobalVariable * BuildClassRoTInitializer(unsigned flags,
1431 unsigned InstanceStart,
1432 unsigned InstanceSize,
1433 const ObjCImplementationDecl *ID);
1434 llvm::GlobalVariable *BuildClassObject(const ObjCInterfaceDecl *CI,
1436 llvm::Constant *IsAGV,
1437 llvm::Constant *SuperClassGV,
1438 llvm::Constant *ClassRoGV,
1439 bool HiddenVisibility);
1441 void emitMethodConstant(ConstantArrayBuilder &builder,
1442 const ObjCMethodDecl *MD,
1445 /// Emit the method list for the given implementation. The return value
1446 /// has type MethodListnfABITy.
1447 llvm::Constant *emitMethodList(Twine Name, MethodListType MLT,
1448 ArrayRef<const ObjCMethodDecl *> Methods);
1450 /// EmitIvarList - Emit the ivar list for the given
1451 /// implementation. If ForClass is true the list of class ivars
1452 /// (i.e. metaclass ivars) is emitted, otherwise the list of
1453 /// interface ivars will be emitted. The return value has type
1454 /// IvarListnfABIPtrTy.
1455 llvm::Constant *EmitIvarList(const ObjCImplementationDecl *ID);
1457 llvm::Constant *EmitIvarOffsetVar(const ObjCInterfaceDecl *ID,
1458 const ObjCIvarDecl *Ivar,
1459 unsigned long int offset);
1461 /// GetOrEmitProtocol - Get the protocol object for the given
1462 /// declaration, emitting it if necessary. The return value has type
1464 llvm::Constant *GetOrEmitProtocol(const ObjCProtocolDecl *PD) override;
1466 /// GetOrEmitProtocolRef - Get a forward reference to the protocol
1467 /// object for the given declaration, emitting it if needed. These
1468 /// forward references will be filled in with empty bodies if no
1469 /// definition is seen. The return value has type ProtocolPtrTy.
1470 llvm::Constant *GetOrEmitProtocolRef(const ObjCProtocolDecl *PD) override;
1472 /// EmitProtocolList - Generate the list of referenced
1473 /// protocols. The return value has type ProtocolListPtrTy.
1474 llvm::Constant *EmitProtocolList(Twine Name,
1475 ObjCProtocolDecl::protocol_iterator begin,
1476 ObjCProtocolDecl::protocol_iterator end);
1478 CodeGen::RValue EmitVTableMessageSend(CodeGen::CodeGenFunction &CGF,
1479 ReturnValueSlot Return,
1480 QualType ResultType,
1482 llvm::Value *Receiver,
1485 const CallArgList &CallArgs,
1486 const ObjCMethodDecl *Method);
1488 /// GetClassGlobal - Return the global variable for the Objective-C
1489 /// class of the given name.
1490 llvm::Constant *GetClassGlobal(StringRef Name,
1491 ForDefinition_t IsForDefinition,
1492 bool Weak = false, bool DLLImport = false);
1493 llvm::Constant *GetClassGlobal(const ObjCInterfaceDecl *ID,
1495 ForDefinition_t isForDefinition);
1497 llvm::Constant *GetClassGlobalForClassRef(const ObjCInterfaceDecl *ID);
1499 llvm::Value *EmitLoadOfClassRef(CodeGenFunction &CGF,
1500 const ObjCInterfaceDecl *ID,
1501 llvm::GlobalVariable *Entry);
1503 /// EmitClassRef - Return a Value*, of type ObjCTypes.ClassPtrTy,
1504 /// for the given class reference.
1505 llvm::Value *EmitClassRef(CodeGenFunction &CGF,
1506 const ObjCInterfaceDecl *ID);
1508 llvm::Value *EmitClassRefFromId(CodeGenFunction &CGF,
1510 const ObjCInterfaceDecl *ID);
1512 llvm::Value *EmitNSAutoreleasePoolClassRef(CodeGenFunction &CGF) override;
1514 /// EmitSuperClassRef - Return a Value*, of type ObjCTypes.ClassPtrTy,
1515 /// for the given super class reference.
1516 llvm::Value *EmitSuperClassRef(CodeGenFunction &CGF,
1517 const ObjCInterfaceDecl *ID);
1519 /// EmitMetaClassRef - Return a Value * of the address of _class_t
1521 llvm::Value *EmitMetaClassRef(CodeGenFunction &CGF,
1522 const ObjCInterfaceDecl *ID, bool Weak);
1524 /// ObjCIvarOffsetVariable - Returns the ivar offset variable for
1527 llvm::GlobalVariable * ObjCIvarOffsetVariable(
1528 const ObjCInterfaceDecl *ID,
1529 const ObjCIvarDecl *Ivar);
1531 /// EmitSelector - Return a Value*, of type ObjCTypes.SelectorPtrTy,
1532 /// for the given selector.
1533 llvm::Value *EmitSelector(CodeGenFunction &CGF, Selector Sel);
1534 Address EmitSelectorAddr(CodeGenFunction &CGF, Selector Sel);
1536 /// GetInterfaceEHType - Get the cached ehtype for the given Objective-C
1537 /// interface. The return value has type EHTypePtrTy.
1538 llvm::Constant *GetInterfaceEHType(const ObjCInterfaceDecl *ID,
1539 ForDefinition_t IsForDefinition);
1541 StringRef getMetaclassSymbolPrefix() const { return "OBJC_METACLASS_$_"; }
1543 StringRef getClassSymbolPrefix() const { return "OBJC_CLASS_$_"; }
1545 void GetClassSizeInfo(const ObjCImplementationDecl *OID,
1546 uint32_t &InstanceStart,
1547 uint32_t &InstanceSize);
1549 // Shamelessly stolen from Analysis/CFRefCount.cpp
1550 Selector GetNullarySelector(const char* name) const {
1551 IdentifierInfo* II = &CGM.getContext().Idents.get(name);
1552 return CGM.getContext().Selectors.getSelector(0, &II);
1555 Selector GetUnarySelector(const char* name) const {
1556 IdentifierInfo* II = &CGM.getContext().Idents.get(name);
1557 return CGM.getContext().Selectors.getSelector(1, &II);
1560 /// ImplementationIsNonLazy - Check whether the given category or
1561 /// class implementation is "non-lazy".
1562 bool ImplementationIsNonLazy(const ObjCImplDecl *OD) const;
1564 bool IsIvarOffsetKnownIdempotent(const CodeGen::CodeGenFunction &CGF,
1565 const ObjCIvarDecl *IV) {
1566 // Annotate the load as an invariant load iff inside an instance method
1567 // and ivar belongs to instance method's class and one of its super class.
1568 // This check is needed because the ivar offset is a lazily
1569 // initialised value that may depend on objc_msgSend to perform a fixup on
1570 // the first message dispatch.
1572 // An additional opportunity to mark the load as invariant arises when the
1573 // base of the ivar access is a parameter to an Objective C method.
1574 // However, because the parameters are not available in the current
1575 // interface, we cannot perform this check.
1576 if (const ObjCMethodDecl *MD =
1577 dyn_cast_or_null<ObjCMethodDecl>(CGF.CurFuncDecl))
1578 if (MD->isInstanceMethod())
1579 if (const ObjCInterfaceDecl *ID = MD->getClassInterface())
1580 return IV->getContainingInterface()->isSuperClassOf(ID);
1584 bool isClassLayoutKnownStatically(const ObjCInterfaceDecl *ID) {
1585 // NSObject is a fixed size. If we can see the @implementation of a class
1586 // which inherits from NSObject then we know that all it's offsets also must
1587 // be fixed. FIXME: Can we do this if see a chain of super classes with
1588 // implementations leading to NSObject?
1589 return ID->getImplementation() && ID->getSuperClass() &&
1590 ID->getSuperClass()->getName() == "NSObject";
1594 CGObjCNonFragileABIMac(CodeGen::CodeGenModule &cgm);
1596 llvm::Constant *getNSConstantStringClassRef() override;
1598 llvm::Function *ModuleInitFunction() override;
1600 CodeGen::RValue GenerateMessageSend(CodeGen::CodeGenFunction &CGF,
1601 ReturnValueSlot Return,
1602 QualType ResultType, Selector Sel,
1603 llvm::Value *Receiver,
1604 const CallArgList &CallArgs,
1605 const ObjCInterfaceDecl *Class,
1606 const ObjCMethodDecl *Method) override;
1609 GenerateMessageSendSuper(CodeGen::CodeGenFunction &CGF,
1610 ReturnValueSlot Return, QualType ResultType,
1611 Selector Sel, const ObjCInterfaceDecl *Class,
1612 bool isCategoryImpl, llvm::Value *Receiver,
1613 bool IsClassMessage, const CallArgList &CallArgs,
1614 const ObjCMethodDecl *Method) override;
1616 llvm::Value *GetClass(CodeGenFunction &CGF,
1617 const ObjCInterfaceDecl *ID) override;
1619 llvm::Value *GetSelector(CodeGenFunction &CGF, Selector Sel) override
1620 { return EmitSelector(CGF, Sel); }
1621 Address GetAddrOfSelector(CodeGenFunction &CGF, Selector Sel) override
1622 { return EmitSelectorAddr(CGF, Sel); }
1624 /// The NeXT/Apple runtimes do not support typed selectors; just emit an
1626 llvm::Value *GetSelector(CodeGenFunction &CGF,
1627 const ObjCMethodDecl *Method) override
1628 { return EmitSelector(CGF, Method->getSelector()); }
1630 void GenerateCategory(const ObjCCategoryImplDecl *CMD) override;
1632 void GenerateClass(const ObjCImplementationDecl *ClassDecl) override;
1634 void RegisterAlias(const ObjCCompatibleAliasDecl *OAD) override {}
1636 llvm::Value *GenerateProtocolRef(CodeGenFunction &CGF,
1637 const ObjCProtocolDecl *PD) override;
1639 llvm::Constant *GetEHType(QualType T) override;
1641 llvm::FunctionCallee GetPropertyGetFunction() override {
1642 return ObjCTypes.getGetPropertyFn();
1644 llvm::FunctionCallee GetPropertySetFunction() override {
1645 return ObjCTypes.getSetPropertyFn();
1648 llvm::FunctionCallee GetOptimizedPropertySetFunction(bool atomic,
1649 bool copy) override {
1650 return ObjCTypes.getOptimizedSetPropertyFn(atomic, copy);
1653 llvm::FunctionCallee GetSetStructFunction() override {
1654 return ObjCTypes.getCopyStructFn();
1657 llvm::FunctionCallee GetGetStructFunction() override {
1658 return ObjCTypes.getCopyStructFn();
1661 llvm::FunctionCallee GetCppAtomicObjectSetFunction() override {
1662 return ObjCTypes.getCppAtomicObjectFunction();
1665 llvm::FunctionCallee GetCppAtomicObjectGetFunction() override {
1666 return ObjCTypes.getCppAtomicObjectFunction();
1669 llvm::FunctionCallee EnumerationMutationFunction() override {
1670 return ObjCTypes.getEnumerationMutationFn();
1673 void EmitTryStmt(CodeGen::CodeGenFunction &CGF,
1674 const ObjCAtTryStmt &S) override;
1675 void EmitSynchronizedStmt(CodeGen::CodeGenFunction &CGF,
1676 const ObjCAtSynchronizedStmt &S) override;
1677 void EmitThrowStmt(CodeGen::CodeGenFunction &CGF, const ObjCAtThrowStmt &S,
1678 bool ClearInsertionPoint=true) override;
1679 llvm::Value * EmitObjCWeakRead(CodeGen::CodeGenFunction &CGF,
1680 Address AddrWeakObj) override;
1681 void EmitObjCWeakAssign(CodeGen::CodeGenFunction &CGF,
1682 llvm::Value *src, Address edst) override;
1683 void EmitObjCGlobalAssign(CodeGen::CodeGenFunction &CGF,
1684 llvm::Value *src, Address dest,
1685 bool threadlocal = false) override;
1686 void EmitObjCIvarAssign(CodeGen::CodeGenFunction &CGF,
1687 llvm::Value *src, Address dest,
1688 llvm::Value *ivarOffset) override;
1689 void EmitObjCStrongCastAssign(CodeGen::CodeGenFunction &CGF,
1690 llvm::Value *src, Address dest) override;
1691 void EmitGCMemmoveCollectable(CodeGen::CodeGenFunction &CGF,
1692 Address dest, Address src,
1693 llvm::Value *size) override;
1694 LValue EmitObjCValueForIvar(CodeGen::CodeGenFunction &CGF, QualType ObjectTy,
1695 llvm::Value *BaseValue, const ObjCIvarDecl *Ivar,
1696 unsigned CVRQualifiers) override;
1697 llvm::Value *EmitIvarOffset(CodeGen::CodeGenFunction &CGF,
1698 const ObjCInterfaceDecl *Interface,
1699 const ObjCIvarDecl *Ivar) override;
1702 /// A helper class for performing the null-initialization of a return
1704 struct NullReturnState {
1705 llvm::BasicBlock *NullBB;
1706 NullReturnState() : NullBB(nullptr) {}
1708 /// Perform a null-check of the given receiver.
1709 void init(CodeGenFunction &CGF, llvm::Value *receiver) {
1710 // Make blocks for the null-receiver and call edges.
1711 NullBB = CGF.createBasicBlock("msgSend.null-receiver");
1712 llvm::BasicBlock *callBB = CGF.createBasicBlock("msgSend.call");
1714 // Check for a null receiver and, if there is one, jump to the
1715 // null-receiver block. There's no point in trying to avoid it:
1716 // we're always going to put *something* there, because otherwise
1717 // we shouldn't have done this null-check in the first place.
1718 llvm::Value *isNull = CGF.Builder.CreateIsNull(receiver);
1719 CGF.Builder.CreateCondBr(isNull, NullBB, callBB);
1721 // Otherwise, start performing the call.
1722 CGF.EmitBlock(callBB);
1725 /// Complete the null-return operation. It is valid to call this
1726 /// regardless of whether 'init' has been called.
1727 RValue complete(CodeGenFunction &CGF,
1728 ReturnValueSlot returnSlot,
1730 QualType resultType,
1731 const CallArgList &CallArgs,
1732 const ObjCMethodDecl *Method) {
1733 // If we never had to do a null-check, just use the raw result.
1734 if (!NullBB) return result;
1736 // The continuation block. This will be left null if we don't have an
1737 // IP, which can happen if the method we're calling is marked noreturn.
1738 llvm::BasicBlock *contBB = nullptr;
1740 // Finish the call path.
1741 llvm::BasicBlock *callBB = CGF.Builder.GetInsertBlock();
1743 contBB = CGF.createBasicBlock("msgSend.cont");
1744 CGF.Builder.CreateBr(contBB);
1747 // Okay, start emitting the null-receiver block.
1748 CGF.EmitBlock(NullBB);
1750 // Release any consumed arguments we've got.
1752 CallArgList::const_iterator I = CallArgs.begin();
1753 for (ObjCMethodDecl::param_const_iterator i = Method->param_begin(),
1754 e = Method->param_end(); i != e; ++i, ++I) {
1755 const ParmVarDecl *ParamDecl = (*i);
1756 if (ParamDecl->hasAttr<NSConsumedAttr>()) {
1757 RValue RV = I->getRValue(CGF);
1758 assert(RV.isScalar() &&
1759 "NullReturnState::complete - arg not on object");
1760 CGF.EmitARCRelease(RV.getScalarVal(), ARCImpreciseLifetime);
1765 // The phi code below assumes that we haven't needed any control flow yet.
1766 assert(CGF.Builder.GetInsertBlock() == NullBB);
1768 // If we've got a void return, just jump to the continuation block.
1769 if (result.isScalar() && resultType->isVoidType()) {
1770 // No jumps required if the message-send was noreturn.
1771 if (contBB) CGF.EmitBlock(contBB);
1775 // If we've got a scalar return, build a phi.
1776 if (result.isScalar()) {
1777 // Derive the null-initialization value.
1778 llvm::Constant *null = CGF.CGM.EmitNullConstant(resultType);
1780 // If no join is necessary, just flow out.
1781 if (!contBB) return RValue::get(null);
1783 // Otherwise, build a phi.
1784 CGF.EmitBlock(contBB);
1785 llvm::PHINode *phi = CGF.Builder.CreatePHI(null->getType(), 2);
1786 phi->addIncoming(result.getScalarVal(), callBB);
1787 phi->addIncoming(null, NullBB);
1788 return RValue::get(phi);
1791 // If we've got an aggregate return, null the buffer out.
1792 // FIXME: maybe we should be doing things differently for all the
1793 // cases where the ABI has us returning (1) non-agg values in
1794 // memory or (2) agg values in registers.
1795 if (result.isAggregate()) {
1796 assert(result.isAggregate() && "null init of non-aggregate result?");
1797 if (!returnSlot.isUnused())
1798 CGF.EmitNullInitialization(result.getAggregateAddress(), resultType);
1799 if (contBB) CGF.EmitBlock(contBB);
1804 CGF.EmitBlock(contBB);
1805 CodeGenFunction::ComplexPairTy callResult = result.getComplexVal();
1807 // Find the scalar type and its zero value.
1808 llvm::Type *scalarTy = callResult.first->getType();
1809 llvm::Constant *scalarZero = llvm::Constant::getNullValue(scalarTy);
1811 // Build phis for both coordinates.
1812 llvm::PHINode *real = CGF.Builder.CreatePHI(scalarTy, 2);
1813 real->addIncoming(callResult.first, callBB);
1814 real->addIncoming(scalarZero, NullBB);
1815 llvm::PHINode *imag = CGF.Builder.CreatePHI(scalarTy, 2);
1816 imag->addIncoming(callResult.second, callBB);
1817 imag->addIncoming(scalarZero, NullBB);
1818 return RValue::getComplex(real, imag);
1822 } // end anonymous namespace
1824 /* *** Helper Functions *** */
1826 /// getConstantGEP() - Help routine to construct simple GEPs.
1827 static llvm::Constant *getConstantGEP(llvm::LLVMContext &VMContext,
1828 llvm::GlobalVariable *C, unsigned idx0,
1830 llvm::Value *Idxs[] = {
1831 llvm::ConstantInt::get(llvm::Type::getInt32Ty(VMContext), idx0),
1832 llvm::ConstantInt::get(llvm::Type::getInt32Ty(VMContext), idx1)
1834 return llvm::ConstantExpr::getGetElementPtr(C->getValueType(), C, Idxs);
1837 /// hasObjCExceptionAttribute - Return true if this class or any super
1838 /// class has the __objc_exception__ attribute.
1839 static bool hasObjCExceptionAttribute(ASTContext &Context,
1840 const ObjCInterfaceDecl *OID) {
1841 if (OID->hasAttr<ObjCExceptionAttr>())
1843 if (const ObjCInterfaceDecl *Super = OID->getSuperClass())
1844 return hasObjCExceptionAttribute(Context, Super);
1848 static llvm::GlobalValue::LinkageTypes
1849 getLinkageTypeForObjCMetadata(CodeGenModule &CGM, StringRef Section) {
1850 if (CGM.getTriple().isOSBinFormatMachO() &&
1851 (Section.empty() || Section.startswith("__DATA")))
1852 return llvm::GlobalValue::InternalLinkage;
1853 return llvm::GlobalValue::PrivateLinkage;
1856 /// A helper function to create an internal or private global variable.
1857 static llvm::GlobalVariable *
1858 finishAndCreateGlobal(ConstantInitBuilder::StructBuilder &Builder,
1859 const llvm::Twine &Name, CodeGenModule &CGM) {
1860 std::string SectionName;
1861 if (CGM.getTriple().isOSBinFormatMachO())
1862 SectionName = "__DATA, __objc_const";
1863 auto *GV = Builder.finishAndCreateGlobal(
1864 Name, CGM.getPointerAlign(), /*constant*/ false,
1865 getLinkageTypeForObjCMetadata(CGM, SectionName));
1866 GV->setSection(SectionName);
1870 /* *** CGObjCMac Public Interface *** */
1872 CGObjCMac::CGObjCMac(CodeGen::CodeGenModule &cgm) : CGObjCCommonMac(cgm),
1878 /// GetClass - Return a reference to the class for the given interface
1880 llvm::Value *CGObjCMac::GetClass(CodeGenFunction &CGF,
1881 const ObjCInterfaceDecl *ID) {
1882 return EmitClassRef(CGF, ID);
1885 /// GetSelector - Return the pointer to the unique'd string for this selector.
1886 llvm::Value *CGObjCMac::GetSelector(CodeGenFunction &CGF, Selector Sel) {
1887 return EmitSelector(CGF, Sel);
1889 Address CGObjCMac::GetAddrOfSelector(CodeGenFunction &CGF, Selector Sel) {
1890 return EmitSelectorAddr(CGF, Sel);
1892 llvm::Value *CGObjCMac::GetSelector(CodeGenFunction &CGF, const ObjCMethodDecl
1894 return EmitSelector(CGF, Method->getSelector());
1897 llvm::Constant *CGObjCMac::GetEHType(QualType T) {
1898 if (T->isObjCIdType() ||
1899 T->isObjCQualifiedIdType()) {
1900 return CGM.GetAddrOfRTTIDescriptor(
1901 CGM.getContext().getObjCIdRedefinitionType(), /*ForEH=*/true);
1903 if (T->isObjCClassType() ||
1904 T->isObjCQualifiedClassType()) {
1905 return CGM.GetAddrOfRTTIDescriptor(
1906 CGM.getContext().getObjCClassRedefinitionType(), /*ForEH=*/true);
1908 if (T->isObjCObjectPointerType())
1909 return CGM.GetAddrOfRTTIDescriptor(T, /*ForEH=*/true);
1911 llvm_unreachable("asking for catch type for ObjC type in fragile runtime");
1914 /// Generate a constant CFString object.
1916 struct __builtin_CFString {
1917 const int *isa; // point to __CFConstantStringClassReference
1924 /// or Generate a constant NSString object.
1926 struct __builtin_NSString {
1927 const int *isa; // point to __NSConstantStringClassReference
1929 unsigned int length;
1934 CGObjCCommonMac::GenerateConstantString(const StringLiteral *SL) {
1935 return (!CGM.getLangOpts().NoConstantCFStrings
1936 ? CGM.GetAddrOfConstantCFString(SL)
1937 : GenerateConstantNSString(SL));
1940 static llvm::StringMapEntry<llvm::GlobalVariable *> &
1941 GetConstantStringEntry(llvm::StringMap<llvm::GlobalVariable *> &Map,
1942 const StringLiteral *Literal, unsigned &StringLength) {
1943 StringRef String = Literal->getString();
1944 StringLength = String.size();
1945 return *Map.insert(std::make_pair(String, nullptr)).first;
1948 llvm::Constant *CGObjCMac::getNSConstantStringClassRef() {
1949 if (llvm::Value *V = ConstantStringClassRef)
1950 return cast<llvm::Constant>(V);
1952 auto &StringClass = CGM.getLangOpts().ObjCConstantStringClass;
1954 StringClass.empty() ? "_NSConstantStringClassReference"
1955 : "_" + StringClass + "ClassReference";
1957 llvm::Type *PTy = llvm::ArrayType::get(CGM.IntTy, 0);
1958 auto GV = CGM.CreateRuntimeVariable(PTy, str);
1959 auto V = llvm::ConstantExpr::getBitCast(GV, CGM.IntTy->getPointerTo());
1960 ConstantStringClassRef = V;
1964 llvm::Constant *CGObjCNonFragileABIMac::getNSConstantStringClassRef() {
1965 if (llvm::Value *V = ConstantStringClassRef)
1966 return cast<llvm::Constant>(V);
1968 auto &StringClass = CGM.getLangOpts().ObjCConstantStringClass;
1970 StringClass.empty() ? "OBJC_CLASS_$_NSConstantString"
1971 : "OBJC_CLASS_$_" + StringClass;
1972 llvm::Constant *GV = GetClassGlobal(str, NotForDefinition);
1974 // Make sure the result is of the correct type.
1975 auto V = llvm::ConstantExpr::getBitCast(GV, CGM.IntTy->getPointerTo());
1977 ConstantStringClassRef = V;
1982 CGObjCCommonMac::GenerateConstantNSString(const StringLiteral *Literal) {
1983 unsigned StringLength = 0;
1984 llvm::StringMapEntry<llvm::GlobalVariable *> &Entry =
1985 GetConstantStringEntry(NSConstantStringMap, Literal, StringLength);
1987 if (auto *C = Entry.second)
1988 return ConstantAddress(C, CharUnits::fromQuantity(C->getAlignment()));
1990 // If we don't already have it, get _NSConstantStringClassReference.
1991 llvm::Constant *Class = getNSConstantStringClassRef();
1993 // If we don't already have it, construct the type for a constant NSString.
1994 if (!NSConstantStringType) {
1995 NSConstantStringType =
1996 llvm::StructType::create({
1997 CGM.Int32Ty->getPointerTo(),
2000 }, "struct.__builtin_NSString");
2003 ConstantInitBuilder Builder(CGM);
2004 auto Fields = Builder.beginStruct(NSConstantStringType);
2011 llvm::ConstantDataArray::getString(VMContext, Entry.first());
2013 llvm::GlobalValue::LinkageTypes Linkage = llvm::GlobalValue::PrivateLinkage;
2014 bool isConstant = !CGM.getLangOpts().WritableStrings;
2016 auto *GV = new llvm::GlobalVariable(CGM.getModule(), C->getType(), isConstant,
2017 Linkage, C, ".str");
2018 GV->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
2019 // Don't enforce the target's minimum global alignment, since the only use
2020 // of the string is via this class initializer.
2021 GV->setAlignment(llvm::Align::None());
2022 Fields.addBitCast(GV, CGM.Int8PtrTy);
2025 Fields.addInt(CGM.IntTy, StringLength);
2028 CharUnits Alignment = CGM.getPointerAlign();
2029 GV = Fields.finishAndCreateGlobal("_unnamed_nsstring_", Alignment,
2031 llvm::GlobalVariable::PrivateLinkage);
2032 const char *NSStringSection = "__OBJC,__cstring_object,regular,no_dead_strip";
2033 const char *NSStringNonFragileABISection =
2034 "__DATA,__objc_stringobj,regular,no_dead_strip";
2035 // FIXME. Fix section.
2036 GV->setSection(CGM.getLangOpts().ObjCRuntime.isNonFragile()
2037 ? NSStringNonFragileABISection
2041 return ConstantAddress(GV, Alignment);
2045 kCFTaggedObjectID_Integer = (1 << 1) + 1
2048 /// Generates a message send where the super is the receiver. This is
2049 /// a message send to self with special delivery semantics indicating
2050 /// which class's method should be called.
2052 CGObjCMac::GenerateMessageSendSuper(CodeGen::CodeGenFunction &CGF,
2053 ReturnValueSlot Return,
2054 QualType ResultType,
2056 const ObjCInterfaceDecl *Class,
2057 bool isCategoryImpl,
2058 llvm::Value *Receiver,
2059 bool IsClassMessage,
2060 const CodeGen::CallArgList &CallArgs,
2061 const ObjCMethodDecl *Method) {
2062 // Create and init a super structure; this is a (receiver, class)
2063 // pair we will pass to objc_msgSendSuper.
2065 CGF.CreateTempAlloca(ObjCTypes.SuperTy, CGF.getPointerAlign(),
2067 llvm::Value *ReceiverAsObject =
2068 CGF.Builder.CreateBitCast(Receiver, ObjCTypes.ObjectPtrTy);
2069 CGF.Builder.CreateStore(ReceiverAsObject,
2070 CGF.Builder.CreateStructGEP(ObjCSuper, 0));
2072 // If this is a class message the metaclass is passed as the target.
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(Target, CGF.getPointerAlign());
2086 llvm::Constant *MetaClassPtr = EmitMetaClassRef(Class);
2087 llvm::Value *SuperPtr =
2088 CGF.Builder.CreateStructGEP(ObjCTypes.ClassTy, MetaClassPtr, 1);
2089 llvm::Value *Super =
2090 CGF.Builder.CreateAlignedLoad(SuperPtr, CGF.getPointerAlign());
2093 } else if (isCategoryImpl)
2094 Target = EmitClassRef(CGF, Class->getSuperClass());
2096 llvm::Value *ClassPtr = EmitSuperClassRef(Class);
2097 ClassPtr = CGF.Builder.CreateStructGEP(ObjCTypes.ClassTy, ClassPtr, 1);
2098 Target = CGF.Builder.CreateAlignedLoad(ClassPtr, CGF.getPointerAlign());
2100 // FIXME: We shouldn't need to do this cast, rectify the ASTContext and
2102 llvm::Type *ClassTy =
2103 CGM.getTypes().ConvertType(CGF.getContext().getObjCClassType());
2104 Target = CGF.Builder.CreateBitCast(Target, ClassTy);
2105 CGF.Builder.CreateStore(Target, CGF.Builder.CreateStructGEP(ObjCSuper, 1));
2106 return EmitMessageSend(CGF, Return, ResultType,
2107 EmitSelector(CGF, Sel),
2108 ObjCSuper.getPointer(), ObjCTypes.SuperPtrCTy,
2109 true, CallArgs, Method, Class, ObjCTypes);
2112 /// Generate code for a message send expression.
2113 CodeGen::RValue CGObjCMac::GenerateMessageSend(CodeGen::CodeGenFunction &CGF,
2114 ReturnValueSlot Return,
2115 QualType ResultType,
2117 llvm::Value *Receiver,
2118 const CallArgList &CallArgs,
2119 const ObjCInterfaceDecl *Class,
2120 const ObjCMethodDecl *Method) {
2121 return EmitMessageSend(CGF, Return, ResultType,
2122 EmitSelector(CGF, Sel),
2123 Receiver, CGF.getContext().getObjCIdType(),
2124 false, CallArgs, Method, Class, ObjCTypes);
2127 static bool isWeakLinkedClass(const ObjCInterfaceDecl *ID) {
2129 if (ID->isWeakImported())
2131 } while ((ID = ID->getSuperClass()));
2137 CGObjCCommonMac::EmitMessageSend(CodeGen::CodeGenFunction &CGF,
2138 ReturnValueSlot Return,
2139 QualType ResultType,
2144 const CallArgList &CallArgs,
2145 const ObjCMethodDecl *Method,
2146 const ObjCInterfaceDecl *ClassReceiver,
2147 const ObjCCommonTypesHelper &ObjCTypes) {
2148 CallArgList ActualArgs;
2150 Arg0 = CGF.Builder.CreateBitCast(Arg0, ObjCTypes.ObjectPtrTy);
2151 ActualArgs.add(RValue::get(Arg0), Arg0Ty);
2152 ActualArgs.add(RValue::get(Sel), CGF.getContext().getObjCSelType());
2153 ActualArgs.addFrom(CallArgs);
2155 // If we're calling a method, use the formal signature.
2156 MessageSendInfo MSI = getMessageSendInfo(Method, ResultType, ActualArgs);
2159 assert(CGM.getContext().getCanonicalType(Method->getReturnType()) ==
2160 CGM.getContext().getCanonicalType(ResultType) &&
2161 "Result type mismatch!");
2163 bool ReceiverCanBeNull = true;
2165 // Super dispatch assumes that self is non-null; even the messenger
2166 // doesn't have a null check internally.
2168 ReceiverCanBeNull = false;
2170 // If this is a direct dispatch of a class method, check whether the class,
2171 // or anything in its hierarchy, was weak-linked.
2172 } else if (ClassReceiver && Method && Method->isClassMethod()) {
2173 ReceiverCanBeNull = isWeakLinkedClass(ClassReceiver);
2175 // If we're emitting a method, and self is const (meaning just ARC, for now),
2176 // and the receiver is a load of self, then self is a valid object.
2177 } else if (auto CurMethod =
2178 dyn_cast_or_null<ObjCMethodDecl>(CGF.CurCodeDecl)) {
2179 auto Self = CurMethod->getSelfDecl();
2180 if (Self->getType().isConstQualified()) {
2181 if (auto LI = dyn_cast<llvm::LoadInst>(Arg0->stripPointerCasts())) {
2182 llvm::Value *SelfAddr = CGF.GetAddrOfLocalVar(Self).getPointer();
2183 if (SelfAddr == LI->getPointerOperand()) {
2184 ReceiverCanBeNull = false;
2190 bool RequiresNullCheck = false;
2192 llvm::FunctionCallee Fn = nullptr;
2193 if (CGM.ReturnSlotInterferesWithArgs(MSI.CallInfo)) {
2194 if (ReceiverCanBeNull) RequiresNullCheck = true;
2195 Fn = (ObjCABI == 2) ? ObjCTypes.getSendStretFn2(IsSuper)
2196 : ObjCTypes.getSendStretFn(IsSuper);
2197 } else if (CGM.ReturnTypeUsesFPRet(ResultType)) {
2198 Fn = (ObjCABI == 2) ? ObjCTypes.getSendFpretFn2(IsSuper)
2199 : ObjCTypes.getSendFpretFn(IsSuper);
2200 } else if (CGM.ReturnTypeUsesFP2Ret(ResultType)) {
2201 Fn = (ObjCABI == 2) ? ObjCTypes.getSendFp2RetFn2(IsSuper)
2202 : ObjCTypes.getSendFp2retFn(IsSuper);
2204 // arm64 uses objc_msgSend for stret methods and yet null receiver check
2205 // must be made for it.
2206 if (ReceiverCanBeNull && CGM.ReturnTypeUsesSRet(MSI.CallInfo))
2207 RequiresNullCheck = true;
2208 Fn = (ObjCABI == 2) ? ObjCTypes.getSendFn2(IsSuper)
2209 : ObjCTypes.getSendFn(IsSuper);
2212 // Cast function to proper signature
2213 llvm::Constant *BitcastFn = cast<llvm::Constant>(
2214 CGF.Builder.CreateBitCast(Fn.getCallee(), MSI.MessengerType));
2216 // We don't need to emit a null check to zero out an indirect result if the
2217 // result is ignored.
2218 if (Return.isUnused())
2219 RequiresNullCheck = false;
2221 // Emit a null-check if there's a consumed argument other than the receiver.
2222 if (!RequiresNullCheck && CGM.getLangOpts().ObjCAutoRefCount && Method) {
2223 for (const auto *ParamDecl : Method->parameters()) {
2224 if (ParamDecl->hasAttr<NSConsumedAttr>()) {
2225 RequiresNullCheck = true;
2231 NullReturnState nullReturn;
2232 if (RequiresNullCheck) {
2233 nullReturn.init(CGF, Arg0);
2236 llvm::CallBase *CallSite;
2237 CGCallee Callee = CGCallee::forDirect(BitcastFn);
2238 RValue rvalue = CGF.EmitCall(MSI.CallInfo, Callee, Return, ActualArgs,
2241 // Mark the call as noreturn if the method is marked noreturn and the
2242 // receiver cannot be null.
2243 if (Method && Method->hasAttr<NoReturnAttr>() && !ReceiverCanBeNull) {
2244 CallSite->setDoesNotReturn();
2247 return nullReturn.complete(CGF, Return, rvalue, ResultType, CallArgs,
2248 RequiresNullCheck ? Method : nullptr);
2251 static Qualifiers::GC GetGCAttrTypeForType(ASTContext &Ctx, QualType FQT,
2252 bool pointee = false) {
2253 // Note that GC qualification applies recursively to C pointer types
2254 // that aren't otherwise decorated. This is weird, but it's probably
2255 // an intentional workaround to the unreliable placement of GC qualifiers.
2256 if (FQT.isObjCGCStrong())
2257 return Qualifiers::Strong;
2259 if (FQT.isObjCGCWeak())
2260 return Qualifiers::Weak;
2262 if (auto ownership = FQT.getObjCLifetime()) {
2263 // Ownership does not apply recursively to C pointer types.
2264 if (pointee) return Qualifiers::GCNone;
2265 switch (ownership) {
2266 case Qualifiers::OCL_Weak: return Qualifiers::Weak;
2267 case Qualifiers::OCL_Strong: return Qualifiers::Strong;
2268 case Qualifiers::OCL_ExplicitNone: return Qualifiers::GCNone;
2269 case Qualifiers::OCL_Autoreleasing: llvm_unreachable("autoreleasing ivar?");
2270 case Qualifiers::OCL_None: llvm_unreachable("known nonzero");
2272 llvm_unreachable("bad objc ownership");
2275 // Treat unqualified retainable pointers as strong.
2276 if (FQT->isObjCObjectPointerType() || FQT->isBlockPointerType())
2277 return Qualifiers::Strong;
2279 // Walk into C pointer types, but only in GC.
2280 if (Ctx.getLangOpts().getGC() != LangOptions::NonGC) {
2281 if (const PointerType *PT = FQT->getAs<PointerType>())
2282 return GetGCAttrTypeForType(Ctx, PT->getPointeeType(), /*pointee*/ true);
2285 return Qualifiers::GCNone;
2291 uint64_t SizeInWords;
2292 IvarInfo(CharUnits offset, uint64_t sizeInWords)
2293 : Offset(offset), SizeInWords(sizeInWords) {}
2295 // Allow sorting based on byte pos.
2296 bool operator<(const IvarInfo &other) const {
2297 return Offset < other.Offset;
2301 /// A helper class for building GC layout strings.
2302 class IvarLayoutBuilder {
2305 /// The start of the layout. Offsets will be relative to this value,
2306 /// and entries less than this value will be silently discarded.
2307 CharUnits InstanceBegin;
2309 /// The end of the layout. Offsets will never exceed this value.
2310 CharUnits InstanceEnd;
2312 /// Whether we're generating the strong layout or the weak layout.
2313 bool ForStrongLayout;
2315 /// Whether the offsets in IvarsInfo might be out-of-order.
2316 bool IsDisordered = false;
2318 llvm::SmallVector<IvarInfo, 8> IvarsInfo;
2321 IvarLayoutBuilder(CodeGenModule &CGM, CharUnits instanceBegin,
2322 CharUnits instanceEnd, bool forStrongLayout)
2323 : CGM(CGM), InstanceBegin(instanceBegin), InstanceEnd(instanceEnd),
2324 ForStrongLayout(forStrongLayout) {
2327 void visitRecord(const RecordType *RT, CharUnits offset);
2329 template <class Iterator, class GetOffsetFn>
2330 void visitAggregate(Iterator begin, Iterator end,
2331 CharUnits aggrOffset,
2332 const GetOffsetFn &getOffset);
2334 void visitField(const FieldDecl *field, CharUnits offset);
2336 /// Add the layout of a block implementation.
2337 void visitBlock(const CGBlockInfo &blockInfo);
2339 /// Is there any information for an interesting bitmap?
2340 bool hasBitmapData() const { return !IvarsInfo.empty(); }
2342 llvm::Constant *buildBitmap(CGObjCCommonMac &CGObjC,
2343 llvm::SmallVectorImpl<unsigned char> &buffer);
2345 static void dump(ArrayRef<unsigned char> buffer) {
2346 const unsigned char *s = buffer.data();
2347 for (unsigned i = 0, e = buffer.size(); i < e; i++)
2349 printf("0x0%x%s", s[i], s[i] != 0 ? ", " : "");
2351 printf("0x%x%s", s[i], s[i] != 0 ? ", " : "");
2355 } // end anonymous namespace
2357 llvm::Constant *CGObjCCommonMac::BuildGCBlockLayout(CodeGenModule &CGM,
2358 const CGBlockInfo &blockInfo) {
2360 llvm::Constant *nullPtr = llvm::Constant::getNullValue(CGM.Int8PtrTy);
2361 if (CGM.getLangOpts().getGC() == LangOptions::NonGC)
2364 IvarLayoutBuilder builder(CGM, CharUnits::Zero(), blockInfo.BlockSize,
2365 /*for strong layout*/ true);
2367 builder.visitBlock(blockInfo);
2369 if (!builder.hasBitmapData())
2372 llvm::SmallVector<unsigned char, 32> buffer;
2373 llvm::Constant *C = builder.buildBitmap(*this, buffer);
2374 if (CGM.getLangOpts().ObjCGCBitmapPrint && !buffer.empty()) {
2375 printf("\n block variable layout for block: ");
2376 builder.dump(buffer);
2382 void IvarLayoutBuilder::visitBlock(const CGBlockInfo &blockInfo) {
2383 // __isa is the first field in block descriptor and must assume by runtime's
2384 // convention that it is GC'able.
2385 IvarsInfo.push_back(IvarInfo(CharUnits::Zero(), 1));
2387 const BlockDecl *blockDecl = blockInfo.getBlockDecl();
2389 // Ignore the optional 'this' capture: C++ objects are not assumed
2392 CharUnits lastFieldOffset;
2394 // Walk the captured variables.
2395 for (const auto &CI : blockDecl->captures()) {
2396 const VarDecl *variable = CI.getVariable();
2397 QualType type = variable->getType();
2399 const CGBlockInfo::Capture &capture = blockInfo.getCapture(variable);
2401 // Ignore constant captures.
2402 if (capture.isConstant()) continue;
2404 CharUnits fieldOffset = capture.getOffset();
2406 // Block fields are not necessarily ordered; if we detect that we're
2407 // adding them out-of-order, make sure we sort later.
2408 if (fieldOffset < lastFieldOffset)
2409 IsDisordered = true;
2410 lastFieldOffset = fieldOffset;
2412 // __block variables are passed by their descriptor address.
2414 IvarsInfo.push_back(IvarInfo(fieldOffset, /*size in words*/ 1));
2418 assert(!type->isArrayType() && "array variable should not be caught");
2419 if (const RecordType *record = type->getAs<RecordType>()) {
2420 visitRecord(record, fieldOffset);
2424 Qualifiers::GC GCAttr = GetGCAttrTypeForType(CGM.getContext(), type);
2426 if (GCAttr == Qualifiers::Strong) {
2427 assert(CGM.getContext().getTypeSize(type)
2428 == CGM.getTarget().getPointerWidth(0));
2429 IvarsInfo.push_back(IvarInfo(fieldOffset, /*size in words*/ 1));
2434 /// getBlockCaptureLifetime - This routine returns life time of the captured
2435 /// block variable for the purpose of block layout meta-data generation. FQT is
2436 /// the type of the variable captured in the block.
2437 Qualifiers::ObjCLifetime CGObjCCommonMac::getBlockCaptureLifetime(QualType FQT,
2439 // If it has an ownership qualifier, we're done.
2440 if (auto lifetime = FQT.getObjCLifetime())
2443 // If it doesn't, and this is ARC, it has no ownership.
2444 if (CGM.getLangOpts().ObjCAutoRefCount)
2445 return Qualifiers::OCL_None;
2447 // In MRC, retainable pointers are owned by non-__block variables.
2448 if (FQT->isObjCObjectPointerType() || FQT->isBlockPointerType())
2449 return ByrefLayout ? Qualifiers::OCL_ExplicitNone : Qualifiers::OCL_Strong;
2451 return Qualifiers::OCL_None;
2454 void CGObjCCommonMac::UpdateRunSkipBlockVars(bool IsByref,
2455 Qualifiers::ObjCLifetime LifeTime,
2456 CharUnits FieldOffset,
2457 CharUnits FieldSize) {
2458 // __block variables are passed by their descriptor address.
2460 RunSkipBlockVars.push_back(RUN_SKIP(BLOCK_LAYOUT_BYREF, FieldOffset,
2462 else if (LifeTime == Qualifiers::OCL_Strong)
2463 RunSkipBlockVars.push_back(RUN_SKIP(BLOCK_LAYOUT_STRONG, FieldOffset,
2465 else if (LifeTime == Qualifiers::OCL_Weak)
2466 RunSkipBlockVars.push_back(RUN_SKIP(BLOCK_LAYOUT_WEAK, FieldOffset,
2468 else if (LifeTime == Qualifiers::OCL_ExplicitNone)
2469 RunSkipBlockVars.push_back(RUN_SKIP(BLOCK_LAYOUT_UNRETAINED, FieldOffset,
2472 RunSkipBlockVars.push_back(RUN_SKIP(BLOCK_LAYOUT_NON_OBJECT_BYTES,
2477 void CGObjCCommonMac::BuildRCRecordLayout(const llvm::StructLayout *RecLayout,
2478 const RecordDecl *RD,
2479 ArrayRef<const FieldDecl*> RecFields,
2480 CharUnits BytePos, bool &HasUnion,
2482 bool IsUnion = (RD && RD->isUnion());
2483 CharUnits MaxUnionSize = CharUnits::Zero();
2484 const FieldDecl *MaxField = nullptr;
2485 const FieldDecl *LastFieldBitfieldOrUnnamed = nullptr;
2486 CharUnits MaxFieldOffset = CharUnits::Zero();
2487 CharUnits LastBitfieldOrUnnamedOffset = CharUnits::Zero();
2489 if (RecFields.empty())
2491 unsigned ByteSizeInBits = CGM.getTarget().getCharWidth();
2493 for (unsigned i = 0, e = RecFields.size(); i != e; ++i) {
2494 const FieldDecl *Field = RecFields[i];
2495 // Note that 'i' here is actually the field index inside RD of Field,
2496 // although this dependency is hidden.
2497 const ASTRecordLayout &RL = CGM.getContext().getASTRecordLayout(RD);
2498 CharUnits FieldOffset =
2499 CGM.getContext().toCharUnitsFromBits(RL.getFieldOffset(i));
2501 // Skip over unnamed or bitfields
2502 if (!Field->getIdentifier() || Field->isBitField()) {
2503 LastFieldBitfieldOrUnnamed = Field;
2504 LastBitfieldOrUnnamedOffset = FieldOffset;
2508 LastFieldBitfieldOrUnnamed = nullptr;
2509 QualType FQT = Field->getType();
2510 if (FQT->isRecordType() || FQT->isUnionType()) {
2511 if (FQT->isUnionType())
2514 BuildRCBlockVarRecordLayout(FQT->getAs<RecordType>(),
2515 BytePos + FieldOffset, HasUnion);
2519 if (const ArrayType *Array = CGM.getContext().getAsArrayType(FQT)) {
2520 auto *CArray = cast<ConstantArrayType>(Array);
2521 uint64_t ElCount = CArray->getSize().getZExtValue();
2522 assert(CArray && "only array with known element size is supported");
2523 FQT = CArray->getElementType();
2524 while (const ArrayType *Array = CGM.getContext().getAsArrayType(FQT)) {
2525 auto *CArray = cast<ConstantArrayType>(Array);
2526 ElCount *= CArray->getSize().getZExtValue();
2527 FQT = CArray->getElementType();
2529 if (FQT->isRecordType() && ElCount) {
2530 int OldIndex = RunSkipBlockVars.size() - 1;
2531 const RecordType *RT = FQT->getAs<RecordType>();
2532 BuildRCBlockVarRecordLayout(RT, BytePos + FieldOffset,
2535 // Replicate layout information for each array element. Note that
2536 // one element is already done.
2538 for (int FirstIndex = RunSkipBlockVars.size() - 1 ;ElIx < ElCount; ElIx++) {
2539 CharUnits Size = CGM.getContext().getTypeSizeInChars(RT);
2540 for (int i = OldIndex+1; i <= FirstIndex; ++i)
2541 RunSkipBlockVars.push_back(
2542 RUN_SKIP(RunSkipBlockVars[i].opcode,
2543 RunSkipBlockVars[i].block_var_bytepos + Size*ElIx,
2544 RunSkipBlockVars[i].block_var_size));
2549 CharUnits FieldSize = CGM.getContext().getTypeSizeInChars(Field->getType());
2551 CharUnits UnionIvarSize = FieldSize;
2552 if (UnionIvarSize > MaxUnionSize) {
2553 MaxUnionSize = UnionIvarSize;
2555 MaxFieldOffset = FieldOffset;
2558 UpdateRunSkipBlockVars(false,
2559 getBlockCaptureLifetime(FQT, ByrefLayout),
2560 BytePos + FieldOffset,
2565 if (LastFieldBitfieldOrUnnamed) {
2566 if (LastFieldBitfieldOrUnnamed->isBitField()) {
2567 // Last field was a bitfield. Must update the info.
2568 uint64_t BitFieldSize
2569 = LastFieldBitfieldOrUnnamed->getBitWidthValue(CGM.getContext());
2570 unsigned UnsSize = (BitFieldSize / ByteSizeInBits) +
2571 ((BitFieldSize % ByteSizeInBits) != 0);
2572 CharUnits Size = CharUnits::fromQuantity(UnsSize);
2573 Size += LastBitfieldOrUnnamedOffset;
2574 UpdateRunSkipBlockVars(false,
2575 getBlockCaptureLifetime(LastFieldBitfieldOrUnnamed->getType(),
2577 BytePos + LastBitfieldOrUnnamedOffset,
2580 assert(!LastFieldBitfieldOrUnnamed->getIdentifier() &&"Expected unnamed");
2581 // Last field was unnamed. Must update skip info.
2583 = CGM.getContext().getTypeSizeInChars(LastFieldBitfieldOrUnnamed->getType());
2584 UpdateRunSkipBlockVars(false,
2585 getBlockCaptureLifetime(LastFieldBitfieldOrUnnamed->getType(),
2587 BytePos + LastBitfieldOrUnnamedOffset,
2593 UpdateRunSkipBlockVars(false,
2594 getBlockCaptureLifetime(MaxField->getType(), ByrefLayout),
2595 BytePos + MaxFieldOffset,
2599 void CGObjCCommonMac::BuildRCBlockVarRecordLayout(const RecordType *RT,
2603 const RecordDecl *RD = RT->getDecl();
2604 SmallVector<const FieldDecl*, 16> Fields(RD->fields());
2605 llvm::Type *Ty = CGM.getTypes().ConvertType(QualType(RT, 0));
2606 const llvm::StructLayout *RecLayout =
2607 CGM.getDataLayout().getStructLayout(cast<llvm::StructType>(Ty));
2609 BuildRCRecordLayout(RecLayout, RD, Fields, BytePos, HasUnion, ByrefLayout);
2612 /// InlineLayoutInstruction - This routine produce an inline instruction for the
2613 /// block variable layout if it can. If not, it returns 0. Rules are as follow:
2614 /// If ((uintptr_t) layout) < (1 << 12), the layout is inline. In the 64bit world,
2615 /// an inline layout of value 0x0000000000000xyz is interpreted as follows:
2616 /// x captured object pointers of BLOCK_LAYOUT_STRONG. Followed by
2617 /// y captured object of BLOCK_LAYOUT_BYREF. Followed by
2618 /// z captured object of BLOCK_LAYOUT_WEAK. If any of the above is missing, zero
2619 /// replaces it. For example, 0x00000x00 means x BLOCK_LAYOUT_STRONG and no
2620 /// BLOCK_LAYOUT_BYREF and no BLOCK_LAYOUT_WEAK objects are captured.
2621 uint64_t CGObjCCommonMac::InlineLayoutInstruction(
2622 SmallVectorImpl<unsigned char> &Layout) {
2623 uint64_t Result = 0;
2624 if (Layout.size() <= 3) {
2625 unsigned size = Layout.size();
2626 unsigned strong_word_count = 0, byref_word_count=0, weak_word_count=0;
2628 enum BLOCK_LAYOUT_OPCODE opcode ;
2632 opcode = (enum BLOCK_LAYOUT_OPCODE) (inst >> 4);
2633 if (opcode == BLOCK_LAYOUT_STRONG)
2634 strong_word_count = (inst & 0xF)+1;
2638 opcode = (enum BLOCK_LAYOUT_OPCODE) (inst >> 4);
2639 if (opcode == BLOCK_LAYOUT_BYREF)
2640 byref_word_count = (inst & 0xF)+1;
2644 opcode = (enum BLOCK_LAYOUT_OPCODE) (inst >> 4);
2645 if (opcode == BLOCK_LAYOUT_WEAK)
2646 weak_word_count = (inst & 0xF)+1;
2653 opcode = (enum BLOCK_LAYOUT_OPCODE) (inst >> 4);
2654 if (opcode == BLOCK_LAYOUT_STRONG) {
2655 strong_word_count = (inst & 0xF)+1;
2657 opcode = (enum BLOCK_LAYOUT_OPCODE) (inst >> 4);
2658 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;
2665 else if (opcode == BLOCK_LAYOUT_BYREF) {
2666 byref_word_count = (inst & 0xF)+1;
2668 opcode = (enum BLOCK_LAYOUT_OPCODE) (inst >> 4);
2669 if (opcode == BLOCK_LAYOUT_WEAK)
2670 weak_word_count = (inst & 0xF)+1;
2680 opcode = (enum BLOCK_LAYOUT_OPCODE) (inst >> 4);
2681 if (opcode == BLOCK_LAYOUT_STRONG)
2682 strong_word_count = (inst & 0xF)+1;
2683 else if (opcode == BLOCK_LAYOUT_BYREF)
2684 byref_word_count = (inst & 0xF)+1;
2685 else if (opcode == BLOCK_LAYOUT_WEAK)
2686 weak_word_count = (inst & 0xF)+1;
2695 // Cannot inline when any of the word counts is 15. Because this is one less
2696 // than the actual work count (so 15 means 16 actual word counts),
2697 // and we can only display 0 thru 15 word counts.
2698 if (strong_word_count == 16 || byref_word_count == 16 || weak_word_count == 16)
2702 (strong_word_count != 0) + (byref_word_count != 0) + (weak_word_count != 0);
2704 if (size == count) {
2705 if (strong_word_count)
2706 Result = strong_word_count;
2708 if (byref_word_count)
2709 Result += byref_word_count;
2711 if (weak_word_count)
2712 Result += weak_word_count;
2718 llvm::Constant *CGObjCCommonMac::getBitmapBlockLayout(bool ComputeByrefLayout) {
2719 llvm::Constant *nullPtr = llvm::Constant::getNullValue(CGM.Int8PtrTy);
2720 if (RunSkipBlockVars.empty())
2722 unsigned WordSizeInBits = CGM.getTarget().getPointerWidth(0);
2723 unsigned ByteSizeInBits = CGM.getTarget().getCharWidth();
2724 unsigned WordSizeInBytes = WordSizeInBits/ByteSizeInBits;
2726 // Sort on byte position; captures might not be allocated in order,
2727 // and unions can do funny things.
2728 llvm::array_pod_sort(RunSkipBlockVars.begin(), RunSkipBlockVars.end());
2729 SmallVector<unsigned char, 16> Layout;
2731 unsigned size = RunSkipBlockVars.size();
2732 for (unsigned i = 0; i < size; i++) {
2733 enum BLOCK_LAYOUT_OPCODE opcode = RunSkipBlockVars[i].opcode;
2734 CharUnits start_byte_pos = RunSkipBlockVars[i].block_var_bytepos;
2735 CharUnits end_byte_pos = start_byte_pos;
2738 if (opcode == RunSkipBlockVars[j].opcode) {
2739 end_byte_pos = RunSkipBlockVars[j++].block_var_bytepos;
2745 CharUnits size_in_bytes =
2746 end_byte_pos - start_byte_pos + RunSkipBlockVars[j-1].block_var_size;
2749 RunSkipBlockVars[j].block_var_bytepos -
2750 RunSkipBlockVars[j-1].block_var_bytepos - RunSkipBlockVars[j-1].block_var_size;
2751 size_in_bytes += gap;
2753 CharUnits residue_in_bytes = CharUnits::Zero();
2754 if (opcode == BLOCK_LAYOUT_NON_OBJECT_BYTES) {
2755 residue_in_bytes = size_in_bytes % WordSizeInBytes;
2756 size_in_bytes -= residue_in_bytes;
2757 opcode = BLOCK_LAYOUT_NON_OBJECT_WORDS;
2760 unsigned size_in_words = size_in_bytes.getQuantity() / WordSizeInBytes;
2761 while (size_in_words >= 16) {
2762 // Note that value in imm. is one less that the actual
2763 // value. So, 0xf means 16 words follow!
2764 unsigned char inst = (opcode << 4) | 0xf;
2765 Layout.push_back(inst);
2766 size_in_words -= 16;
2768 if (size_in_words > 0) {
2769 // Note that value in imm. is one less that the actual
2770 // value. So, we subtract 1 away!
2771 unsigned char inst = (opcode << 4) | (size_in_words-1);
2772 Layout.push_back(inst);
2774 if (residue_in_bytes > CharUnits::Zero()) {
2775 unsigned char inst =
2776 (BLOCK_LAYOUT_NON_OBJECT_BYTES << 4) | (residue_in_bytes.getQuantity()-1);
2777 Layout.push_back(inst);
2781 while (!Layout.empty()) {
2782 unsigned char inst = Layout.back();
2783 enum BLOCK_LAYOUT_OPCODE opcode = (enum BLOCK_LAYOUT_OPCODE) (inst >> 4);
2784 if (opcode == BLOCK_LAYOUT_NON_OBJECT_BYTES || opcode == BLOCK_LAYOUT_NON_OBJECT_WORDS)
2790 uint64_t Result = InlineLayoutInstruction(Layout);
2792 // Block variable layout instruction has been inlined.
2793 if (CGM.getLangOpts().ObjCGCBitmapPrint) {
2794 if (ComputeByrefLayout)
2795 printf("\n Inline BYREF variable layout: ");
2797 printf("\n Inline block variable layout: ");
2798 printf("0x0%" PRIx64 "", Result);
2799 if (auto numStrong = (Result & 0xF00) >> 8)
2800 printf(", BL_STRONG:%d", (int) numStrong);
2801 if (auto numByref = (Result & 0x0F0) >> 4)
2802 printf(", BL_BYREF:%d", (int) numByref);
2803 if (auto numWeak = (Result & 0x00F) >> 0)
2804 printf(", BL_WEAK:%d", (int) numWeak);
2805 printf(", BL_OPERATOR:0\n");
2807 return llvm::ConstantInt::get(CGM.IntPtrTy, Result);
2810 unsigned char inst = (BLOCK_LAYOUT_OPERATOR << 4) | 0;
2811 Layout.push_back(inst);
2813 for (unsigned i = 0, e = Layout.size(); i != e; i++)
2814 BitMap += Layout[i];
2816 if (CGM.getLangOpts().ObjCGCBitmapPrint) {
2817 if (ComputeByrefLayout)
2818 printf("\n Byref variable layout: ");
2820 printf("\n Block variable layout: ");
2821 for (unsigned i = 0, e = BitMap.size(); i != e; i++) {
2822 unsigned char inst = BitMap[i];
2823 enum BLOCK_LAYOUT_OPCODE opcode = (enum BLOCK_LAYOUT_OPCODE) (inst >> 4);
2826 case BLOCK_LAYOUT_OPERATOR:
2827 printf("BL_OPERATOR:");
2830 case BLOCK_LAYOUT_NON_OBJECT_BYTES:
2831 printf("BL_NON_OBJECT_BYTES:");
2833 case BLOCK_LAYOUT_NON_OBJECT_WORDS:
2834 printf("BL_NON_OBJECT_WORD:");
2836 case BLOCK_LAYOUT_STRONG:
2837 printf("BL_STRONG:");
2839 case BLOCK_LAYOUT_BYREF:
2840 printf("BL_BYREF:");
2842 case BLOCK_LAYOUT_WEAK:
2845 case BLOCK_LAYOUT_UNRETAINED:
2846 printf("BL_UNRETAINED:");
2849 // Actual value of word count is one more that what is in the imm.
2850 // field of the instruction
2851 printf("%d", (inst & 0xf) + delta);
2859 auto *Entry = CreateCStringLiteral(BitMap, ObjCLabelType::ClassName,
2860 /*ForceNonFragileABI=*/true,
2861 /*NullTerminate=*/false);
2862 return getConstantGEP(VMContext, Entry, 0, 0);
2865 static std::string getBlockLayoutInfoString(
2866 const SmallVectorImpl<CGObjCCommonMac::RUN_SKIP> &RunSkipBlockVars,
2867 bool HasCopyDisposeHelpers) {
2869 for (const CGObjCCommonMac::RUN_SKIP &R : RunSkipBlockVars) {
2870 if (R.opcode == CGObjCCommonMac::BLOCK_LAYOUT_UNRETAINED) {
2871 // Copy/dispose helpers don't have any information about
2872 // __unsafe_unretained captures, so unconditionally concatenate a string.
2874 } else if (HasCopyDisposeHelpers) {
2875 // Information about __strong, __weak, or byref captures has already been
2876 // encoded into the names of the copy/dispose helpers. We have to add a
2877 // string here only when the copy/dispose helpers aren't generated (which
2878 // happens when the block is non-escaping).
2882 case CGObjCCommonMac::BLOCK_LAYOUT_STRONG:
2885 case CGObjCCommonMac::BLOCK_LAYOUT_BYREF:
2888 case CGObjCCommonMac::BLOCK_LAYOUT_WEAK:
2895 Str += llvm::to_string(R.block_var_bytepos.getQuantity());
2896 Str += "l" + llvm::to_string(R.block_var_size.getQuantity());
2901 void CGObjCCommonMac::fillRunSkipBlockVars(CodeGenModule &CGM,
2902 const CGBlockInfo &blockInfo) {
2903 assert(CGM.getLangOpts().getGC() == LangOptions::NonGC);
2905 RunSkipBlockVars.clear();
2906 bool hasUnion = false;
2908 unsigned WordSizeInBits = CGM.getTarget().getPointerWidth(0);
2909 unsigned ByteSizeInBits = CGM.getTarget().getCharWidth();
2910 unsigned WordSizeInBytes = WordSizeInBits/ByteSizeInBits;
2912 const BlockDecl *blockDecl = blockInfo.getBlockDecl();
2914 // Calculate the basic layout of the block structure.
2915 const llvm::StructLayout *layout =
2916 CGM.getDataLayout().getStructLayout(blockInfo.StructureType);
2918 // Ignore the optional 'this' capture: C++ objects are not assumed
2920 if (blockInfo.BlockHeaderForcedGapSize != CharUnits::Zero())
2921 UpdateRunSkipBlockVars(false, Qualifiers::OCL_None,
2922 blockInfo.BlockHeaderForcedGapOffset,
2923 blockInfo.BlockHeaderForcedGapSize);
2924 // Walk the captured variables.
2925 for (const auto &CI : blockDecl->captures()) {
2926 const VarDecl *variable = CI.getVariable();
2927 QualType type = variable->getType();
2929 const CGBlockInfo::Capture &capture = blockInfo.getCapture(variable);
2931 // Ignore constant captures.
2932 if (capture.isConstant()) continue;
2934 CharUnits fieldOffset =
2935 CharUnits::fromQuantity(layout->getElementOffset(capture.getIndex()));
2937 assert(!type->isArrayType() && "array variable should not be caught");
2939 if (const RecordType *record = type->getAs<RecordType>()) {
2940 BuildRCBlockVarRecordLayout(record, fieldOffset, hasUnion);
2943 CharUnits fieldSize;
2945 fieldSize = CharUnits::fromQuantity(WordSizeInBytes);
2947 fieldSize = CGM.getContext().getTypeSizeInChars(type);
2948 UpdateRunSkipBlockVars(CI.isByRef(), getBlockCaptureLifetime(type, false),
2949 fieldOffset, fieldSize);
2954 CGObjCCommonMac::BuildRCBlockLayout(CodeGenModule &CGM,
2955 const CGBlockInfo &blockInfo) {
2956 fillRunSkipBlockVars(CGM, blockInfo);
2957 return getBitmapBlockLayout(false);
2960 std::string CGObjCCommonMac::getRCBlockLayoutStr(CodeGenModule &CGM,
2961 const CGBlockInfo &blockInfo) {
2962 fillRunSkipBlockVars(CGM, blockInfo);
2963 return getBlockLayoutInfoString(RunSkipBlockVars,
2964 blockInfo.needsCopyDisposeHelpers());
2967 llvm::Constant *CGObjCCommonMac::BuildByrefLayout(CodeGen::CodeGenModule &CGM,
2969 assert(CGM.getLangOpts().getGC() == LangOptions::NonGC);
2970 assert(!T->isArrayType() && "__block array variable should not be caught");
2971 CharUnits fieldOffset;
2972 RunSkipBlockVars.clear();
2973 bool hasUnion = false;
2974 if (const RecordType *record = T->getAs<RecordType>()) {
2975 BuildRCBlockVarRecordLayout(record, fieldOffset, hasUnion, true /*ByrefLayout */);
2976 llvm::Constant *Result = getBitmapBlockLayout(true);
2977 if (isa<llvm::ConstantInt>(Result))
2978 Result = llvm::ConstantExpr::getIntToPtr(Result, CGM.Int8PtrTy);
2981 llvm::Constant *nullPtr = llvm::Constant::getNullValue(CGM.Int8PtrTy);
2985 llvm::Value *CGObjCMac::GenerateProtocolRef(CodeGenFunction &CGF,
2986 const ObjCProtocolDecl *PD) {
2987 // FIXME: I don't understand why gcc generates this, or where it is
2988 // resolved. Investigate. Its also wasteful to look this up over and over.
2989 LazySymbols.insert(&CGM.getContext().Idents.get("Protocol"));
2991 return llvm::ConstantExpr::getBitCast(GetProtocolRef(PD),
2992 ObjCTypes.getExternalProtocolPtrTy());
2995 void CGObjCCommonMac::GenerateProtocol(const ObjCProtocolDecl *PD) {
2996 // FIXME: We shouldn't need this, the protocol decl should contain enough
2997 // information to tell us whether this was a declaration or a definition.
2998 DefinedProtocols.insert(PD->getIdentifier());
3000 // If we have generated a forward reference to this protocol, emit
3001 // it now. Otherwise do nothing, the protocol objects are lazily
3003 if (Protocols.count(PD->getIdentifier()))
3004 GetOrEmitProtocol(PD);
3007 llvm::Constant *CGObjCCommonMac::GetProtocolRef(const ObjCProtocolDecl *PD) {
3008 if (DefinedProtocols.count(PD->getIdentifier()))
3009 return GetOrEmitProtocol(PD);
3011 return GetOrEmitProtocolRef(PD);
3014 llvm::Value *CGObjCCommonMac::EmitClassRefViaRuntime(
3015 CodeGenFunction &CGF,
3016 const ObjCInterfaceDecl *ID,
3017 ObjCCommonTypesHelper &ObjCTypes) {
3018 llvm::FunctionCallee lookUpClassFn = ObjCTypes.getLookUpClassFn();
3020 llvm::Value *className =
3021 CGF.CGM.GetAddrOfConstantCString(ID->getObjCRuntimeNameAsString())
3023 ASTContext &ctx = CGF.CGM.getContext();
3025 CGF.Builder.CreateBitCast(className,
3027 ctx.getPointerType(ctx.CharTy.withConst())));
3028 llvm::CallInst *call = CGF.Builder.CreateCall(lookUpClassFn, className);
3029 call->setDoesNotThrow();
3034 // Objective-C 1.0 extensions
3035 struct _objc_protocol {
3036 struct _objc_protocol_extension *isa;
3037 char *protocol_name;
3038 struct _objc_protocol_list *protocol_list;
3039 struct _objc__method_prototype_list *instance_methods;
3040 struct _objc__method_prototype_list *class_methods
3043 See EmitProtocolExtension().
3045 llvm::Constant *CGObjCMac::GetOrEmitProtocol(const ObjCProtocolDecl *PD) {
3046 llvm::GlobalVariable *Entry = Protocols[PD->getIdentifier()];
3048 // Early exit if a defining object has already been generated.
3049 if (Entry && Entry->hasInitializer())
3052 // Use the protocol definition, if there is one.
3053 if (const ObjCProtocolDecl *Def = PD->getDefinition())
3056 // FIXME: I don't understand why gcc generates this, or where it is
3057 // resolved. Investigate. Its also wasteful to look this up over and over.
3058 LazySymbols.insert(&CGM.getContext().Idents.get("Protocol"));
3060 // Construct method lists.
3061 auto methodLists = ProtocolMethodLists::get(PD);
3063 ConstantInitBuilder builder(CGM);
3064 auto values = builder.beginStruct(ObjCTypes.ProtocolTy);
3065 values.add(EmitProtocolExtension(PD, methodLists));
3066 values.add(GetClassName(PD->getObjCRuntimeNameAsString()));
3067 values.add(EmitProtocolList("OBJC_PROTOCOL_REFS_" + PD->getName(),
3068 PD->protocol_begin(), PD->protocol_end()));
3069 values.add(methodLists.emitMethodList(this, PD,
3070 ProtocolMethodLists::RequiredInstanceMethods));
3071 values.add(methodLists.emitMethodList(this, PD,
3072 ProtocolMethodLists::RequiredClassMethods));
3075 // Already created, update the initializer.
3076 assert(Entry->hasPrivateLinkage());
3077 values.finishAndSetAsInitializer(Entry);
3079 Entry = values.finishAndCreateGlobal("OBJC_PROTOCOL_" + PD->getName(),
3080 CGM.getPointerAlign(),
3082 llvm::GlobalValue::PrivateLinkage);
3083 Entry->setSection("__OBJC,__protocol,regular,no_dead_strip");
3085 Protocols[PD->getIdentifier()] = Entry;
3087 CGM.addCompilerUsedGlobal(Entry);
3092 llvm::Constant *CGObjCMac::GetOrEmitProtocolRef(const ObjCProtocolDecl *PD) {
3093 llvm::GlobalVariable *&Entry = Protocols[PD->getIdentifier()];
3096 // We use the initializer as a marker of whether this is a forward
3097 // reference or not. At module finalization we add the empty
3098 // contents for protocols which were referenced but never defined.
3099 Entry = new llvm::GlobalVariable(CGM.getModule(), ObjCTypes.ProtocolTy,
3100 false, llvm::GlobalValue::PrivateLinkage,
3101 nullptr, "OBJC_PROTOCOL_" + PD->getName());
3102 Entry->setSection("__OBJC,__protocol,regular,no_dead_strip");
3103 // FIXME: Is this necessary? Why only for protocol?
3104 Entry->setAlignment(llvm::Align(4));
3111 struct _objc_protocol_extension {
3113 struct objc_method_description_list *optional_instance_methods;
3114 struct objc_method_description_list *optional_class_methods;
3115 struct objc_property_list *instance_properties;
3116 const char ** extendedMethodTypes;
3117 struct objc_property_list *class_properties;
3121 CGObjCMac::EmitProtocolExtension(const ObjCProtocolDecl *PD,
3122 const ProtocolMethodLists &methodLists) {
3123 auto optInstanceMethods =
3124 methodLists.emitMethodList(this, PD,
3125 ProtocolMethodLists::OptionalInstanceMethods);
3126 auto optClassMethods =
3127 methodLists.emitMethodList(this, PD,
3128 ProtocolMethodLists::OptionalClassMethods);
3130 auto extendedMethodTypes =
3131 EmitProtocolMethodTypes("OBJC_PROTOCOL_METHOD_TYPES_" + PD->getName(),
3132 methodLists.emitExtendedTypesArray(this),
3135 auto instanceProperties =
3136 EmitPropertyList("OBJC_$_PROP_PROTO_LIST_" + PD->getName(), nullptr, PD,
3138 auto classProperties =
3139 EmitPropertyList("OBJC_$_CLASS_PROP_PROTO_LIST_" + PD->getName(), nullptr,
3140 PD, ObjCTypes, true);
3142 // Return null if no extension bits are used.
3143 if (optInstanceMethods->isNullValue() &&
3144 optClassMethods->isNullValue() &&
3145 extendedMethodTypes->isNullValue() &&
3146 instanceProperties->isNullValue() &&
3147 classProperties->isNullValue()) {
3148 return llvm::Constant::getNullValue(ObjCTypes.ProtocolExtensionPtrTy);
3152 CGM.getDataLayout().getTypeAllocSize(ObjCTypes.ProtocolExtensionTy);
3154 ConstantInitBuilder builder(CGM);
3155 auto values = builder.beginStruct(ObjCTypes.ProtocolExtensionTy);
3156 values.addInt(ObjCTypes.IntTy, size);
3157 values.add(optInstanceMethods);
3158 values.add(optClassMethods);
3159 values.add(instanceProperties);
3160 values.add(extendedMethodTypes);
3161 values.add(classProperties);
3163 // No special section, but goes in llvm.used
3164 return CreateMetadataVar("_OBJC_PROTOCOLEXT_" + PD->getName(), values,
3165 StringRef(), CGM.getPointerAlign(), true);
3169 struct objc_protocol_list {
3170 struct objc_protocol_list *next;
3176 CGObjCMac::EmitProtocolList(Twine name,
3177 ObjCProtocolDecl::protocol_iterator begin,
3178 ObjCProtocolDecl::protocol_iterator end) {
3179 // Just return null for empty protocol lists
3181 return llvm::Constant::getNullValue(ObjCTypes.ProtocolListPtrTy);
3183 ConstantInitBuilder builder(CGM);
3184 auto values = builder.beginStruct();
3186 // This field is only used by the runtime.
3187 values.addNullPointer(ObjCTypes.ProtocolListPtrTy);
3189 // Reserve a slot for the count.
3190 auto countSlot = values.addPlaceholder();
3192 auto refsArray = values.beginArray(ObjCTypes.ProtocolPtrTy);
3193 for (; begin != end; ++begin) {
3194 refsArray.add(GetProtocolRef(*begin));
3196 auto count = refsArray.size();
3198 // This list is null terminated.
3199 refsArray.addNullPointer(ObjCTypes.ProtocolPtrTy);
3201 refsArray.finishAndAddTo(values);
3202 values.fillPlaceholderWithInt(countSlot, ObjCTypes.LongTy, count);
3205 if (CGM.getTriple().isOSBinFormatMachO())
3206 section = "__OBJC,__cat_cls_meth,regular,no_dead_strip";
3208 llvm::GlobalVariable *GV =
3209 CreateMetadataVar(name, values, section, CGM.getPointerAlign(), false);
3210 return llvm::ConstantExpr::getBitCast(GV, ObjCTypes.ProtocolListPtrTy);
3214 PushProtocolProperties(llvm::SmallPtrSet<const IdentifierInfo*,16> &PropertySet,
3215 SmallVectorImpl<const ObjCPropertyDecl *> &Properties,
3216 const ObjCProtocolDecl *Proto,
3217 bool IsClassProperty) {
3218 for (const auto *P : Proto->protocols())
3219 PushProtocolProperties(PropertySet, Properties, P, IsClassProperty);
3221 for (const auto *PD : Proto->properties()) {
3222 if (IsClassProperty != PD->isClassProperty())
3224 if (!PropertySet.insert(PD->getIdentifier()).second)
3226 Properties.push_back(PD);
3231 struct _objc_property {
3232 const char * const name;
3233 const char * const attributes;
3236 struct _objc_property_list {
3237 uint32_t entsize; // sizeof (struct _objc_property)
3238 uint32_t prop_count;
3239 struct _objc_property[prop_count];
3242 llvm::Constant *CGObjCCommonMac::EmitPropertyList(Twine Name,
3243 const Decl *Container,
3244 const ObjCContainerDecl *OCD,
3245 const ObjCCommonTypesHelper &ObjCTypes,
3246 bool IsClassProperty) {
3247 if (IsClassProperty) {
3248 // Make this entry NULL for OS X with deployment target < 10.11, for iOS
3249 // with deployment target < 9.0.
3250 const llvm::Triple &Triple = CGM.getTarget().getTriple();
3251 if ((Triple.isMacOSX() && Triple.isMacOSXVersionLT(10, 11)) ||
3252 (Triple.isiOS() && Triple.isOSVersionLT(9)))
3253 return llvm::Constant::getNullValue(ObjCTypes.PropertyListPtrTy);
3256 SmallVector<const ObjCPropertyDecl *, 16> Properties;
3257 llvm::SmallPtrSet<const IdentifierInfo*, 16> PropertySet;
3259 if (const ObjCInterfaceDecl *OID = dyn_cast<ObjCInterfaceDecl>(OCD))
3260 for (const ObjCCategoryDecl *ClassExt : OID->known_extensions())
3261 for (auto *PD : ClassExt->properties()) {
3262 if (IsClassProperty != PD->isClassProperty())
3264 PropertySet.insert(PD->getIdentifier());
3265 Properties.push_back(PD);
3268 for (const auto *PD : OCD->properties()) {
3269 if (IsClassProperty != PD->isClassProperty())
3271 // Don't emit duplicate metadata for properties that were already in a
3273 if (!PropertySet.insert(PD->getIdentifier()).second)
3275 Properties.push_back(PD);
3278 if (const ObjCInterfaceDecl *OID = dyn_cast<ObjCInterfaceDecl>(OCD)) {
3279 for (const auto *P : OID->all_referenced_protocols())
3280 PushProtocolProperties(PropertySet, Properties, P, IsClassProperty);
3282 else if (const ObjCCategoryDecl *CD = dyn_cast<ObjCCategoryDecl>(OCD)) {
3283 for (const auto *P : CD->protocols())
3284 PushProtocolProperties(PropertySet, Properties, P, IsClassProperty);
3287 // Return null for empty list.
3288 if (Properties.empty())
3289 return llvm::Constant::getNullValue(ObjCTypes.PropertyListPtrTy);
3291 unsigned propertySize =
3292 CGM.getDataLayout().getTypeAllocSize(ObjCTypes.PropertyTy);
3294 ConstantInitBuilder builder(CGM);
3295 auto values = builder.beginStruct();
3296 values.addInt(ObjCTypes.IntTy, propertySize);
3297 values.addInt(ObjCTypes.IntTy, Properties.size());
3298 auto propertiesArray = values.beginArray(ObjCTypes.PropertyTy);
3299 for (auto PD : Properties) {
3300 auto property = propertiesArray.beginStruct(ObjCTypes.PropertyTy);
3301 property.add(GetPropertyName(PD->getIdentifier()));
3302 property.add(GetPropertyTypeString(PD, Container));
3303 property.finishAndAddTo(propertiesArray);
3305 propertiesArray.finishAndAddTo(values);
3308 if (CGM.getTriple().isOSBinFormatMachO())
3309 Section = (ObjCABI == 2) ? "__DATA, __objc_const"
3310 : "__OBJC,__property,regular,no_dead_strip";
3312 llvm::GlobalVariable *GV =
3313 CreateMetadataVar(Name, values, Section, CGM.getPointerAlign(), true);
3314 return llvm::ConstantExpr::getBitCast(GV, ObjCTypes.PropertyListPtrTy);
3318 CGObjCCommonMac::EmitProtocolMethodTypes(Twine Name,
3319 ArrayRef<llvm::Constant*> MethodTypes,
3320 const ObjCCommonTypesHelper &ObjCTypes) {
3321 // Return null for empty list.
3322 if (MethodTypes.empty())
3323 return llvm::Constant::getNullValue(ObjCTypes.Int8PtrPtrTy);
3325 llvm::ArrayType *AT = llvm::ArrayType::get(ObjCTypes.Int8PtrTy,
3326 MethodTypes.size());
3327 llvm::Constant *Init = llvm::ConstantArray::get(AT, MethodTypes);
3330 if (CGM.getTriple().isOSBinFormatMachO() && ObjCABI == 2)
3331 Section = "__DATA, __objc_const";
3333 llvm::GlobalVariable *GV =
3334 CreateMetadataVar(Name, Init, Section, CGM.getPointerAlign(), true);
3335 return llvm::ConstantExpr::getBitCast(GV, ObjCTypes.Int8PtrPtrTy);
3339 struct _objc_category {
3340 char *category_name;
3342 struct _objc_method_list *instance_methods;
3343 struct _objc_method_list *class_methods;
3344 struct _objc_protocol_list *protocols;
3345 uint32_t size; // <rdar://4585769>
3346 struct _objc_property_list *instance_properties;
3347 struct _objc_property_list *class_properties;
3350 void CGObjCMac::GenerateCategory(const ObjCCategoryImplDecl *OCD) {
3351 unsigned Size = CGM.getDataLayout().getTypeAllocSize(ObjCTypes.CategoryTy);
3353 // FIXME: This is poor design, the OCD should have a pointer to the category
3354 // decl. Additionally, note that Category can be null for the @implementation
3355 // w/o an @interface case. Sema should just create one for us as it does for
3356 // @implementation so everyone else can live life under a clear blue sky.
3357 const ObjCInterfaceDecl *Interface = OCD->getClassInterface();
3358 const ObjCCategoryDecl *Category =
3359 Interface->FindCategoryDeclaration(OCD->getIdentifier());
3361 SmallString<256> ExtName;
3362 llvm::raw_svector_ostream(ExtName) << Interface->getName() << '_'
3365 ConstantInitBuilder Builder(CGM);
3366 auto Values = Builder.beginStruct(ObjCTypes.CategoryTy);
3373 SmallVector<const ObjCMethodDecl *, 16> Methods[NumMethodLists];
3374 for (const auto *MD : OCD->methods()) {
3375 Methods[unsigned(MD->isClassMethod())].push_back(MD);
3378 Values.add(GetClassName(OCD->getName()));
3379 Values.add(GetClassName(Interface->getObjCRuntimeNameAsString()));
3380 LazySymbols.insert(Interface->getIdentifier());
3382 Values.add(emitMethodList(ExtName, MethodListType::CategoryInstanceMethods,
3383 Methods[InstanceMethods]));
3384 Values.add(emitMethodList(ExtName, MethodListType::CategoryClassMethods,
3385 Methods[ClassMethods]));
3388 EmitProtocolList("OBJC_CATEGORY_PROTOCOLS_" + ExtName.str(),
3389 Category->protocol_begin(), Category->protocol_end()));
3391 Values.addNullPointer(ObjCTypes.ProtocolListPtrTy);
3393 Values.addInt(ObjCTypes.IntTy, Size);
3395 // If there is no category @interface then there can be no properties.
3397 Values.add(EmitPropertyList("_OBJC_$_PROP_LIST_" + ExtName.str(),
3398 OCD, Category, ObjCTypes, false));
3399 Values.add(EmitPropertyList("_OBJC_$_CLASS_PROP_LIST_" + ExtName.str(),
3400 OCD, Category, ObjCTypes, true));
3402 Values.addNullPointer(ObjCTypes.PropertyListPtrTy);
3403 Values.addNullPointer(ObjCTypes.PropertyListPtrTy);
3406 llvm::GlobalVariable *GV =
3407 CreateMetadataVar("OBJC_CATEGORY_" + ExtName.str(), Values,
3408 "__OBJC,__category,regular,no_dead_strip",
3409 CGM.getPointerAlign(), true);
3410 DefinedCategories.push_back(GV);
3411 DefinedCategoryNames.insert(llvm::CachedHashString(ExtName));
3412 // method definition entries must be clear for next implementation.
3413 MethodDefinitions.clear();
3416 enum FragileClassFlags {
3417 /// Apparently: is not a meta-class.
3418 FragileABI_Class_Factory = 0x00001,
3420 /// Is a meta-class.
3421 FragileABI_Class_Meta = 0x00002,
3423 /// Has a non-trivial constructor or destructor.
3424 FragileABI_Class_HasCXXStructors = 0x02000,
3426 /// Has hidden visibility.
3427 FragileABI_Class_Hidden = 0x20000,
3429 /// Class implementation was compiled under ARC.
3430 FragileABI_Class_CompiledByARC = 0x04000000,
3432 /// Class implementation was compiled under MRC and has MRC weak ivars.
3433 /// Exclusive with CompiledByARC.
3434 FragileABI_Class_HasMRCWeakIvars = 0x08000000,
3437 enum NonFragileClassFlags {
3438 /// Is a meta-class.
3439 NonFragileABI_Class_Meta = 0x00001,
3441 /// Is a root class.
3442 NonFragileABI_Class_Root = 0x00002,
3444 /// Has a non-trivial constructor or destructor.
3445 NonFragileABI_Class_HasCXXStructors = 0x00004,
3447 /// Has hidden visibility.
3448 NonFragileABI_Class_Hidden = 0x00010,
3450 /// Has the exception attribute.
3451 NonFragileABI_Class_Exception = 0x00020,
3453 /// (Obsolete) ARC-specific: this class has a .release_ivars method
3454 NonFragileABI_Class_HasIvarReleaser = 0x00040,
3456 /// Class implementation was compiled under ARC.
3457 NonFragileABI_Class_CompiledByARC = 0x00080,
3459 /// Class has non-trivial destructors, but zero-initialization is okay.
3460 NonFragileABI_Class_HasCXXDestructorOnly = 0x00100,
3462 /// Class implementation was compiled under MRC and has MRC weak ivars.
3463 /// Exclusive with CompiledByARC.
3464 NonFragileABI_Class_HasMRCWeakIvars = 0x00200,
3467 static bool hasWeakMember(QualType type) {
3468 if (type.getObjCLifetime() == Qualifiers::OCL_Weak) {
3472 if (auto recType = type->getAs<RecordType>()) {
3473 for (auto field : recType->getDecl()->fields()) {
3474 if (hasWeakMember(field->getType()))
3482 /// For compatibility, we only want to set the "HasMRCWeakIvars" flag
3483 /// (and actually fill in a layout string) if we really do have any
3485 static bool hasMRCWeakIvars(CodeGenModule &CGM,
3486 const ObjCImplementationDecl *ID) {
3487 if (!CGM.getLangOpts().ObjCWeak) return false;
3488 assert(CGM.getLangOpts().getGC() == LangOptions::NonGC);
3490 for (const ObjCIvarDecl *ivar =
3491 ID->getClassInterface()->all_declared_ivar_begin();
3492 ivar; ivar = ivar->getNextIvar()) {
3493 if (hasWeakMember(ivar->getType()))
3501 struct _objc_class {
3508 struct _objc_ivar_list *ivars;
3509 struct _objc_method_list *methods;
3510 struct _objc_cache *cache;
3511 struct _objc_protocol_list *protocols;
3512 // Objective-C 1.0 extensions (<rdr://4585769>)
3513 const char *ivar_layout;
3514 struct _objc_class_ext *ext;
3517 See EmitClassExtension();
3519 void CGObjCMac::GenerateClass(const ObjCImplementationDecl *ID) {
3520 IdentifierInfo *RuntimeName =
3521 &CGM.getContext().Idents.get(ID->getObjCRuntimeNameAsString());
3522 DefinedSymbols.insert(RuntimeName);
3524 std::string ClassName = ID->getNameAsString();
3526 ObjCInterfaceDecl *Interface =
3527 const_cast<ObjCInterfaceDecl*>(ID->getClassInterface());
3528 llvm::Constant *Protocols =
3529 EmitProtocolList("OBJC_CLASS_PROTOCOLS_" + ID->getName(),
3530 Interface->all_referenced_protocol_begin(),
3531 Interface->all_referenced_protocol_end());
3532 unsigned Flags = FragileABI_Class_Factory;
3533 if (ID->hasNonZeroConstructors() || ID->hasDestructors())
3534 Flags |= FragileABI_Class_HasCXXStructors;
3536 bool hasMRCWeak = false;
3538 if (CGM.getLangOpts().ObjCAutoRefCount)
3539 Flags |= FragileABI_Class_CompiledByARC;
3540 else if ((hasMRCWeak = hasMRCWeakIvars(CGM, ID)))
3541 Flags |= FragileABI_Class_HasMRCWeakIvars;
3544 CGM.getContext().getASTObjCImplementationLayout(ID).getSize();
3546 // FIXME: Set CXX-structors flag.
3547 if (ID->getClassInterface()->getVisibility() == HiddenVisibility)
3548 Flags |= FragileABI_Class_Hidden;
3555 SmallVector<const ObjCMethodDecl *, 16> Methods[NumMethodLists];
3556 for (const auto *MD : ID->methods()) {
3557 Methods[unsigned(MD->isClassMethod())].push_back(MD);
3560 for (const auto *PID : ID->property_impls()) {
3561 if (PID->getPropertyImplementation() == ObjCPropertyImplDecl::Synthesize) {
3562 ObjCPropertyDecl *PD = PID->getPropertyDecl();
3564 if (ObjCMethodDecl *MD = PD->getGetterMethodDecl())
3565 if (GetMethodDefinition(MD))
3566 Methods[InstanceMethods].push_back(MD);
3567 if (ObjCMethodDecl *MD = PD->getSetterMethodDecl())
3568 if (GetMethodDefinition(MD))
3569 Methods[InstanceMethods].push_back(MD);
3573 ConstantInitBuilder builder(CGM);
3574 auto values = builder.beginStruct(ObjCTypes.ClassTy);
3575 values.add(EmitMetaClass(ID, Protocols, Methods[ClassMethods]));
3576 if (ObjCInterfaceDecl *Super = Interface->getSuperClass()) {
3577 // Record a reference to the super class.
3578 LazySymbols.insert(Super->getIdentifier());
3580 values.addBitCast(GetClassName(Super->getObjCRuntimeNameAsString()),
3581 ObjCTypes.ClassPtrTy);
3583 values.addNullPointer(ObjCTypes.ClassPtrTy);
3585 values.add(GetClassName(ID->getObjCRuntimeNameAsString()));
3586 // Version is always 0.
3587 values.addInt(ObjCTypes.LongTy, 0);
3588 values.addInt(ObjCTypes.LongTy, Flags);
3589 values.addInt(ObjCTypes.LongTy, Size.getQuantity());
3590 values.add(EmitIvarList(ID, false));
3591 values.add(emitMethodList(ID->getName(), MethodListType::InstanceMethods,
3592 Methods[InstanceMethods]));
3593 // cache is always NULL.
3594 values.addNullPointer(ObjCTypes.CachePtrTy);
3595 values.add(Protocols);
3596 values.add(BuildStrongIvarLayout(ID, CharUnits::Zero(), Size));
3597 values.add(EmitClassExtension(ID, Size, hasMRCWeak,
3598 /*isMetaclass*/ false));
3600 std::string Name("OBJC_CLASS_");
3602 const char *Section = "__OBJC,__class,regular,no_dead_strip";
3603 // Check for a forward reference.
3604 llvm::GlobalVariable *GV = CGM.getModule().getGlobalVariable(Name, true);
3606 assert(GV->getType()->getElementType() == ObjCTypes.ClassTy &&
3607 "Forward metaclass reference has incorrect type.");
3608 values.finishAndSetAsInitializer(GV);
3609 GV->setSection(Section);
3610 GV->setAlignment(CGM.getPointerAlign().getAsAlign());
3611 CGM.addCompilerUsedGlobal(GV);
3613 GV = CreateMetadataVar(Name, values, Section, CGM.getPointerAlign(), true);
3614 DefinedClasses.push_back(GV);
3615 ImplementedClasses.push_back(Interface);
3616 // method definition entries must be clear for next implementation.
3617 MethodDefinitions.clear();
3620 llvm::Constant *CGObjCMac::EmitMetaClass(const ObjCImplementationDecl *ID,
3621 llvm::Constant *Protocols,
3622 ArrayRef<const ObjCMethodDecl*> Methods) {
3623 unsigned Flags = FragileABI_Class_Meta;
3624 unsigned Size = CGM.getDataLayout().getTypeAllocSize(ObjCTypes.ClassTy);
3626 if (ID->getClassInterface()->getVisibility() == HiddenVisibility)
3627 Flags |= FragileABI_Class_Hidden;
3629 ConstantInitBuilder builder(CGM);
3630 auto values = builder.beginStruct(ObjCTypes.ClassTy);
3631 // The isa for the metaclass is the root of the hierarchy.
3632 const ObjCInterfaceDecl *Root = ID->getClassInterface();
3633 while (const ObjCInterfaceDecl *Super = Root->getSuperClass())
3635 values.addBitCast(GetClassName(Root->getObjCRuntimeNameAsString()),
3636 ObjCTypes.ClassPtrTy);
3637 // The super class for the metaclass is emitted as the name of the
3638 // super class. The runtime fixes this up to point to the
3639 // *metaclass* for the super class.
3640 if (ObjCInterfaceDecl *Super = ID->getClassInterface()->getSuperClass()) {
3641 values.addBitCast(GetClassName(Super->getObjCRuntimeNameAsString()),
3642 ObjCTypes.ClassPtrTy);
3644 values.addNullPointer(ObjCTypes.ClassPtrTy);
3646 values.add(GetClassName(ID->getObjCRuntimeNameAsString()));
3647 // Version is always 0.
3648 values.addInt(ObjCTypes.LongTy, 0);
3649 values.addInt(ObjCTypes.LongTy, Flags);
3650 values.addInt(ObjCTypes.LongTy, Size);
3651 values.add(EmitIvarList(ID, true));
3652 values.add(emitMethodList(ID->getName(), MethodListType::ClassMethods,
3654 // cache is always NULL.
3655 values.addNullPointer(ObjCTypes.CachePtrTy);
3656 values.add(Protocols);
3657 // ivar_layout for metaclass is always NULL.
3658 values.addNullPointer(ObjCTypes.Int8PtrTy);
3659 // The class extension is used to store class properties for metaclasses.
3660 values.add(EmitClassExtension(ID, CharUnits::Zero(), false/*hasMRCWeak*/,
3661 /*isMetaclass*/true));
3663 std::string Name("OBJC_METACLASS_");
3664 Name += ID->getName();
3666 // Check for a forward reference.
3667 llvm::GlobalVariable *GV = CGM.getModule().getGlobalVariable(Name, true);
3669 assert(GV->getType()->getElementType() == ObjCTypes.ClassTy &&
3670 "Forward metaclass reference has incorrect type.");
3671 values.finishAndSetAsInitializer(GV);
3673 GV = values.finishAndCreateGlobal(Name, CGM.getPointerAlign(),
3675 llvm::GlobalValue::PrivateLinkage);
3677 GV->setSection("__OBJC,__meta_class,regular,no_dead_strip");
3678 CGM.addCompilerUsedGlobal(GV);
3683 llvm::Constant *CGObjCMac::EmitMetaClassRef(const ObjCInterfaceDecl *ID) {
3684 std::string Name = "OBJC_METACLASS_" + ID->getNameAsString();
3686 // FIXME: Should we look these up somewhere other than the module. Its a bit
3687 // silly since we only generate these while processing an implementation, so
3688 // exactly one pointer would work if know when we entered/exitted an
3689 // implementation block.
3691 // Check for an existing forward reference.
3692 // Previously, metaclass with internal linkage may have been defined.
3693 // pass 'true' as 2nd argument so it is returned.
3694 llvm::GlobalVariable *GV = CGM.getModule().getGlobalVariable(Name, true);
3696 GV = new llvm::GlobalVariable(CGM.getModule(), ObjCTypes.ClassTy, false,
3697 llvm::GlobalValue::PrivateLinkage, nullptr,
3700 assert(GV->getType()->getElementType() == ObjCTypes.ClassTy &&
3701 "Forward metaclass reference has incorrect type.");
3705 llvm::Value *CGObjCMac::EmitSuperClassRef(const ObjCInterfaceDecl *ID) {
3706 std::string Name = "OBJC_CLASS_" + ID->getNameAsString();
3707 llvm::GlobalVariable *GV = CGM.getModule().getGlobalVariable(Name, true);
3710 GV = new llvm::GlobalVariable(CGM.getModule(), ObjCTypes.ClassTy, false,
3711 llvm::GlobalValue::PrivateLinkage, nullptr,
3714 assert(GV->getType()->getElementType() == ObjCTypes.ClassTy &&
3715 "Forward class metadata reference has incorrect type.");
3720 Emit a "class extension", which in this specific context means extra
3721 data that doesn't fit in the normal fragile-ABI class structure, and
3722 has nothing to do with the language concept of a class extension.
3724 struct objc_class_ext {
3726 const char *weak_ivar_layout;
3727 struct _objc_property_list *properties;
3731 CGObjCMac::EmitClassExtension(const ObjCImplementationDecl *ID,
3732 CharUnits InstanceSize, bool hasMRCWeakIvars,
3734 // Weak ivar layout.
3735 llvm::Constant *layout;
3737 layout = llvm::ConstantPointerNull::get(CGM.Int8PtrTy);
3739 layout = BuildWeakIvarLayout(ID, CharUnits::Zero(), InstanceSize,
3744 llvm::Constant *propertyList =
3745 EmitPropertyList((isMetaclass ? Twine("_OBJC_$_CLASS_PROP_LIST_")
3746 : Twine("_OBJC_$_PROP_LIST_"))
3748 ID, ID->getClassInterface(), ObjCTypes, isMetaclass);
3750 // Return null if no extension bits are used.
3751 if (layout->isNullValue() && propertyList->isNullValue()) {
3752 return llvm::Constant::getNullValue(ObjCTypes.ClassExtensionPtrTy);
3756 CGM.getDataLayout().getTypeAllocSize(ObjCTypes.ClassExtensionTy);
3758 ConstantInitBuilder builder(CGM);
3759 auto values = builder.beginStruct(ObjCTypes.ClassExtensionTy);
3760 values.addInt(ObjCTypes.IntTy, size);
3762 values.add(propertyList);
3764 return CreateMetadataVar("OBJC_CLASSEXT_" + ID->getName(), values,
3765 "__OBJC,__class_ext,regular,no_dead_strip",
3766 CGM.getPointerAlign(), true);
3776 struct objc_ivar_list {
3778 struct objc_ivar list[count];
3781 llvm::Constant *CGObjCMac::EmitIvarList(const ObjCImplementationDecl *ID,
3783 // When emitting the root class GCC emits ivar entries for the
3784 // actual class structure. It is not clear if we need to follow this
3785 // behavior; for now lets try and get away with not doing it. If so,
3786 // the cleanest solution would be to make up an ObjCInterfaceDecl
3789 return llvm::Constant::getNullValue(ObjCTypes.IvarListPtrTy);
3791 const ObjCInterfaceDecl *OID = ID->getClassInterface();
3793 ConstantInitBuilder builder(CGM);
3794 auto ivarList = builder.beginStruct();
3795 auto countSlot = ivarList.addPlaceholder();
3796 auto ivars = ivarList.beginArray(ObjCTypes.IvarTy);
3798 for (const ObjCIvarDecl *IVD = OID->all_declared_ivar_begin();
3799 IVD; IVD = IVD->getNextIvar()) {
3800 // Ignore unnamed bit-fields.
3801 if (!IVD->getDeclName())
3804 auto ivar = ivars.beginStruct(ObjCTypes.IvarTy);
3805 ivar.add(GetMethodVarName(IVD->getIdentifier()));
3806 ivar.add(GetMethodVarType(IVD));
3807 ivar.addInt(ObjCTypes.IntTy, ComputeIvarBaseOffset(CGM, OID, IVD));
3808 ivar.finishAndAddTo(ivars);
3811 // Return null for empty list.
3812 auto count = ivars.size();
3816 return llvm::Constant::getNullValue(ObjCTypes.IvarListPtrTy);
3819 ivars.finishAndAddTo(ivarList);
3820 ivarList.fillPlaceholderWithInt(countSlot, ObjCTypes.IntTy, count);
3822 llvm::GlobalVariable *GV;
3825 CreateMetadataVar("OBJC_CLASS_VARIABLES_" + ID->getName(), ivarList,
3826 "__OBJC,__class_vars,regular,no_dead_strip",
3827 CGM.getPointerAlign(), true);
3829 GV = CreateMetadataVar("OBJC_INSTANCE_VARIABLES_" + ID->getName(), ivarList,
3830 "__OBJC,__instance_vars,regular,no_dead_strip",
3831 CGM.getPointerAlign(), true);
3832 return llvm::ConstantExpr::getBitCast(GV, ObjCTypes.IvarListPtrTy);
3835 /// Build a struct objc_method_description constant for the given method.
3837 /// struct objc_method_description {
3838 /// SEL method_name;
3839 /// char *method_types;
3841 void CGObjCMac::emitMethodDescriptionConstant(ConstantArrayBuilder &builder,
3842 const ObjCMethodDecl *MD) {
3843 auto description = builder.beginStruct(ObjCTypes.MethodDescriptionTy);
3844 description.addBitCast(GetMethodVarName(MD->getSelector()),
3845 ObjCTypes.SelectorPtrTy);
3846 description.add(GetMethodVarType(MD));
3847 description.finishAndAddTo(builder);
3850 /// Build a struct objc_method constant for the given method.
3852 /// struct objc_method {
3853 /// SEL method_name;
3854 /// char *method_types;
3857 void CGObjCMac::emitMethodConstant(ConstantArrayBuilder &builder,
3858 const ObjCMethodDecl *MD) {
3859 llvm::Function *fn = GetMethodDefinition(MD);
3860 assert(fn && "no definition registered for method");
3862 auto method = builder.beginStruct(ObjCTypes.MethodTy);
3863 method.addBitCast(GetMethodVarName(MD->getSelector()),
3864 ObjCTypes.SelectorPtrTy);
3865 method.add(GetMethodVarType(MD));
3866 method.addBitCast(fn, ObjCTypes.Int8PtrTy);
3867 method.finishAndAddTo(builder);
3870 /// Build a struct objc_method_list or struct objc_method_description_list,
3873 /// struct objc_method_list {
3874 /// struct objc_method_list *obsolete;
3876 /// struct objc_method methods_list[count];
3879 /// struct objc_method_description_list {
3881 /// struct objc_method_description list[count];
3883 llvm::Constant *CGObjCMac::emitMethodList(Twine name, MethodListType MLT,
3884 ArrayRef<const ObjCMethodDecl *> methods) {
3887 bool forProtocol = false;
3889 case MethodListType::CategoryInstanceMethods:
3890 prefix = "OBJC_CATEGORY_INSTANCE_METHODS_";
3891 section = "__OBJC,__cat_inst_meth,regular,no_dead_strip";
3892 forProtocol = false;
3894 case MethodListType::CategoryClassMethods:
3895 prefix = "OBJC_CATEGORY_CLASS_METHODS_";
3896 section = "__OBJC,__cat_cls_meth,regular,no_dead_strip";
3897 forProtocol = false;
3899 case MethodListType::InstanceMethods:
3900 prefix = "OBJC_INSTANCE_METHODS_";
3901 section = "__OBJC,__inst_meth,regular,no_dead_strip";
3902 forProtocol = false;
3904 case MethodListType::ClassMethods:
3905 prefix = "OBJC_CLASS_METHODS_";
3906 section = "__OBJC,__cls_meth,regular,no_dead_strip";
3907 forProtocol = false;
3909 case MethodListType::ProtocolInstanceMethods:
3910 prefix = "OBJC_PROTOCOL_INSTANCE_METHODS_";
3911 section = "__OBJC,__cat_inst_meth,regular,no_dead_strip";
3914 case MethodListType::ProtocolClassMethods:
3915 prefix = "OBJC_PROTOCOL_CLASS_METHODS_";
3916 section = "__OBJC,__cat_cls_meth,regular,no_dead_strip";
3919 case MethodListType::OptionalProtocolInstanceMethods:
3920 prefix = "OBJC_PROTOCOL_INSTANCE_METHODS_OPT_";
3921 section = "__OBJC,__cat_inst_meth,regular,no_dead_strip";
3924 case MethodListType::OptionalProtocolClassMethods:
3925 prefix = "OBJC_PROTOCOL_CLASS_METHODS_OPT_";
3926 section = "__OBJC,__cat_cls_meth,regular,no_dead_strip";
3931 // Return null for empty list.
3932 if (methods.empty())
3933 return llvm::Constant::getNullValue(forProtocol
3934 ? ObjCTypes.MethodDescriptionListPtrTy
3935 : ObjCTypes.MethodListPtrTy);
3937 // For protocols, this is an objc_method_description_list, which has
3938 // a slightly different structure.
3940 ConstantInitBuilder builder(CGM);
3941 auto values = builder.beginStruct();
3942 values.addInt(ObjCTypes.IntTy, methods.size());
3943 auto methodArray = values.beginArray(ObjCTypes.MethodDescriptionTy);
3944 for (auto MD : methods) {
3945 emitMethodDescriptionConstant(methodArray, MD);
3947 methodArray.finishAndAddTo(values);
3949 llvm::GlobalVariable *GV = CreateMetadataVar(prefix + name, values, section,
3950 CGM.getPointerAlign(), true);
3951 return llvm::ConstantExpr::getBitCast(GV,
3952 ObjCTypes.MethodDescriptionListPtrTy);
3955 // Otherwise, it's an objc_method_list.
3956 ConstantInitBuilder builder(CGM);
3957 auto values = builder.beginStruct();
3958 values.addNullPointer(ObjCTypes.Int8PtrTy);
3959 values.addInt(ObjCTypes.IntTy, methods.size());
3960 auto methodArray = values.beginArray(ObjCTypes.MethodTy);
3961 for (auto MD : methods) {
3962 emitMethodConstant(methodArray, MD);
3964 methodArray.finishAndAddTo(values);
3966 llvm::GlobalVariable *GV = CreateMetadataVar(prefix + name, values, section,
3967 CGM.getPointerAlign(), true);
3968 return llvm::ConstantExpr::getBitCast(GV, ObjCTypes.MethodListPtrTy);
3971 llvm::Function *CGObjCCommonMac::GenerateMethod(const ObjCMethodDecl *OMD,
3972 const ObjCContainerDecl *CD) {
3973 SmallString<256> Name;
3974 GetNameForMethod(OMD, CD, Name);
3976 CodeGenTypes &Types = CGM.getTypes();
3977 llvm::FunctionType *MethodTy =
3978 Types.GetFunctionType(Types.arrangeObjCMethodDeclaration(OMD));
3979 llvm::Function *Method =
3980 llvm::Function::Create(MethodTy,
3981 llvm::GlobalValue::InternalLinkage,
3984 MethodDefinitions.insert(std::make_pair(OMD, Method));
3989 llvm::GlobalVariable *CGObjCCommonMac::CreateMetadataVar(Twine Name,
3990 ConstantStructBuilder &Init,
3994 llvm::GlobalValue::LinkageTypes LT =
3995 getLinkageTypeForObjCMetadata(CGM, Section);
3996 llvm::GlobalVariable *GV =
3997 Init.finishAndCreateGlobal(Name, Align, /*constant*/ false, LT);
3998 if (!Section.empty())
3999 GV->setSection(Section);
4001 CGM.addCompilerUsedGlobal(GV);
4005 llvm::GlobalVariable *CGObjCCommonMac::CreateMetadataVar(Twine Name,
4006 llvm::Constant *Init,
4010 llvm::Type *Ty = Init->getType();
4011 llvm::GlobalValue::LinkageTypes LT =
4012 getLinkageTypeForObjCMetadata(CGM, Section);
4013 llvm::GlobalVariable *GV =
4014 new llvm::GlobalVariable(CGM.getModule(), Ty, false, LT, Init, Name);
4015 if (!Section.empty())
4016 GV->setSection(Section);
4017 GV->setAlignment(Align.getAsAlign());
4019 CGM.addCompilerUsedGlobal(GV);
4023 llvm::GlobalVariable *
4024 CGObjCCommonMac::CreateCStringLiteral(StringRef Name, ObjCLabelType Type,
4025 bool ForceNonFragileABI,
4026 bool NullTerminate) {
4029 case ObjCLabelType::ClassName: Label = "OBJC_CLASS_NAME_"; break;
4030 case ObjCLabelType::MethodVarName: Label = "OBJC_METH_VAR_NAME_"; break;
4031 case ObjCLabelType::MethodVarType: Label = "OBJC_METH_VAR_TYPE_"; break;
4032 case ObjCLabelType::PropertyName: Label = "OBJC_PROP_NAME_ATTR_"; break;
4035 bool NonFragile = ForceNonFragileABI || isNonFragileABI();
4039 case ObjCLabelType::ClassName:
4040 Section = NonFragile ? "__TEXT,__objc_classname,cstring_literals"
4041 : "__TEXT,__cstring,cstring_literals";
4043 case ObjCLabelType::MethodVarName:
4044 Section = NonFragile ? "__TEXT,__objc_methname,cstring_literals"
4045 : "__TEXT,__cstring,cstring_literals";
4047 case ObjCLabelType::MethodVarType:
4048 Section = NonFragile ? "__TEXT,__objc_methtype,cstring_literals"
4049 : "__TEXT,__cstring,cstring_literals";
4051 case ObjCLabelType::PropertyName:
4052 Section = "__TEXT,__cstring,cstring_literals";
4056 llvm::Constant *Value =
4057 llvm::ConstantDataArray::getString(VMContext, Name, NullTerminate);
4058 llvm::GlobalVariable *GV =
4059 new llvm::GlobalVariable(CGM.getModule(), Value->getType(),
4060 /*isConstant=*/true,
4061 llvm::GlobalValue::PrivateLinkage, Value, Label);
4062 if (CGM.getTriple().isOSBinFormatMachO())
4063 GV->setSection(Section);
4064 GV->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
4065 GV->setAlignment(CharUnits::One().getAsAlign());
4066 CGM.addCompilerUsedGlobal(GV);
4071 llvm::Function *CGObjCMac::ModuleInitFunction() {
4072 // Abuse this interface function as a place to finalize.
4077 llvm::FunctionCallee CGObjCMac::GetPropertyGetFunction() {
4078 return ObjCTypes.getGetPropertyFn();
4081 llvm::FunctionCallee CGObjCMac::GetPropertySetFunction() {
4082 return ObjCTypes.getSetPropertyFn();
4085 llvm::FunctionCallee CGObjCMac::GetOptimizedPropertySetFunction(bool atomic,
4087 return ObjCTypes.getOptimizedSetPropertyFn(atomic, copy);
4090 llvm::FunctionCallee CGObjCMac::GetGetStructFunction() {
4091 return ObjCTypes.getCopyStructFn();
4094 llvm::FunctionCallee CGObjCMac::GetSetStructFunction() {
4095 return ObjCTypes.getCopyStructFn();
4098 llvm::FunctionCallee CGObjCMac::GetCppAtomicObjectGetFunction() {
4099 return ObjCTypes.getCppAtomicObjectFunction();
4102 llvm::FunctionCallee CGObjCMac::GetCppAtomicObjectSetFunction() {
4103 return ObjCTypes.getCppAtomicObjectFunction();
4106 llvm::FunctionCallee CGObjCMac::EnumerationMutationFunction() {
4107 return ObjCTypes.getEnumerationMutationFn();
4110 void CGObjCMac::EmitTryStmt(CodeGenFunction &CGF, const ObjCAtTryStmt &S) {
4111 return EmitTryOrSynchronizedStmt(CGF, S);
4114 void CGObjCMac::EmitSynchronizedStmt(CodeGenFunction &CGF,
4115 const ObjCAtSynchronizedStmt &S) {
4116 return EmitTryOrSynchronizedStmt(CGF, S);
4120 struct PerformFragileFinally final : EHScopeStack::Cleanup {
4122 Address SyncArgSlot;
4123 Address CallTryExitVar;
4124 Address ExceptionData;
4125 ObjCTypesHelper &ObjCTypes;
4126 PerformFragileFinally(const Stmt *S,
4127 Address SyncArgSlot,
4128 Address CallTryExitVar,
4129 Address ExceptionData,
4130 ObjCTypesHelper *ObjCTypes)
4131 : S(*S), SyncArgSlot(SyncArgSlot), CallTryExitVar(CallTryExitVar),
4132 ExceptionData(ExceptionData), ObjCTypes(*ObjCTypes) {}
4134 void Emit(CodeGenFunction &CGF, Flags flags) override {
4135 // Check whether we need to call objc_exception_try_exit.
4136 // In optimized code, this branch will always be folded.
4137 llvm::BasicBlock *FinallyCallExit =
4138 CGF.createBasicBlock("finally.call_exit");
4139 llvm::BasicBlock *FinallyNoCallExit =
4140 CGF.createBasicBlock("finally.no_call_exit");
4141 CGF.Builder.CreateCondBr(CGF.Builder.CreateLoad(CallTryExitVar),
4142 FinallyCallExit, FinallyNoCallExit);
4144 CGF.EmitBlock(FinallyCallExit);
4145 CGF.EmitNounwindRuntimeCall(ObjCTypes.getExceptionTryExitFn(),
4146 ExceptionData.getPointer());
4148 CGF.EmitBlock(FinallyNoCallExit);
4150 if (isa<ObjCAtTryStmt>(S)) {
4151 if (const ObjCAtFinallyStmt* FinallyStmt =
4152 cast<ObjCAtTryStmt>(S).getFinallyStmt()) {
4153 // Don't try to do the @finally if this is an EH cleanup.
4154 if (flags.isForEHCleanup()) return;
4156 // Save the current cleanup destination in case there's
4157 // control flow inside the finally statement.
4158 llvm::Value *CurCleanupDest =
4159 CGF.Builder.CreateLoad(CGF.getNormalCleanupDestSlot());
4161 CGF.EmitStmt(FinallyStmt->getFinallyBody());
4163 if (CGF.HaveInsertPoint()) {
4164 CGF.Builder.CreateStore(CurCleanupDest,
4165 CGF.getNormalCleanupDestSlot());
4167 // Currently, the end of the cleanup must always exist.
4168 CGF.EnsureInsertPoint();
4172 // Emit objc_sync_exit(expr); as finally's sole statement for
4174 llvm::Value *SyncArg = CGF.Builder.CreateLoad(SyncArgSlot);
4175 CGF.EmitNounwindRuntimeCall(ObjCTypes.getSyncExitFn(), SyncArg);
4180 class FragileHazards {
4181 CodeGenFunction &CGF;
4182 SmallVector<llvm::Value*, 20> Locals;
4183 llvm::DenseSet<llvm::BasicBlock*> BlocksBeforeTry;
4185 llvm::InlineAsm *ReadHazard;
4186 llvm::InlineAsm *WriteHazard;
4188 llvm::FunctionType *GetAsmFnType();
4190 void collectLocals();
4191 void emitReadHazard(CGBuilderTy &Builder);
4194 FragileHazards(CodeGenFunction &CGF);
4196 void emitWriteHazard();
4197 void emitHazardsInNewBlocks();
4199 } // end anonymous namespace
4201 /// Create the fragile-ABI read and write hazards based on the current
4202 /// state of the function, which is presumed to be immediately prior
4203 /// to a @try block. These hazards are used to maintain correct
4204 /// semantics in the face of optimization and the fragile ABI's
4205 /// cavalier use of setjmp/longjmp.
4206 FragileHazards::FragileHazards(CodeGenFunction &CGF) : CGF(CGF) {
4209 if (Locals.empty()) return;
4211 // Collect all the blocks in the function.
4212 for (llvm::Function::iterator
4213 I = CGF.CurFn->begin(), E = CGF.CurFn->end(); I != E; ++I)
4214 BlocksBeforeTry.insert(&*I);
4216 llvm::FunctionType *AsmFnTy = GetAsmFnType();
4218 // Create a read hazard for the allocas. This inhibits dead-store
4219 // optimizations and forces the values to memory. This hazard is
4220 // inserted before any 'throwing' calls in the protected scope to
4221 // reflect the possibility that the variables might be read from the
4222 // catch block if the call throws.
4224 std::string Constraint;
4225 for (unsigned I = 0, E = Locals.size(); I != E; ++I) {
4226 if (I) Constraint += ',';
4230 ReadHazard = llvm::InlineAsm::get(AsmFnTy, "", Constraint, true, false);
4233 // Create a write hazard for the allocas. This inhibits folding
4234 // loads across the hazard. This hazard is inserted at the
4235 // beginning of the catch path to reflect the possibility that the
4236 // variables might have been written within the protected scope.
4238 std::string Constraint;
4239 for (unsigned I = 0, E = Locals.size(); I != E; ++I) {
4240 if (I) Constraint += ',';
4241 Constraint += "=*m";
4244 WriteHazard = llvm::InlineAsm::get(AsmFnTy, "", Constraint, true, false);
4248 /// Emit a write hazard at the current location.
4249 void FragileHazards::emitWriteHazard() {
4250 if (Locals.empty()) return;
4252 CGF.EmitNounwindRuntimeCall(WriteHazard, Locals);
4255 void FragileHazards::emitReadHazard(CGBuilderTy &Builder) {
4256 assert(!Locals.empty());
4257 llvm::CallInst *call = Builder.CreateCall(ReadHazard, Locals);
4258 call->setDoesNotThrow();
4259 call->setCallingConv(CGF.getRuntimeCC());
4262 /// Emit read hazards in all the protected blocks, i.e. all the blocks
4263 /// which have been inserted since the beginning of the try.
4264 void FragileHazards::emitHazardsInNewBlocks() {
4265 if (Locals.empty()) return;
4267 CGBuilderTy Builder(CGF, CGF.getLLVMContext());
4269 // Iterate through all blocks, skipping those prior to the try.
4270 for (llvm::Function::iterator
4271 FI = CGF.CurFn->begin(), FE = CGF.CurFn->end(); FI != FE; ++FI) {
4272 llvm::BasicBlock &BB = *FI;
4273 if (BlocksBeforeTry.count(&BB)) continue;
4275 // Walk through all the calls in the block.
4276 for (llvm::BasicBlock::iterator
4277 BI = BB.begin(), BE = BB.end(); BI != BE; ++BI) {
4278 llvm::Instruction &I = *BI;
4280 // Ignore instructions that aren't non-intrinsic calls.
4281 // These are the only calls that can possibly call longjmp.
4282 if (!isa<llvm::CallInst>(I) && !isa<llvm::InvokeInst>(I))
4284 if (isa<llvm::IntrinsicInst>(I))
4287 // Ignore call sites marked nounwind. This may be questionable,
4288 // since 'nounwind' doesn't necessarily mean 'does not call longjmp'.
4289 if (cast<llvm::CallBase>(I).doesNotThrow())
4292 // Insert a read hazard before the call. This will ensure that
4293 // any writes to the locals are performed before making the
4294 // call. If the call throws, then this is sufficient to
4295 // guarantee correctness as long as it doesn't also write to any
4297 Builder.SetInsertPoint(&BB, BI);
4298 emitReadHazard(Builder);
4303 static void addIfPresent(llvm::DenseSet<llvm::Value*> &S, Address V) {
4304 if (V.isValid()) S.insert(V.getPointer());
4307 void FragileHazards::collectLocals() {
4308 // Compute a set of allocas to ignore.
4309 llvm::DenseSet<llvm::Value*> AllocasToIgnore;
4310 addIfPresent(AllocasToIgnore, CGF.ReturnValue);
4311 addIfPresent(AllocasToIgnore, CGF.NormalCleanupDest);
4313 // Collect all the allocas currently in the function. This is
4314 // probably way too aggressive.
4315 llvm::BasicBlock &Entry = CGF.CurFn->getEntryBlock();
4316 for (llvm::BasicBlock::iterator
4317 I = Entry.begin(), E = Entry.end(); I != E; ++I)
4318 if (isa<llvm::AllocaInst>(*I) && !AllocasToIgnore.count(&*I))
4319 Locals.push_back(&*I);
4322 llvm::FunctionType *FragileHazards::GetAsmFnType() {
4323 SmallVector<llvm::Type *, 16> tys(Locals.size());
4324 for (unsigned i = 0, e = Locals.size(); i != e; ++i)
4325 tys[i] = Locals[i]->getType();
4326 return llvm::FunctionType::get(CGF.VoidTy, tys, false);
4331 Objective-C setjmp-longjmp (sjlj) Exception Handling
4334 A catch buffer is a setjmp buffer plus:
4335 - a pointer to the exception that was caught
4336 - a pointer to the previous exception data buffer
4337 - two pointers of reserved storage
4338 Therefore catch buffers form a stack, with a pointer to the top
4339 of the stack kept in thread-local storage.
4341 objc_exception_try_enter pushes a catch buffer onto the EH stack.
4342 objc_exception_try_exit pops the given catch buffer, which is
4343 required to be the top of the EH stack.
4344 objc_exception_throw pops the top of the EH stack, writes the
4345 thrown exception into the appropriate field, and longjmps
4346 to the setjmp buffer. It crashes the process (with a printf
4347 and an abort()) if there are no catch buffers on the stack.
4348 objc_exception_extract just reads the exception pointer out of the
4351 There's no reason an implementation couldn't use a light-weight
4352 setjmp here --- something like __builtin_setjmp, but API-compatible
4353 with the heavyweight setjmp. This will be more important if we ever
4354 want to implement correct ObjC/C++ exception interactions for the
4357 Note that for this use of setjmp/longjmp to be correct, we may need
4358 to mark some local variables volatile: if a non-volatile local
4359 variable is modified between the setjmp and the longjmp, it has
4360 indeterminate value. For the purposes of LLVM IR, it may be
4361 sufficient to make loads and stores within the @try (to variables
4362 declared outside the @try) volatile. This is necessary for
4363 optimized correctness, but is not currently being done; this is
4364 being tracked as rdar://problem/8160285
4366 The basic framework for a @try-catch-finally is as follows:
4368 objc_exception_data d;
4370 bool _call_try_exit = true;
4372 objc_exception_try_enter(&d);
4373 if (!setjmp(d.jmp_buf)) {
4377 id _caught = objc_exception_extract(&d);
4379 // enter new try scope for handlers
4380 if (!setjmp(d.jmp_buf)) {
4381 ... match exception and execute catch blocks ...
4383 // fell off end, rethrow.
4385 ... jump-through-finally to finally_rethrow ...
4387 // exception in catch block
4388 _rethrow = objc_exception_extract(&d);
4389 _call_try_exit = false;
4390 ... jump-through-finally to finally_rethrow ...
4393 ... jump-through-finally to finally_end ...
4397 objc_exception_try_exit(&d);
4399 ... finally block ....
4400 ... dispatch to finally destination ...
4403 objc_exception_throw(_rethrow);
4408 This framework differs slightly from the one gcc uses, in that gcc
4409 uses _rethrow to determine if objc_exception_try_exit should be called
4410 and if the object should be rethrown. This breaks in the face of
4411 throwing nil and introduces unnecessary branches.
4413 We specialize this framework for a few particular circumstances:
4415 - If there are no catch blocks, then we avoid emitting the second
4416 exception handling context.
4418 - If there is a catch-all catch block (i.e. @catch(...) or @catch(id
4419 e)) we avoid emitting the code to rethrow an uncaught exception.
4421 - FIXME: If there is no @finally block we can do a few more
4424 Rethrows and Jumps-Through-Finally
4427 '@throw;' is supported by pushing the currently-caught exception
4428 onto ObjCEHStack while the @catch blocks are emitted.
4430 Branches through the @finally block are handled with an ordinary
4431 normal cleanup. We do not register an EH cleanup; fragile-ABI ObjC
4432 exceptions are not compatible with C++ exceptions, and this is
4433 hardly the only place where this will go wrong.
4435 @synchronized(expr) { stmt; } is emitted as if it were:
4436 id synch_value = expr;
4437 objc_sync_enter(synch_value);
4438 @try { stmt; } @finally { objc_sync_exit(synch_value); }
4441 void CGObjCMac::EmitTryOrSynchronizedStmt(CodeGen::CodeGenFunction &CGF,
4443 bool isTry = isa<ObjCAtTryStmt>(S);
4445 // A destination for the fall-through edges of the catch handlers to
4447 CodeGenFunction::JumpDest FinallyEnd =
4448 CGF.getJumpDestInCurrentScope("finally.end");
4450 // A destination for the rethrow edge of the catch handlers to jump
4452 CodeGenFunction::JumpDest FinallyRethrow =
4453 CGF.getJumpDestInCurrentScope("finally.rethrow");
4455 // For @synchronized, call objc_sync_enter(sync.expr). The
4456 // evaluation of the expression must occur before we enter the
4457 // @synchronized. We can't avoid a temp here because we need the
4458 // value to be preserved. If the backend ever does liveness
4459 // correctly after setjmp, this will be unnecessary.
4460 Address SyncArgSlot = Address::invalid();
4462 llvm::Value *SyncArg =
4463 CGF.EmitScalarExpr(cast<ObjCAtSynchronizedStmt>(S).getSynchExpr());
4464 SyncArg = CGF.Builder.CreateBitCast(SyncArg, ObjCTypes.ObjectPtrTy);
4465 CGF.EmitNounwindRuntimeCall(ObjCTypes.getSyncEnterFn(), SyncArg);
4467 SyncArgSlot = CGF.CreateTempAlloca(SyncArg->getType(),
4468 CGF.getPointerAlign(), "sync.arg");
4469 CGF.Builder.CreateStore(SyncArg, SyncArgSlot);
4472 // Allocate memory for the setjmp buffer. This needs to be kept
4473 // live throughout the try and catch blocks.
4474 Address ExceptionData = CGF.CreateTempAlloca(ObjCTypes.ExceptionDataTy,
4475 CGF.getPointerAlign(),
4476 "exceptiondata.ptr");
4478 // Create the fragile hazards. Note that this will not capture any
4479 // of the allocas required for exception processing, but will
4480 // capture the current basic block (which extends all the way to the
4481 // setjmp call) as "before the @try".
4482 FragileHazards Hazards(CGF);
4484 // Create a flag indicating whether the cleanup needs to call
4485 // objc_exception_try_exit. This is true except when
4486 // - no catches match and we're branching through the cleanup
4487 // just to rethrow the exception, or
4488 // - a catch matched and we're falling out of the catch handler.
4489 // The setjmp-safety rule here is that we should always store to this
4490 // variable in a place that dominates the branch through the cleanup
4491 // without passing through any setjmps.
4492 Address CallTryExitVar = CGF.CreateTempAlloca(CGF.Builder.getInt1Ty(),
4496 // A slot containing the exception to rethrow. Only needed when we
4497 // have both a @catch and a @finally.
4498 Address PropagatingExnVar = Address::invalid();
4500 // Push a normal cleanup to leave the try scope.
4501 CGF.EHStack.pushCleanup<PerformFragileFinally>(NormalAndEHCleanup, &S,
4507 // Enter a try block:
4508 // - Call objc_exception_try_enter to push ExceptionData on top of
4510 CGF.EmitNounwindRuntimeCall(ObjCTypes.getExceptionTryEnterFn(),
4511 ExceptionData.getPointer());
4513 // - Call setjmp on the exception data buffer.
4514 llvm::Constant *Zero = llvm::ConstantInt::get(CGF.Builder.getInt32Ty(), 0);
4515 llvm::Value *GEPIndexes[] = { Zero, Zero, Zero };
4516 llvm::Value *SetJmpBuffer = CGF.Builder.CreateGEP(
4517 ObjCTypes.ExceptionDataTy, ExceptionData.getPointer(), GEPIndexes,
4519 llvm::CallInst *SetJmpResult = CGF.EmitNounwindRuntimeCall(
4520 ObjCTypes.getSetJmpFn(), SetJmpBuffer, "setjmp_result");
4521 SetJmpResult->setCanReturnTwice();
4523 // If setjmp returned 0, enter the protected block; otherwise,
4524 // branch to the handler.
4525 llvm::BasicBlock *TryBlock = CGF.createBasicBlock("try");
4526 llvm::BasicBlock *TryHandler = CGF.createBasicBlock("try.handler");
4527 llvm::Value *DidCatch =
4528 CGF.Builder.CreateIsNotNull(SetJmpResult, "did_catch_exception");
4529 CGF.Builder.CreateCondBr(DidCatch, TryHandler, TryBlock);
4531 // Emit the protected block.
4532 CGF.EmitBlock(TryBlock);
4533 CGF.Builder.CreateStore(CGF.Builder.getTrue(), CallTryExitVar);
4534 CGF.EmitStmt(isTry ? cast<ObjCAtTryStmt>(S).getTryBody()
4535 : cast<ObjCAtSynchronizedStmt>(S).getSynchBody());
4537 CGBuilderTy::InsertPoint TryFallthroughIP = CGF.Builder.saveAndClearIP();
4539 // Emit the exception handler block.
4540 CGF.EmitBlock(TryHandler);
4542 // Don't optimize loads of the in-scope locals across this point.
4543 Hazards.emitWriteHazard();
4545 // For a @synchronized (or a @try with no catches), just branch
4546 // through the cleanup to the rethrow block.
4547 if (!isTry || !cast<ObjCAtTryStmt>(S).getNumCatchStmts()) {
4548 // Tell the cleanup not to re-pop the exit.
4549 CGF.Builder.CreateStore(CGF.Builder.getFalse(), CallTryExitVar);
4550 CGF.EmitBranchThroughCleanup(FinallyRethrow);
4552 // Otherwise, we have to match against the caught exceptions.
4554 // Retrieve the exception object. We may emit multiple blocks but
4555 // nothing can cross this so the value is already in SSA form.
4556 llvm::CallInst *Caught =
4557 CGF.EmitNounwindRuntimeCall(ObjCTypes.getExceptionExtractFn(),
4558 ExceptionData.getPointer(), "caught");
4560 // Push the exception to rethrow onto the EH value stack for the
4561 // benefit of any @throws in the handlers.
4562 CGF.ObjCEHValueStack.push_back(Caught);
4564 const ObjCAtTryStmt* AtTryStmt = cast<ObjCAtTryStmt>(&S);
4566 bool HasFinally = (AtTryStmt->getFinallyStmt() != nullptr);
4568 llvm::BasicBlock *CatchBlock = nullptr;
4569 llvm::BasicBlock *CatchHandler = nullptr;
4571 // Save the currently-propagating exception before
4572 // objc_exception_try_enter clears the exception slot.
4573 PropagatingExnVar = CGF.CreateTempAlloca(Caught->getType(),
4574 CGF.getPointerAlign(),
4575 "propagating_exception");
4576 CGF.Builder.CreateStore(Caught, PropagatingExnVar);
4578 // Enter a new exception try block (in case a @catch block
4579 // throws an exception).
4580 CGF.EmitNounwindRuntimeCall(ObjCTypes.getExceptionTryEnterFn(),
4581 ExceptionData.getPointer());
4583 llvm::CallInst *SetJmpResult =
4584 CGF.EmitNounwindRuntimeCall(ObjCTypes.getSetJmpFn(),
4585 SetJmpBuffer, "setjmp.result");
4586 SetJmpResult->setCanReturnTwice();
4588 llvm::Value *Threw =
4589 CGF.Builder.CreateIsNotNull(SetJmpResult, "did_catch_exception");
4591 CatchBlock = CGF.createBasicBlock("catch");
4592 CatchHandler = CGF.createBasicBlock("catch_for_catch");
4593 CGF.Builder.CreateCondBr(Threw, CatchHandler, CatchBlock);
4595 CGF.EmitBlock(CatchBlock);
4598 CGF.Builder.CreateStore(CGF.Builder.getInt1(HasFinally), CallTryExitVar);
4600 // Handle catch list. As a special case we check if everything is
4601 // matched and avoid generating code for falling off the end if
4603 bool AllMatched = false;
4604 for (unsigned I = 0, N = AtTryStmt->getNumCatchStmts(); I != N; ++I) {
4605 const ObjCAtCatchStmt *CatchStmt = AtTryStmt->getCatchStmt(I);
4607 const VarDecl *CatchParam = CatchStmt->getCatchParamDecl();
4608 const ObjCObjectPointerType *OPT = nullptr;
4610 // catch(...) always matches.
4614 OPT = CatchParam->getType()->getAs<ObjCObjectPointerType>();
4616 // catch(id e) always matches under this ABI, since only
4617 // ObjC exceptions end up here in the first place.
4618 // FIXME: For the time being we also match id<X>; this should
4619 // be rejected by Sema instead.
4620 if (OPT && (OPT->isObjCIdType() || OPT->isObjCQualifiedIdType()))
4624 // If this is a catch-all, we don't need to test anything.
4626 CodeGenFunction::RunCleanupsScope CatchVarCleanups(CGF);
4629 CGF.EmitAutoVarDecl(*CatchParam);
4630 assert(CGF.HaveInsertPoint() && "DeclStmt destroyed insert point?");
4632 // These types work out because ConvertType(id) == i8*.
4633 EmitInitOfCatchParam(CGF, Caught, CatchParam);
4636 CGF.EmitStmt(CatchStmt->getCatchBody());
4638 // The scope of the catch variable ends right here.
4639 CatchVarCleanups.ForceCleanup();
4641 CGF.EmitBranchThroughCleanup(FinallyEnd);
4645 assert(OPT && "Unexpected non-object pointer type in @catch");
4646 const ObjCObjectType *ObjTy = OPT->getObjectType();
4648 // FIXME: @catch (Class c) ?
4649 ObjCInterfaceDecl *IDecl = ObjTy->getInterface();
4650 assert(IDecl && "Catch parameter must have Objective-C type!");
4652 // Check if the @catch block matches the exception object.
4653 llvm::Value *Class = EmitClassRef(CGF, IDecl);
4655 llvm::Value *matchArgs[] = { Class, Caught };
4656 llvm::CallInst *Match =
4657 CGF.EmitNounwindRuntimeCall(ObjCTypes.getExceptionMatchFn(),
4658 matchArgs, "match");
4660 llvm::BasicBlock *MatchedBlock = CGF.createBasicBlock("match");
4661 llvm::BasicBlock *NextCatchBlock = CGF.createBasicBlock("catch.next");
4663 CGF.Builder.CreateCondBr(CGF.Builder.CreateIsNotNull(Match, "matched"),
4664 MatchedBlock, NextCatchBlock);
4666 // Emit the @catch block.
4667 CGF.EmitBlock(MatchedBlock);
4669 // Collect any cleanups for the catch variable. The scope lasts until
4670 // the end of the catch body.
4671 CodeGenFunction::RunCleanupsScope CatchVarCleanups(CGF);
4673 CGF.EmitAutoVarDecl(*CatchParam);
4674 assert(CGF.HaveInsertPoint() && "DeclStmt destroyed insert point?");
4676 // Initialize the catch variable.
4678 CGF.Builder.CreateBitCast(Caught,
4679 CGF.ConvertType(CatchParam->getType()));
4680 EmitInitOfCatchParam(CGF, Tmp, CatchParam);
4682 CGF.EmitStmt(CatchStmt->getCatchBody());
4684 // We're done with the catch variable.
4685 CatchVarCleanups.ForceCleanup();
4687 CGF.EmitBranchThroughCleanup(FinallyEnd);
4689 CGF.EmitBlock(NextCatchBlock);
4692 CGF.ObjCEHValueStack.pop_back();
4694 // If nothing wanted anything to do with the caught exception,
4695 // kill the extract call.
4696 if (Caught->use_empty())
4697 Caught->eraseFromParent();
4700 CGF.EmitBranchThroughCleanup(FinallyRethrow);
4703 // Emit the exception handler for the @catch blocks.
4704 CGF.EmitBlock(CatchHandler);
4706 // In theory we might now need a write hazard, but actually it's
4707 // unnecessary because there's no local-accessing code between
4708 // the try's write hazard and here.
4709 //Hazards.emitWriteHazard();
4711 // Extract the new exception and save it to the
4712 // propagating-exception slot.
4713 assert(PropagatingExnVar.isValid());
4714 llvm::CallInst *NewCaught =
4715 CGF.EmitNounwindRuntimeCall(ObjCTypes.getExceptionExtractFn(),
4716 ExceptionData.getPointer(), "caught");
4717 CGF.Builder.CreateStore(NewCaught, PropagatingExnVar);
4719 // Don't pop the catch handler; the throw already did.
4720 CGF.Builder.CreateStore(CGF.Builder.getFalse(), CallTryExitVar);
4721 CGF.EmitBranchThroughCleanup(FinallyRethrow);
4725 // Insert read hazards as required in the new blocks.
4726 Hazards.emitHazardsInNewBlocks();
4729 CGF.Builder.restoreIP(TryFallthroughIP);
4730 if (CGF.HaveInsertPoint())
4731 CGF.Builder.CreateStore(CGF.Builder.getTrue(), CallTryExitVar);
4732 CGF.PopCleanupBlock();
4733 CGF.EmitBlock(FinallyEnd.getBlock(), true);
4735 // Emit the rethrow block.
4736 CGBuilderTy::InsertPoint SavedIP = CGF.Builder.saveAndClearIP();
4737 CGF.EmitBlock(FinallyRethrow.getBlock(), true);
4738 if (CGF.HaveInsertPoint()) {
4739 // If we have a propagating-exception variable, check it.
4740 llvm::Value *PropagatingExn;
4741 if (PropagatingExnVar.isValid()) {
4742 PropagatingExn = CGF.Builder.CreateLoad(PropagatingExnVar);
4744 // Otherwise, just look in the buffer for the exception to throw.
4746 llvm::CallInst *Caught =
4747 CGF.EmitNounwindRuntimeCall(ObjCTypes.getExceptionExtractFn(),
4748 ExceptionData.getPointer());
4749 PropagatingExn = Caught;
4752 CGF.EmitNounwindRuntimeCall(ObjCTypes.getExceptionThrowFn(),
4754 CGF.Builder.CreateUnreachable();
4757 CGF.Builder.restoreIP(SavedIP);
4760 void CGObjCMac::EmitThrowStmt(CodeGen::CodeGenFunction &CGF,
4761 const ObjCAtThrowStmt &S,
4762 bool ClearInsertionPoint) {
4763 llvm::Value *ExceptionAsObject;
4765 if (const Expr *ThrowExpr = S.getThrowExpr()) {
4766 llvm::Value *Exception = CGF.EmitObjCThrowOperand(ThrowExpr);
4768 CGF.Builder.CreateBitCast(Exception, ObjCTypes.ObjectPtrTy);
4770 assert((!CGF.ObjCEHValueStack.empty() && CGF.ObjCEHValueStack.back()) &&
4771 "Unexpected rethrow outside @catch block.");
4772 ExceptionAsObject = CGF.ObjCEHValueStack.back();
4775 CGF.EmitRuntimeCall(ObjCTypes.getExceptionThrowFn(), ExceptionAsObject)
4776 ->setDoesNotReturn();
4777 CGF.Builder.CreateUnreachable();
4779 // Clear the insertion point to indicate we are in unreachable code.
4780 if (ClearInsertionPoint)
4781 CGF.Builder.ClearInsertionPoint();
4784 /// EmitObjCWeakRead - Code gen for loading value of a __weak
4785 /// object: objc_read_weak (id *src)
4787 llvm::Value * CGObjCMac::EmitObjCWeakRead(CodeGen::CodeGenFunction &CGF,
4788 Address AddrWeakObj) {
4789 llvm::Type* DestTy = AddrWeakObj.getElementType();
4790 AddrWeakObj = CGF.Builder.CreateBitCast(AddrWeakObj,
4791 ObjCTypes.PtrObjectPtrTy);
4792 llvm::Value *read_weak =
4793 CGF.EmitNounwindRuntimeCall(ObjCTypes.getGcReadWeakFn(),
4794 AddrWeakObj.getPointer(), "weakread");
4795 read_weak = CGF.Builder.CreateBitCast(read_weak, DestTy);
4799 /// EmitObjCWeakAssign - Code gen for assigning to a __weak object.
4800 /// objc_assign_weak (id src, id *dst)
4802 void CGObjCMac::EmitObjCWeakAssign(CodeGen::CodeGenFunction &CGF,
4803 llvm::Value *src, Address dst) {
4804 llvm::Type * SrcTy = src->getType();
4805 if (!isa<llvm::PointerType>(SrcTy)) {
4806 unsigned Size = CGM.getDataLayout().getTypeAllocSize(SrcTy);
4807 assert(Size <= 8 && "does not support size > 8");
4808 src = (Size == 4) ? CGF.Builder.CreateBitCast(src, CGM.Int32Ty)
4809 : CGF.Builder.CreateBitCast(src, CGM.Int64Ty);
4810 src = CGF.Builder.CreateIntToPtr(src, ObjCTypes.Int8PtrTy);
4812 src = CGF.Builder.CreateBitCast(src, ObjCTypes.ObjectPtrTy);
4813 dst = CGF.Builder.CreateBitCast(dst, ObjCTypes.PtrObjectPtrTy);
4814 llvm::Value *args[] = { src, dst.getPointer() };
4815 CGF.EmitNounwindRuntimeCall(ObjCTypes.getGcAssignWeakFn(),
4816 args, "weakassign");
4819 /// EmitObjCGlobalAssign - Code gen for assigning to a __strong object.
4820 /// objc_assign_global (id src, id *dst)
4822 void CGObjCMac::EmitObjCGlobalAssign(CodeGen::CodeGenFunction &CGF,
4823 llvm::Value *src, Address dst,
4825 llvm::Type * SrcTy = src->getType();
4826 if (!isa<llvm::PointerType>(SrcTy)) {
4827 unsigned Size = CGM.getDataLayout().getTypeAllocSize(SrcTy);
4828 assert(Size <= 8 && "does not support size > 8");
4829 src = (Size == 4) ? CGF.Builder.CreateBitCast(src, CGM.Int32Ty)
4830 : CGF.Builder.CreateBitCast(src, CGM.Int64Ty);
4831 src = CGF.Builder.CreateIntToPtr(src, ObjCTypes.Int8PtrTy);
4833 src = CGF.Builder.CreateBitCast(src, ObjCTypes.ObjectPtrTy);
4834 dst = CGF.Builder.CreateBitCast(dst, ObjCTypes.PtrObjectPtrTy);
4835 llvm::Value *args[] = { src, dst.getPointer() };
4837 CGF.EmitNounwindRuntimeCall(ObjCTypes.getGcAssignGlobalFn(),
4838 args, "globalassign");
4840 CGF.EmitNounwindRuntimeCall(ObjCTypes.getGcAssignThreadLocalFn(),
4841 args, "threadlocalassign");
4844 /// EmitObjCIvarAssign - Code gen for assigning to a __strong object.
4845 /// objc_assign_ivar (id src, id *dst, ptrdiff_t ivaroffset)
4847 void CGObjCMac::EmitObjCIvarAssign(CodeGen::CodeGenFunction &CGF,
4848 llvm::Value *src, Address dst,
4849 llvm::Value *ivarOffset) {
4850 assert(ivarOffset && "EmitObjCIvarAssign - ivarOffset is NULL");
4851 llvm::Type * SrcTy = src->getType();
4852 if (!isa<llvm::PointerType>(SrcTy)) {
4853 unsigned Size = CGM.getDataLayout().getTypeAllocSize(SrcTy);
4854 assert(Size <= 8 && "does not support size > 8");
4855 src = (Size == 4) ? CGF.Builder.CreateBitCast(src, CGM.Int32Ty)
4856 : CGF.Builder.CreateBitCast(src, CGM.Int64Ty);
4857 src = CGF.Builder.CreateIntToPtr(src, ObjCTypes.Int8PtrTy);
4859 src = CGF.Builder.CreateBitCast(src, ObjCTypes.ObjectPtrTy);
4860 dst = CGF.Builder.CreateBitCast(dst, ObjCTypes.PtrObjectPtrTy);
4861 llvm::Value *args[] = { src, dst.getPointer(), ivarOffset };
4862 CGF.EmitNounwindRuntimeCall(ObjCTypes.getGcAssignIvarFn(), args);
4865 /// EmitObjCStrongCastAssign - Code gen for assigning to a __strong cast object.
4866 /// objc_assign_strongCast (id src, id *dst)
4868 void CGObjCMac::EmitObjCStrongCastAssign(CodeGen::CodeGenFunction &CGF,
4869 llvm::Value *src, Address dst) {
4870 llvm::Type * SrcTy = src->getType();
4871 if (!isa<llvm::PointerType>(SrcTy)) {
4872 unsigned Size = CGM.getDataLayout().getTypeAllocSize(SrcTy);
4873 assert(Size <= 8 && "does not support size > 8");
4874 src = (Size == 4) ? CGF.Builder.CreateBitCast(src, CGM.Int32Ty)
4875 : CGF.Builder.CreateBitCast(src, CGM.Int64Ty);
4876 src = CGF.Builder.CreateIntToPtr(src, ObjCTypes.Int8PtrTy);
4878 src = CGF.Builder.CreateBitCast(src, ObjCTypes.ObjectPtrTy);
4879 dst = CGF.Builder.CreateBitCast(dst, ObjCTypes.PtrObjectPtrTy);
4880 llvm::Value *args[] = { src, dst.getPointer() };
4881 CGF.EmitNounwindRuntimeCall(ObjCTypes.getGcAssignStrongCastFn(),
4882 args, "strongassign");
4885 void CGObjCMac::EmitGCMemmoveCollectable(CodeGen::CodeGenFunction &CGF,
4888 llvm::Value *size) {
4889 SrcPtr = CGF.Builder.CreateBitCast(SrcPtr, ObjCTypes.Int8PtrTy);
4890 DestPtr = CGF.Builder.CreateBitCast(DestPtr, ObjCTypes.Int8PtrTy);
4891 llvm::Value *args[] = { DestPtr.getPointer(), SrcPtr.getPointer(), size };
4892 CGF.EmitNounwindRuntimeCall(ObjCTypes.GcMemmoveCollectableFn(), args);
4895 /// EmitObjCValueForIvar - Code Gen for ivar reference.
4897 LValue CGObjCMac::EmitObjCValueForIvar(CodeGen::CodeGenFunction &CGF,
4899 llvm::Value *BaseValue,
4900 const ObjCIvarDecl *Ivar,
4901 unsigned CVRQualifiers) {
4902 const ObjCInterfaceDecl *ID =
4903 ObjectTy->castAs<ObjCObjectType>()->getInterface();
4904 return EmitValueForIvarAtOffset(CGF, ID, BaseValue, Ivar, CVRQualifiers,
4905 EmitIvarOffset(CGF, ID, Ivar));
4908 llvm::Value *CGObjCMac::EmitIvarOffset(CodeGen::CodeGenFunction &CGF,
4909 const ObjCInterfaceDecl *Interface,
4910 const ObjCIvarDecl *Ivar) {
4911 uint64_t Offset = ComputeIvarBaseOffset(CGM, Interface, Ivar);
4912 return llvm::ConstantInt::get(
4913 CGM.getTypes().ConvertType(CGM.getContext().LongTy),
4917 /* *** Private Interface *** */
4919 std::string CGObjCCommonMac::GetSectionName(StringRef Section,
4920 StringRef MachOAttributes) {
4921 switch (CGM.getTriple().getObjectFormat()) {
4922 case llvm::Triple::UnknownObjectFormat:
4923 llvm_unreachable("unexpected object file format");
4924 case llvm::Triple::MachO: {
4925 if (MachOAttributes.empty())
4926 return ("__DATA," + Section).str();
4927 return ("__DATA," + Section + "," + MachOAttributes).str();
4929 case llvm::Triple::ELF:
4930 assert(Section.substr(0, 2) == "__" &&
4931 "expected the name to begin with __");
4932 return Section.substr(2).str();
4933 case llvm::Triple::COFF:
4934 assert(Section.substr(0, 2) == "__" &&
4935 "expected the name to begin with __");
4936 return ("." + Section.substr(2) + "$B").str();
4937 case llvm::Triple::Wasm:
4938 case llvm::Triple::XCOFF:
4939 llvm::report_fatal_error(
4940 "Objective-C support is unimplemented for object file format.");
4943 llvm_unreachable("Unhandled llvm::Triple::ObjectFormatType enum");
4946 /// EmitImageInfo - Emit the image info marker used to encode some module
4947 /// level information.
4949 /// See: <rdr://4810609&4810587&4810587>
4950 /// struct IMAGE_INFO {
4951 /// unsigned version;
4954 enum ImageInfoFlags {
4955 eImageInfo_FixAndContinue = (1 << 0), // This flag is no longer set by clang.
4956 eImageInfo_GarbageCollected = (1 << 1),
4957 eImageInfo_GCOnly = (1 << 2),
4958 eImageInfo_OptimizedByDyld = (1 << 3), // This flag is set by the dyld shared cache.
4960 // A flag indicating that the module has no instances of a @synthesize of a
4961 // superclass variable. <rdar://problem/6803242>
4962 eImageInfo_CorrectedSynthesize = (1 << 4), // This flag is no longer set by clang.
4963 eImageInfo_ImageIsSimulated = (1 << 5),
4964 eImageInfo_ClassProperties = (1 << 6)
4967 void CGObjCCommonMac::EmitImageInfo() {
4968 unsigned version = 0; // Version is unused?
4969 std::string Section =
4971 ? "__OBJC,__image_info,regular"
4972 : GetSectionName("__objc_imageinfo", "regular,no_dead_strip");
4974 // Generate module-level named metadata to convey this information to the
4975 // linker and code-gen.
4976 llvm::Module &Mod = CGM.getModule();
4978 // Add the ObjC ABI version to the module flags.
4979 Mod.addModuleFlag(llvm::Module::Error, "Objective-C Version", ObjCABI);
4980 Mod.addModuleFlag(llvm::Module::Error, "Objective-C Image Info Version",
4982 Mod.addModuleFlag(llvm::Module::Error, "Objective-C Image Info Section",
4983 llvm::MDString::get(VMContext, Section));
4985 if (CGM.getLangOpts().getGC() == LangOptions::NonGC) {
4986 // Non-GC overrides those files which specify GC.
4987 Mod.addModuleFlag(llvm::Module::Override,
4988 "Objective-C Garbage Collection", (uint32_t)0);
4990 // Add the ObjC garbage collection value.
4991 Mod.addModuleFlag(llvm::Module::Error,
4992 "Objective-C Garbage Collection",
4993 eImageInfo_GarbageCollected);
4995 if (CGM.getLangOpts().getGC() == LangOptions::GCOnly) {
4996 // Add the ObjC GC Only value.
4997 Mod.addModuleFlag(llvm::Module::Error, "Objective-C GC Only",
5000 // Require that GC be specified and set to eImageInfo_GarbageCollected.
5001 llvm::Metadata *Ops[2] = {
5002 llvm::MDString::get(VMContext, "Objective-C Garbage Collection"),
5003 llvm::ConstantAsMetadata::get(llvm::ConstantInt::get(
5004 llvm::Type::getInt32Ty(VMContext), eImageInfo_GarbageCollected))};
5005 Mod.addModuleFlag(llvm::Module::Require, "Objective-C GC Only",
5006 llvm::MDNode::get(VMContext, Ops));
5010 // Indicate whether we're compiling this to run on a simulator.
5011 if (CGM.getTarget().getTriple().isSimulatorEnvironment())
5012 Mod.addModuleFlag(llvm::Module::Error, "Objective-C Is Simulated",
5013 eImageInfo_ImageIsSimulated);
5015 // Indicate whether we are generating class properties.
5016 Mod.addModuleFlag(llvm::Module::Error, "Objective-C Class Properties",
5017 eImageInfo_ClassProperties);
5020 // struct objc_module {
5021 // unsigned long version;
5022 // unsigned long size;
5023 // const char *name;
5027 // FIXME: Get from somewhere
5028 static const int ModuleVersion = 7;
5030 void CGObjCMac::EmitModuleInfo() {
5031 uint64_t Size = CGM.getDataLayout().getTypeAllocSize(ObjCTypes.ModuleTy);
5033 ConstantInitBuilder builder(CGM);
5034 auto values = builder.beginStruct(ObjCTypes.ModuleTy);
5035 values.addInt(ObjCTypes.LongTy, ModuleVersion);
5036 values.addInt(ObjCTypes.LongTy, Size);
5037 // This used to be the filename, now it is unused. <rdr://4327263>
5038 values.add(GetClassName(StringRef("")));
5039 values.add(EmitModuleSymbols());
5040 CreateMetadataVar("OBJC_MODULES", values,
5041 "__OBJC,__module_info,regular,no_dead_strip",
5042 CGM.getPointerAlign(), true);
5045 llvm::Constant *CGObjCMac::EmitModuleSymbols() {
5046 unsigned NumClasses = DefinedClasses.size();
5047 unsigned NumCategories = DefinedCategories.size();
5049 // Return null if no symbols were defined.
5050 if (!NumClasses && !NumCategories)
5051 return llvm::Constant::getNullValue(ObjCTypes.SymtabPtrTy);
5053 ConstantInitBuilder builder(CGM);
5054 auto values = builder.beginStruct();
5055 values.addInt(ObjCTypes.LongTy, 0);
5056 values.addNullPointer(ObjCTypes.SelectorPtrTy);
5057 values.addInt(ObjCTypes.ShortTy, NumClasses);
5058 values.addInt(ObjCTypes.ShortTy, NumCategories);
5060 // The runtime expects exactly the list of defined classes followed
5061 // by the list of defined categories, in a single array.
5062 auto array = values.beginArray(ObjCTypes.Int8PtrTy);
5063 for (unsigned i=0; i<NumClasses; i++) {
5064 const ObjCInterfaceDecl *ID = ImplementedClasses[i];
5066 if (ObjCImplementationDecl *IMP = ID->getImplementation())
5067 // We are implementing a weak imported interface. Give it external linkage
5068 if (ID->isWeakImported() && !IMP->isWeakImported())
5069 DefinedClasses[i]->setLinkage(llvm::GlobalVariable::ExternalLinkage);
5071 array.addBitCast(DefinedClasses[i], ObjCTypes.Int8PtrTy);
5073 for (unsigned i=0; i<NumCategories; i++)
5074 array.addBitCast(DefinedCategories[i], ObjCTypes.Int8PtrTy);
5076 array.finishAndAddTo(values);
5078 llvm::GlobalVariable *GV = CreateMetadataVar(
5079 "OBJC_SYMBOLS", values, "__OBJC,__symbols,regular,no_dead_strip",
5080 CGM.getPointerAlign(), true);
5081 return llvm::ConstantExpr::getBitCast(GV, ObjCTypes.SymtabPtrTy);
5084 llvm::Value *CGObjCMac::EmitClassRefFromId(CodeGenFunction &CGF,
5085 IdentifierInfo *II) {
5086 LazySymbols.insert(II);
5088 llvm::GlobalVariable *&Entry = ClassReferences[II];
5091 llvm::Constant *Casted =
5092 llvm::ConstantExpr::getBitCast(GetClassName(II->getName()),
5093 ObjCTypes.ClassPtrTy);
5094 Entry = CreateMetadataVar(
5095 "OBJC_CLASS_REFERENCES_", Casted,
5096 "__OBJC,__cls_refs,literal_pointers,no_dead_strip",
5097 CGM.getPointerAlign(), true);
5100 return CGF.Builder.CreateAlignedLoad(Entry, CGF.getPointerAlign());
5103 llvm::Value *CGObjCMac::EmitClassRef(CodeGenFunction &CGF,
5104 const ObjCInterfaceDecl *ID) {
5105 // If the class has the objc_runtime_visible attribute, we need to
5106 // use the Objective-C runtime to get the class.
5107 if (ID->hasAttr<ObjCRuntimeVisibleAttr>())
5108 return EmitClassRefViaRuntime(CGF, ID, ObjCTypes);
5110 IdentifierInfo *RuntimeName =
5111 &CGM.getContext().Idents.get(ID->getObjCRuntimeNameAsString());
5112 return EmitClassRefFromId(CGF, RuntimeName);
5115 llvm::Value *CGObjCMac::EmitNSAutoreleasePoolClassRef(CodeGenFunction &CGF) {
5116 IdentifierInfo *II = &CGM.getContext().Idents.get("NSAutoreleasePool");
5117 return EmitClassRefFromId(CGF, II);
5120 llvm::Value *CGObjCMac::EmitSelector(CodeGenFunction &CGF, Selector Sel) {
5121 return CGF.Builder.CreateLoad(EmitSelectorAddr(CGF, Sel));
5124 Address CGObjCMac::EmitSelectorAddr(CodeGenFunction &CGF, Selector Sel) {
5125 CharUnits Align = CGF.getPointerAlign();
5127 llvm::GlobalVariable *&Entry = SelectorReferences[Sel];
5129 llvm::Constant *Casted =
5130 llvm::ConstantExpr::getBitCast(GetMethodVarName(Sel),
5131 ObjCTypes.SelectorPtrTy);
5132 Entry = CreateMetadataVar(
5133 "OBJC_SELECTOR_REFERENCES_", Casted,
5134 "__OBJC,__message_refs,literal_pointers,no_dead_strip", Align, true);
5135 Entry->setExternallyInitialized(true);
5138 return Address(Entry, Align);
5141 llvm::Constant *CGObjCCommonMac::GetClassName(StringRef RuntimeName) {
5142 llvm::GlobalVariable *&Entry = ClassNames[RuntimeName];
5144 Entry = CreateCStringLiteral(RuntimeName, ObjCLabelType::ClassName);
5145 return getConstantGEP(VMContext, Entry, 0, 0);
5148 llvm::Function *CGObjCCommonMac::GetMethodDefinition(const ObjCMethodDecl *MD) {
5149 llvm::DenseMap<const ObjCMethodDecl*, llvm::Function*>::iterator
5150 I = MethodDefinitions.find(MD);
5151 if (I != MethodDefinitions.end())
5157 /// GetIvarLayoutName - Returns a unique constant for the given
5158 /// ivar layout bitmap.
5159 llvm::Constant *CGObjCCommonMac::GetIvarLayoutName(IdentifierInfo *Ident,
5160 const ObjCCommonTypesHelper &ObjCTypes) {
5161 return llvm::Constant::getNullValue(ObjCTypes.Int8PtrTy);
5164 void IvarLayoutBuilder::visitRecord(const RecordType *RT,
5166 const RecordDecl *RD = RT->getDecl();
5168 // If this is a union, remember that we had one, because it might mess
5169 // up the ordering of layout entries.
5171 IsDisordered = true;
5173 const ASTRecordLayout *recLayout = nullptr;
5174 visitAggregate(RD->field_begin(), RD->field_end(), offset,
5175 [&](const FieldDecl *field) -> CharUnits {
5177 recLayout = &CGM.getContext().getASTRecordLayout(RD);
5178 auto offsetInBits = recLayout->getFieldOffset(field->getFieldIndex());
5179 return CGM.getContext().toCharUnitsFromBits(offsetInBits);
5183 template <class Iterator, class GetOffsetFn>
5184 void IvarLayoutBuilder::visitAggregate(Iterator begin, Iterator end,
5185 CharUnits aggregateOffset,
5186 const GetOffsetFn &getOffset) {
5187 for (; begin != end; ++begin) {
5188 auto field = *begin;
5190 // Skip over bitfields.
5191 if (field->isBitField()) {
5195 // Compute the offset of the field within the aggregate.
5196 CharUnits fieldOffset = aggregateOffset + getOffset(field);
5198 visitField(field, fieldOffset);
5202 /// Collect layout information for the given fields into IvarsInfo.
5203 void IvarLayoutBuilder::visitField(const FieldDecl *field,
5204 CharUnits fieldOffset) {
5205 QualType fieldType = field->getType();
5207 // Drill down into arrays.
5208 uint64_t numElts = 1;
5209 if (auto arrayType = CGM.getContext().getAsIncompleteArrayType(fieldType)) {
5211 fieldType = arrayType->getElementType();
5213 // Unlike incomplete arrays, constant arrays can be nested.
5214 while (auto arrayType = CGM.getContext().getAsConstantArrayType(fieldType)) {
5215 numElts *= arrayType->getSize().getZExtValue();
5216 fieldType = arrayType->getElementType();
5219 assert(!fieldType->isArrayType() && "ivar of non-constant array type?");
5221 // If we ended up with a zero-sized array, we've done what we can do within
5222 // the limits of this layout encoding.
5223 if (numElts == 0) return;
5225 // Recurse if the base element type is a record type.
5226 if (auto recType = fieldType->getAs<RecordType>()) {
5227 size_t oldEnd = IvarsInfo.size();
5229 visitRecord(recType, fieldOffset);
5231 // If we have an array, replicate the first entry's layout information.
5232 auto numEltEntries = IvarsInfo.size() - oldEnd;
5233 if (numElts != 1 && numEltEntries != 0) {
5234 CharUnits eltSize = CGM.getContext().getTypeSizeInChars(recType);
5235 for (uint64_t eltIndex = 1; eltIndex != numElts; ++eltIndex) {
5236 // Copy the last numEltEntries onto the end of the array, adjusting
5237 // each for the element size.
5238 for (size_t i = 0; i != numEltEntries; ++i) {
5239 auto firstEntry = IvarsInfo[oldEnd + i];
5240 IvarsInfo.push_back(IvarInfo(firstEntry.Offset + eltIndex * eltSize,
5241 firstEntry.SizeInWords));
5249 // Classify the element type.
5250 Qualifiers::GC GCAttr = GetGCAttrTypeForType(CGM.getContext(), fieldType);
5252 // If it matches what we're looking for, add an entry.
5253 if ((ForStrongLayout && GCAttr == Qualifiers::Strong)
5254 || (!ForStrongLayout && GCAttr == Qualifiers::Weak)) {
5255 assert(CGM.getContext().getTypeSizeInChars(fieldType)
5256 == CGM.getPointerSize());
5257 IvarsInfo.push_back(IvarInfo(fieldOffset, numElts));
5261 /// buildBitmap - This routine does the horsework of taking the offsets of
5262 /// strong/weak references and creating a bitmap. The bitmap is also
5263 /// returned in the given buffer, suitable for being passed to \c dump().
5264 llvm::Constant *IvarLayoutBuilder::buildBitmap(CGObjCCommonMac &CGObjC,
5265 llvm::SmallVectorImpl<unsigned char> &buffer) {
5266 // The bitmap is a series of skip/scan instructions, aligned to word
5267 // boundaries. The skip is performed first.
5268 const unsigned char MaxNibble = 0xF;
5269 const unsigned char SkipMask = 0xF0, SkipShift = 4;
5270 const unsigned char ScanMask = 0x0F, ScanShift = 0;
5272 assert(!IvarsInfo.empty() && "generating bitmap for no data");
5274 // Sort the ivar info on byte position in case we encounterred a
5275 // union nested in the ivar list.
5277 // This isn't a stable sort, but our algorithm should handle it fine.
5278 llvm::array_pod_sort(IvarsInfo.begin(), IvarsInfo.end());
5280 assert(std::is_sorted(IvarsInfo.begin(), IvarsInfo.end()));
5282 assert(IvarsInfo.back().Offset < InstanceEnd);
5284 assert(buffer.empty());
5286 // Skip the next N words.
5287 auto skip = [&](unsigned numWords) {
5288 assert(numWords > 0);
5290 // Try to merge into the previous byte. Since scans happen second, we
5291 // can't do this if it includes a scan.
5292 if (!buffer.empty() && !(buffer.back() & ScanMask)) {
5293 unsigned lastSkip = buffer.back() >> SkipShift;
5294 if (lastSkip < MaxNibble) {
5295 unsigned claimed = std::min(MaxNibble - lastSkip, numWords);
5296 numWords -= claimed;
5297 lastSkip += claimed;
5298 buffer.back() = (lastSkip << SkipShift);
5302 while (numWords >= MaxNibble) {
5303 buffer.push_back(MaxNibble << SkipShift);
5304 numWords -= MaxNibble;
5307 buffer.push_back(numWords << SkipShift);
5311 // Scan the next N words.
5312 auto scan = [&](unsigned numWords) {
5313 assert(numWords > 0);
5315 // Try to merge into the previous byte. Since scans happen second, we can
5316 // do this even if it includes a skip.
5317 if (!buffer.empty()) {
5318 unsigned lastScan = (buffer.back() & ScanMask) >> ScanShift;
5319 if (lastScan < MaxNibble) {
5320 unsigned claimed = std::min(MaxNibble - lastScan, numWords);
5321 numWords -= claimed;
5322 lastScan += claimed;
5323 buffer.back() = (buffer.back() & SkipMask) | (lastScan << ScanShift);
5327 while (numWords >= MaxNibble) {
5328 buffer.push_back(MaxNibble << ScanShift);
5329 numWords -= MaxNibble;
5332 buffer.push_back(numWords << ScanShift);
5336 // One past the end of the last scan.
5337 unsigned endOfLastScanInWords = 0;
5338 const CharUnits WordSize = CGM.getPointerSize();
5340 // Consider all the scan requests.
5341 for (auto &request : IvarsInfo) {
5342 CharUnits beginOfScan = request.Offset - InstanceBegin;
5344 // Ignore scan requests that don't start at an even multiple of the
5345 // word size. We can't encode them.
5346 if ((beginOfScan % WordSize) != 0) continue;
5348 // Ignore scan requests that start before the instance start.
5349 // This assumes that scans never span that boundary. The boundary
5350 // isn't the true start of the ivars, because in the fragile-ARC case
5351 // it's rounded up to word alignment, but the test above should leave
5352 // us ignoring that possibility.
5353 if (beginOfScan.isNegative()) {
5354 assert(request.Offset + request.SizeInWords * WordSize <= InstanceBegin);
5358 unsigned beginOfScanInWords = beginOfScan / WordSize;
5359 unsigned endOfScanInWords = beginOfScanInWords + request.SizeInWords;
5361 // If the scan starts some number of words after the last one ended,
5363 if (beginOfScanInWords > endOfLastScanInWords) {
5364 skip(beginOfScanInWords - endOfLastScanInWords);
5366 // Otherwise, start scanning where the last left off.
5368 beginOfScanInWords = endOfLastScanInWords;
5370 // If that leaves us with nothing to scan, ignore this request.
5371 if (beginOfScanInWords >= endOfScanInWords) continue;
5374 // Scan to the end of the request.
5375 assert(beginOfScanInWords < endOfScanInWords);
5376 scan(endOfScanInWords - beginOfScanInWords);
5377 endOfLastScanInWords = endOfScanInWords;
5381 return llvm::ConstantPointerNull::get(CGM.Int8PtrTy);
5383 // For GC layouts, emit a skip to the end of the allocation so that we
5384 // have precise information about the entire thing. This isn't useful
5385 // or necessary for the ARC-style layout strings.
5386 if (CGM.getLangOpts().getGC() != LangOptions::NonGC) {
5387 unsigned lastOffsetInWords =
5388 (InstanceEnd - InstanceBegin + WordSize - CharUnits::One()) / WordSize;
5389 if (lastOffsetInWords > endOfLastScanInWords) {
5390 skip(lastOffsetInWords - endOfLastScanInWords);
5394 // Null terminate the string.
5395 buffer.push_back(0);
5397 auto *Entry = CGObjC.CreateCStringLiteral(
5398 reinterpret_cast<char *>(buffer.data()), ObjCLabelType::ClassName);
5399 return getConstantGEP(CGM.getLLVMContext(), Entry, 0, 0);
5402 /// BuildIvarLayout - Builds ivar layout bitmap for the class
5403 /// implementation for the __strong or __weak case.
5404 /// The layout map displays which words in ivar list must be skipped
5405 /// and which must be scanned by GC (see below). String is built of bytes.
5406 /// Each byte is divided up in two nibbles (4-bit each). Left nibble is count
5407 /// of words to skip and right nibble is count of words to scan. So, each
5408 /// nibble represents up to 15 workds to skip or scan. Skipping the rest is
5409 /// represented by a 0x00 byte which also ends the string.
5410 /// 1. when ForStrongLayout is true, following ivars are scanned:
5413 /// - __strong anything
5415 /// 2. When ForStrongLayout is false, following ivars are scanned:
5416 /// - __weak anything
5419 CGObjCCommonMac::BuildIvarLayout(const ObjCImplementationDecl *OMD,
5420 CharUnits beginOffset, CharUnits endOffset,
5421 bool ForStrongLayout, bool HasMRCWeakIvars) {
5422 // If this is MRC, and we're either building a strong layout or there
5423 // are no weak ivars, bail out early.
5424 llvm::Type *PtrTy = CGM.Int8PtrTy;
5425 if (CGM.getLangOpts().getGC() == LangOptions::NonGC &&
5426 !CGM.getLangOpts().ObjCAutoRefCount &&
5427 (ForStrongLayout || !HasMRCWeakIvars))
5428 return llvm::Constant::getNullValue(PtrTy);
5430 const ObjCInterfaceDecl *OI = OMD->getClassInterface();
5431 SmallVector<const ObjCIvarDecl*, 32> ivars;
5433 // GC layout strings include the complete object layout, possibly
5434 // inaccurately in the non-fragile ABI; the runtime knows how to fix this
5437 // ARC layout strings only include the class's ivars. In non-fragile
5438 // runtimes, that means starting at InstanceStart, rounded up to word
5439 // alignment. In fragile runtimes, there's no InstanceStart, so it means
5440 // starting at the offset of the first ivar, rounded up to word alignment.
5442 // MRC weak layout strings follow the ARC style.
5443 CharUnits baseOffset;
5444 if (CGM.getLangOpts().getGC() == LangOptions::NonGC) {
5445 for (const ObjCIvarDecl *IVD = OI->all_declared_ivar_begin();
5446 IVD; IVD = IVD->getNextIvar())
5447 ivars.push_back(IVD);
5449 if (isNonFragileABI()) {
5450 baseOffset = beginOffset; // InstanceStart
5451 } else if (!ivars.empty()) {
5453 CharUnits::fromQuantity(ComputeIvarBaseOffset(CGM, OMD, ivars[0]));
5455 baseOffset = CharUnits::Zero();
5458 baseOffset = baseOffset.alignTo(CGM.getPointerAlign());
5461 CGM.getContext().DeepCollectObjCIvars(OI, true, ivars);
5463 baseOffset = CharUnits::Zero();
5467 return llvm::Constant::getNullValue(PtrTy);
5469 IvarLayoutBuilder builder(CGM, baseOffset, endOffset, ForStrongLayout);
5471 builder.visitAggregate(ivars.begin(), ivars.end(), CharUnits::Zero(),
5472 [&](const ObjCIvarDecl *ivar) -> CharUnits {
5473 return CharUnits::fromQuantity(ComputeIvarBaseOffset(CGM, OMD, ivar));
5476 if (!builder.hasBitmapData())
5477 return llvm::Constant::getNullValue(PtrTy);
5479 llvm::SmallVector<unsigned char, 4> buffer;
5480 llvm::Constant *C = builder.buildBitmap(*this, buffer);
5482 if (CGM.getLangOpts().ObjCGCBitmapPrint && !buffer.empty()) {
5483 printf("\n%s ivar layout for class '%s': ",
5484 ForStrongLayout ? "strong" : "weak",
5485 OMD->getClassInterface()->getName().str().c_str());
5486 builder.dump(buffer);
5491 llvm::Constant *CGObjCCommonMac::GetMethodVarName(Selector Sel) {
5492 llvm::GlobalVariable *&Entry = MethodVarNames[Sel];
5493 // FIXME: Avoid std::string in "Sel.getAsString()"
5495 Entry = CreateCStringLiteral(Sel.getAsString(), ObjCLabelType::MethodVarName);
5496 return getConstantGEP(VMContext, Entry, 0, 0);
5499 // FIXME: Merge into a single cstring creation function.
5500 llvm::Constant *CGObjCCommonMac::GetMethodVarName(IdentifierInfo *ID) {
5501 return GetMethodVarName(CGM.getContext().Selectors.getNullarySelector(ID));
5504 llvm::Constant *CGObjCCommonMac::GetMethodVarType(const FieldDecl *Field) {
5505 std::string TypeStr;
5506 CGM.getContext().getObjCEncodingForType(Field->getType(), TypeStr, Field);
5508 llvm::GlobalVariable *&Entry = MethodVarTypes[TypeStr];
5510 Entry = CreateCStringLiteral(TypeStr, ObjCLabelType::MethodVarType);
5511 return getConstantGEP(VMContext, Entry, 0, 0);
5514 llvm::Constant *CGObjCCommonMac::GetMethodVarType(const ObjCMethodDecl *D,
5516 std::string TypeStr =
5517 CGM.getContext().getObjCEncodingForMethodDecl(D, Extended);
5519 llvm::GlobalVariable *&Entry = MethodVarTypes[TypeStr];
5521 Entry = CreateCStringLiteral(TypeStr, ObjCLabelType::MethodVarType);
5522 return getConstantGEP(VMContext, Entry, 0, 0);
5525 // FIXME: Merge into a single cstring creation function.
5526 llvm::Constant *CGObjCCommonMac::GetPropertyName(IdentifierInfo *Ident) {
5527 llvm::GlobalVariable *&Entry = PropertyNames[Ident];
5529 Entry = CreateCStringLiteral(Ident->getName(), ObjCLabelType::PropertyName);
5530 return getConstantGEP(VMContext, Entry, 0, 0);
5533 // FIXME: Merge into a single cstring creation function.
5534 // FIXME: This Decl should be more precise.
5536 CGObjCCommonMac::GetPropertyTypeString(const ObjCPropertyDecl *PD,
5537 const Decl *Container) {
5538 std::string TypeStr =
5539 CGM.getContext().getObjCEncodingForPropertyDecl(PD, Container);
5540 return GetPropertyName(&CGM.getContext().Idents.get(TypeStr));
5543 void CGObjCCommonMac::GetNameForMethod(const ObjCMethodDecl *D,
5544 const ObjCContainerDecl *CD,
5545 SmallVectorImpl<char> &Name) {
5546 llvm::raw_svector_ostream OS(Name);
5547 assert (CD && "Missing container decl in GetNameForMethod");
5548 OS << '\01' << (D->isInstanceMethod() ? '-' : '+')
5549 << '[' << CD->getName();
5550 if (const ObjCCategoryImplDecl *CID =
5551 dyn_cast<ObjCCategoryImplDecl>(D->getDeclContext()))
5552 OS << '(' << *CID << ')';
5553 OS << ' ' << D->getSelector().getAsString() << ']';
5556 void CGObjCMac::FinishModule() {
5559 // Emit the dummy bodies for any protocols which were referenced but
5561 for (auto &entry : Protocols) {
5562 llvm::GlobalVariable *global = entry.second;
5563 if (global->hasInitializer())
5566 ConstantInitBuilder builder(CGM);
5567 auto values = builder.beginStruct(ObjCTypes.ProtocolTy);
5568 values.addNullPointer(ObjCTypes.ProtocolExtensionPtrTy);
5569 values.add(GetClassName(entry.first->getName()));
5570 values.addNullPointer(ObjCTypes.ProtocolListPtrTy);
5571 values.addNullPointer(ObjCTypes.MethodDescriptionListPtrTy);
5572 values.addNullPointer(ObjCTypes.MethodDescriptionListPtrTy);
5573 values.finishAndSetAsInitializer(global);
5574 CGM.addCompilerUsedGlobal(global);
5577 // Add assembler directives to add lazy undefined symbol references
5578 // for classes which are referenced but not defined. This is
5579 // important for correct linker interaction.
5581 // FIXME: It would be nice if we had an LLVM construct for this.
5582 if ((!LazySymbols.empty() || !DefinedSymbols.empty()) &&
5583 CGM.getTriple().isOSBinFormatMachO()) {
5584 SmallString<256> Asm;
5585 Asm += CGM.getModule().getModuleInlineAsm();
5586 if (!Asm.empty() && Asm.back() != '\n')
5589 llvm::raw_svector_ostream OS(Asm);
5590 for (const auto *Sym : DefinedSymbols)
5591 OS << "\t.objc_class_name_" << Sym->getName() << "=0\n"
5592 << "\t.globl .objc_class_name_" << Sym->getName() << "\n";
5593 for (const auto *Sym : LazySymbols)
5594 OS << "\t.lazy_reference .objc_class_name_" << Sym->getName() << "\n";
5595 for (const auto &Category : DefinedCategoryNames)
5596 OS << "\t.objc_category_name_" << Category << "=0\n"
5597 << "\t.globl .objc_category_name_" << Category << "\n";
5599 CGM.getModule().setModuleInlineAsm(OS.str());
5603 CGObjCNonFragileABIMac::CGObjCNonFragileABIMac(CodeGen::CodeGenModule &cgm)
5604 : CGObjCCommonMac(cgm), ObjCTypes(cgm), ObjCEmptyCacheVar(nullptr),
5605 ObjCEmptyVtableVar(nullptr) {
5611 ObjCCommonTypesHelper::ObjCCommonTypesHelper(CodeGen::CodeGenModule &cgm)
5612 : VMContext(cgm.getLLVMContext()), CGM(cgm), ExternalProtocolPtrTy(nullptr)
5614 CodeGen::CodeGenTypes &Types = CGM.getTypes();
5615 ASTContext &Ctx = CGM.getContext();
5617 ShortTy = cast<llvm::IntegerType>(Types.ConvertType(Ctx.ShortTy));
5619 LongTy = cast<llvm::IntegerType>(Types.ConvertType(Ctx.LongTy));
5620 Int8PtrTy = CGM.Int8PtrTy;
5621 Int8PtrPtrTy = CGM.Int8PtrPtrTy;
5623 // arm64 targets use "int" ivar offset variables. All others,
5624 // including OS X x86_64 and Windows x86_64, use "long" ivar offsets.
5625 if (CGM.getTarget().getTriple().getArch() == llvm::Triple::aarch64)
5626 IvarOffsetVarTy = IntTy;
5628 IvarOffsetVarTy = LongTy;
5631 cast<llvm::PointerType>(Types.ConvertType(Ctx.getObjCIdType()));
5633 llvm::PointerType::getUnqual(ObjectPtrTy);
5635 cast<llvm::PointerType>(Types.ConvertType(Ctx.getObjCSelType()));
5637 // I'm not sure I like this. The implicit coordination is a bit
5638 // gross. We should solve this in a reasonable fashion because this
5639 // is a pretty common task (match some runtime data structure with
5640 // an LLVM data structure).
5642 // FIXME: This is leaked.
5643 // FIXME: Merge with rewriter code?
5645 // struct _objc_super {
5649 RecordDecl *RD = RecordDecl::Create(Ctx, TTK_Struct,
5650 Ctx.getTranslationUnitDecl(),
5651 SourceLocation(), SourceLocation(),
5652 &Ctx.Idents.get("_objc_super"));
5653 RD->addDecl(FieldDecl::Create(Ctx, RD, SourceLocation(), SourceLocation(),
5654 nullptr, Ctx.getObjCIdType(), nullptr, nullptr,
5655 false, ICIS_NoInit));
5656 RD->addDecl(FieldDecl::Create(Ctx, RD, SourceLocation(), SourceLocation(),
5657 nullptr, Ctx.getObjCClassType(), nullptr,
5658 nullptr, false, ICIS_NoInit));
5659 RD->completeDefinition();
5661 SuperCTy = Ctx.getTagDeclType(RD);
5662 SuperPtrCTy = Ctx.getPointerType(SuperCTy);
5664 SuperTy = cast<llvm::StructType>(Types.ConvertType(SuperCTy));
5665 SuperPtrTy = llvm::PointerType::getUnqual(SuperTy);
5669 // char *attributes;
5671 PropertyTy = llvm::StructType::create("struct._prop_t", Int8PtrTy, Int8PtrTy);
5673 // struct _prop_list_t {
5674 // uint32_t entsize; // sizeof(struct _prop_t)
5675 // uint32_t count_of_properties;
5676 // struct _prop_t prop_list[count_of_properties];
5678 PropertyListTy = llvm::StructType::create(
5679 "struct._prop_list_t", IntTy, IntTy, llvm::ArrayType::get(PropertyTy, 0));
5680 // struct _prop_list_t *
5681 PropertyListPtrTy = llvm::PointerType::getUnqual(PropertyListTy);
5683 // struct _objc_method {
5685 // char *method_type;
5688 MethodTy = llvm::StructType::create("struct._objc_method", SelectorPtrTy,
5689 Int8PtrTy, Int8PtrTy);
5691 // struct _objc_cache *
5692 CacheTy = llvm::StructType::create(VMContext, "struct._objc_cache");
5693 CachePtrTy = llvm::PointerType::getUnqual(CacheTy);
5696 ObjCTypesHelper::ObjCTypesHelper(CodeGen::CodeGenModule &cgm)
5697 : ObjCCommonTypesHelper(cgm) {
5698 // struct _objc_method_description {
5702 MethodDescriptionTy = llvm::StructType::create(
5703 "struct._objc_method_description", SelectorPtrTy, Int8PtrTy);
5705 // struct _objc_method_description_list {
5707 // struct _objc_method_description[1];
5709 MethodDescriptionListTy =
5710 llvm::StructType::create("struct._objc_method_description_list", IntTy,
5711 llvm::ArrayType::get(MethodDescriptionTy, 0));
5713 // struct _objc_method_description_list *
5714 MethodDescriptionListPtrTy =
5715 llvm::PointerType::getUnqual(MethodDescriptionListTy);
5717 // Protocol description structures
5719 // struct _objc_protocol_extension {
5720 // uint32_t size; // sizeof(struct _objc_protocol_extension)
5721 // struct _objc_method_description_list *optional_instance_methods;
5722 // struct _objc_method_description_list *optional_class_methods;
5723 // struct _objc_property_list *instance_properties;
5724 // const char ** extendedMethodTypes;
5725 // struct _objc_property_list *class_properties;
5727 ProtocolExtensionTy = llvm::StructType::create(
5728 "struct._objc_protocol_extension", IntTy, MethodDescriptionListPtrTy,
5729 MethodDescriptionListPtrTy, PropertyListPtrTy, Int8PtrPtrTy,
5732 // struct _objc_protocol_extension *
5733 ProtocolExtensionPtrTy = llvm::PointerType::getUnqual(ProtocolExtensionTy);
5735 // Handle recursive construction of Protocol and ProtocolList types
5738 llvm::StructType::create(VMContext, "struct._objc_protocol");
5741 llvm::StructType::create(VMContext, "struct._objc_protocol_list");
5742 ProtocolListTy->setBody(llvm::PointerType::getUnqual(ProtocolListTy), LongTy,
5743 llvm::ArrayType::get(ProtocolTy, 0));
5745 // struct _objc_protocol {
5746 // struct _objc_protocol_extension *isa;
5747 // char *protocol_name;
5748 // struct _objc_protocol **_objc_protocol_list;
5749 // struct _objc_method_description_list *instance_methods;
5750 // struct _objc_method_description_list *class_methods;
5752 ProtocolTy->setBody(ProtocolExtensionPtrTy, Int8PtrTy,
5753 llvm::PointerType::getUnqual(ProtocolListTy),
5754 MethodDescriptionListPtrTy, MethodDescriptionListPtrTy);
5756 // struct _objc_protocol_list *
5757 ProtocolListPtrTy = llvm::PointerType::getUnqual(ProtocolListTy);
5759 ProtocolPtrTy = llvm::PointerType::getUnqual(ProtocolTy);
5761 // Class description structures
5763 // struct _objc_ivar {
5768 IvarTy = llvm::StructType::create("struct._objc_ivar", Int8PtrTy, Int8PtrTy,
5771 // struct _objc_ivar_list *
5773 llvm::StructType::create(VMContext, "struct._objc_ivar_list");
5774 IvarListPtrTy = llvm::PointerType::getUnqual(IvarListTy);
5776 // struct _objc_method_list *
5778 llvm::StructType::create(VMContext, "struct._objc_method_list");
5779 MethodListPtrTy = llvm::PointerType::getUnqual(MethodListTy);
5781 // struct _objc_class_extension *
5782 ClassExtensionTy = llvm::StructType::create(
5783 "struct._objc_class_extension", IntTy, Int8PtrTy, PropertyListPtrTy);
5784 ClassExtensionPtrTy = llvm::PointerType::getUnqual(ClassExtensionTy);
5786 ClassTy = llvm::StructType::create(VMContext, "struct._objc_class");
5788 // struct _objc_class {
5790 // Class super_class;
5794 // long instance_size;
5795 // struct _objc_ivar_list *ivars;
5796 // struct _objc_method_list *methods;
5797 // struct _objc_cache *cache;
5798 // struct _objc_protocol_list *protocols;
5799 // char *ivar_layout;
5800 // struct _objc_class_ext *ext;
5802 ClassTy->setBody(llvm::PointerType::getUnqual(ClassTy),
5803 llvm::PointerType::getUnqual(ClassTy), Int8PtrTy, LongTy,
5804 LongTy, LongTy, IvarListPtrTy, MethodListPtrTy, CachePtrTy,
5805 ProtocolListPtrTy, Int8PtrTy, ClassExtensionPtrTy);
5807 ClassPtrTy = llvm::PointerType::getUnqual(ClassTy);
5809 // struct _objc_category {
5810 // char *category_name;
5811 // char *class_name;
5812 // struct _objc_method_list *instance_method;
5813 // struct _objc_method_list *class_method;
5814 // struct _objc_protocol_list *protocols;
5815 // uint32_t size; // sizeof(struct _objc_category)
5816 // struct _objc_property_list *instance_properties;// category's @property
5817 // struct _objc_property_list *class_properties;
5819 CategoryTy = llvm::StructType::create(
5820 "struct._objc_category", Int8PtrTy, Int8PtrTy, MethodListPtrTy,
5821 MethodListPtrTy, ProtocolListPtrTy, IntTy, PropertyListPtrTy,
5824 // Global metadata structures
5826 // struct _objc_symtab {
5827 // long sel_ref_cnt;
5829 // short cls_def_cnt;
5830 // short cat_def_cnt;
5831 // char *defs[cls_def_cnt + cat_def_cnt];
5833 SymtabTy = llvm::StructType::create("struct._objc_symtab", LongTy,
5834 SelectorPtrTy, ShortTy, ShortTy,
5835 llvm::ArrayType::get(Int8PtrTy, 0));
5836 SymtabPtrTy = llvm::PointerType::getUnqual(SymtabTy);
5838 // struct _objc_module {
5840 // long size; // sizeof(struct _objc_module)
5842 // struct _objc_symtab* symtab;
5844 ModuleTy = llvm::StructType::create("struct._objc_module", LongTy, LongTy,
5845 Int8PtrTy, SymtabPtrTy);
5847 // FIXME: This is the size of the setjmp buffer and should be target
5848 // specific. 18 is what's used on 32-bit X86.
5849 uint64_t SetJmpBufferSize = 18;
5852 llvm::Type *StackPtrTy = llvm::ArrayType::get(CGM.Int8PtrTy, 4);
5854 ExceptionDataTy = llvm::StructType::create(
5855 "struct._objc_exception_data",
5856 llvm::ArrayType::get(CGM.Int32Ty, SetJmpBufferSize), StackPtrTy);
5859 ObjCNonFragileABITypesHelper::ObjCNonFragileABITypesHelper(CodeGen::CodeGenModule &cgm)
5860 : ObjCCommonTypesHelper(cgm) {
5861 // struct _method_list_t {
5862 // uint32_t entsize; // sizeof(struct _objc_method)
5863 // uint32_t method_count;
5864 // struct _objc_method method_list[method_count];
5867 llvm::StructType::create("struct.__method_list_t", IntTy, IntTy,
5868 llvm::ArrayType::get(MethodTy, 0));
5869 // struct method_list_t *
5870 MethodListnfABIPtrTy = llvm::PointerType::getUnqual(MethodListnfABITy);
5872 // struct _protocol_t {
5874 // const char * const protocol_name;
5875 // const struct _protocol_list_t * protocol_list; // super protocols
5876 // const struct method_list_t * const instance_methods;
5877 // const struct method_list_t * const class_methods;
5878 // const struct method_list_t *optionalInstanceMethods;
5879 // const struct method_list_t *optionalClassMethods;
5880 // const struct _prop_list_t * properties;
5881 // const uint32_t size; // sizeof(struct _protocol_t)
5882 // const uint32_t flags; // = 0
5883 // const char ** extendedMethodTypes;
5884 // const char *demangledName;
5885 // const struct _prop_list_t * class_properties;
5888 // Holder for struct _protocol_list_t *
5889 ProtocolListnfABITy =
5890 llvm::StructType::create(VMContext, "struct._objc_protocol_list");
5892 ProtocolnfABITy = llvm::StructType::create(
5893 "struct._protocol_t", ObjectPtrTy, Int8PtrTy,
5894 llvm::PointerType::getUnqual(ProtocolListnfABITy), MethodListnfABIPtrTy,
5895 MethodListnfABIPtrTy, MethodListnfABIPtrTy, MethodListnfABIPtrTy,
5896 PropertyListPtrTy, IntTy, IntTy, Int8PtrPtrTy, Int8PtrTy,
5899 // struct _protocol_t*
5900 ProtocolnfABIPtrTy = llvm::PointerType::getUnqual(ProtocolnfABITy);
5902 // struct _protocol_list_t {
5903 // long protocol_count; // Note, this is 32/64 bit
5904 // struct _protocol_t *[protocol_count];
5906 ProtocolListnfABITy->setBody(LongTy,
5907 llvm::ArrayType::get(ProtocolnfABIPtrTy, 0));
5909 // struct _objc_protocol_list*
5910 ProtocolListnfABIPtrTy = llvm::PointerType::getUnqual(ProtocolListnfABITy);
5913 // unsigned [long] int *offset; // pointer to ivar offset location
5916 // uint32_t alignment;
5919 IvarnfABITy = llvm::StructType::create(
5920 "struct._ivar_t", llvm::PointerType::getUnqual(IvarOffsetVarTy),
5921 Int8PtrTy, Int8PtrTy, IntTy, IntTy);
5923 // struct _ivar_list_t {
5924 // uint32 entsize; // sizeof(struct _ivar_t)
5926 // struct _iver_t list[count];
5929 llvm::StructType::create("struct._ivar_list_t", IntTy, IntTy,
5930 llvm::ArrayType::get(IvarnfABITy, 0));
5932 IvarListnfABIPtrTy = llvm::PointerType::getUnqual(IvarListnfABITy);
5934 // struct _class_ro_t {
5935 // uint32_t const flags;
5936 // uint32_t const instanceStart;
5937 // uint32_t const instanceSize;
5938 // uint32_t const reserved; // only when building for 64bit targets
5939 // const uint8_t * const ivarLayout;
5940 // const char *const name;
5941 // const struct _method_list_t * const baseMethods;
5942 // const struct _objc_protocol_list *const baseProtocols;
5943 // const struct _ivar_list_t *const ivars;
5944 // const uint8_t * const weakIvarLayout;
5945 // const struct _prop_list_t * const properties;
5948 // FIXME. Add 'reserved' field in 64bit abi mode!
5949 ClassRonfABITy = llvm::StructType::create(
5950 "struct._class_ro_t", IntTy, IntTy, IntTy, Int8PtrTy, Int8PtrTy,
5951 MethodListnfABIPtrTy, ProtocolListnfABIPtrTy, IvarListnfABIPtrTy,
5952 Int8PtrTy, PropertyListPtrTy);
5954 // ImpnfABITy - LLVM for id (*)(id, SEL, ...)
5955 llvm::Type *params[] = { ObjectPtrTy, SelectorPtrTy };
5956 ImpnfABITy = llvm::FunctionType::get(ObjectPtrTy, params, false)
5959 // struct _class_t {
5960 // struct _class_t *isa;
5961 // struct _class_t * const superclass;
5964 // struct class_ro_t *ro;
5967 ClassnfABITy = llvm::StructType::create(VMContext, "struct._class_t");
5968 ClassnfABITy->setBody(llvm::PointerType::getUnqual(ClassnfABITy),
5969 llvm::PointerType::getUnqual(ClassnfABITy), CachePtrTy,
5970 llvm::PointerType::getUnqual(ImpnfABITy),
5971 llvm::PointerType::getUnqual(ClassRonfABITy));
5973 // LLVM for struct _class_t *
5974 ClassnfABIPtrTy = llvm::PointerType::getUnqual(ClassnfABITy);
5976 // struct _category_t {
5977 // const char * const name;
5978 // struct _class_t *const cls;
5979 // const struct _method_list_t * const instance_methods;
5980 // const struct _method_list_t * const class_methods;
5981 // const struct _protocol_list_t * const protocols;
5982 // const struct _prop_list_t * const properties;
5983 // const struct _prop_list_t * const class_properties;
5984 // const uint32_t size;
5986 CategorynfABITy = llvm::StructType::create(
5987 "struct._category_t", Int8PtrTy, ClassnfABIPtrTy, MethodListnfABIPtrTy,
5988 MethodListnfABIPtrTy, ProtocolListnfABIPtrTy, PropertyListPtrTy,
5989 PropertyListPtrTy, IntTy);
5991 // New types for nonfragile abi messaging.
5992 CodeGen::CodeGenTypes &Types = CGM.getTypes();
5993 ASTContext &Ctx = CGM.getContext();
5995 // MessageRefTy - LLVM for:
5996 // struct _message_ref_t {
6001 // First the clang type for struct _message_ref_t
6002 RecordDecl *RD = RecordDecl::Create(Ctx, TTK_Struct,
6003 Ctx.getTranslationUnitDecl(),
6004 SourceLocation(), SourceLocation(),
6005 &Ctx.Idents.get("_message_ref_t"));
6006 RD->addDecl(FieldDecl::Create(Ctx, RD, SourceLocation(), SourceLocation(),
6007 nullptr, Ctx.VoidPtrTy, nullptr, nullptr, false,
6009 RD->addDecl(FieldDecl::Create(Ctx, RD, SourceLocation(), SourceLocation(),
6010 nullptr, Ctx.getObjCSelType(), nullptr, nullptr,
6011 false, ICIS_NoInit));
6012 RD->completeDefinition();
6014 MessageRefCTy = Ctx.getTagDeclType(RD);
6015 MessageRefCPtrTy = Ctx.getPointerType(MessageRefCTy);
6016 MessageRefTy = cast<llvm::StructType>(Types.ConvertType(MessageRefCTy));
6018 // MessageRefPtrTy - LLVM for struct _message_ref_t*
6019 MessageRefPtrTy = llvm::PointerType::getUnqual(MessageRefTy);
6021 // SuperMessageRefTy - LLVM for:
6022 // struct _super_message_ref_t {
6023 // SUPER_IMP messenger;
6026 SuperMessageRefTy = llvm::StructType::create("struct._super_message_ref_t",
6027 ImpnfABITy, SelectorPtrTy);
6029 // SuperMessageRefPtrTy - LLVM for struct _super_message_ref_t*
6030 SuperMessageRefPtrTy = llvm::PointerType::getUnqual(SuperMessageRefTy);
6033 // struct objc_typeinfo {
6034 // const void** vtable; // objc_ehtype_vtable + 2
6035 // const char* name; // c++ typeinfo string
6038 EHTypeTy = llvm::StructType::create("struct._objc_typeinfo",
6039 llvm::PointerType::getUnqual(Int8PtrTy),
6040 Int8PtrTy, ClassnfABIPtrTy);
6041 EHTypePtrTy = llvm::PointerType::getUnqual(EHTypeTy);
6044 llvm::Function *CGObjCNonFragileABIMac::ModuleInitFunction() {
6045 FinishNonFragileABIModule();
6050 void CGObjCNonFragileABIMac::AddModuleClassList(
6051 ArrayRef<llvm::GlobalValue *> Container, StringRef SymbolName,
6052 StringRef SectionName) {
6053 unsigned NumClasses = Container.size();
6058 SmallVector<llvm::Constant*, 8> Symbols(NumClasses);
6059 for (unsigned i=0; i<NumClasses; i++)
6060 Symbols[i] = llvm::ConstantExpr::getBitCast(Container[i],
6061 ObjCTypes.Int8PtrTy);
6062 llvm::Constant *Init =
6063 llvm::ConstantArray::get(llvm::ArrayType::get(ObjCTypes.Int8PtrTy,
6067 // Section name is obtained by calling GetSectionName, which returns
6068 // sections in the __DATA segment on MachO.
6069 assert((!CGM.getTriple().isOSBinFormatMachO() ||
6070 SectionName.startswith("__DATA")) &&
6071 "SectionName expected to start with __DATA on MachO");
6072 llvm::GlobalValue::LinkageTypes LT =
6073 getLinkageTypeForObjCMetadata(CGM, SectionName);
6074 llvm::GlobalVariable *GV =
6075 new llvm::GlobalVariable(CGM.getModule(), Init->getType(), false, LT, Init,
6078 llvm::Align(CGM.getDataLayout().getABITypeAlignment(Init->getType())));
6079 GV->setSection(SectionName);
6080 CGM.addCompilerUsedGlobal(GV);
6083 void CGObjCNonFragileABIMac::FinishNonFragileABIModule() {
6084 // nonfragile abi has no module definition.
6086 // Build list of all implemented class addresses in array
6087 // L_OBJC_LABEL_CLASS_$.
6089 for (unsigned i=0, NumClasses=ImplementedClasses.size(); i<NumClasses; i++) {
6090 const ObjCInterfaceDecl *ID = ImplementedClasses[i];
6092 if (ObjCImplementationDecl *IMP = ID->getImplementation())
6093 // We are implementing a weak imported interface. Give it external linkage
6094 if (ID->isWeakImported() && !IMP->isWeakImported()) {
6095 DefinedClasses[i]->setLinkage(llvm::GlobalVariable::ExternalLinkage);
6096 DefinedMetaClasses[i]->setLinkage(llvm::GlobalVariable::ExternalLinkage);
6100 AddModuleClassList(DefinedClasses, "OBJC_LABEL_CLASS_$",
6101 GetSectionName("__objc_classlist",
6102 "regular,no_dead_strip"));
6104 AddModuleClassList(DefinedNonLazyClasses, "OBJC_LABEL_NONLAZY_CLASS_$",
6105 GetSectionName("__objc_nlclslist",
6106 "regular,no_dead_strip"));
6108 // Build list of all implemented category addresses in array
6109 // L_OBJC_LABEL_CATEGORY_$.
6110 AddModuleClassList(DefinedCategories, "OBJC_LABEL_CATEGORY_$",
6111 GetSectionName("__objc_catlist",
6112 "regular,no_dead_strip"));
6113 AddModuleClassList(DefinedStubCategories, "OBJC_LABEL_STUB_CATEGORY_$",
6114 GetSectionName("__objc_catlist2",
6115 "regular,no_dead_strip"));
6116 AddModuleClassList(DefinedNonLazyCategories, "OBJC_LABEL_NONLAZY_CATEGORY_$",
6117 GetSectionName("__objc_nlcatlist",
6118 "regular,no_dead_strip"));
6123 /// isVTableDispatchedSelector - Returns true if SEL is not in the list of
6124 /// VTableDispatchMethods; false otherwise. What this means is that
6125 /// except for the 19 selectors in the list, we generate 32bit-style
6126 /// message dispatch call for all the rest.
6127 bool CGObjCNonFragileABIMac::isVTableDispatchedSelector(Selector Sel) {
6128 // At various points we've experimented with using vtable-based
6129 // dispatch for all methods.
6130 switch (CGM.getCodeGenOpts().getObjCDispatchMethod()) {
6131 case CodeGenOptions::Legacy:
6133 case CodeGenOptions::NonLegacy:
6135 case CodeGenOptions::Mixed:
6139 // If so, see whether this selector is in the white-list of things which must
6140 // use the new dispatch convention. We lazily build a dense set for this.
6141 if (VTableDispatchMethods.empty()) {
6142 VTableDispatchMethods.insert(GetNullarySelector("alloc"));
6143 VTableDispatchMethods.insert(GetNullarySelector("class"));
6144 VTableDispatchMethods.insert(GetNullarySelector("self"));
6145 VTableDispatchMethods.insert(GetNullarySelector("isFlipped"));
6146 VTableDispatchMethods.insert(GetNullarySelector("length"));
6147 VTableDispatchMethods.insert(GetNullarySelector("count"));
6149 // These are vtable-based if GC is disabled.
6150 // Optimistically use vtable dispatch for hybrid compiles.
6151 if (CGM.getLangOpts().getGC() != LangOptions::GCOnly) {
6152 VTableDispatchMethods.insert(GetNullarySelector("retain"));
6153 VTableDispatchMethods.insert(GetNullarySelector("release"));
6154 VTableDispatchMethods.insert(GetNullarySelector("autorelease"));
6157 VTableDispatchMethods.insert(GetUnarySelector("allocWithZone"));
6158 VTableDispatchMethods.insert(GetUnarySelector("isKindOfClass"));
6159 VTableDispatchMethods.insert(GetUnarySelector("respondsToSelector"));
6160 VTableDispatchMethods.insert(GetUnarySelector("objectForKey"));
6161 VTableDispatchMethods.insert(GetUnarySelector("objectAtIndex"));
6162 VTableDispatchMethods.insert(GetUnarySelector("isEqualToString"));
6163 VTableDispatchMethods.insert(GetUnarySelector("isEqual"));
6165 // These are vtable-based if GC is enabled.
6166 // Optimistically use vtable dispatch for hybrid compiles.
6167 if (CGM.getLangOpts().getGC() != LangOptions::NonGC) {
6168 VTableDispatchMethods.insert(GetNullarySelector("hash"));
6169 VTableDispatchMethods.insert(GetUnarySelector("addObject"));
6171 // "countByEnumeratingWithState:objects:count"
6172 IdentifierInfo *KeyIdents[] = {
6173 &CGM.getContext().Idents.get("countByEnumeratingWithState"),
6174 &CGM.getContext().Idents.get("objects"),
6175 &CGM.getContext().Idents.get("count")
6177 VTableDispatchMethods.insert(
6178 CGM.getContext().Selectors.getSelector(3, KeyIdents));
6182 return VTableDispatchMethods.count(Sel);
6185 /// BuildClassRoTInitializer - generate meta-data for:
6186 /// struct _class_ro_t {
6187 /// uint32_t const flags;
6188 /// uint32_t const instanceStart;
6189 /// uint32_t const instanceSize;
6190 /// uint32_t const reserved; // only when building for 64bit targets
6191 /// const uint8_t * const ivarLayout;
6192 /// const char *const name;
6193 /// const struct _method_list_t * const baseMethods;
6194 /// const struct _protocol_list_t *const baseProtocols;
6195 /// const struct _ivar_list_t *const ivars;
6196 /// const uint8_t * const weakIvarLayout;
6197 /// const struct _prop_list_t * const properties;
6200 llvm::GlobalVariable * CGObjCNonFragileABIMac::BuildClassRoTInitializer(
6202 unsigned InstanceStart,
6203 unsigned InstanceSize,
6204 const ObjCImplementationDecl *ID) {
6205 std::string ClassName = ID->getObjCRuntimeNameAsString();
6207 CharUnits beginInstance = CharUnits::fromQuantity(InstanceStart);
6208 CharUnits endInstance = CharUnits::fromQuantity(InstanceSize);
6210 bool hasMRCWeak = false;
6211 if (CGM.getLangOpts().ObjCAutoRefCount)
6212 flags |= NonFragileABI_Class_CompiledByARC;
6213 else if ((hasMRCWeak = hasMRCWeakIvars(CGM, ID)))
6214 flags |= NonFragileABI_Class_HasMRCWeakIvars;
6216 ConstantInitBuilder builder(CGM);
6217 auto values = builder.beginStruct(ObjCTypes.ClassRonfABITy);
6219 values.addInt(ObjCTypes.IntTy, flags);
6220 values.addInt(ObjCTypes.IntTy, InstanceStart);
6221 values.addInt(ObjCTypes.IntTy, InstanceSize);
6222 values.add((flags & NonFragileABI_Class_Meta)
6223 ? GetIvarLayoutName(nullptr, ObjCTypes)
6224 : BuildStrongIvarLayout(ID, beginInstance, endInstance));
6225 values.add(GetClassName(ID->getObjCRuntimeNameAsString()));
6227 // const struct _method_list_t * const baseMethods;
6228 SmallVector<const ObjCMethodDecl*, 16> methods;
6229 if (flags & NonFragileABI_Class_Meta) {
6230 for (const auto *MD : ID->class_methods())
6231 methods.push_back(MD);
6233 for (const auto *MD : ID->instance_methods())
6234 methods.push_back(MD);
6236 for (const auto *PID : ID->property_impls()) {
6237 if (PID->getPropertyImplementation() == ObjCPropertyImplDecl::Synthesize){
6238 ObjCPropertyDecl *PD = PID->getPropertyDecl();
6240 if (auto MD = PD->getGetterMethodDecl())
6241 if (GetMethodDefinition(MD))
6242 methods.push_back(MD);
6243 if (auto MD = PD->getSetterMethodDecl())
6244 if (GetMethodDefinition(MD))
6245 methods.push_back(MD);
6250 values.add(emitMethodList(ID->getObjCRuntimeNameAsString(),
6251 (flags & NonFragileABI_Class_Meta)
6252 ? MethodListType::ClassMethods
6253 : MethodListType::InstanceMethods,
6256 const ObjCInterfaceDecl *OID = ID->getClassInterface();
6257 assert(OID && "CGObjCNonFragileABIMac::BuildClassRoTInitializer");
6258 values.add(EmitProtocolList("_OBJC_CLASS_PROTOCOLS_$_"
6259 + OID->getObjCRuntimeNameAsString(),
6260 OID->all_referenced_protocol_begin(),
6261 OID->all_referenced_protocol_end()));
6263 if (flags & NonFragileABI_Class_Meta) {
6264 values.addNullPointer(ObjCTypes.IvarListnfABIPtrTy);
6265 values.add(GetIvarLayoutName(nullptr, ObjCTypes));
6266 values.add(EmitPropertyList(
6267 "_OBJC_$_CLASS_PROP_LIST_" + ID->getObjCRuntimeNameAsString(),
6268 ID, ID->getClassInterface(), ObjCTypes, true));
6270 values.add(EmitIvarList(ID));
6271 values.add(BuildWeakIvarLayout(ID, beginInstance, endInstance, hasMRCWeak));
6272 values.add(EmitPropertyList(
6273 "_OBJC_$_PROP_LIST_" + ID->getObjCRuntimeNameAsString(),
6274 ID, ID->getClassInterface(), ObjCTypes, false));
6277 llvm::SmallString<64> roLabel;
6278 llvm::raw_svector_ostream(roLabel)
6279 << ((flags & NonFragileABI_Class_Meta) ? "_OBJC_METACLASS_RO_$_"
6280 : "_OBJC_CLASS_RO_$_")
6283 return finishAndCreateGlobal(values, roLabel, CGM);
6286 /// Build the metaclass object for a class.
6288 /// struct _class_t {
6289 /// struct _class_t *isa;
6290 /// struct _class_t * const superclass;
6293 /// struct class_ro_t *ro;
6296 llvm::GlobalVariable *
6297 CGObjCNonFragileABIMac::BuildClassObject(const ObjCInterfaceDecl *CI,
6299 llvm::Constant *IsAGV,
6300 llvm::Constant *SuperClassGV,
6301 llvm::Constant *ClassRoGV,
6302 bool HiddenVisibility) {
6303 ConstantInitBuilder builder(CGM);
6304 auto values = builder.beginStruct(ObjCTypes.ClassnfABITy);
6307 values.add(SuperClassGV);
6309 values.addNullPointer(ObjCTypes.ClassnfABIPtrTy);
6311 values.add(ObjCEmptyCacheVar);
6312 values.add(ObjCEmptyVtableVar);
6313 values.add(ClassRoGV);
6315 llvm::GlobalVariable *GV =
6316 cast<llvm::GlobalVariable>(GetClassGlobal(CI, isMetaclass, ForDefinition));
6317 values.finishAndSetAsInitializer(GV);
6319 if (CGM.getTriple().isOSBinFormatMachO())
6320 GV->setSection("__DATA, __objc_data");
6321 GV->setAlignment(llvm::Align(
6322 CGM.getDataLayout().getABITypeAlignment(ObjCTypes.ClassnfABITy)));
6323 if (!CGM.getTriple().isOSBinFormatCOFF())
6324 if (HiddenVisibility)
6325 GV->setVisibility(llvm::GlobalValue::HiddenVisibility);
6329 bool CGObjCNonFragileABIMac::ImplementationIsNonLazy(
6330 const ObjCImplDecl *OD) const {
6331 return OD->getClassMethod(GetNullarySelector("load")) != nullptr ||
6332 OD->getClassInterface()->hasAttr<ObjCNonLazyClassAttr>() ||
6333 OD->hasAttr<ObjCNonLazyClassAttr>();
6336 void CGObjCNonFragileABIMac::GetClassSizeInfo(const ObjCImplementationDecl *OID,
6337 uint32_t &InstanceStart,
6338 uint32_t &InstanceSize) {
6339 const ASTRecordLayout &RL =
6340 CGM.getContext().getASTObjCImplementationLayout(OID);
6342 // InstanceSize is really instance end.
6343 InstanceSize = RL.getDataSize().getQuantity();
6345 // If there are no fields, the start is the same as the end.
6346 if (!RL.getFieldCount())
6347 InstanceStart = InstanceSize;
6349 InstanceStart = RL.getFieldOffset(0) / CGM.getContext().getCharWidth();
6352 static llvm::GlobalValue::DLLStorageClassTypes getStorage(CodeGenModule &CGM,
6354 IdentifierInfo &II = CGM.getContext().Idents.get(Name);
6355 TranslationUnitDecl *TUDecl = CGM.getContext().getTranslationUnitDecl();
6356 DeclContext *DC = TranslationUnitDecl::castToDeclContext(TUDecl);
6358 const VarDecl *VD = nullptr;
6359 for (const auto &Result : DC->lookup(&II))
6360 if ((VD = dyn_cast<VarDecl>(Result)))
6364 return llvm::GlobalValue::DLLImportStorageClass;
6365 if (VD->hasAttr<DLLExportAttr>())
6366 return llvm::GlobalValue::DLLExportStorageClass;
6367 if (VD->hasAttr<DLLImportAttr>())
6368 return llvm::GlobalValue::DLLImportStorageClass;
6369 return llvm::GlobalValue::DefaultStorageClass;
6372 void CGObjCNonFragileABIMac::GenerateClass(const ObjCImplementationDecl *ID) {
6373 if (!ObjCEmptyCacheVar) {
6375 new llvm::GlobalVariable(CGM.getModule(), ObjCTypes.CacheTy, false,
6376 llvm::GlobalValue::ExternalLinkage, nullptr,
6377 "_objc_empty_cache");
6378 if (CGM.getTriple().isOSBinFormatCOFF())
6379 ObjCEmptyCacheVar->setDLLStorageClass(getStorage(CGM, "_objc_empty_cache"));
6381 // Only OS X with deployment version <10.9 use the empty vtable symbol
6382 const llvm::Triple &Triple = CGM.getTarget().getTriple();
6383 if (Triple.isMacOSX() && Triple.isMacOSXVersionLT(10, 9))
6384 ObjCEmptyVtableVar =
6385 new llvm::GlobalVariable(CGM.getModule(), ObjCTypes.ImpnfABITy, false,
6386 llvm::GlobalValue::ExternalLinkage, nullptr,
6387 "_objc_empty_vtable");
6389 ObjCEmptyVtableVar =
6390 llvm::ConstantPointerNull::get(ObjCTypes.ImpnfABITy->getPointerTo());
6393 // FIXME: Is this correct (that meta class size is never computed)?
6394 uint32_t InstanceStart =
6395 CGM.getDataLayout().getTypeAllocSize(ObjCTypes.ClassnfABITy);
6396 uint32_t InstanceSize = InstanceStart;
6397 uint32_t flags = NonFragileABI_Class_Meta;
6399 llvm::Constant *SuperClassGV, *IsAGV;
6401 const auto *CI = ID->getClassInterface();
6402 assert(CI && "CGObjCNonFragileABIMac::GenerateClass - class is 0");
6404 // Build the flags for the metaclass.
6405 bool classIsHidden = (CGM.getTriple().isOSBinFormatCOFF())
6406 ? !CI->hasAttr<DLLExportAttr>()
6407 : CI->getVisibility() == HiddenVisibility;
6409 flags |= NonFragileABI_Class_Hidden;
6411 // FIXME: why is this flag set on the metaclass?
6412 // ObjC metaclasses have no fields and don't really get constructed.
6413 if (ID->hasNonZeroConstructors() || ID->hasDestructors()) {
6414 flags |= NonFragileABI_Class_HasCXXStructors;
6415 if (!ID->hasNonZeroConstructors())
6416 flags |= NonFragileABI_Class_HasCXXDestructorOnly;
6419 if (!CI->getSuperClass()) {
6421 flags |= NonFragileABI_Class_Root;
6423 SuperClassGV = GetClassGlobal(CI, /*metaclass*/ false, NotForDefinition);
6424 IsAGV = GetClassGlobal(CI, /*metaclass*/ true, NotForDefinition);
6426 // Has a root. Current class is not a root.
6427 const ObjCInterfaceDecl *Root = ID->getClassInterface();
6428 while (const ObjCInterfaceDecl *Super = Root->getSuperClass())
6431 const auto *Super = CI->getSuperClass();
6432 IsAGV = GetClassGlobal(Root, /*metaclass*/ true, NotForDefinition);
6433 SuperClassGV = GetClassGlobal(Super, /*metaclass*/ true, NotForDefinition);
6436 llvm::GlobalVariable *CLASS_RO_GV =
6437 BuildClassRoTInitializer(flags, InstanceStart, InstanceSize, ID);
6439 llvm::GlobalVariable *MetaTClass =
6440 BuildClassObject(CI, /*metaclass*/ true,
6441 IsAGV, SuperClassGV, CLASS_RO_GV, classIsHidden);
6442 CGM.setGVProperties(MetaTClass, CI);
6443 DefinedMetaClasses.push_back(MetaTClass);
6445 // Metadata for the class
6448 flags |= NonFragileABI_Class_Hidden;
6450 if (ID->hasNonZeroConstructors() || ID->hasDestructors()) {
6451 flags |= NonFragileABI_Class_HasCXXStructors;
6453 // Set a flag to enable a runtime optimization when a class has
6454 // fields that require destruction but which don't require
6455 // anything except zero-initialization during construction. This
6456 // is most notably true of __strong and __weak types, but you can
6457 // also imagine there being C++ types with non-trivial default
6458 // constructors that merely set all fields to null.
6459 if (!ID->hasNonZeroConstructors())
6460 flags |= NonFragileABI_Class_HasCXXDestructorOnly;
6463 if (hasObjCExceptionAttribute(CGM.getContext(), CI))
6464 flags |= NonFragileABI_Class_Exception;
6466 if (!CI->getSuperClass()) {
6467 flags |= NonFragileABI_Class_Root;
6468 SuperClassGV = nullptr;
6470 // Has a root. Current class is not a root.
6471 const auto *Super = CI->getSuperClass();
6472 SuperClassGV = GetClassGlobal(Super, /*metaclass*/ false, NotForDefinition);
6475 GetClassSizeInfo(ID, InstanceStart, InstanceSize);
6477 BuildClassRoTInitializer(flags, InstanceStart, InstanceSize, ID);
6479 llvm::GlobalVariable *ClassMD =
6480 BuildClassObject(CI, /*metaclass*/ false,
6481 MetaTClass, SuperClassGV, CLASS_RO_GV, classIsHidden);
6482 CGM.setGVProperties(ClassMD, CI);
6483 DefinedClasses.push_back(ClassMD);
6484 ImplementedClasses.push_back(CI);
6486 // Determine if this class is also "non-lazy".
6487 if (ImplementationIsNonLazy(ID))
6488 DefinedNonLazyClasses.push_back(ClassMD);
6490 // Force the definition of the EHType if necessary.
6491 if (flags & NonFragileABI_Class_Exception)
6492 (void) GetInterfaceEHType(CI, ForDefinition);
6493 // Make sure method definition entries are all clear for next implementation.
6494 MethodDefinitions.clear();
6497 /// GenerateProtocolRef - This routine is called to generate code for
6498 /// a protocol reference expression; as in:
6500 /// @protocol(Proto1);
6502 /// It generates a weak reference to l_OBJC_PROTOCOL_REFERENCE_$_Proto1
6503 /// which will hold address of the protocol meta-data.
6505 llvm::Value *CGObjCNonFragileABIMac::GenerateProtocolRef(CodeGenFunction &CGF,
6506 const ObjCProtocolDecl *PD) {
6508 // This routine is called for @protocol only. So, we must build definition
6509 // of protocol's meta-data (not a reference to it!)
6511 llvm::Constant *Init =
6512 llvm::ConstantExpr::getBitCast(GetOrEmitProtocol(PD),
6513 ObjCTypes.getExternalProtocolPtrTy());
6515 std::string ProtocolName("_OBJC_PROTOCOL_REFERENCE_$_");
6516 ProtocolName += PD->getObjCRuntimeNameAsString();
6518 CharUnits Align = CGF.getPointerAlign();
6520 llvm::GlobalVariable *PTGV = CGM.getModule().getGlobalVariable(ProtocolName);
6522 return CGF.Builder.CreateAlignedLoad(PTGV, Align);
6523 PTGV = new llvm::GlobalVariable(CGM.getModule(), Init->getType(), false,
6524 llvm::GlobalValue::WeakAnyLinkage, Init,
6526 PTGV->setSection(GetSectionName("__objc_protorefs",
6527 "coalesced,no_dead_strip"));
6528 PTGV->setVisibility(llvm::GlobalValue::HiddenVisibility);
6529 PTGV->setAlignment(Align.getAsAlign());
6530 if (!CGM.getTriple().isOSBinFormatMachO())
6531 PTGV->setComdat(CGM.getModule().getOrInsertComdat(ProtocolName));
6532 CGM.addUsedGlobal(PTGV);
6533 return CGF.Builder.CreateAlignedLoad(PTGV, Align);
6536 /// GenerateCategory - Build metadata for a category implementation.
6537 /// struct _category_t {
6538 /// const char * const name;
6539 /// struct _class_t *const cls;
6540 /// const struct _method_list_t * const instance_methods;
6541 /// const struct _method_list_t * const class_methods;
6542 /// const struct _protocol_list_t * const protocols;
6543 /// const struct _prop_list_t * const properties;
6544 /// const struct _prop_list_t * const class_properties;
6545 /// const uint32_t size;
6548 void CGObjCNonFragileABIMac::GenerateCategory(const ObjCCategoryImplDecl *OCD) {
6549 const ObjCInterfaceDecl *Interface = OCD->getClassInterface();
6550 const char *Prefix = "_OBJC_$_CATEGORY_";
6552 llvm::SmallString<64> ExtCatName(Prefix);
6553 ExtCatName += Interface->getObjCRuntimeNameAsString();
6554 ExtCatName += "_$_";
6555 ExtCatName += OCD->getNameAsString();
6557 ConstantInitBuilder builder(CGM);
6558 auto values = builder.beginStruct(ObjCTypes.CategorynfABITy);
6559 values.add(GetClassName(OCD->getIdentifier()->getName()));
6560 // meta-class entry symbol
6561 values.add(GetClassGlobal(Interface, /*metaclass*/ false, NotForDefinition));
6562 std::string listName =
6563 (Interface->getObjCRuntimeNameAsString() + "_$_" + OCD->getName()).str();
6565 SmallVector<const ObjCMethodDecl *, 16> instanceMethods;
6566 SmallVector<const ObjCMethodDecl *, 8> classMethods;
6567 for (const auto *MD : OCD->methods()) {
6568 if (MD->isInstanceMethod()) {
6569 instanceMethods.push_back(MD);
6571 classMethods.push_back(MD);
6575 values.add(emitMethodList(listName, MethodListType::CategoryInstanceMethods,
6577 values.add(emitMethodList(listName, MethodListType::CategoryClassMethods,
6580 const ObjCCategoryDecl *Category =
6581 Interface->FindCategoryDeclaration(OCD->getIdentifier());
6583 SmallString<256> ExtName;
6584 llvm::raw_svector_ostream(ExtName) << Interface->getObjCRuntimeNameAsString() << "_$_"
6586 values.add(EmitProtocolList("_OBJC_CATEGORY_PROTOCOLS_$_"
6587 + Interface->getObjCRuntimeNameAsString() + "_$_"
6588 + Category->getName(),
6589 Category->protocol_begin(),
6590 Category->protocol_end()));
6591 values.add(EmitPropertyList("_OBJC_$_PROP_LIST_" + ExtName.str(),
6592 OCD, Category, ObjCTypes, false));
6593 values.add(EmitPropertyList("_OBJC_$_CLASS_PROP_LIST_" + ExtName.str(),
6594 OCD, Category, ObjCTypes, true));
6596 values.addNullPointer(ObjCTypes.ProtocolListnfABIPtrTy);
6597 values.addNullPointer(ObjCTypes.PropertyListPtrTy);
6598 values.addNullPointer(ObjCTypes.PropertyListPtrTy);
6601 unsigned Size = CGM.getDataLayout().getTypeAllocSize(ObjCTypes.CategorynfABITy);
6602 values.addInt(ObjCTypes.IntTy, Size);
6604 llvm::GlobalVariable *GCATV =
6605 finishAndCreateGlobal(values, ExtCatName.str(), CGM);
6606 CGM.addCompilerUsedGlobal(GCATV);
6607 if (Interface->hasAttr<ObjCClassStubAttr>())
6608 DefinedStubCategories.push_back(GCATV);
6610 DefinedCategories.push_back(GCATV);
6612 // Determine if this category is also "non-lazy".
6613 if (ImplementationIsNonLazy(OCD))
6614 DefinedNonLazyCategories.push_back(GCATV);
6615 // method definition entries must be clear for next implementation.
6616 MethodDefinitions.clear();
6619 /// emitMethodConstant - Return a struct objc_method constant. If
6620 /// forProtocol is true, the implementation will be null; otherwise,
6621 /// the method must have a definition registered with the runtime.
6623 /// struct _objc_method {
6625 /// char *method_type;
6628 void CGObjCNonFragileABIMac::emitMethodConstant(ConstantArrayBuilder &builder,
6629 const ObjCMethodDecl *MD,
6631 auto method = builder.beginStruct(ObjCTypes.MethodTy);
6632 method.addBitCast(GetMethodVarName(MD->getSelector()),
6633 ObjCTypes.SelectorPtrTy);
6634 method.add(GetMethodVarType(MD));
6637 // Protocol methods have no implementation. So, this entry is always NULL.
6638 method.addNullPointer(ObjCTypes.Int8PtrTy);
6640 llvm::Function *fn = GetMethodDefinition(MD);
6641 assert(fn && "no definition for method?");
6642 method.addBitCast(fn, ObjCTypes.Int8PtrTy);
6645 method.finishAndAddTo(builder);
6648 /// Build meta-data for method declarations.
6650 /// struct _method_list_t {
6651 /// uint32_t entsize; // sizeof(struct _objc_method)
6652 /// uint32_t method_count;
6653 /// struct _objc_method method_list[method_count];
6657 CGObjCNonFragileABIMac::emitMethodList(Twine name, MethodListType kind,
6658 ArrayRef<const ObjCMethodDecl *> methods) {
6659 // Return null for empty list.
6660 if (methods.empty())
6661 return llvm::Constant::getNullValue(ObjCTypes.MethodListnfABIPtrTy);
6666 case MethodListType::CategoryInstanceMethods:
6667 prefix = "_OBJC_$_CATEGORY_INSTANCE_METHODS_";
6668 forProtocol = false;
6670 case MethodListType::CategoryClassMethods:
6671 prefix = "_OBJC_$_CATEGORY_CLASS_METHODS_";
6672 forProtocol = false;
6674 case MethodListType::InstanceMethods:
6675 prefix = "_OBJC_$_INSTANCE_METHODS_";
6676 forProtocol = false;
6678 case MethodListType::ClassMethods:
6679 prefix = "_OBJC_$_CLASS_METHODS_";
6680 forProtocol = false;
6683 case MethodListType::ProtocolInstanceMethods:
6684 prefix = "_OBJC_$_PROTOCOL_INSTANCE_METHODS_";
6687 case MethodListType::ProtocolClassMethods:
6688 prefix = "_OBJC_$_PROTOCOL_CLASS_METHODS_";
6691 case MethodListType::OptionalProtocolInstanceMethods:
6692 prefix = "_OBJC_$_PROTOCOL_INSTANCE_METHODS_OPT_";
6695 case MethodListType::OptionalProtocolClassMethods:
6696 prefix = "_OBJC_$_PROTOCOL_CLASS_METHODS_OPT_";
6701 ConstantInitBuilder builder(CGM);
6702 auto values = builder.beginStruct();
6704 // sizeof(struct _objc_method)
6705 unsigned Size = CGM.getDataLayout().getTypeAllocSize(ObjCTypes.MethodTy);
6706 values.addInt(ObjCTypes.IntTy, Size);
6708 values.addInt(ObjCTypes.IntTy, methods.size());
6709 auto methodArray = values.beginArray(ObjCTypes.MethodTy);
6710 for (auto MD : methods) {
6711 emitMethodConstant(methodArray, MD, forProtocol);
6713 methodArray.finishAndAddTo(values);
6715 llvm::GlobalVariable *GV = finishAndCreateGlobal(values, prefix + name, CGM);
6716 CGM.addCompilerUsedGlobal(GV);
6717 return llvm::ConstantExpr::getBitCast(GV, ObjCTypes.MethodListnfABIPtrTy);
6720 /// ObjCIvarOffsetVariable - Returns the ivar offset variable for
6722 llvm::GlobalVariable *
6723 CGObjCNonFragileABIMac::ObjCIvarOffsetVariable(const ObjCInterfaceDecl *ID,
6724 const ObjCIvarDecl *Ivar) {
6725 const ObjCInterfaceDecl *Container = Ivar->getContainingInterface();
6726 llvm::SmallString<64> Name("OBJC_IVAR_$_");
6727 Name += Container->getObjCRuntimeNameAsString();
6729 Name += Ivar->getName();
6730 llvm::GlobalVariable *IvarOffsetGV = CGM.getModule().getGlobalVariable(Name);
6731 if (!IvarOffsetGV) {
6733 new llvm::GlobalVariable(CGM.getModule(), ObjCTypes.IvarOffsetVarTy,
6734 false, llvm::GlobalValue::ExternalLinkage,
6735 nullptr, Name.str());
6736 if (CGM.getTriple().isOSBinFormatCOFF()) {
6737 bool IsPrivateOrPackage =
6738 Ivar->getAccessControl() == ObjCIvarDecl::Private ||
6739 Ivar->getAccessControl() == ObjCIvarDecl::Package;
6741 const ObjCInterfaceDecl *ContainingID = Ivar->getContainingInterface();
6743 if (ContainingID->hasAttr<DLLImportAttr>())
6745 ->setDLLStorageClass(llvm::GlobalValue::DLLImportStorageClass);
6746 else if (ContainingID->hasAttr<DLLExportAttr>() && !IsPrivateOrPackage)
6748 ->setDLLStorageClass(llvm::GlobalValue::DLLExportStorageClass);
6751 return IvarOffsetGV;
6755 CGObjCNonFragileABIMac::EmitIvarOffsetVar(const ObjCInterfaceDecl *ID,
6756 const ObjCIvarDecl *Ivar,
6757 unsigned long int Offset) {
6758 llvm::GlobalVariable *IvarOffsetGV = ObjCIvarOffsetVariable(ID, Ivar);
6759 IvarOffsetGV->setInitializer(
6760 llvm::ConstantInt::get(ObjCTypes.IvarOffsetVarTy, Offset));
6761 IvarOffsetGV->setAlignment(llvm::Align(
6762 CGM.getDataLayout().getABITypeAlignment(ObjCTypes.IvarOffsetVarTy)));
6764 if (!CGM.getTriple().isOSBinFormatCOFF()) {
6765 // FIXME: This matches gcc, but shouldn't the visibility be set on the use
6766 // as well (i.e., in ObjCIvarOffsetVariable).
6767 if (Ivar->getAccessControl() == ObjCIvarDecl::Private ||
6768 Ivar->getAccessControl() == ObjCIvarDecl::Package ||
6769 ID->getVisibility() == HiddenVisibility)
6770 IvarOffsetGV->setVisibility(llvm::GlobalValue::HiddenVisibility);
6772 IvarOffsetGV->setVisibility(llvm::GlobalValue::DefaultVisibility);
6775 // If ID's layout is known, then make the global constant. This serves as a
6776 // useful assertion: we'll never use this variable to calculate ivar offsets,
6777 // so if the runtime tries to patch it then we should crash.
6778 if (isClassLayoutKnownStatically(ID))
6779 IvarOffsetGV->setConstant(true);
6781 if (CGM.getTriple().isOSBinFormatMachO())
6782 IvarOffsetGV->setSection("__DATA, __objc_ivar");
6783 return IvarOffsetGV;
6786 /// EmitIvarList - Emit the ivar list for the given
6787 /// implementation. The return value has type
6788 /// IvarListnfABIPtrTy.
6789 /// struct _ivar_t {
6790 /// unsigned [long] int *offset; // pointer to ivar offset location
6793 /// uint32_t alignment;
6796 /// struct _ivar_list_t {
6797 /// uint32 entsize; // sizeof(struct _ivar_t)
6799 /// struct _iver_t list[count];
6803 llvm::Constant *CGObjCNonFragileABIMac::EmitIvarList(
6804 const ObjCImplementationDecl *ID) {
6806 ConstantInitBuilder builder(CGM);
6807 auto ivarList = builder.beginStruct();
6808 ivarList.addInt(ObjCTypes.IntTy,
6809 CGM.getDataLayout().getTypeAllocSize(ObjCTypes.IvarnfABITy));
6810 auto ivarCountSlot = ivarList.addPlaceholder();
6811 auto ivars = ivarList.beginArray(ObjCTypes.IvarnfABITy);
6813 const ObjCInterfaceDecl *OID = ID->getClassInterface();
6814 assert(OID && "CGObjCNonFragileABIMac::EmitIvarList - null interface");
6816 // FIXME. Consolidate this with similar code in GenerateClass.
6818 for (const ObjCIvarDecl *IVD = OID->all_declared_ivar_begin();
6819 IVD; IVD = IVD->getNextIvar()) {
6820 // Ignore unnamed bit-fields.
6821 if (!IVD->getDeclName())
6824 auto ivar = ivars.beginStruct(ObjCTypes.IvarnfABITy);
6825 ivar.add(EmitIvarOffsetVar(ID->getClassInterface(), IVD,
6826 ComputeIvarBaseOffset(CGM, ID, IVD)));
6827 ivar.add(GetMethodVarName(IVD->getIdentifier()));
6828 ivar.add(GetMethodVarType(IVD));
6829 llvm::Type *FieldTy =
6830 CGM.getTypes().ConvertTypeForMem(IVD->getType());
6831 unsigned Size = CGM.getDataLayout().getTypeAllocSize(FieldTy);
6832 unsigned Align = CGM.getContext().getPreferredTypeAlign(
6833 IVD->getType().getTypePtr()) >> 3;
6834 Align = llvm::Log2_32(Align);
6835 ivar.addInt(ObjCTypes.IntTy, Align);
6836 // NOTE. Size of a bitfield does not match gcc's, because of the
6837 // way bitfields are treated special in each. But I am told that
6838 // 'size' for bitfield ivars is ignored by the runtime so it does
6839 // not matter. If it matters, there is enough info to get the
6841 ivar.addInt(ObjCTypes.IntTy, Size);
6842 ivar.finishAndAddTo(ivars);
6844 // Return null for empty list.
6845 if (ivars.empty()) {
6848 return llvm::Constant::getNullValue(ObjCTypes.IvarListnfABIPtrTy);
6851 auto ivarCount = ivars.size();
6852 ivars.finishAndAddTo(ivarList);
6853 ivarList.fillPlaceholderWithInt(ivarCountSlot, ObjCTypes.IntTy, ivarCount);
6855 const char *Prefix = "_OBJC_$_INSTANCE_VARIABLES_";
6856 llvm::GlobalVariable *GV = finishAndCreateGlobal(
6857 ivarList, Prefix + OID->getObjCRuntimeNameAsString(), CGM);
6858 CGM.addCompilerUsedGlobal(GV);
6859 return llvm::ConstantExpr::getBitCast(GV, ObjCTypes.IvarListnfABIPtrTy);
6862 llvm::Constant *CGObjCNonFragileABIMac::GetOrEmitProtocolRef(
6863 const ObjCProtocolDecl *PD) {
6864 llvm::GlobalVariable *&Entry = Protocols[PD->getIdentifier()];
6867 // We use the initializer as a marker of whether this is a forward
6868 // reference or not. At module finalization we add the empty
6869 // contents for protocols which were referenced but never defined.
6870 llvm::SmallString<64> Protocol;
6871 llvm::raw_svector_ostream(Protocol) << "_OBJC_PROTOCOL_$_"
6872 << PD->getObjCRuntimeNameAsString();
6874 Entry = new llvm::GlobalVariable(CGM.getModule(), ObjCTypes.ProtocolnfABITy,
6875 false, llvm::GlobalValue::ExternalLinkage,
6877 if (!CGM.getTriple().isOSBinFormatMachO())
6878 Entry->setComdat(CGM.getModule().getOrInsertComdat(Protocol));
6884 /// GetOrEmitProtocol - Generate the protocol meta-data:
6886 /// struct _protocol_t {
6888 /// const char * const protocol_name;
6889 /// const struct _protocol_list_t * protocol_list; // super protocols
6890 /// const struct method_list_t * const instance_methods;
6891 /// const struct method_list_t * const class_methods;
6892 /// const struct method_list_t *optionalInstanceMethods;
6893 /// const struct method_list_t *optionalClassMethods;
6894 /// const struct _prop_list_t * properties;
6895 /// const uint32_t size; // sizeof(struct _protocol_t)
6896 /// const uint32_t flags; // = 0
6897 /// const char ** extendedMethodTypes;
6898 /// const char *demangledName;
6899 /// const struct _prop_list_t * class_properties;
6904 llvm::Constant *CGObjCNonFragileABIMac::GetOrEmitProtocol(
6905 const ObjCProtocolDecl *PD) {
6906 llvm::GlobalVariable *Entry = Protocols[PD->getIdentifier()];
6908 // Early exit if a defining object has already been generated.
6909 if (Entry && Entry->hasInitializer())
6912 // Use the protocol definition, if there is one.
6913 assert(PD->hasDefinition() &&
6914 "emitting protocol metadata without definition");
6915 PD = PD->getDefinition();
6917 auto methodLists = ProtocolMethodLists::get(PD);
6919 ConstantInitBuilder builder(CGM);
6920 auto values = builder.beginStruct(ObjCTypes.ProtocolnfABITy);
6923 values.addNullPointer(ObjCTypes.ObjectPtrTy);
6924 values.add(GetClassName(PD->getObjCRuntimeNameAsString()));
6925 values.add(EmitProtocolList("_OBJC_$_PROTOCOL_REFS_"
6926 + PD->getObjCRuntimeNameAsString(),
6927 PD->protocol_begin(),
6928 PD->protocol_end()));
6929 values.add(methodLists.emitMethodList(this, PD,
6930 ProtocolMethodLists::RequiredInstanceMethods));
6931 values.add(methodLists.emitMethodList(this, PD,
6932 ProtocolMethodLists::RequiredClassMethods));
6933 values.add(methodLists.emitMethodList(this, PD,
6934 ProtocolMethodLists::OptionalInstanceMethods));
6935 values.add(methodLists.emitMethodList(this, PD,
6936 ProtocolMethodLists::OptionalClassMethods));
6937 values.add(EmitPropertyList(
6938 "_OBJC_$_PROP_LIST_" + PD->getObjCRuntimeNameAsString(),
6939 nullptr, PD, ObjCTypes, false));
6941 CGM.getDataLayout().getTypeAllocSize(ObjCTypes.ProtocolnfABITy);
6942 values.addInt(ObjCTypes.IntTy, Size);
6943 values.addInt(ObjCTypes.IntTy, 0);
6944 values.add(EmitProtocolMethodTypes("_OBJC_$_PROTOCOL_METHOD_TYPES_"
6945 + PD->getObjCRuntimeNameAsString(),
6946 methodLists.emitExtendedTypesArray(this),
6949 // const char *demangledName;
6950 values.addNullPointer(ObjCTypes.Int8PtrTy);
6952 values.add(EmitPropertyList(
6953 "_OBJC_$_CLASS_PROP_LIST_" + PD->getObjCRuntimeNameAsString(),
6954 nullptr, PD, ObjCTypes, true));
6957 // Already created, fix the linkage and update the initializer.
6958 Entry->setLinkage(llvm::GlobalValue::WeakAnyLinkage);
6959 values.finishAndSetAsInitializer(Entry);
6961 llvm::SmallString<64> symbolName;
6962 llvm::raw_svector_ostream(symbolName)
6963 << "_OBJC_PROTOCOL_$_" << PD->getObjCRuntimeNameAsString();
6965 Entry = values.finishAndCreateGlobal(symbolName, CGM.getPointerAlign(),
6967 llvm::GlobalValue::WeakAnyLinkage);
6968 if (!CGM.getTriple().isOSBinFormatMachO())
6969 Entry->setComdat(CGM.getModule().getOrInsertComdat(symbolName));
6971 Protocols[PD->getIdentifier()] = Entry;
6973 Entry->setVisibility(llvm::GlobalValue::HiddenVisibility);
6974 CGM.addUsedGlobal(Entry);
6976 // Use this protocol meta-data to build protocol list table in section
6977 // __DATA, __objc_protolist
6978 llvm::SmallString<64> ProtocolRef;
6979 llvm::raw_svector_ostream(ProtocolRef) << "_OBJC_LABEL_PROTOCOL_$_"
6980 << PD->getObjCRuntimeNameAsString();
6982 llvm::GlobalVariable *PTGV =
6983 new llvm::GlobalVariable(CGM.getModule(), ObjCTypes.ProtocolnfABIPtrTy,
6984 false, llvm::GlobalValue::WeakAnyLinkage, Entry,
6986 if (!CGM.getTriple().isOSBinFormatMachO())
6987 PTGV->setComdat(CGM.getModule().getOrInsertComdat(ProtocolRef));
6988 PTGV->setAlignment(llvm::Align(
6989 CGM.getDataLayout().getABITypeAlignment(ObjCTypes.ProtocolnfABIPtrTy)));
6990 PTGV->setSection(GetSectionName("__objc_protolist",
6991 "coalesced,no_dead_strip"));
6992 PTGV->setVisibility(llvm::GlobalValue::HiddenVisibility);
6993 CGM.addUsedGlobal(PTGV);
6997 /// EmitProtocolList - Generate protocol list meta-data:
6999 /// struct _protocol_list_t {
7000 /// long protocol_count; // Note, this is 32/64 bit
7001 /// struct _protocol_t[protocol_count];
7006 CGObjCNonFragileABIMac::EmitProtocolList(Twine Name,
7007 ObjCProtocolDecl::protocol_iterator begin,
7008 ObjCProtocolDecl::protocol_iterator end) {
7009 SmallVector<llvm::Constant *, 16> ProtocolRefs;
7011 // Just return null for empty protocol lists
7013 return llvm::Constant::getNullValue(ObjCTypes.ProtocolListnfABIPtrTy);
7015 // FIXME: We shouldn't need to do this lookup here, should we?
7016 SmallString<256> TmpName;
7017 Name.toVector(TmpName);
7018 llvm::GlobalVariable *GV =
7019 CGM.getModule().getGlobalVariable(TmpName.str(), true);
7021 return llvm::ConstantExpr::getBitCast(GV, ObjCTypes.ProtocolListnfABIPtrTy);
7023 ConstantInitBuilder builder(CGM);
7024 auto values = builder.beginStruct();
7025 auto countSlot = values.addPlaceholder();
7027 // A null-terminated array of protocols.
7028 auto array = values.beginArray(ObjCTypes.ProtocolnfABIPtrTy);
7029 for (; begin != end; ++begin)
7030 array.add(GetProtocolRef(*begin)); // Implemented???
7031 auto count = array.size();
7032 array.addNullPointer(ObjCTypes.ProtocolnfABIPtrTy);
7034 array.finishAndAddTo(values);
7035 values.fillPlaceholderWithInt(countSlot, ObjCTypes.LongTy, count);
7037 GV = finishAndCreateGlobal(values, Name, CGM);
7038 CGM.addCompilerUsedGlobal(GV);
7039 return llvm::ConstantExpr::getBitCast(GV,
7040 ObjCTypes.ProtocolListnfABIPtrTy);
7043 /// EmitObjCValueForIvar - Code Gen for nonfragile ivar reference.
7044 /// This code gen. amounts to generating code for:
7046 /// (type *)((char *)base + _OBJC_IVAR_$_.ivar;
7049 LValue CGObjCNonFragileABIMac::EmitObjCValueForIvar(
7050 CodeGen::CodeGenFunction &CGF,
7052 llvm::Value *BaseValue,
7053 const ObjCIvarDecl *Ivar,
7054 unsigned CVRQualifiers) {
7055 ObjCInterfaceDecl *ID = ObjectTy->castAs<ObjCObjectType>()->getInterface();
7056 llvm::Value *Offset = EmitIvarOffset(CGF, ID, Ivar);
7057 return EmitValueForIvarAtOffset(CGF, ID, BaseValue, Ivar, CVRQualifiers,
7062 CGObjCNonFragileABIMac::EmitIvarOffset(CodeGen::CodeGenFunction &CGF,
7063 const ObjCInterfaceDecl *Interface,
7064 const ObjCIvarDecl *Ivar) {
7065 llvm::Value *IvarOffsetValue;
7066 if (isClassLayoutKnownStatically(Interface)) {
7067 IvarOffsetValue = llvm::ConstantInt::get(
7068 ObjCTypes.IvarOffsetVarTy,
7069 ComputeIvarBaseOffset(CGM, Interface->getImplementation(), Ivar));
7071 llvm::GlobalVariable *GV = ObjCIvarOffsetVariable(Interface, Ivar);
7073 CGF.Builder.CreateAlignedLoad(GV, CGF.getSizeAlign(), "ivar");
7074 if (IsIvarOffsetKnownIdempotent(CGF, Ivar))
7075 cast<llvm::LoadInst>(IvarOffsetValue)
7076 ->setMetadata(CGM.getModule().getMDKindID("invariant.load"),
7077 llvm::MDNode::get(VMContext, None));
7080 // This could be 32bit int or 64bit integer depending on the architecture.
7081 // Cast it to 64bit integer value, if it is a 32bit integer ivar offset value
7082 // as this is what caller always expects.
7083 if (ObjCTypes.IvarOffsetVarTy == ObjCTypes.IntTy)
7084 IvarOffsetValue = CGF.Builder.CreateIntCast(
7085 IvarOffsetValue, ObjCTypes.LongTy, true, "ivar.conv");
7086 return IvarOffsetValue;
7089 static void appendSelectorForMessageRefTable(std::string &buffer,
7090 Selector selector) {
7091 if (selector.isUnarySelector()) {
7092 buffer += selector.getNameForSlot(0);
7096 for (unsigned i = 0, e = selector.getNumArgs(); i != e; ++i) {
7097 buffer += selector.getNameForSlot(i);
7102 /// Emit a "vtable" message send. We emit a weak hidden-visibility
7103 /// struct, initially containing the selector pointer and a pointer to
7104 /// a "fixup" variant of the appropriate objc_msgSend. To call, we
7105 /// load and call the function pointer, passing the address of the
7106 /// struct as the second parameter. The runtime determines whether
7107 /// the selector is currently emitted using vtable dispatch; if so, it
7108 /// substitutes a stub function which simply tail-calls through the
7109 /// appropriate vtable slot, and if not, it substitues a stub function
7110 /// which tail-calls objc_msgSend. Both stubs adjust the selector
7111 /// argument to correctly point to the selector.
7113 CGObjCNonFragileABIMac::EmitVTableMessageSend(CodeGenFunction &CGF,
7114 ReturnValueSlot returnSlot,
7115 QualType resultType,
7120 const CallArgList &formalArgs,
7121 const ObjCMethodDecl *method) {
7122 // Compute the actual arguments.
7125 // First argument: the receiver / super-call structure.
7127 arg0 = CGF.Builder.CreateBitCast(arg0, ObjCTypes.ObjectPtrTy);
7128 args.add(RValue::get(arg0), arg0Type);
7130 // Second argument: a pointer to the message ref structure. Leave
7131 // the actual argument value blank for now.
7132 args.add(RValue::get(nullptr), ObjCTypes.MessageRefCPtrTy);
7134 args.insert(args.end(), formalArgs.begin(), formalArgs.end());
7136 MessageSendInfo MSI = getMessageSendInfo(method, resultType, args);
7138 NullReturnState nullReturn;
7140 // Find the function to call and the mangled name for the message
7141 // ref structure. Using a different mangled name wouldn't actually
7142 // be a problem; it would just be a waste.
7144 // The runtime currently never uses vtable dispatch for anything
7145 // except normal, non-super message-sends.
7146 // FIXME: don't use this for that.
7147 llvm::FunctionCallee fn = nullptr;
7148 std::string messageRefName("_");
7149 if (CGM.ReturnSlotInterferesWithArgs(MSI.CallInfo)) {
7151 fn = ObjCTypes.getMessageSendSuper2StretFixupFn();
7152 messageRefName += "objc_msgSendSuper2_stret_fixup";
7154 nullReturn.init(CGF, arg0);
7155 fn = ObjCTypes.getMessageSendStretFixupFn();
7156 messageRefName += "objc_msgSend_stret_fixup";
7158 } else if (!isSuper && CGM.ReturnTypeUsesFPRet(resultType)) {
7159 fn = ObjCTypes.getMessageSendFpretFixupFn();
7160 messageRefName += "objc_msgSend_fpret_fixup";
7163 fn = ObjCTypes.getMessageSendSuper2FixupFn();
7164 messageRefName += "objc_msgSendSuper2_fixup";
7166 fn = ObjCTypes.getMessageSendFixupFn();
7167 messageRefName += "objc_msgSend_fixup";
7170 assert(fn && "CGObjCNonFragileABIMac::EmitMessageSend");
7171 messageRefName += '_';
7173 // Append the selector name, except use underscores anywhere we
7174 // would have used colons.
7175 appendSelectorForMessageRefTable(messageRefName, selector);
7177 llvm::GlobalVariable *messageRef
7178 = CGM.getModule().getGlobalVariable(messageRefName);
7180 // Build the message ref structure.
7181 ConstantInitBuilder builder(CGM);
7182 auto values = builder.beginStruct();
7183 values.add(cast<llvm::Constant>(fn.getCallee()));
7184 values.add(GetMethodVarName(selector));
7185 messageRef = values.finishAndCreateGlobal(messageRefName,
7186 CharUnits::fromQuantity(16),
7188 llvm::GlobalValue::WeakAnyLinkage);
7189 messageRef->setVisibility(llvm::GlobalValue::HiddenVisibility);
7190 messageRef->setSection(GetSectionName("__objc_msgrefs", "coalesced"));
7193 bool requiresnullCheck = false;
7194 if (CGM.getLangOpts().ObjCAutoRefCount && method)
7195 for (const auto *ParamDecl : method->parameters()) {
7196 if (ParamDecl->hasAttr<NSConsumedAttr>()) {
7197 if (!nullReturn.NullBB)
7198 nullReturn.init(CGF, arg0);
7199 requiresnullCheck = true;
7205 Address(CGF.Builder.CreateBitCast(messageRef, ObjCTypes.MessageRefPtrTy),
7206 CGF.getPointerAlign());
7208 // Update the message ref argument.
7209 args[1].setRValue(RValue::get(mref.getPointer()));
7211 // Load the function to call from the message ref table.
7212 Address calleeAddr = CGF.Builder.CreateStructGEP(mref, 0);
7213 llvm::Value *calleePtr = CGF.Builder.CreateLoad(calleeAddr, "msgSend_fn");
7215 calleePtr = CGF.Builder.CreateBitCast(calleePtr, MSI.MessengerType);
7216 CGCallee callee(CGCalleeInfo(), calleePtr);
7218 RValue result = CGF.EmitCall(MSI.CallInfo, callee, returnSlot, args);
7219 return nullReturn.complete(CGF, returnSlot, result, resultType, formalArgs,
7220 requiresnullCheck ? method : nullptr);
7223 /// Generate code for a message send expression in the nonfragile abi.
7225 CGObjCNonFragileABIMac::GenerateMessageSend(CodeGen::CodeGenFunction &CGF,
7226 ReturnValueSlot Return,
7227 QualType ResultType,
7229 llvm::Value *Receiver,
7230 const CallArgList &CallArgs,
7231 const ObjCInterfaceDecl *Class,
7232 const ObjCMethodDecl *Method) {
7233 return isVTableDispatchedSelector(Sel)
7234 ? EmitVTableMessageSend(CGF, Return, ResultType, Sel,
7235 Receiver, CGF.getContext().getObjCIdType(),
7236 false, CallArgs, Method)
7237 : EmitMessageSend(CGF, Return, ResultType,
7238 EmitSelector(CGF, Sel),
7239 Receiver, CGF.getContext().getObjCIdType(),
7240 false, CallArgs, Method, Class, ObjCTypes);
7244 CGObjCNonFragileABIMac::GetClassGlobal(const ObjCInterfaceDecl *ID,
7246 ForDefinition_t isForDefinition) {
7248 (metaclass ? getMetaclassSymbolPrefix() : getClassSymbolPrefix());
7249 return GetClassGlobal((prefix + ID->getObjCRuntimeNameAsString()).str(),
7251 ID->isWeakImported(),
7253 && CGM.getTriple().isOSBinFormatCOFF()
7254 && ID->hasAttr<DLLImportAttr>());
7258 CGObjCNonFragileABIMac::GetClassGlobal(StringRef Name,
7259 ForDefinition_t IsForDefinition,
7260 bool Weak, bool DLLImport) {
7261 llvm::GlobalValue::LinkageTypes L =
7262 Weak ? llvm::GlobalValue::ExternalWeakLinkage
7263 : llvm::GlobalValue::ExternalLinkage;
7265 llvm::GlobalVariable *GV = CGM.getModule().getGlobalVariable(Name);
7266 if (!GV || GV->getType() != ObjCTypes.ClassnfABITy->getPointerTo()) {
7267 auto *NewGV = new llvm::GlobalVariable(ObjCTypes.ClassnfABITy, false, L,
7271 NewGV->setDLLStorageClass(llvm::GlobalValue::DLLImportStorageClass);
7274 GV->replaceAllUsesWith(
7275 llvm::ConstantExpr::getBitCast(NewGV, GV->getType()));
7276 GV->eraseFromParent();
7279 CGM.getModule().getGlobalList().push_back(GV);
7282 assert(GV->getLinkage() == L);
7287 CGObjCNonFragileABIMac::GetClassGlobalForClassRef(const ObjCInterfaceDecl *ID) {
7288 llvm::Constant *ClassGV = GetClassGlobal(ID, /*metaclass*/ false,
7291 if (!ID->hasAttr<ObjCClassStubAttr>())
7294 ClassGV = llvm::ConstantExpr::getPointerCast(ClassGV, ObjCTypes.Int8PtrTy);
7296 // Stub classes are pointer-aligned. Classrefs pointing at stub classes
7297 // must set the least significant bit set to 1.
7298 auto *Idx = llvm::ConstantInt::get(CGM.Int32Ty, 1);
7299 return llvm::ConstantExpr::getGetElementPtr(CGM.Int8Ty, ClassGV, Idx);
7303 CGObjCNonFragileABIMac::EmitLoadOfClassRef(CodeGenFunction &CGF,
7304 const ObjCInterfaceDecl *ID,
7305 llvm::GlobalVariable *Entry) {
7306 if (ID && ID->hasAttr<ObjCClassStubAttr>()) {
7307 // Classrefs pointing at Objective-C stub classes must be loaded by calling
7308 // a special runtime function.
7309 return CGF.EmitRuntimeCall(
7310 ObjCTypes.getLoadClassrefFn(), Entry, "load_classref_result");
7313 CharUnits Align = CGF.getPointerAlign();
7314 return CGF.Builder.CreateAlignedLoad(Entry, Align);
7318 CGObjCNonFragileABIMac::EmitClassRefFromId(CodeGenFunction &CGF,
7320 const ObjCInterfaceDecl *ID) {
7321 llvm::GlobalVariable *&Entry = ClassReferences[II];
7324 llvm::Constant *ClassGV;
7326 ClassGV = GetClassGlobalForClassRef(ID);
7328 ClassGV = GetClassGlobal((getClassSymbolPrefix() + II->getName()).str(),
7330 assert(ClassGV->getType() == ObjCTypes.ClassnfABIPtrTy &&
7331 "classref was emitted with the wrong type?");
7334 std::string SectionName =
7335 GetSectionName("__objc_classrefs", "regular,no_dead_strip");
7336 Entry = new llvm::GlobalVariable(
7337 CGM.getModule(), ClassGV->getType(), false,
7338 getLinkageTypeForObjCMetadata(CGM, SectionName), ClassGV,
7339 "OBJC_CLASSLIST_REFERENCES_$_");
7340 Entry->setAlignment(CGF.getPointerAlign().getAsAlign());
7341 if (!ID || !ID->hasAttr<ObjCClassStubAttr>())
7342 Entry->setSection(SectionName);
7344 CGM.addCompilerUsedGlobal(Entry);
7347 return EmitLoadOfClassRef(CGF, ID, Entry);
7350 llvm::Value *CGObjCNonFragileABIMac::EmitClassRef(CodeGenFunction &CGF,
7351 const ObjCInterfaceDecl *ID) {
7352 // If the class has the objc_runtime_visible attribute, we need to
7353 // use the Objective-C runtime to get the class.
7354 if (ID->hasAttr<ObjCRuntimeVisibleAttr>())
7355 return EmitClassRefViaRuntime(CGF, ID, ObjCTypes);
7357 return EmitClassRefFromId(CGF, ID->getIdentifier(), ID);
7360 llvm::Value *CGObjCNonFragileABIMac::EmitNSAutoreleasePoolClassRef(
7361 CodeGenFunction &CGF) {
7362 IdentifierInfo *II = &CGM.getContext().Idents.get("NSAutoreleasePool");
7363 return EmitClassRefFromId(CGF, II, nullptr);
7367 CGObjCNonFragileABIMac::EmitSuperClassRef(CodeGenFunction &CGF,
7368 const ObjCInterfaceDecl *ID) {
7369 llvm::GlobalVariable *&Entry = SuperClassReferences[ID->getIdentifier()];
7372 llvm::Constant *ClassGV = GetClassGlobalForClassRef(ID);
7373 std::string SectionName =
7374 GetSectionName("__objc_superrefs", "regular,no_dead_strip");
7375 Entry = new llvm::GlobalVariable(
7376 CGM.getModule(), ClassGV->getType(), false,
7377 getLinkageTypeForObjCMetadata(CGM, SectionName), ClassGV,
7378 "OBJC_CLASSLIST_SUP_REFS_$_");
7379 Entry->setAlignment(CGF.getPointerAlign().getAsAlign());
7380 Entry->setSection(SectionName);
7381 CGM.addCompilerUsedGlobal(Entry);
7384 return EmitLoadOfClassRef(CGF, ID, Entry);
7387 /// EmitMetaClassRef - Return a Value * of the address of _class_t
7390 llvm::Value *CGObjCNonFragileABIMac::EmitMetaClassRef(CodeGenFunction &CGF,
7391 const ObjCInterfaceDecl *ID,
7393 CharUnits Align = CGF.getPointerAlign();
7394 llvm::GlobalVariable * &Entry = MetaClassReferences[ID->getIdentifier()];
7396 auto MetaClassGV = GetClassGlobal(ID, /*metaclass*/ true, NotForDefinition);
7397 std::string SectionName =
7398 GetSectionName("__objc_superrefs", "regular,no_dead_strip");
7399 Entry = new llvm::GlobalVariable(
7400 CGM.getModule(), ObjCTypes.ClassnfABIPtrTy, false,
7401 getLinkageTypeForObjCMetadata(CGM, SectionName), MetaClassGV,
7402 "OBJC_CLASSLIST_SUP_REFS_$_");
7403 Entry->setAlignment(Align.getAsAlign());
7404 Entry->setSection(SectionName);
7405 CGM.addCompilerUsedGlobal(Entry);
7408 return CGF.Builder.CreateAlignedLoad(Entry, Align);
7411 /// GetClass - Return a reference to the class for the given interface
7413 llvm::Value *CGObjCNonFragileABIMac::GetClass(CodeGenFunction &CGF,
7414 const ObjCInterfaceDecl *ID) {
7415 if (ID->isWeakImported()) {
7416 auto ClassGV = GetClassGlobal(ID, /*metaclass*/ false, NotForDefinition);
7418 assert(!isa<llvm::GlobalVariable>(ClassGV) ||
7419 cast<llvm::GlobalVariable>(ClassGV)->hasExternalWeakLinkage());
7422 return EmitClassRef(CGF, ID);
7425 /// Generates a message send where the super is the receiver. This is
7426 /// a message send to self with special delivery semantics indicating
7427 /// which class's method should be called.
7429 CGObjCNonFragileABIMac::GenerateMessageSendSuper(CodeGen::CodeGenFunction &CGF,
7430 ReturnValueSlot Return,
7431 QualType ResultType,
7433 const ObjCInterfaceDecl *Class,
7434 bool isCategoryImpl,
7435 llvm::Value *Receiver,
7436 bool IsClassMessage,
7437 const CodeGen::CallArgList &CallArgs,
7438 const ObjCMethodDecl *Method) {
7440 // Create and init a super structure; this is a (receiver, class)
7441 // pair we will pass to objc_msgSendSuper.
7443 CGF.CreateTempAlloca(ObjCTypes.SuperTy, CGF.getPointerAlign(),
7446 llvm::Value *ReceiverAsObject =
7447 CGF.Builder.CreateBitCast(Receiver, ObjCTypes.ObjectPtrTy);
7448 CGF.Builder.CreateStore(ReceiverAsObject,
7449 CGF.Builder.CreateStructGEP(ObjCSuper, 0));
7451 // If this is a class message the metaclass is passed as the target.
7452 llvm::Value *Target;
7454 Target = EmitMetaClassRef(CGF, Class, Class->isWeakImported());
7456 Target = EmitSuperClassRef(CGF, Class);
7458 // FIXME: We shouldn't need to do this cast, rectify the ASTContext and
7460 llvm::Type *ClassTy =
7461 CGM.getTypes().ConvertType(CGF.getContext().getObjCClassType());
7462 Target = CGF.Builder.CreateBitCast(Target, ClassTy);
7463 CGF.Builder.CreateStore(Target, CGF.Builder.CreateStructGEP(ObjCSuper, 1));
7465 return (isVTableDispatchedSelector(Sel))
7466 ? EmitVTableMessageSend(CGF, Return, ResultType, Sel,
7467 ObjCSuper.getPointer(), ObjCTypes.SuperPtrCTy,
7468 true, CallArgs, Method)
7469 : EmitMessageSend(CGF, Return, ResultType,
7470 EmitSelector(CGF, Sel),
7471 ObjCSuper.getPointer(), ObjCTypes.SuperPtrCTy,
7472 true, CallArgs, Method, Class, ObjCTypes);
7475 llvm::Value *CGObjCNonFragileABIMac::EmitSelector(CodeGenFunction &CGF,
7477 Address Addr = EmitSelectorAddr(CGF, Sel);
7479 llvm::LoadInst* LI = CGF.Builder.CreateLoad(Addr);
7480 LI->setMetadata(CGM.getModule().getMDKindID("invariant.load"),
7481 llvm::MDNode::get(VMContext, None));
7485 Address CGObjCNonFragileABIMac::EmitSelectorAddr(CodeGenFunction &CGF,
7487 llvm::GlobalVariable *&Entry = SelectorReferences[Sel];
7489 CharUnits Align = CGF.getPointerAlign();
7491 llvm::Constant *Casted =
7492 llvm::ConstantExpr::getBitCast(GetMethodVarName(Sel),
7493 ObjCTypes.SelectorPtrTy);
7494 std::string SectionName =
7495 GetSectionName("__objc_selrefs", "literal_pointers,no_dead_strip");
7496 Entry = new llvm::GlobalVariable(
7497 CGM.getModule(), ObjCTypes.SelectorPtrTy, false,
7498 getLinkageTypeForObjCMetadata(CGM, SectionName), Casted,
7499 "OBJC_SELECTOR_REFERENCES_");
7500 Entry->setExternallyInitialized(true);
7501 Entry->setSection(SectionName);
7502 Entry->setAlignment(Align.getAsAlign());
7503 CGM.addCompilerUsedGlobal(Entry);
7506 return Address(Entry, Align);
7509 /// EmitObjCIvarAssign - Code gen for assigning to a __strong object.
7510 /// objc_assign_ivar (id src, id *dst, ptrdiff_t)
7512 void CGObjCNonFragileABIMac::EmitObjCIvarAssign(CodeGen::CodeGenFunction &CGF,
7515 llvm::Value *ivarOffset) {
7516 llvm::Type * SrcTy = src->getType();
7517 if (!isa<llvm::PointerType>(SrcTy)) {
7518 unsigned Size = CGM.getDataLayout().getTypeAllocSize(SrcTy);
7519 assert(Size <= 8 && "does not support size > 8");
7520 src = (Size == 4 ? CGF.Builder.CreateBitCast(src, ObjCTypes.IntTy)
7521 : CGF.Builder.CreateBitCast(src, ObjCTypes.LongTy));
7522 src = CGF.Builder.CreateIntToPtr(src, ObjCTypes.Int8PtrTy);
7524 src = CGF.Builder.CreateBitCast(src, ObjCTypes.ObjectPtrTy);
7525 dst = CGF.Builder.CreateBitCast(dst, ObjCTypes.PtrObjectPtrTy);
7526 llvm::Value *args[] = { src, dst.getPointer(), ivarOffset };
7527 CGF.EmitNounwindRuntimeCall(ObjCTypes.getGcAssignIvarFn(), args);
7530 /// EmitObjCStrongCastAssign - Code gen for assigning to a __strong cast object.
7531 /// objc_assign_strongCast (id src, id *dst)
7533 void CGObjCNonFragileABIMac::EmitObjCStrongCastAssign(
7534 CodeGen::CodeGenFunction &CGF,
7535 llvm::Value *src, Address dst) {
7536 llvm::Type * SrcTy = src->getType();
7537 if (!isa<llvm::PointerType>(SrcTy)) {
7538 unsigned Size = CGM.getDataLayout().getTypeAllocSize(SrcTy);
7539 assert(Size <= 8 && "does not support size > 8");
7540 src = (Size == 4 ? CGF.Builder.CreateBitCast(src, ObjCTypes.IntTy)
7541 : CGF.Builder.CreateBitCast(src, ObjCTypes.LongTy));
7542 src = CGF.Builder.CreateIntToPtr(src, ObjCTypes.Int8PtrTy);
7544 src = CGF.Builder.CreateBitCast(src, ObjCTypes.ObjectPtrTy);
7545 dst = CGF.Builder.CreateBitCast(dst, ObjCTypes.PtrObjectPtrTy);
7546 llvm::Value *args[] = { src, dst.getPointer() };
7547 CGF.EmitNounwindRuntimeCall(ObjCTypes.getGcAssignStrongCastFn(),
7548 args, "weakassign");
7551 void CGObjCNonFragileABIMac::EmitGCMemmoveCollectable(
7552 CodeGen::CodeGenFunction &CGF,
7555 llvm::Value *Size) {
7556 SrcPtr = CGF.Builder.CreateBitCast(SrcPtr, ObjCTypes.Int8PtrTy);
7557 DestPtr = CGF.Builder.CreateBitCast(DestPtr, ObjCTypes.Int8PtrTy);
7558 llvm::Value *args[] = { DestPtr.getPointer(), SrcPtr.getPointer(), Size };
7559 CGF.EmitNounwindRuntimeCall(ObjCTypes.GcMemmoveCollectableFn(), args);
7562 /// EmitObjCWeakRead - Code gen for loading value of a __weak
7563 /// object: objc_read_weak (id *src)
7565 llvm::Value * CGObjCNonFragileABIMac::EmitObjCWeakRead(
7566 CodeGen::CodeGenFunction &CGF,
7567 Address AddrWeakObj) {
7568 llvm::Type *DestTy = AddrWeakObj.getElementType();
7569 AddrWeakObj = CGF.Builder.CreateBitCast(AddrWeakObj, ObjCTypes.PtrObjectPtrTy);
7570 llvm::Value *read_weak =
7571 CGF.EmitNounwindRuntimeCall(ObjCTypes.getGcReadWeakFn(),
7572 AddrWeakObj.getPointer(), "weakread");
7573 read_weak = CGF.Builder.CreateBitCast(read_weak, DestTy);
7577 /// EmitObjCWeakAssign - Code gen for assigning to a __weak object.
7578 /// objc_assign_weak (id src, id *dst)
7580 void CGObjCNonFragileABIMac::EmitObjCWeakAssign(CodeGen::CodeGenFunction &CGF,
7581 llvm::Value *src, Address dst) {
7582 llvm::Type * SrcTy = src->getType();
7583 if (!isa<llvm::PointerType>(SrcTy)) {
7584 unsigned Size = CGM.getDataLayout().getTypeAllocSize(SrcTy);
7585 assert(Size <= 8 && "does not support size > 8");
7586 src = (Size == 4 ? CGF.Builder.CreateBitCast(src, ObjCTypes.IntTy)
7587 : CGF.Builder.CreateBitCast(src, ObjCTypes.LongTy));
7588 src = CGF.Builder.CreateIntToPtr(src, ObjCTypes.Int8PtrTy);
7590 src = CGF.Builder.CreateBitCast(src, ObjCTypes.ObjectPtrTy);
7591 dst = CGF.Builder.CreateBitCast(dst, ObjCTypes.PtrObjectPtrTy);
7592 llvm::Value *args[] = { src, dst.getPointer() };
7593 CGF.EmitNounwindRuntimeCall(ObjCTypes.getGcAssignWeakFn(),
7594 args, "weakassign");
7597 /// EmitObjCGlobalAssign - Code gen for assigning to a __strong object.
7598 /// objc_assign_global (id src, id *dst)
7600 void CGObjCNonFragileABIMac::EmitObjCGlobalAssign(CodeGen::CodeGenFunction &CGF,
7601 llvm::Value *src, Address dst,
7603 llvm::Type * SrcTy = src->getType();
7604 if (!isa<llvm::PointerType>(SrcTy)) {
7605 unsigned Size = CGM.getDataLayout().getTypeAllocSize(SrcTy);
7606 assert(Size <= 8 && "does not support size > 8");
7607 src = (Size == 4 ? CGF.Builder.CreateBitCast(src, ObjCTypes.IntTy)
7608 : CGF.Builder.CreateBitCast(src, ObjCTypes.LongTy));
7609 src = CGF.Builder.CreateIntToPtr(src, ObjCTypes.Int8PtrTy);
7611 src = CGF.Builder.CreateBitCast(src, ObjCTypes.ObjectPtrTy);
7612 dst = CGF.Builder.CreateBitCast(dst, ObjCTypes.PtrObjectPtrTy);
7613 llvm::Value *args[] = { src, dst.getPointer() };
7615 CGF.EmitNounwindRuntimeCall(ObjCTypes.getGcAssignGlobalFn(),
7616 args, "globalassign");
7618 CGF.EmitNounwindRuntimeCall(ObjCTypes.getGcAssignThreadLocalFn(),
7619 args, "threadlocalassign");
7623 CGObjCNonFragileABIMac::EmitSynchronizedStmt(CodeGen::CodeGenFunction &CGF,
7624 const ObjCAtSynchronizedStmt &S) {
7625 EmitAtSynchronizedStmt(CGF, S, ObjCTypes.getSyncEnterFn(),
7626 ObjCTypes.getSyncExitFn());
7630 CGObjCNonFragileABIMac::GetEHType(QualType T) {
7631 // There's a particular fixed type info for 'id'.
7632 if (T->isObjCIdType() || T->isObjCQualifiedIdType()) {
7633 auto *IDEHType = CGM.getModule().getGlobalVariable("OBJC_EHTYPE_id");
7636 new llvm::GlobalVariable(CGM.getModule(), ObjCTypes.EHTypeTy, false,
7637 llvm::GlobalValue::ExternalLinkage, nullptr,
7639 if (CGM.getTriple().isOSBinFormatCOFF())
7640 IDEHType->setDLLStorageClass(getStorage(CGM, "OBJC_EHTYPE_id"));
7645 // All other types should be Objective-C interface pointer types.
7646 const ObjCObjectPointerType *PT = T->getAs<ObjCObjectPointerType>();
7647 assert(PT && "Invalid @catch type.");
7649 const ObjCInterfaceType *IT = PT->getInterfaceType();
7650 assert(IT && "Invalid @catch type.");
7652 return GetInterfaceEHType(IT->getDecl(), NotForDefinition);
7655 void CGObjCNonFragileABIMac::EmitTryStmt(CodeGen::CodeGenFunction &CGF,
7656 const ObjCAtTryStmt &S) {
7657 EmitTryCatchStmt(CGF, S, ObjCTypes.getObjCBeginCatchFn(),
7658 ObjCTypes.getObjCEndCatchFn(),
7659 ObjCTypes.getExceptionRethrowFn());
7662 /// EmitThrowStmt - Generate code for a throw statement.
7663 void CGObjCNonFragileABIMac::EmitThrowStmt(CodeGen::CodeGenFunction &CGF,
7664 const ObjCAtThrowStmt &S,
7665 bool ClearInsertionPoint) {
7666 if (const Expr *ThrowExpr = S.getThrowExpr()) {
7667 llvm::Value *Exception = CGF.EmitObjCThrowOperand(ThrowExpr);
7668 Exception = CGF.Builder.CreateBitCast(Exception, ObjCTypes.ObjectPtrTy);
7669 llvm::CallBase *Call =
7670 CGF.EmitRuntimeCallOrInvoke(ObjCTypes.getExceptionThrowFn(), Exception);
7671 Call->setDoesNotReturn();
7673 llvm::CallBase *Call =
7674 CGF.EmitRuntimeCallOrInvoke(ObjCTypes.getExceptionRethrowFn());
7675 Call->setDoesNotReturn();
7678 CGF.Builder.CreateUnreachable();
7679 if (ClearInsertionPoint)
7680 CGF.Builder.ClearInsertionPoint();
7684 CGObjCNonFragileABIMac::GetInterfaceEHType(const ObjCInterfaceDecl *ID,
7685 ForDefinition_t IsForDefinition) {
7686 llvm::GlobalVariable * &Entry = EHTypeReferences[ID->getIdentifier()];
7687 StringRef ClassName = ID->getObjCRuntimeNameAsString();
7689 // If we don't need a definition, return the entry if found or check
7690 // if we use an external reference.
7691 if (!IsForDefinition) {
7695 // If this type (or a super class) has the __objc_exception__
7696 // attribute, emit an external reference.
7697 if (hasObjCExceptionAttribute(CGM.getContext(), ID)) {
7698 std::string EHTypeName = ("OBJC_EHTYPE_$_" + ClassName).str();
7699 Entry = new llvm::GlobalVariable(CGM.getModule(), ObjCTypes.EHTypeTy,
7700 false, llvm::GlobalValue::ExternalLinkage,
7701 nullptr, EHTypeName);
7702 CGM.setGVProperties(Entry, ID);
7707 // Otherwise we need to either make a new entry or fill in the initializer.
7708 assert((!Entry || !Entry->hasInitializer()) && "Duplicate EHType definition");
7710 std::string VTableName = "objc_ehtype_vtable";
7711 auto *VTableGV = CGM.getModule().getGlobalVariable(VTableName);
7714 new llvm::GlobalVariable(CGM.getModule(), ObjCTypes.Int8PtrTy, false,
7715 llvm::GlobalValue::ExternalLinkage, nullptr,
7717 if (CGM.getTriple().isOSBinFormatCOFF())
7718 VTableGV->setDLLStorageClass(getStorage(CGM, VTableName));
7721 llvm::Value *VTableIdx = llvm::ConstantInt::get(CGM.Int32Ty, 2);
7722 ConstantInitBuilder builder(CGM);
7723 auto values = builder.beginStruct(ObjCTypes.EHTypeTy);
7725 llvm::ConstantExpr::getInBoundsGetElementPtr(VTableGV->getValueType(),
7726 VTableGV, VTableIdx));
7727 values.add(GetClassName(ClassName));
7728 values.add(GetClassGlobal(ID, /*metaclass*/ false, NotForDefinition));
7730 llvm::GlobalValue::LinkageTypes L = IsForDefinition
7731 ? llvm::GlobalValue::ExternalLinkage
7732 : llvm::GlobalValue::WeakAnyLinkage;
7734 values.finishAndSetAsInitializer(Entry);
7735 Entry->setAlignment(CGM.getPointerAlign().getAsAlign());
7737 Entry = values.finishAndCreateGlobal("OBJC_EHTYPE_$_" + ClassName,
7738 CGM.getPointerAlign(),
7741 if (hasObjCExceptionAttribute(CGM.getContext(), ID))
7742 CGM.setGVProperties(Entry, ID);
7744 assert(Entry->getLinkage() == L);
7746 if (!CGM.getTriple().isOSBinFormatCOFF())
7747 if (ID->getVisibility() == HiddenVisibility)
7748 Entry->setVisibility(llvm::GlobalValue::HiddenVisibility);
7750 if (IsForDefinition)
7751 if (CGM.getTriple().isOSBinFormatMachO())
7752 Entry->setSection("__DATA,__objc_const");
7759 CodeGen::CGObjCRuntime *
7760 CodeGen::CreateMacObjCRuntime(CodeGen::CodeGenModule &CGM) {
7761 switch (CGM.getLangOpts().ObjCRuntime.getKind()) {
7762 case ObjCRuntime::FragileMacOSX:
7763 return new CGObjCMac(CGM);
7765 case ObjCRuntime::MacOSX:
7766 case ObjCRuntime::iOS:
7767 case ObjCRuntime::WatchOS:
7768 return new CGObjCNonFragileABIMac(CGM);
7770 case ObjCRuntime::GNUstep:
7771 case ObjCRuntime::GCC:
7772 case ObjCRuntime::ObjFW:
7773 llvm_unreachable("these runtimes are not Mac runtimes");
7775 llvm_unreachable("bad runtime");