1 //===------- CGObjCMac.cpp - Interface to Apple Objective-C Runtime -------===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This provides Objective-C code generation targeting the Apple runtime.
12 //===----------------------------------------------------------------------===//
15 #include "CGCleanup.h"
16 #include "CGObjCRuntime.h"
17 #include "CGRecordLayout.h"
18 #include "CodeGenFunction.h"
19 #include "CodeGenModule.h"
20 #include "clang/CodeGen/ConstantInitBuilder.h"
21 #include "clang/AST/ASTContext.h"
22 #include "clang/AST/Decl.h"
23 #include "clang/AST/DeclObjC.h"
24 #include "clang/AST/RecordLayout.h"
25 #include "clang/AST/StmtObjC.h"
26 #include "clang/Basic/LangOptions.h"
27 #include "clang/CodeGen/CGFunctionInfo.h"
28 #include "clang/Frontend/CodeGenOptions.h"
29 #include "llvm/ADT/CachedHashString.h"
30 #include "llvm/ADT/DenseSet.h"
31 #include "llvm/ADT/SetVector.h"
32 #include "llvm/ADT/SmallPtrSet.h"
33 #include "llvm/ADT/SmallString.h"
34 #include "llvm/IR/CallSite.h"
35 #include "llvm/IR/DataLayout.h"
36 #include "llvm/IR/InlineAsm.h"
37 #include "llvm/IR/IntrinsicInst.h"
38 #include "llvm/IR/LLVMContext.h"
39 #include "llvm/IR/Module.h"
40 #include "llvm/Support/raw_ostream.h"
43 using namespace clang;
44 using namespace CodeGen;
48 // FIXME: We should find a nicer way to make the labels for metadata, string
49 // concatenation is lame.
51 class ObjCCommonTypesHelper {
53 llvm::LLVMContext &VMContext;
56 // The types of these functions don't really matter because we
57 // should always bitcast before calling them.
59 /// id objc_msgSend (id, SEL, ...)
61 /// The default messenger, used for sends whose ABI is unchanged from
62 /// the all-integer/pointer case.
63 llvm::Constant *getMessageSendFn() const {
64 // Add the non-lazy-bind attribute, since objc_msgSend is likely to
66 llvm::Type *params[] = { ObjectPtrTy, SelectorPtrTy };
67 return CGM.CreateRuntimeFunction(
68 llvm::FunctionType::get(ObjectPtrTy, params, true), "objc_msgSend",
69 llvm::AttributeList::get(CGM.getLLVMContext(),
70 llvm::AttributeList::FunctionIndex,
71 llvm::Attribute::NonLazyBind));
74 /// void objc_msgSend_stret (id, SEL, ...)
76 /// The messenger used when the return value is an aggregate returned
77 /// by indirect reference in the first argument, and therefore the
78 /// self and selector parameters are shifted over by one.
79 llvm::Constant *getMessageSendStretFn() const {
80 llvm::Type *params[] = { ObjectPtrTy, SelectorPtrTy };
81 return CGM.CreateRuntimeFunction(llvm::FunctionType::get(CGM.VoidTy,
83 "objc_msgSend_stret");
87 /// [double | long double] objc_msgSend_fpret(id self, SEL op, ...)
89 /// The messenger used when the return value is returned on the x87
90 /// floating-point stack; without a special entrypoint, the nil case
91 /// would be unbalanced.
92 llvm::Constant *getMessageSendFpretFn() const {
93 llvm::Type *params[] = { ObjectPtrTy, SelectorPtrTy };
94 return CGM.CreateRuntimeFunction(llvm::FunctionType::get(CGM.DoubleTy,
96 "objc_msgSend_fpret");
100 /// _Complex long double objc_msgSend_fp2ret(id self, SEL op, ...)
102 /// The messenger used when the return value is returned in two values on the
103 /// x87 floating point stack; without a special entrypoint, the nil case
104 /// would be unbalanced. Only used on 64-bit X86.
105 llvm::Constant *getMessageSendFp2retFn() const {
106 llvm::Type *params[] = { ObjectPtrTy, SelectorPtrTy };
107 llvm::Type *longDoubleType = llvm::Type::getX86_FP80Ty(VMContext);
108 llvm::Type *resultType =
109 llvm::StructType::get(longDoubleType, longDoubleType);
111 return CGM.CreateRuntimeFunction(llvm::FunctionType::get(resultType,
113 "objc_msgSend_fp2ret");
116 /// id objc_msgSendSuper(struct objc_super *super, SEL op, ...)
118 /// The messenger used for super calls, which have different dispatch
119 /// semantics. The class passed is the superclass of the current
121 llvm::Constant *getMessageSendSuperFn() const {
122 llvm::Type *params[] = { SuperPtrTy, SelectorPtrTy };
123 return CGM.CreateRuntimeFunction(llvm::FunctionType::get(ObjectPtrTy,
125 "objc_msgSendSuper");
128 /// id objc_msgSendSuper2(struct objc_super *super, SEL op, ...)
130 /// A slightly different messenger used for super calls. The class
131 /// passed is the current class.
132 llvm::Constant *getMessageSendSuperFn2() const {
133 llvm::Type *params[] = { SuperPtrTy, SelectorPtrTy };
134 return CGM.CreateRuntimeFunction(llvm::FunctionType::get(ObjectPtrTy,
136 "objc_msgSendSuper2");
139 /// void objc_msgSendSuper_stret(void *stretAddr, struct objc_super *super,
142 /// The messenger used for super calls which return an aggregate indirectly.
143 llvm::Constant *getMessageSendSuperStretFn() const {
144 llvm::Type *params[] = { Int8PtrTy, SuperPtrTy, SelectorPtrTy };
145 return CGM.CreateRuntimeFunction(
146 llvm::FunctionType::get(CGM.VoidTy, params, true),
147 "objc_msgSendSuper_stret");
150 /// void objc_msgSendSuper2_stret(void * stretAddr, struct objc_super *super,
153 /// objc_msgSendSuper_stret with the super2 semantics.
154 llvm::Constant *getMessageSendSuperStretFn2() const {
155 llvm::Type *params[] = { Int8PtrTy, SuperPtrTy, SelectorPtrTy };
156 return CGM.CreateRuntimeFunction(
157 llvm::FunctionType::get(CGM.VoidTy, params, true),
158 "objc_msgSendSuper2_stret");
161 llvm::Constant *getMessageSendSuperFpretFn() const {
162 // There is no objc_msgSendSuper_fpret? How can that work?
163 return getMessageSendSuperFn();
166 llvm::Constant *getMessageSendSuperFpretFn2() const {
167 // There is no objc_msgSendSuper_fpret? How can that work?
168 return getMessageSendSuperFn2();
172 CodeGen::CodeGenModule &CGM;
175 llvm::IntegerType *ShortTy, *IntTy, *LongTy;
176 llvm::PointerType *Int8PtrTy, *Int8PtrPtrTy;
177 llvm::Type *IvarOffsetVarTy;
179 /// ObjectPtrTy - LLVM type for object handles (typeof(id))
180 llvm::PointerType *ObjectPtrTy;
182 /// PtrObjectPtrTy - LLVM type for id *
183 llvm::PointerType *PtrObjectPtrTy;
185 /// SelectorPtrTy - LLVM type for selector handles (typeof(SEL))
186 llvm::PointerType *SelectorPtrTy;
189 /// ProtocolPtrTy - LLVM type for external protocol handles
190 /// (typeof(Protocol))
191 llvm::Type *ExternalProtocolPtrTy;
194 llvm::Type *getExternalProtocolPtrTy() {
195 if (!ExternalProtocolPtrTy) {
196 // FIXME: It would be nice to unify this with the opaque type, so that the
197 // IR comes out a bit cleaner.
198 CodeGen::CodeGenTypes &Types = CGM.getTypes();
199 ASTContext &Ctx = CGM.getContext();
200 llvm::Type *T = Types.ConvertType(Ctx.getObjCProtoType());
201 ExternalProtocolPtrTy = llvm::PointerType::getUnqual(T);
204 return ExternalProtocolPtrTy;
207 // SuperCTy - clang type for struct objc_super.
209 // SuperPtrCTy - clang type for struct objc_super *.
210 QualType SuperPtrCTy;
212 /// SuperTy - LLVM type for struct objc_super.
213 llvm::StructType *SuperTy;
214 /// SuperPtrTy - LLVM type for struct objc_super *.
215 llvm::PointerType *SuperPtrTy;
217 /// PropertyTy - LLVM type for struct objc_property (struct _prop_t
218 /// in GCC parlance).
219 llvm::StructType *PropertyTy;
221 /// PropertyListTy - LLVM type for struct objc_property_list
222 /// (_prop_list_t in GCC parlance).
223 llvm::StructType *PropertyListTy;
224 /// PropertyListPtrTy - LLVM type for struct objc_property_list*.
225 llvm::PointerType *PropertyListPtrTy;
227 // MethodTy - LLVM type for struct objc_method.
228 llvm::StructType *MethodTy;
230 /// CacheTy - LLVM type for struct objc_cache.
232 /// CachePtrTy - LLVM type for struct objc_cache *.
233 llvm::PointerType *CachePtrTy;
235 llvm::Constant *getGetPropertyFn() {
236 CodeGen::CodeGenTypes &Types = CGM.getTypes();
237 ASTContext &Ctx = CGM.getContext();
238 // id objc_getProperty (id, SEL, ptrdiff_t, bool)
239 CanQualType IdType = Ctx.getCanonicalParamType(Ctx.getObjCIdType());
240 CanQualType SelType = Ctx.getCanonicalParamType(Ctx.getObjCSelType());
241 CanQualType Params[] = {
243 Ctx.getPointerDiffType()->getCanonicalTypeUnqualified(), Ctx.BoolTy};
244 llvm::FunctionType *FTy =
245 Types.GetFunctionType(
246 Types.arrangeBuiltinFunctionDeclaration(IdType, Params));
247 return CGM.CreateRuntimeFunction(FTy, "objc_getProperty");
250 llvm::Constant *getSetPropertyFn() {
251 CodeGen::CodeGenTypes &Types = CGM.getTypes();
252 ASTContext &Ctx = CGM.getContext();
253 // void objc_setProperty (id, SEL, ptrdiff_t, id, bool, bool)
254 CanQualType IdType = Ctx.getCanonicalParamType(Ctx.getObjCIdType());
255 CanQualType SelType = Ctx.getCanonicalParamType(Ctx.getObjCSelType());
256 CanQualType Params[] = {
259 Ctx.getPointerDiffType()->getCanonicalTypeUnqualified(),
263 llvm::FunctionType *FTy =
264 Types.GetFunctionType(
265 Types.arrangeBuiltinFunctionDeclaration(Ctx.VoidTy, Params));
266 return CGM.CreateRuntimeFunction(FTy, "objc_setProperty");
269 llvm::Constant *getOptimizedSetPropertyFn(bool atomic, bool copy) {
270 CodeGen::CodeGenTypes &Types = CGM.getTypes();
271 ASTContext &Ctx = CGM.getContext();
272 // void objc_setProperty_atomic(id self, SEL _cmd,
273 // id newValue, ptrdiff_t offset);
274 // void objc_setProperty_nonatomic(id self, SEL _cmd,
275 // id newValue, ptrdiff_t offset);
276 // void objc_setProperty_atomic_copy(id self, SEL _cmd,
277 // id newValue, ptrdiff_t offset);
278 // void objc_setProperty_nonatomic_copy(id self, SEL _cmd,
279 // id newValue, ptrdiff_t offset);
281 SmallVector<CanQualType,4> Params;
282 CanQualType IdType = Ctx.getCanonicalParamType(Ctx.getObjCIdType());
283 CanQualType SelType = Ctx.getCanonicalParamType(Ctx.getObjCSelType());
284 Params.push_back(IdType);
285 Params.push_back(SelType);
286 Params.push_back(IdType);
287 Params.push_back(Ctx.getPointerDiffType()->getCanonicalTypeUnqualified());
288 llvm::FunctionType *FTy =
289 Types.GetFunctionType(
290 Types.arrangeBuiltinFunctionDeclaration(Ctx.VoidTy, Params));
293 name = "objc_setProperty_atomic_copy";
294 else if (atomic && !copy)
295 name = "objc_setProperty_atomic";
296 else if (!atomic && copy)
297 name = "objc_setProperty_nonatomic_copy";
299 name = "objc_setProperty_nonatomic";
301 return CGM.CreateRuntimeFunction(FTy, name);
304 llvm::Constant *getCopyStructFn() {
305 CodeGen::CodeGenTypes &Types = CGM.getTypes();
306 ASTContext &Ctx = CGM.getContext();
307 // void objc_copyStruct (void *, const void *, size_t, bool, bool)
308 SmallVector<CanQualType,5> Params;
309 Params.push_back(Ctx.VoidPtrTy);
310 Params.push_back(Ctx.VoidPtrTy);
311 Params.push_back(Ctx.LongTy);
312 Params.push_back(Ctx.BoolTy);
313 Params.push_back(Ctx.BoolTy);
314 llvm::FunctionType *FTy =
315 Types.GetFunctionType(
316 Types.arrangeBuiltinFunctionDeclaration(Ctx.VoidTy, Params));
317 return CGM.CreateRuntimeFunction(FTy, "objc_copyStruct");
320 /// This routine declares and returns address of:
321 /// void objc_copyCppObjectAtomic(
322 /// void *dest, const void *src,
323 /// void (*copyHelper) (void *dest, const void *source));
324 llvm::Constant *getCppAtomicObjectFunction() {
325 CodeGen::CodeGenTypes &Types = CGM.getTypes();
326 ASTContext &Ctx = CGM.getContext();
327 /// void objc_copyCppObjectAtomic(void *dest, const void *src, void *helper);
328 SmallVector<CanQualType,3> Params;
329 Params.push_back(Ctx.VoidPtrTy);
330 Params.push_back(Ctx.VoidPtrTy);
331 Params.push_back(Ctx.VoidPtrTy);
332 llvm::FunctionType *FTy =
333 Types.GetFunctionType(
334 Types.arrangeBuiltinFunctionDeclaration(Ctx.VoidTy, Params));
335 return CGM.CreateRuntimeFunction(FTy, "objc_copyCppObjectAtomic");
338 llvm::Constant *getEnumerationMutationFn() {
339 CodeGen::CodeGenTypes &Types = CGM.getTypes();
340 ASTContext &Ctx = CGM.getContext();
341 // void objc_enumerationMutation (id)
342 SmallVector<CanQualType,1> Params;
343 Params.push_back(Ctx.getCanonicalParamType(Ctx.getObjCIdType()));
344 llvm::FunctionType *FTy =
345 Types.GetFunctionType(
346 Types.arrangeBuiltinFunctionDeclaration(Ctx.VoidTy, Params));
347 return CGM.CreateRuntimeFunction(FTy, "objc_enumerationMutation");
350 llvm::Constant *getLookUpClassFn() {
351 CodeGen::CodeGenTypes &Types = CGM.getTypes();
352 ASTContext &Ctx = CGM.getContext();
353 // Class objc_lookUpClass (const char *)
354 SmallVector<CanQualType,1> Params;
356 Ctx.getCanonicalType(Ctx.getPointerType(Ctx.CharTy.withConst())));
357 llvm::FunctionType *FTy =
358 Types.GetFunctionType(Types.arrangeBuiltinFunctionDeclaration(
359 Ctx.getCanonicalType(Ctx.getObjCClassType()),
361 return CGM.CreateRuntimeFunction(FTy, "objc_lookUpClass");
364 /// GcReadWeakFn -- LLVM objc_read_weak (id *src) function.
365 llvm::Constant *getGcReadWeakFn() {
366 // id objc_read_weak (id *)
367 llvm::Type *args[] = { ObjectPtrTy->getPointerTo() };
368 llvm::FunctionType *FTy =
369 llvm::FunctionType::get(ObjectPtrTy, args, false);
370 return CGM.CreateRuntimeFunction(FTy, "objc_read_weak");
373 /// GcAssignWeakFn -- LLVM objc_assign_weak function.
374 llvm::Constant *getGcAssignWeakFn() {
375 // id objc_assign_weak (id, id *)
376 llvm::Type *args[] = { ObjectPtrTy, ObjectPtrTy->getPointerTo() };
377 llvm::FunctionType *FTy =
378 llvm::FunctionType::get(ObjectPtrTy, args, false);
379 return CGM.CreateRuntimeFunction(FTy, "objc_assign_weak");
382 /// GcAssignGlobalFn -- LLVM objc_assign_global function.
383 llvm::Constant *getGcAssignGlobalFn() {
384 // id objc_assign_global(id, id *)
385 llvm::Type *args[] = { ObjectPtrTy, ObjectPtrTy->getPointerTo() };
386 llvm::FunctionType *FTy =
387 llvm::FunctionType::get(ObjectPtrTy, args, false);
388 return CGM.CreateRuntimeFunction(FTy, "objc_assign_global");
391 /// GcAssignThreadLocalFn -- LLVM objc_assign_threadlocal function.
392 llvm::Constant *getGcAssignThreadLocalFn() {
393 // id objc_assign_threadlocal(id src, id * dest)
394 llvm::Type *args[] = { ObjectPtrTy, ObjectPtrTy->getPointerTo() };
395 llvm::FunctionType *FTy =
396 llvm::FunctionType::get(ObjectPtrTy, args, false);
397 return CGM.CreateRuntimeFunction(FTy, "objc_assign_threadlocal");
400 /// GcAssignIvarFn -- LLVM objc_assign_ivar function.
401 llvm::Constant *getGcAssignIvarFn() {
402 // id objc_assign_ivar(id, id *, ptrdiff_t)
403 llvm::Type *args[] = { ObjectPtrTy, ObjectPtrTy->getPointerTo(),
405 llvm::FunctionType *FTy =
406 llvm::FunctionType::get(ObjectPtrTy, args, false);
407 return CGM.CreateRuntimeFunction(FTy, "objc_assign_ivar");
410 /// GcMemmoveCollectableFn -- LLVM objc_memmove_collectable function.
411 llvm::Constant *GcMemmoveCollectableFn() {
412 // void *objc_memmove_collectable(void *dst, const void *src, size_t size)
413 llvm::Type *args[] = { Int8PtrTy, Int8PtrTy, LongTy };
414 llvm::FunctionType *FTy = llvm::FunctionType::get(Int8PtrTy, args, false);
415 return CGM.CreateRuntimeFunction(FTy, "objc_memmove_collectable");
418 /// GcAssignStrongCastFn -- LLVM objc_assign_strongCast function.
419 llvm::Constant *getGcAssignStrongCastFn() {
420 // id objc_assign_strongCast(id, id *)
421 llvm::Type *args[] = { ObjectPtrTy, ObjectPtrTy->getPointerTo() };
422 llvm::FunctionType *FTy =
423 llvm::FunctionType::get(ObjectPtrTy, args, false);
424 return CGM.CreateRuntimeFunction(FTy, "objc_assign_strongCast");
427 /// ExceptionThrowFn - LLVM objc_exception_throw function.
428 llvm::Constant *getExceptionThrowFn() {
429 // void objc_exception_throw(id)
430 llvm::Type *args[] = { ObjectPtrTy };
431 llvm::FunctionType *FTy =
432 llvm::FunctionType::get(CGM.VoidTy, args, false);
433 return CGM.CreateRuntimeFunction(FTy, "objc_exception_throw");
436 /// ExceptionRethrowFn - LLVM objc_exception_rethrow function.
437 llvm::Constant *getExceptionRethrowFn() {
438 // void objc_exception_rethrow(void)
439 llvm::FunctionType *FTy = llvm::FunctionType::get(CGM.VoidTy, false);
440 return CGM.CreateRuntimeFunction(FTy, "objc_exception_rethrow");
443 /// SyncEnterFn - LLVM object_sync_enter function.
444 llvm::Constant *getSyncEnterFn() {
445 // int objc_sync_enter (id)
446 llvm::Type *args[] = { ObjectPtrTy };
447 llvm::FunctionType *FTy =
448 llvm::FunctionType::get(CGM.IntTy, args, false);
449 return CGM.CreateRuntimeFunction(FTy, "objc_sync_enter");
452 /// SyncExitFn - LLVM object_sync_exit function.
453 llvm::Constant *getSyncExitFn() {
454 // int objc_sync_exit (id)
455 llvm::Type *args[] = { ObjectPtrTy };
456 llvm::FunctionType *FTy =
457 llvm::FunctionType::get(CGM.IntTy, args, false);
458 return CGM.CreateRuntimeFunction(FTy, "objc_sync_exit");
461 llvm::Constant *getSendFn(bool IsSuper) const {
462 return IsSuper ? getMessageSendSuperFn() : getMessageSendFn();
465 llvm::Constant *getSendFn2(bool IsSuper) const {
466 return IsSuper ? getMessageSendSuperFn2() : getMessageSendFn();
469 llvm::Constant *getSendStretFn(bool IsSuper) const {
470 return IsSuper ? getMessageSendSuperStretFn() : getMessageSendStretFn();
473 llvm::Constant *getSendStretFn2(bool IsSuper) const {
474 return IsSuper ? getMessageSendSuperStretFn2() : getMessageSendStretFn();
477 llvm::Constant *getSendFpretFn(bool IsSuper) const {
478 return IsSuper ? getMessageSendSuperFpretFn() : getMessageSendFpretFn();
481 llvm::Constant *getSendFpretFn2(bool IsSuper) const {
482 return IsSuper ? getMessageSendSuperFpretFn2() : getMessageSendFpretFn();
485 llvm::Constant *getSendFp2retFn(bool IsSuper) const {
486 return IsSuper ? getMessageSendSuperFn() : getMessageSendFp2retFn();
489 llvm::Constant *getSendFp2RetFn2(bool IsSuper) const {
490 return IsSuper ? getMessageSendSuperFn2() : getMessageSendFp2retFn();
493 ObjCCommonTypesHelper(CodeGen::CodeGenModule &cgm);
496 /// ObjCTypesHelper - Helper class that encapsulates lazy
497 /// construction of varies types used during ObjC generation.
498 class ObjCTypesHelper : public ObjCCommonTypesHelper {
500 /// SymtabTy - LLVM type for struct objc_symtab.
501 llvm::StructType *SymtabTy;
502 /// SymtabPtrTy - LLVM type for struct objc_symtab *.
503 llvm::PointerType *SymtabPtrTy;
504 /// ModuleTy - LLVM type for struct objc_module.
505 llvm::StructType *ModuleTy;
507 /// ProtocolTy - LLVM type for struct objc_protocol.
508 llvm::StructType *ProtocolTy;
509 /// ProtocolPtrTy - LLVM type for struct objc_protocol *.
510 llvm::PointerType *ProtocolPtrTy;
511 /// ProtocolExtensionTy - LLVM type for struct
512 /// objc_protocol_extension.
513 llvm::StructType *ProtocolExtensionTy;
514 /// ProtocolExtensionTy - LLVM type for struct
515 /// objc_protocol_extension *.
516 llvm::PointerType *ProtocolExtensionPtrTy;
517 /// MethodDescriptionTy - LLVM type for struct
518 /// objc_method_description.
519 llvm::StructType *MethodDescriptionTy;
520 /// MethodDescriptionListTy - LLVM type for struct
521 /// objc_method_description_list.
522 llvm::StructType *MethodDescriptionListTy;
523 /// MethodDescriptionListPtrTy - LLVM type for struct
524 /// objc_method_description_list *.
525 llvm::PointerType *MethodDescriptionListPtrTy;
526 /// ProtocolListTy - LLVM type for struct objc_property_list.
527 llvm::StructType *ProtocolListTy;
528 /// ProtocolListPtrTy - LLVM type for struct objc_property_list*.
529 llvm::PointerType *ProtocolListPtrTy;
530 /// CategoryTy - LLVM type for struct objc_category.
531 llvm::StructType *CategoryTy;
532 /// ClassTy - LLVM type for struct objc_class.
533 llvm::StructType *ClassTy;
534 /// ClassPtrTy - LLVM type for struct objc_class *.
535 llvm::PointerType *ClassPtrTy;
536 /// ClassExtensionTy - LLVM type for struct objc_class_ext.
537 llvm::StructType *ClassExtensionTy;
538 /// ClassExtensionPtrTy - LLVM type for struct objc_class_ext *.
539 llvm::PointerType *ClassExtensionPtrTy;
540 // IvarTy - LLVM type for struct objc_ivar.
541 llvm::StructType *IvarTy;
542 /// IvarListTy - LLVM type for struct objc_ivar_list.
543 llvm::StructType *IvarListTy;
544 /// IvarListPtrTy - LLVM type for struct objc_ivar_list *.
545 llvm::PointerType *IvarListPtrTy;
546 /// MethodListTy - LLVM type for struct objc_method_list.
547 llvm::StructType *MethodListTy;
548 /// MethodListPtrTy - LLVM type for struct objc_method_list *.
549 llvm::PointerType *MethodListPtrTy;
551 /// ExceptionDataTy - LLVM type for struct _objc_exception_data.
552 llvm::StructType *ExceptionDataTy;
554 /// ExceptionTryEnterFn - LLVM objc_exception_try_enter function.
555 llvm::Constant *getExceptionTryEnterFn() {
556 llvm::Type *params[] = { ExceptionDataTy->getPointerTo() };
557 return CGM.CreateRuntimeFunction(
558 llvm::FunctionType::get(CGM.VoidTy, params, false),
559 "objc_exception_try_enter");
562 /// ExceptionTryExitFn - LLVM objc_exception_try_exit function.
563 llvm::Constant *getExceptionTryExitFn() {
564 llvm::Type *params[] = { ExceptionDataTy->getPointerTo() };
565 return CGM.CreateRuntimeFunction(
566 llvm::FunctionType::get(CGM.VoidTy, params, false),
567 "objc_exception_try_exit");
570 /// ExceptionExtractFn - LLVM objc_exception_extract function.
571 llvm::Constant *getExceptionExtractFn() {
572 llvm::Type *params[] = { ExceptionDataTy->getPointerTo() };
573 return CGM.CreateRuntimeFunction(llvm::FunctionType::get(ObjectPtrTy,
575 "objc_exception_extract");
578 /// ExceptionMatchFn - LLVM objc_exception_match function.
579 llvm::Constant *getExceptionMatchFn() {
580 llvm::Type *params[] = { ClassPtrTy, ObjectPtrTy };
581 return CGM.CreateRuntimeFunction(
582 llvm::FunctionType::get(CGM.Int32Ty, params, false),
583 "objc_exception_match");
586 /// SetJmpFn - LLVM _setjmp function.
587 llvm::Constant *getSetJmpFn() {
588 // This is specifically the prototype for x86.
589 llvm::Type *params[] = { CGM.Int32Ty->getPointerTo() };
590 return CGM.CreateRuntimeFunction(
591 llvm::FunctionType::get(CGM.Int32Ty, params, false), "_setjmp",
592 llvm::AttributeList::get(CGM.getLLVMContext(),
593 llvm::AttributeList::FunctionIndex,
594 llvm::Attribute::NonLazyBind));
598 ObjCTypesHelper(CodeGen::CodeGenModule &cgm);
601 /// ObjCNonFragileABITypesHelper - will have all types needed by objective-c's
603 class ObjCNonFragileABITypesHelper : public ObjCCommonTypesHelper {
605 // MethodListnfABITy - LLVM for struct _method_list_t
606 llvm::StructType *MethodListnfABITy;
608 // MethodListnfABIPtrTy - LLVM for struct _method_list_t*
609 llvm::PointerType *MethodListnfABIPtrTy;
611 // ProtocolnfABITy = LLVM for struct _protocol_t
612 llvm::StructType *ProtocolnfABITy;
614 // ProtocolnfABIPtrTy = LLVM for struct _protocol_t*
615 llvm::PointerType *ProtocolnfABIPtrTy;
617 // ProtocolListnfABITy - LLVM for struct _objc_protocol_list
618 llvm::StructType *ProtocolListnfABITy;
620 // ProtocolListnfABIPtrTy - LLVM for struct _objc_protocol_list*
621 llvm::PointerType *ProtocolListnfABIPtrTy;
623 // ClassnfABITy - LLVM for struct _class_t
624 llvm::StructType *ClassnfABITy;
626 // ClassnfABIPtrTy - LLVM for struct _class_t*
627 llvm::PointerType *ClassnfABIPtrTy;
629 // IvarnfABITy - LLVM for struct _ivar_t
630 llvm::StructType *IvarnfABITy;
632 // IvarListnfABITy - LLVM for struct _ivar_list_t
633 llvm::StructType *IvarListnfABITy;
635 // IvarListnfABIPtrTy = LLVM for struct _ivar_list_t*
636 llvm::PointerType *IvarListnfABIPtrTy;
638 // ClassRonfABITy - LLVM for struct _class_ro_t
639 llvm::StructType *ClassRonfABITy;
641 // ImpnfABITy - LLVM for id (*)(id, SEL, ...)
642 llvm::PointerType *ImpnfABITy;
644 // CategorynfABITy - LLVM for struct _category_t
645 llvm::StructType *CategorynfABITy;
647 // New types for nonfragile abi messaging.
649 // MessageRefTy - LLVM for:
650 // struct _message_ref_t {
654 llvm::StructType *MessageRefTy;
655 // MessageRefCTy - clang type for struct _message_ref_t
656 QualType MessageRefCTy;
658 // MessageRefPtrTy - LLVM for struct _message_ref_t*
659 llvm::Type *MessageRefPtrTy;
660 // MessageRefCPtrTy - clang type for struct _message_ref_t*
661 QualType MessageRefCPtrTy;
663 // SuperMessageRefTy - LLVM for:
664 // struct _super_message_ref_t {
665 // SUPER_IMP messenger;
668 llvm::StructType *SuperMessageRefTy;
670 // SuperMessageRefPtrTy - LLVM for struct _super_message_ref_t*
671 llvm::PointerType *SuperMessageRefPtrTy;
673 llvm::Constant *getMessageSendFixupFn() {
674 // id objc_msgSend_fixup(id, struct message_ref_t*, ...)
675 llvm::Type *params[] = { ObjectPtrTy, MessageRefPtrTy };
676 return CGM.CreateRuntimeFunction(llvm::FunctionType::get(ObjectPtrTy,
678 "objc_msgSend_fixup");
681 llvm::Constant *getMessageSendFpretFixupFn() {
682 // id objc_msgSend_fpret_fixup(id, struct message_ref_t*, ...)
683 llvm::Type *params[] = { ObjectPtrTy, MessageRefPtrTy };
684 return CGM.CreateRuntimeFunction(llvm::FunctionType::get(ObjectPtrTy,
686 "objc_msgSend_fpret_fixup");
689 llvm::Constant *getMessageSendStretFixupFn() {
690 // id objc_msgSend_stret_fixup(id, struct message_ref_t*, ...)
691 llvm::Type *params[] = { ObjectPtrTy, MessageRefPtrTy };
692 return CGM.CreateRuntimeFunction(llvm::FunctionType::get(ObjectPtrTy,
694 "objc_msgSend_stret_fixup");
697 llvm::Constant *getMessageSendSuper2FixupFn() {
698 // id objc_msgSendSuper2_fixup (struct objc_super *,
699 // struct _super_message_ref_t*, ...)
700 llvm::Type *params[] = { SuperPtrTy, SuperMessageRefPtrTy };
701 return CGM.CreateRuntimeFunction(llvm::FunctionType::get(ObjectPtrTy,
703 "objc_msgSendSuper2_fixup");
706 llvm::Constant *getMessageSendSuper2StretFixupFn() {
707 // id objc_msgSendSuper2_stret_fixup(struct objc_super *,
708 // struct _super_message_ref_t*, ...)
709 llvm::Type *params[] = { SuperPtrTy, SuperMessageRefPtrTy };
710 return CGM.CreateRuntimeFunction(llvm::FunctionType::get(ObjectPtrTy,
712 "objc_msgSendSuper2_stret_fixup");
715 llvm::Constant *getObjCEndCatchFn() {
716 return CGM.CreateRuntimeFunction(llvm::FunctionType::get(CGM.VoidTy, false),
721 llvm::Constant *getObjCBeginCatchFn() {
722 llvm::Type *params[] = { Int8PtrTy };
723 return CGM.CreateRuntimeFunction(llvm::FunctionType::get(Int8PtrTy,
728 llvm::StructType *EHTypeTy;
729 llvm::Type *EHTypePtrTy;
731 ObjCNonFragileABITypesHelper(CodeGen::CodeGenModule &cgm);
734 enum class ObjCLabelType {
741 class CGObjCCommonMac : public CodeGen::CGObjCRuntime {
747 SKIP_SCAN(unsigned _skip = 0, unsigned _scan = 0)
748 : skip(_skip), scan(_scan) {}
751 /// opcode for captured block variables layout 'instructions'.
752 /// In the following descriptions, 'I' is the value of the immediate field.
753 /// (field following the opcode).
755 enum BLOCK_LAYOUT_OPCODE {
756 /// An operator which affects how the following layout should be
758 /// I == 0: Halt interpretation and treat everything else as
759 /// a non-pointer. Note that this instruction is equal
761 /// I != 0: Currently unused.
762 BLOCK_LAYOUT_OPERATOR = 0,
764 /// The next I+1 bytes do not contain a value of object pointer type.
765 /// Note that this can leave the stream unaligned, meaning that
766 /// subsequent word-size instructions do not begin at a multiple of
767 /// the pointer size.
768 BLOCK_LAYOUT_NON_OBJECT_BYTES = 1,
770 /// The next I+1 words do not contain a value of object pointer type.
771 /// This is simply an optimized version of BLOCK_LAYOUT_BYTES for
772 /// when the required skip quantity is a multiple of the pointer size.
773 BLOCK_LAYOUT_NON_OBJECT_WORDS = 2,
775 /// The next I+1 words are __strong pointers to Objective-C
776 /// objects or blocks.
777 BLOCK_LAYOUT_STRONG = 3,
779 /// The next I+1 words are pointers to __block variables.
780 BLOCK_LAYOUT_BYREF = 4,
782 /// The next I+1 words are __weak pointers to Objective-C
783 /// objects or blocks.
784 BLOCK_LAYOUT_WEAK = 5,
786 /// The next I+1 words are __unsafe_unretained pointers to
787 /// Objective-C objects or blocks.
788 BLOCK_LAYOUT_UNRETAINED = 6
790 /// The next I+1 words are block or object pointers with some
791 /// as-yet-unspecified ownership semantics. If we add more
792 /// flavors of ownership semantics, values will be taken from
795 /// This is included so that older tools can at least continue
796 /// processing the layout past such things.
797 //BLOCK_LAYOUT_OWNERSHIP_UNKNOWN = 7..10,
799 /// All other opcodes are reserved. Halt interpretation and
800 /// treat everything else as opaque.
805 enum BLOCK_LAYOUT_OPCODE opcode;
806 CharUnits block_var_bytepos;
807 CharUnits block_var_size;
808 RUN_SKIP(enum BLOCK_LAYOUT_OPCODE Opcode = BLOCK_LAYOUT_OPERATOR,
809 CharUnits BytePos = CharUnits::Zero(),
810 CharUnits Size = CharUnits::Zero())
811 : opcode(Opcode), block_var_bytepos(BytePos), block_var_size(Size) {}
813 // Allow sorting based on byte pos.
814 bool operator<(const RUN_SKIP &b) const {
815 return block_var_bytepos < b.block_var_bytepos;
820 llvm::LLVMContext &VMContext;
821 // FIXME! May not be needing this after all.
824 // arc/mrr layout of captured block literal variables.
825 SmallVector<RUN_SKIP, 16> RunSkipBlockVars;
827 /// LazySymbols - Symbols to generate a lazy reference for. See
828 /// DefinedSymbols and FinishModule().
829 llvm::SetVector<IdentifierInfo*> LazySymbols;
831 /// DefinedSymbols - External symbols which are defined by this
832 /// module. The symbols in this list and LazySymbols are used to add
833 /// special linker symbols which ensure that Objective-C modules are
835 llvm::SetVector<IdentifierInfo*> DefinedSymbols;
837 /// ClassNames - uniqued class names.
838 llvm::StringMap<llvm::GlobalVariable*> ClassNames;
840 /// MethodVarNames - uniqued method variable names.
841 llvm::DenseMap<Selector, llvm::GlobalVariable*> MethodVarNames;
843 /// DefinedCategoryNames - list of category names in form Class_Category.
844 llvm::SmallSetVector<llvm::CachedHashString, 16> DefinedCategoryNames;
846 /// MethodVarTypes - uniqued method type signatures. We have to use
847 /// a StringMap here because have no other unique reference.
848 llvm::StringMap<llvm::GlobalVariable*> MethodVarTypes;
850 /// MethodDefinitions - map of methods which have been defined in
851 /// this translation unit.
852 llvm::DenseMap<const ObjCMethodDecl*, llvm::Function*> MethodDefinitions;
854 /// PropertyNames - uniqued method variable names.
855 llvm::DenseMap<IdentifierInfo*, llvm::GlobalVariable*> PropertyNames;
857 /// ClassReferences - uniqued class references.
858 llvm::DenseMap<IdentifierInfo*, llvm::GlobalVariable*> ClassReferences;
860 /// SelectorReferences - uniqued selector references.
861 llvm::DenseMap<Selector, llvm::GlobalVariable*> SelectorReferences;
863 /// Protocols - Protocols for which an objc_protocol structure has
864 /// been emitted. Forward declarations are handled by creating an
865 /// empty structure whose initializer is filled in when/if defined.
866 llvm::DenseMap<IdentifierInfo*, llvm::GlobalVariable*> Protocols;
868 /// DefinedProtocols - Protocols which have actually been
869 /// defined. We should not need this, see FIXME in GenerateProtocol.
870 llvm::DenseSet<IdentifierInfo*> DefinedProtocols;
872 /// DefinedClasses - List of defined classes.
873 SmallVector<llvm::GlobalValue*, 16> DefinedClasses;
875 /// ImplementedClasses - List of @implemented classes.
876 SmallVector<const ObjCInterfaceDecl*, 16> ImplementedClasses;
878 /// DefinedNonLazyClasses - List of defined "non-lazy" classes.
879 SmallVector<llvm::GlobalValue*, 16> DefinedNonLazyClasses;
881 /// DefinedCategories - List of defined categories.
882 SmallVector<llvm::GlobalValue*, 16> DefinedCategories;
884 /// DefinedNonLazyCategories - List of defined "non-lazy" categories.
885 SmallVector<llvm::GlobalValue*, 16> DefinedNonLazyCategories;
887 /// Cached reference to the class for constant strings. This value has type
888 /// int * but is actually an Obj-C class pointer.
889 llvm::WeakTrackingVH ConstantStringClassRef;
891 /// \brief The LLVM type corresponding to NSConstantString.
892 llvm::StructType *NSConstantStringType = nullptr;
894 llvm::StringMap<llvm::GlobalVariable *> NSConstantStringMap;
896 /// GetNameForMethod - Return a name for the given method.
897 /// \param[out] NameOut - The return value.
898 void GetNameForMethod(const ObjCMethodDecl *OMD,
899 const ObjCContainerDecl *CD,
900 SmallVectorImpl<char> &NameOut);
902 /// GetMethodVarName - Return a unique constant for the given
903 /// selector's name. The return value has type char *.
904 llvm::Constant *GetMethodVarName(Selector Sel);
905 llvm::Constant *GetMethodVarName(IdentifierInfo *Ident);
907 /// GetMethodVarType - Return a unique constant for the given
908 /// method's type encoding string. The return value has type char *.
910 // FIXME: This is a horrible name.
911 llvm::Constant *GetMethodVarType(const ObjCMethodDecl *D,
912 bool Extended = false);
913 llvm::Constant *GetMethodVarType(const FieldDecl *D);
915 /// GetPropertyName - Return a unique constant for the given
916 /// name. The return value has type char *.
917 llvm::Constant *GetPropertyName(IdentifierInfo *Ident);
919 // FIXME: This can be dropped once string functions are unified.
920 llvm::Constant *GetPropertyTypeString(const ObjCPropertyDecl *PD,
921 const Decl *Container);
923 /// GetClassName - Return a unique constant for the given selector's
924 /// runtime name (which may change via use of objc_runtime_name attribute on
925 /// class or protocol definition. The return value has type char *.
926 llvm::Constant *GetClassName(StringRef RuntimeName);
928 llvm::Function *GetMethodDefinition(const ObjCMethodDecl *MD);
930 /// BuildIvarLayout - Builds ivar layout bitmap for the class
931 /// implementation for the __strong or __weak case.
933 /// \param hasMRCWeakIvars - Whether we are compiling in MRC and there
934 /// are any weak ivars defined directly in the class. Meaningless unless
935 /// building a weak layout. Does not guarantee that the layout will
936 /// actually have any entries, because the ivar might be under-aligned.
937 llvm::Constant *BuildIvarLayout(const ObjCImplementationDecl *OI,
938 CharUnits beginOffset,
940 bool forStrongLayout,
941 bool hasMRCWeakIvars);
943 llvm::Constant *BuildStrongIvarLayout(const ObjCImplementationDecl *OI,
944 CharUnits beginOffset,
945 CharUnits endOffset) {
946 return BuildIvarLayout(OI, beginOffset, endOffset, true, false);
949 llvm::Constant *BuildWeakIvarLayout(const ObjCImplementationDecl *OI,
950 CharUnits beginOffset,
952 bool hasMRCWeakIvars) {
953 return BuildIvarLayout(OI, beginOffset, endOffset, false, hasMRCWeakIvars);
956 Qualifiers::ObjCLifetime getBlockCaptureLifetime(QualType QT, bool ByrefLayout);
958 void UpdateRunSkipBlockVars(bool IsByref,
959 Qualifiers::ObjCLifetime LifeTime,
960 CharUnits FieldOffset,
961 CharUnits FieldSize);
963 void BuildRCBlockVarRecordLayout(const RecordType *RT,
964 CharUnits BytePos, bool &HasUnion,
965 bool ByrefLayout=false);
967 void BuildRCRecordLayout(const llvm::StructLayout *RecLayout,
968 const RecordDecl *RD,
969 ArrayRef<const FieldDecl*> RecFields,
970 CharUnits BytePos, bool &HasUnion,
973 uint64_t InlineLayoutInstruction(SmallVectorImpl<unsigned char> &Layout);
975 llvm::Constant *getBitmapBlockLayout(bool ComputeByrefLayout);
977 /// GetIvarLayoutName - Returns a unique constant for the given
978 /// ivar layout bitmap.
979 llvm::Constant *GetIvarLayoutName(IdentifierInfo *Ident,
980 const ObjCCommonTypesHelper &ObjCTypes);
982 /// EmitPropertyList - Emit the given property list. The return
983 /// value has type PropertyListPtrTy.
984 llvm::Constant *EmitPropertyList(Twine Name,
985 const Decl *Container,
986 const ObjCContainerDecl *OCD,
987 const ObjCCommonTypesHelper &ObjCTypes,
988 bool IsClassProperty);
990 /// EmitProtocolMethodTypes - Generate the array of extended method type
991 /// strings. The return value has type Int8PtrPtrTy.
992 llvm::Constant *EmitProtocolMethodTypes(Twine Name,
993 ArrayRef<llvm::Constant*> MethodTypes,
994 const ObjCCommonTypesHelper &ObjCTypes);
996 /// GetProtocolRef - Return a reference to the internal protocol
997 /// description, creating an empty one if it has not been
998 /// defined. The return value has type ProtocolPtrTy.
999 llvm::Constant *GetProtocolRef(const ObjCProtocolDecl *PD);
1001 /// Return a reference to the given Class using runtime calls rather than
1002 /// by a symbol reference.
1003 llvm::Value *EmitClassRefViaRuntime(CodeGenFunction &CGF,
1004 const ObjCInterfaceDecl *ID,
1005 ObjCCommonTypesHelper &ObjCTypes);
1008 /// CreateMetadataVar - Create a global variable with internal
1009 /// linkage for use by the Objective-C runtime.
1011 /// This is a convenience wrapper which not only creates the
1012 /// variable, but also sets the section and alignment and adds the
1013 /// global to the "llvm.used" list.
1015 /// \param Name - The variable name.
1016 /// \param Init - The variable initializer; this is also used to
1017 /// define the type of the variable.
1018 /// \param Section - The section the variable should go into, or empty.
1019 /// \param Align - The alignment for the variable, or 0.
1020 /// \param AddToUsed - Whether the variable should be added to
1022 llvm::GlobalVariable *CreateMetadataVar(Twine Name,
1023 ConstantStructBuilder &Init,
1024 StringRef Section, CharUnits Align,
1026 llvm::GlobalVariable *CreateMetadataVar(Twine Name,
1027 llvm::Constant *Init,
1028 StringRef Section, CharUnits Align,
1031 llvm::GlobalVariable *CreateCStringLiteral(StringRef Name,
1032 ObjCLabelType LabelType,
1033 bool ForceNonFragileABI = false,
1034 bool NullTerminate = true);
1037 CodeGen::RValue EmitMessageSend(CodeGen::CodeGenFunction &CGF,
1038 ReturnValueSlot Return,
1039 QualType ResultType,
1044 const CallArgList &CallArgs,
1045 const ObjCMethodDecl *OMD,
1046 const ObjCInterfaceDecl *ClassReceiver,
1047 const ObjCCommonTypesHelper &ObjCTypes);
1049 /// EmitImageInfo - Emit the image info marker used to encode some module
1050 /// level information.
1051 void EmitImageInfo();
1054 CGObjCCommonMac(CodeGen::CodeGenModule &cgm) :
1055 CGObjCRuntime(cgm), VMContext(cgm.getLLVMContext()) { }
1057 bool isNonFragileABI() const {
1058 return ObjCABI == 2;
1061 ConstantAddress GenerateConstantString(const StringLiteral *SL) override;
1062 ConstantAddress GenerateConstantNSString(const StringLiteral *SL);
1064 llvm::Function *GenerateMethod(const ObjCMethodDecl *OMD,
1065 const ObjCContainerDecl *CD=nullptr) override;
1067 void GenerateProtocol(const ObjCProtocolDecl *PD) override;
1069 /// GetOrEmitProtocol - Get the protocol object for the given
1070 /// declaration, emitting it if necessary. The return value has type
1072 virtual llvm::Constant *GetOrEmitProtocol(const ObjCProtocolDecl *PD)=0;
1074 /// GetOrEmitProtocolRef - Get a forward reference to the protocol
1075 /// object for the given declaration, emitting it if needed. These
1076 /// forward references will be filled in with empty bodies if no
1077 /// definition is seen. The return value has type ProtocolPtrTy.
1078 virtual llvm::Constant *GetOrEmitProtocolRef(const ObjCProtocolDecl *PD)=0;
1080 virtual llvm::Constant *getNSConstantStringClassRef() = 0;
1082 llvm::Constant *BuildGCBlockLayout(CodeGen::CodeGenModule &CGM,
1083 const CGBlockInfo &blockInfo) override;
1084 llvm::Constant *BuildRCBlockLayout(CodeGen::CodeGenModule &CGM,
1085 const CGBlockInfo &blockInfo) override;
1087 llvm::Constant *BuildByrefLayout(CodeGen::CodeGenModule &CGM,
1088 QualType T) override;
1093 enum class MethodListType {
1094 CategoryInstanceMethods,
1095 CategoryClassMethods,
1098 ProtocolInstanceMethods,
1099 ProtocolClassMethods,
1100 OptionalProtocolInstanceMethods,
1101 OptionalProtocolClassMethods,
1104 /// A convenience class for splitting the methods of a protocol into
1105 /// the four interesting groups.
1106 class ProtocolMethodLists {
1109 RequiredInstanceMethods,
1110 RequiredClassMethods,
1111 OptionalInstanceMethods,
1112 OptionalClassMethods
1115 NumProtocolMethodLists = 4
1118 static MethodListType getMethodListKind(Kind kind) {
1120 case RequiredInstanceMethods:
1121 return MethodListType::ProtocolInstanceMethods;
1122 case RequiredClassMethods:
1123 return MethodListType::ProtocolClassMethods;
1124 case OptionalInstanceMethods:
1125 return MethodListType::OptionalProtocolInstanceMethods;
1126 case OptionalClassMethods:
1127 return MethodListType::OptionalProtocolClassMethods;
1129 llvm_unreachable("bad kind");
1132 SmallVector<const ObjCMethodDecl *, 4> Methods[NumProtocolMethodLists];
1134 static ProtocolMethodLists get(const ObjCProtocolDecl *PD) {
1135 ProtocolMethodLists result;
1137 for (auto MD : PD->methods()) {
1138 size_t index = (2 * size_t(MD->isOptional()))
1139 + (size_t(MD->isClassMethod()));
1140 result.Methods[index].push_back(MD);
1146 template <class Self>
1147 SmallVector<llvm::Constant*, 8> emitExtendedTypesArray(Self *self) const {
1148 // In both ABIs, the method types list is parallel with the
1149 // concatenation of the methods arrays in the following order:
1152 // optional instance methods
1153 // optional class methods
1154 SmallVector<llvm::Constant*, 8> result;
1156 // Methods is already in the correct order for both ABIs.
1157 for (auto &list : Methods) {
1158 for (auto MD : list) {
1159 result.push_back(self->GetMethodVarType(MD, true));
1166 template <class Self>
1167 llvm::Constant *emitMethodList(Self *self, const ObjCProtocolDecl *PD,
1169 return self->emitMethodList(PD->getObjCRuntimeNameAsString(),
1170 getMethodListKind(kind), Methods[kind]);
1174 } // end anonymous namespace
1176 class CGObjCMac : public CGObjCCommonMac {
1178 friend ProtocolMethodLists;
1180 ObjCTypesHelper ObjCTypes;
1182 /// EmitModuleInfo - Another marker encoding module level
1184 void EmitModuleInfo();
1186 /// EmitModuleSymols - Emit module symbols, the list of defined
1187 /// classes and categories. The result has type SymtabPtrTy.
1188 llvm::Constant *EmitModuleSymbols();
1190 /// FinishModule - Write out global data structures at the end of
1191 /// processing a translation unit.
1192 void FinishModule();
1194 /// EmitClassExtension - Generate the class extension structure used
1195 /// to store the weak ivar layout and properties. The return value
1196 /// has type ClassExtensionPtrTy.
1197 llvm::Constant *EmitClassExtension(const ObjCImplementationDecl *ID,
1198 CharUnits instanceSize,
1199 bool hasMRCWeakIvars,
1202 /// EmitClassRef - Return a Value*, of type ObjCTypes.ClassPtrTy,
1203 /// for the given class.
1204 llvm::Value *EmitClassRef(CodeGenFunction &CGF,
1205 const ObjCInterfaceDecl *ID);
1207 llvm::Value *EmitClassRefFromId(CodeGenFunction &CGF,
1208 IdentifierInfo *II);
1210 llvm::Value *EmitNSAutoreleasePoolClassRef(CodeGenFunction &CGF) override;
1212 /// EmitSuperClassRef - Emits reference to class's main metadata class.
1213 llvm::Value *EmitSuperClassRef(const ObjCInterfaceDecl *ID);
1215 /// EmitIvarList - Emit the ivar list for the given
1216 /// implementation. If ForClass is true the list of class ivars
1217 /// (i.e. metaclass ivars) is emitted, otherwise the list of
1218 /// interface ivars will be emitted. The return value has type
1220 llvm::Constant *EmitIvarList(const ObjCImplementationDecl *ID,
1223 /// EmitMetaClass - Emit a forward reference to the class structure
1224 /// for the metaclass of the given interface. The return value has
1225 /// type ClassPtrTy.
1226 llvm::Constant *EmitMetaClassRef(const ObjCInterfaceDecl *ID);
1228 /// EmitMetaClass - Emit a class structure for the metaclass of the
1229 /// given implementation. The return value has type ClassPtrTy.
1230 llvm::Constant *EmitMetaClass(const ObjCImplementationDecl *ID,
1231 llvm::Constant *Protocols,
1232 ArrayRef<const ObjCMethodDecl *> Methods);
1234 void emitMethodConstant(ConstantArrayBuilder &builder,
1235 const ObjCMethodDecl *MD);
1237 void emitMethodDescriptionConstant(ConstantArrayBuilder &builder,
1238 const ObjCMethodDecl *MD);
1240 /// EmitMethodList - Emit the method list for the given
1241 /// implementation. The return value has type MethodListPtrTy.
1242 llvm::Constant *emitMethodList(Twine Name, MethodListType MLT,
1243 ArrayRef<const ObjCMethodDecl *> Methods);
1245 /// GetOrEmitProtocol - Get the protocol object for the given
1246 /// declaration, emitting it if necessary. The return value has type
1248 llvm::Constant *GetOrEmitProtocol(const ObjCProtocolDecl *PD) override;
1250 /// GetOrEmitProtocolRef - Get a forward reference to the protocol
1251 /// object for the given declaration, emitting it if needed. These
1252 /// forward references will be filled in with empty bodies if no
1253 /// definition is seen. The return value has type ProtocolPtrTy.
1254 llvm::Constant *GetOrEmitProtocolRef(const ObjCProtocolDecl *PD) override;
1256 /// EmitProtocolExtension - Generate the protocol extension
1257 /// structure used to store optional instance and class methods, and
1258 /// protocol properties. The return value has type
1259 /// ProtocolExtensionPtrTy.
1261 EmitProtocolExtension(const ObjCProtocolDecl *PD,
1262 const ProtocolMethodLists &methodLists);
1264 /// EmitProtocolList - Generate the list of referenced
1265 /// protocols. The return value has type ProtocolListPtrTy.
1266 llvm::Constant *EmitProtocolList(Twine Name,
1267 ObjCProtocolDecl::protocol_iterator begin,
1268 ObjCProtocolDecl::protocol_iterator end);
1270 /// EmitSelector - Return a Value*, of type ObjCTypes.SelectorPtrTy,
1271 /// for the given selector.
1272 llvm::Value *EmitSelector(CodeGenFunction &CGF, Selector Sel);
1273 Address EmitSelectorAddr(CodeGenFunction &CGF, Selector Sel);
1276 CGObjCMac(CodeGen::CodeGenModule &cgm);
1278 llvm::Constant *getNSConstantStringClassRef() override;
1280 llvm::Function *ModuleInitFunction() override;
1282 CodeGen::RValue GenerateMessageSend(CodeGen::CodeGenFunction &CGF,
1283 ReturnValueSlot Return,
1284 QualType ResultType,
1285 Selector Sel, llvm::Value *Receiver,
1286 const CallArgList &CallArgs,
1287 const ObjCInterfaceDecl *Class,
1288 const ObjCMethodDecl *Method) override;
1291 GenerateMessageSendSuper(CodeGen::CodeGenFunction &CGF,
1292 ReturnValueSlot Return, QualType ResultType,
1293 Selector Sel, const ObjCInterfaceDecl *Class,
1294 bool isCategoryImpl, llvm::Value *Receiver,
1295 bool IsClassMessage, const CallArgList &CallArgs,
1296 const ObjCMethodDecl *Method) override;
1298 llvm::Value *GetClass(CodeGenFunction &CGF,
1299 const ObjCInterfaceDecl *ID) override;
1301 llvm::Value *GetSelector(CodeGenFunction &CGF, Selector Sel) override;
1302 Address GetAddrOfSelector(CodeGenFunction &CGF, Selector Sel) override;
1304 /// The NeXT/Apple runtimes do not support typed selectors; just emit an
1306 llvm::Value *GetSelector(CodeGenFunction &CGF,
1307 const ObjCMethodDecl *Method) override;
1309 llvm::Constant *GetEHType(QualType T) override;
1311 void GenerateCategory(const ObjCCategoryImplDecl *CMD) override;
1313 void GenerateClass(const ObjCImplementationDecl *ClassDecl) override;
1315 void RegisterAlias(const ObjCCompatibleAliasDecl *OAD) override {}
1317 llvm::Value *GenerateProtocolRef(CodeGenFunction &CGF,
1318 const ObjCProtocolDecl *PD) override;
1320 llvm::Constant *GetPropertyGetFunction() override;
1321 llvm::Constant *GetPropertySetFunction() override;
1322 llvm::Constant *GetOptimizedPropertySetFunction(bool atomic,
1323 bool copy) override;
1324 llvm::Constant *GetGetStructFunction() override;
1325 llvm::Constant *GetSetStructFunction() override;
1326 llvm::Constant *GetCppAtomicObjectGetFunction() override;
1327 llvm::Constant *GetCppAtomicObjectSetFunction() override;
1328 llvm::Constant *EnumerationMutationFunction() override;
1330 void EmitTryStmt(CodeGen::CodeGenFunction &CGF,
1331 const ObjCAtTryStmt &S) override;
1332 void EmitSynchronizedStmt(CodeGen::CodeGenFunction &CGF,
1333 const ObjCAtSynchronizedStmt &S) override;
1334 void EmitTryOrSynchronizedStmt(CodeGen::CodeGenFunction &CGF, const Stmt &S);
1335 void EmitThrowStmt(CodeGen::CodeGenFunction &CGF, const ObjCAtThrowStmt &S,
1336 bool ClearInsertionPoint=true) override;
1337 llvm::Value * EmitObjCWeakRead(CodeGen::CodeGenFunction &CGF,
1338 Address AddrWeakObj) override;
1339 void EmitObjCWeakAssign(CodeGen::CodeGenFunction &CGF,
1340 llvm::Value *src, Address dst) override;
1341 void EmitObjCGlobalAssign(CodeGen::CodeGenFunction &CGF,
1342 llvm::Value *src, Address dest,
1343 bool threadlocal = false) override;
1344 void EmitObjCIvarAssign(CodeGen::CodeGenFunction &CGF,
1345 llvm::Value *src, Address dest,
1346 llvm::Value *ivarOffset) override;
1347 void EmitObjCStrongCastAssign(CodeGen::CodeGenFunction &CGF,
1348 llvm::Value *src, Address dest) override;
1349 void EmitGCMemmoveCollectable(CodeGen::CodeGenFunction &CGF,
1350 Address dest, Address src,
1351 llvm::Value *size) override;
1353 LValue EmitObjCValueForIvar(CodeGen::CodeGenFunction &CGF, QualType ObjectTy,
1354 llvm::Value *BaseValue, const ObjCIvarDecl *Ivar,
1355 unsigned CVRQualifiers) override;
1356 llvm::Value *EmitIvarOffset(CodeGen::CodeGenFunction &CGF,
1357 const ObjCInterfaceDecl *Interface,
1358 const ObjCIvarDecl *Ivar) override;
1361 class CGObjCNonFragileABIMac : public CGObjCCommonMac {
1363 friend ProtocolMethodLists;
1364 ObjCNonFragileABITypesHelper ObjCTypes;
1365 llvm::GlobalVariable* ObjCEmptyCacheVar;
1366 llvm::Constant* ObjCEmptyVtableVar;
1368 /// SuperClassReferences - uniqued super class references.
1369 llvm::DenseMap<IdentifierInfo*, llvm::GlobalVariable*> SuperClassReferences;
1371 /// MetaClassReferences - uniqued meta class references.
1372 llvm::DenseMap<IdentifierInfo*, llvm::GlobalVariable*> MetaClassReferences;
1374 /// EHTypeReferences - uniqued class ehtype references.
1375 llvm::DenseMap<IdentifierInfo*, llvm::GlobalVariable*> EHTypeReferences;
1377 /// VTableDispatchMethods - List of methods for which we generate
1378 /// vtable-based message dispatch.
1379 llvm::DenseSet<Selector> VTableDispatchMethods;
1381 /// DefinedMetaClasses - List of defined meta-classes.
1382 std::vector<llvm::GlobalValue*> DefinedMetaClasses;
1384 /// isVTableDispatchedSelector - Returns true if SEL is a
1385 /// vtable-based selector.
1386 bool isVTableDispatchedSelector(Selector Sel);
1388 /// FinishNonFragileABIModule - Write out global data structures at the end of
1389 /// processing a translation unit.
1390 void FinishNonFragileABIModule();
1392 /// AddModuleClassList - Add the given list of class pointers to the
1393 /// module with the provided symbol and section names.
1394 void AddModuleClassList(ArrayRef<llvm::GlobalValue *> Container,
1395 StringRef SymbolName, StringRef SectionName);
1397 llvm::GlobalVariable * BuildClassRoTInitializer(unsigned flags,
1398 unsigned InstanceStart,
1399 unsigned InstanceSize,
1400 const ObjCImplementationDecl *ID);
1401 llvm::GlobalVariable *BuildClassObject(const ObjCInterfaceDecl *CI,
1403 llvm::Constant *IsAGV,
1404 llvm::Constant *SuperClassGV,
1405 llvm::Constant *ClassRoGV,
1406 bool HiddenVisibility);
1408 void emitMethodConstant(ConstantArrayBuilder &builder,
1409 const ObjCMethodDecl *MD,
1412 /// Emit the method list for the given implementation. The return value
1413 /// has type MethodListnfABITy.
1414 llvm::Constant *emitMethodList(Twine Name, MethodListType MLT,
1415 ArrayRef<const ObjCMethodDecl *> Methods);
1417 /// EmitIvarList - Emit the ivar list for the given
1418 /// implementation. If ForClass is true the list of class ivars
1419 /// (i.e. metaclass ivars) is emitted, otherwise the list of
1420 /// interface ivars will be emitted. The return value has type
1421 /// IvarListnfABIPtrTy.
1422 llvm::Constant *EmitIvarList(const ObjCImplementationDecl *ID);
1424 llvm::Constant *EmitIvarOffsetVar(const ObjCInterfaceDecl *ID,
1425 const ObjCIvarDecl *Ivar,
1426 unsigned long int offset);
1428 /// GetOrEmitProtocol - Get the protocol object for the given
1429 /// declaration, emitting it if necessary. The return value has type
1431 llvm::Constant *GetOrEmitProtocol(const ObjCProtocolDecl *PD) override;
1433 /// GetOrEmitProtocolRef - Get a forward reference to the protocol
1434 /// object for the given declaration, emitting it if needed. These
1435 /// forward references will be filled in with empty bodies if no
1436 /// definition is seen. The return value has type ProtocolPtrTy.
1437 llvm::Constant *GetOrEmitProtocolRef(const ObjCProtocolDecl *PD) override;
1439 /// EmitProtocolList - Generate the list of referenced
1440 /// protocols. The return value has type ProtocolListPtrTy.
1441 llvm::Constant *EmitProtocolList(Twine Name,
1442 ObjCProtocolDecl::protocol_iterator begin,
1443 ObjCProtocolDecl::protocol_iterator end);
1445 CodeGen::RValue EmitVTableMessageSend(CodeGen::CodeGenFunction &CGF,
1446 ReturnValueSlot Return,
1447 QualType ResultType,
1449 llvm::Value *Receiver,
1452 const CallArgList &CallArgs,
1453 const ObjCMethodDecl *Method);
1455 /// GetClassGlobal - Return the global variable for the Objective-C
1456 /// class of the given name.
1457 llvm::Constant *GetClassGlobal(StringRef Name,
1458 ForDefinition_t IsForDefinition,
1459 bool Weak = false, bool DLLImport = false);
1460 llvm::Constant *GetClassGlobal(const ObjCInterfaceDecl *ID,
1462 ForDefinition_t isForDefinition);
1464 /// EmitClassRef - Return a Value*, of type ObjCTypes.ClassPtrTy,
1465 /// for the given class reference.
1466 llvm::Value *EmitClassRef(CodeGenFunction &CGF,
1467 const ObjCInterfaceDecl *ID);
1469 llvm::Value *EmitClassRefFromId(CodeGenFunction &CGF,
1471 const ObjCInterfaceDecl *ID);
1473 llvm::Value *EmitNSAutoreleasePoolClassRef(CodeGenFunction &CGF) override;
1475 /// EmitSuperClassRef - Return a Value*, of type ObjCTypes.ClassPtrTy,
1476 /// for the given super class reference.
1477 llvm::Value *EmitSuperClassRef(CodeGenFunction &CGF,
1478 const ObjCInterfaceDecl *ID);
1480 /// EmitMetaClassRef - Return a Value * of the address of _class_t
1482 llvm::Value *EmitMetaClassRef(CodeGenFunction &CGF,
1483 const ObjCInterfaceDecl *ID, bool Weak);
1485 /// ObjCIvarOffsetVariable - Returns the ivar offset variable for
1488 llvm::GlobalVariable * ObjCIvarOffsetVariable(
1489 const ObjCInterfaceDecl *ID,
1490 const ObjCIvarDecl *Ivar);
1492 /// EmitSelector - Return a Value*, of type ObjCTypes.SelectorPtrTy,
1493 /// for the given selector.
1494 llvm::Value *EmitSelector(CodeGenFunction &CGF, Selector Sel);
1495 Address EmitSelectorAddr(CodeGenFunction &CGF, Selector Sel);
1497 /// GetInterfaceEHType - Get the cached ehtype for the given Objective-C
1498 /// interface. The return value has type EHTypePtrTy.
1499 llvm::Constant *GetInterfaceEHType(const ObjCInterfaceDecl *ID,
1500 ForDefinition_t IsForDefinition);
1502 StringRef getMetaclassSymbolPrefix() const { return "OBJC_METACLASS_$_"; }
1504 StringRef getClassSymbolPrefix() const { return "OBJC_CLASS_$_"; }
1506 void GetClassSizeInfo(const ObjCImplementationDecl *OID,
1507 uint32_t &InstanceStart,
1508 uint32_t &InstanceSize);
1510 // Shamelessly stolen from Analysis/CFRefCount.cpp
1511 Selector GetNullarySelector(const char* name) const {
1512 IdentifierInfo* II = &CGM.getContext().Idents.get(name);
1513 return CGM.getContext().Selectors.getSelector(0, &II);
1516 Selector GetUnarySelector(const char* name) const {
1517 IdentifierInfo* II = &CGM.getContext().Idents.get(name);
1518 return CGM.getContext().Selectors.getSelector(1, &II);
1521 /// ImplementationIsNonLazy - Check whether the given category or
1522 /// class implementation is "non-lazy".
1523 bool ImplementationIsNonLazy(const ObjCImplDecl *OD) const;
1525 bool IsIvarOffsetKnownIdempotent(const CodeGen::CodeGenFunction &CGF,
1526 const ObjCIvarDecl *IV) {
1527 // Annotate the load as an invariant load iff inside an instance method
1528 // and ivar belongs to instance method's class and one of its super class.
1529 // This check is needed because the ivar offset is a lazily
1530 // initialised value that may depend on objc_msgSend to perform a fixup on
1531 // the first message dispatch.
1533 // An additional opportunity to mark the load as invariant arises when the
1534 // base of the ivar access is a parameter to an Objective C method.
1535 // However, because the parameters are not available in the current
1536 // interface, we cannot perform this check.
1537 if (const ObjCMethodDecl *MD =
1538 dyn_cast_or_null<ObjCMethodDecl>(CGF.CurFuncDecl))
1539 if (MD->isInstanceMethod())
1540 if (const ObjCInterfaceDecl *ID = MD->getClassInterface())
1541 return IV->getContainingInterface()->isSuperClassOf(ID);
1546 CGObjCNonFragileABIMac(CodeGen::CodeGenModule &cgm);
1548 llvm::Constant *getNSConstantStringClassRef() override;
1550 llvm::Function *ModuleInitFunction() override;
1552 CodeGen::RValue GenerateMessageSend(CodeGen::CodeGenFunction &CGF,
1553 ReturnValueSlot Return,
1554 QualType ResultType, Selector Sel,
1555 llvm::Value *Receiver,
1556 const CallArgList &CallArgs,
1557 const ObjCInterfaceDecl *Class,
1558 const ObjCMethodDecl *Method) override;
1561 GenerateMessageSendSuper(CodeGen::CodeGenFunction &CGF,
1562 ReturnValueSlot Return, QualType ResultType,
1563 Selector Sel, const ObjCInterfaceDecl *Class,
1564 bool isCategoryImpl, llvm::Value *Receiver,
1565 bool IsClassMessage, const CallArgList &CallArgs,
1566 const ObjCMethodDecl *Method) override;
1568 llvm::Value *GetClass(CodeGenFunction &CGF,
1569 const ObjCInterfaceDecl *ID) override;
1571 llvm::Value *GetSelector(CodeGenFunction &CGF, Selector Sel) override
1572 { return EmitSelector(CGF, Sel); }
1573 Address GetAddrOfSelector(CodeGenFunction &CGF, Selector Sel) override
1574 { return EmitSelectorAddr(CGF, Sel); }
1576 /// The NeXT/Apple runtimes do not support typed selectors; just emit an
1578 llvm::Value *GetSelector(CodeGenFunction &CGF,
1579 const ObjCMethodDecl *Method) override
1580 { return EmitSelector(CGF, Method->getSelector()); }
1582 void GenerateCategory(const ObjCCategoryImplDecl *CMD) override;
1584 void GenerateClass(const ObjCImplementationDecl *ClassDecl) override;
1586 void RegisterAlias(const ObjCCompatibleAliasDecl *OAD) override {}
1588 llvm::Value *GenerateProtocolRef(CodeGenFunction &CGF,
1589 const ObjCProtocolDecl *PD) override;
1591 llvm::Constant *GetEHType(QualType T) override;
1593 llvm::Constant *GetPropertyGetFunction() override {
1594 return ObjCTypes.getGetPropertyFn();
1596 llvm::Constant *GetPropertySetFunction() override {
1597 return ObjCTypes.getSetPropertyFn();
1600 llvm::Constant *GetOptimizedPropertySetFunction(bool atomic,
1601 bool copy) override {
1602 return ObjCTypes.getOptimizedSetPropertyFn(atomic, copy);
1605 llvm::Constant *GetSetStructFunction() override {
1606 return ObjCTypes.getCopyStructFn();
1609 llvm::Constant *GetGetStructFunction() override {
1610 return ObjCTypes.getCopyStructFn();
1613 llvm::Constant *GetCppAtomicObjectSetFunction() override {
1614 return ObjCTypes.getCppAtomicObjectFunction();
1617 llvm::Constant *GetCppAtomicObjectGetFunction() override {
1618 return ObjCTypes.getCppAtomicObjectFunction();
1621 llvm::Constant *EnumerationMutationFunction() override {
1622 return ObjCTypes.getEnumerationMutationFn();
1625 void EmitTryStmt(CodeGen::CodeGenFunction &CGF,
1626 const ObjCAtTryStmt &S) override;
1627 void EmitSynchronizedStmt(CodeGen::CodeGenFunction &CGF,
1628 const ObjCAtSynchronizedStmt &S) override;
1629 void EmitThrowStmt(CodeGen::CodeGenFunction &CGF, const ObjCAtThrowStmt &S,
1630 bool ClearInsertionPoint=true) override;
1631 llvm::Value * EmitObjCWeakRead(CodeGen::CodeGenFunction &CGF,
1632 Address AddrWeakObj) override;
1633 void EmitObjCWeakAssign(CodeGen::CodeGenFunction &CGF,
1634 llvm::Value *src, Address edst) override;
1635 void EmitObjCGlobalAssign(CodeGen::CodeGenFunction &CGF,
1636 llvm::Value *src, Address dest,
1637 bool threadlocal = false) override;
1638 void EmitObjCIvarAssign(CodeGen::CodeGenFunction &CGF,
1639 llvm::Value *src, Address dest,
1640 llvm::Value *ivarOffset) override;
1641 void EmitObjCStrongCastAssign(CodeGen::CodeGenFunction &CGF,
1642 llvm::Value *src, Address dest) override;
1643 void EmitGCMemmoveCollectable(CodeGen::CodeGenFunction &CGF,
1644 Address dest, Address src,
1645 llvm::Value *size) override;
1646 LValue EmitObjCValueForIvar(CodeGen::CodeGenFunction &CGF, QualType ObjectTy,
1647 llvm::Value *BaseValue, const ObjCIvarDecl *Ivar,
1648 unsigned CVRQualifiers) override;
1649 llvm::Value *EmitIvarOffset(CodeGen::CodeGenFunction &CGF,
1650 const ObjCInterfaceDecl *Interface,
1651 const ObjCIvarDecl *Ivar) override;
1654 /// A helper class for performing the null-initialization of a return
1656 struct NullReturnState {
1657 llvm::BasicBlock *NullBB;
1658 NullReturnState() : NullBB(nullptr) {}
1660 /// Perform a null-check of the given receiver.
1661 void init(CodeGenFunction &CGF, llvm::Value *receiver) {
1662 // Make blocks for the null-receiver and call edges.
1663 NullBB = CGF.createBasicBlock("msgSend.null-receiver");
1664 llvm::BasicBlock *callBB = CGF.createBasicBlock("msgSend.call");
1666 // Check for a null receiver and, if there is one, jump to the
1667 // null-receiver block. There's no point in trying to avoid it:
1668 // we're always going to put *something* there, because otherwise
1669 // we shouldn't have done this null-check in the first place.
1670 llvm::Value *isNull = CGF.Builder.CreateIsNull(receiver);
1671 CGF.Builder.CreateCondBr(isNull, NullBB, callBB);
1673 // Otherwise, start performing the call.
1674 CGF.EmitBlock(callBB);
1677 /// Complete the null-return operation. It is valid to call this
1678 /// regardless of whether 'init' has been called.
1679 RValue complete(CodeGenFunction &CGF, RValue result, QualType resultType,
1680 const CallArgList &CallArgs,
1681 const ObjCMethodDecl *Method) {
1682 // If we never had to do a null-check, just use the raw result.
1683 if (!NullBB) return result;
1685 // The continuation block. This will be left null if we don't have an
1686 // IP, which can happen if the method we're calling is marked noreturn.
1687 llvm::BasicBlock *contBB = nullptr;
1689 // Finish the call path.
1690 llvm::BasicBlock *callBB = CGF.Builder.GetInsertBlock();
1692 contBB = CGF.createBasicBlock("msgSend.cont");
1693 CGF.Builder.CreateBr(contBB);
1696 // Okay, start emitting the null-receiver block.
1697 CGF.EmitBlock(NullBB);
1699 // Release any consumed arguments we've got.
1701 CallArgList::const_iterator I = CallArgs.begin();
1702 for (ObjCMethodDecl::param_const_iterator i = Method->param_begin(),
1703 e = Method->param_end(); i != e; ++i, ++I) {
1704 const ParmVarDecl *ParamDecl = (*i);
1705 if (ParamDecl->hasAttr<NSConsumedAttr>()) {
1707 assert(RV.isScalar() &&
1708 "NullReturnState::complete - arg not on object");
1709 CGF.EmitARCRelease(RV.getScalarVal(), ARCImpreciseLifetime);
1714 // The phi code below assumes that we haven't needed any control flow yet.
1715 assert(CGF.Builder.GetInsertBlock() == NullBB);
1717 // If we've got a void return, just jump to the continuation block.
1718 if (result.isScalar() && resultType->isVoidType()) {
1719 // No jumps required if the message-send was noreturn.
1720 if (contBB) CGF.EmitBlock(contBB);
1724 // If we've got a scalar return, build a phi.
1725 if (result.isScalar()) {
1726 // Derive the null-initialization value.
1727 llvm::Constant *null = CGF.CGM.EmitNullConstant(resultType);
1729 // If no join is necessary, just flow out.
1730 if (!contBB) return RValue::get(null);
1732 // Otherwise, build a phi.
1733 CGF.EmitBlock(contBB);
1734 llvm::PHINode *phi = CGF.Builder.CreatePHI(null->getType(), 2);
1735 phi->addIncoming(result.getScalarVal(), callBB);
1736 phi->addIncoming(null, NullBB);
1737 return RValue::get(phi);
1740 // If we've got an aggregate return, null the buffer out.
1741 // FIXME: maybe we should be doing things differently for all the
1742 // cases where the ABI has us returning (1) non-agg values in
1743 // memory or (2) agg values in registers.
1744 if (result.isAggregate()) {
1745 assert(result.isAggregate() && "null init of non-aggregate result?");
1746 CGF.EmitNullInitialization(result.getAggregateAddress(), resultType);
1747 if (contBB) CGF.EmitBlock(contBB);
1752 CGF.EmitBlock(contBB);
1753 CodeGenFunction::ComplexPairTy callResult = result.getComplexVal();
1755 // Find the scalar type and its zero value.
1756 llvm::Type *scalarTy = callResult.first->getType();
1757 llvm::Constant *scalarZero = llvm::Constant::getNullValue(scalarTy);
1759 // Build phis for both coordinates.
1760 llvm::PHINode *real = CGF.Builder.CreatePHI(scalarTy, 2);
1761 real->addIncoming(callResult.first, callBB);
1762 real->addIncoming(scalarZero, NullBB);
1763 llvm::PHINode *imag = CGF.Builder.CreatePHI(scalarTy, 2);
1764 imag->addIncoming(callResult.second, callBB);
1765 imag->addIncoming(scalarZero, NullBB);
1766 return RValue::getComplex(real, imag);
1770 } // end anonymous namespace
1772 /* *** Helper Functions *** */
1774 /// getConstantGEP() - Help routine to construct simple GEPs.
1775 static llvm::Constant *getConstantGEP(llvm::LLVMContext &VMContext,
1776 llvm::GlobalVariable *C, unsigned idx0,
1778 llvm::Value *Idxs[] = {
1779 llvm::ConstantInt::get(llvm::Type::getInt32Ty(VMContext), idx0),
1780 llvm::ConstantInt::get(llvm::Type::getInt32Ty(VMContext), idx1)
1782 return llvm::ConstantExpr::getGetElementPtr(C->getValueType(), C, Idxs);
1785 /// hasObjCExceptionAttribute - Return true if this class or any super
1786 /// class has the __objc_exception__ attribute.
1787 static bool hasObjCExceptionAttribute(ASTContext &Context,
1788 const ObjCInterfaceDecl *OID) {
1789 if (OID->hasAttr<ObjCExceptionAttr>())
1791 if (const ObjCInterfaceDecl *Super = OID->getSuperClass())
1792 return hasObjCExceptionAttribute(Context, Super);
1796 /* *** CGObjCMac Public Interface *** */
1798 CGObjCMac::CGObjCMac(CodeGen::CodeGenModule &cgm) : CGObjCCommonMac(cgm),
1804 /// GetClass - Return a reference to the class for the given interface
1806 llvm::Value *CGObjCMac::GetClass(CodeGenFunction &CGF,
1807 const ObjCInterfaceDecl *ID) {
1808 return EmitClassRef(CGF, ID);
1811 /// GetSelector - Return the pointer to the unique'd string for this selector.
1812 llvm::Value *CGObjCMac::GetSelector(CodeGenFunction &CGF, Selector Sel) {
1813 return EmitSelector(CGF, Sel);
1815 Address CGObjCMac::GetAddrOfSelector(CodeGenFunction &CGF, Selector Sel) {
1816 return EmitSelectorAddr(CGF, Sel);
1818 llvm::Value *CGObjCMac::GetSelector(CodeGenFunction &CGF, const ObjCMethodDecl
1820 return EmitSelector(CGF, Method->getSelector());
1823 llvm::Constant *CGObjCMac::GetEHType(QualType T) {
1824 if (T->isObjCIdType() ||
1825 T->isObjCQualifiedIdType()) {
1826 return CGM.GetAddrOfRTTIDescriptor(
1827 CGM.getContext().getObjCIdRedefinitionType(), /*ForEH=*/true);
1829 if (T->isObjCClassType() ||
1830 T->isObjCQualifiedClassType()) {
1831 return CGM.GetAddrOfRTTIDescriptor(
1832 CGM.getContext().getObjCClassRedefinitionType(), /*ForEH=*/true);
1834 if (T->isObjCObjectPointerType())
1835 return CGM.GetAddrOfRTTIDescriptor(T, /*ForEH=*/true);
1837 llvm_unreachable("asking for catch type for ObjC type in fragile runtime");
1840 /// Generate a constant CFString object.
1842 struct __builtin_CFString {
1843 const int *isa; // point to __CFConstantStringClassReference
1850 /// or Generate a constant NSString object.
1852 struct __builtin_NSString {
1853 const int *isa; // point to __NSConstantStringClassReference
1855 unsigned int length;
1860 CGObjCCommonMac::GenerateConstantString(const StringLiteral *SL) {
1861 return (!CGM.getLangOpts().NoConstantCFStrings
1862 ? CGM.GetAddrOfConstantCFString(SL)
1863 : GenerateConstantNSString(SL));
1866 static llvm::StringMapEntry<llvm::GlobalVariable *> &
1867 GetConstantStringEntry(llvm::StringMap<llvm::GlobalVariable *> &Map,
1868 const StringLiteral *Literal, unsigned &StringLength) {
1869 StringRef String = Literal->getString();
1870 StringLength = String.size();
1871 return *Map.insert(std::make_pair(String, nullptr)).first;
1874 llvm::Constant *CGObjCMac::getNSConstantStringClassRef() {
1875 if (llvm::Value *V = ConstantStringClassRef)
1876 return cast<llvm::Constant>(V);
1878 auto &StringClass = CGM.getLangOpts().ObjCConstantStringClass;
1880 StringClass.empty() ? "_NSConstantStringClassReference"
1881 : "_" + StringClass + "ClassReference";
1883 llvm::Type *PTy = llvm::ArrayType::get(CGM.IntTy, 0);
1884 auto GV = CGM.CreateRuntimeVariable(PTy, str);
1885 auto V = llvm::ConstantExpr::getBitCast(GV, CGM.IntTy->getPointerTo());
1886 ConstantStringClassRef = V;
1890 llvm::Constant *CGObjCNonFragileABIMac::getNSConstantStringClassRef() {
1891 if (llvm::Value *V = ConstantStringClassRef)
1892 return cast<llvm::Constant>(V);
1894 auto &StringClass = CGM.getLangOpts().ObjCConstantStringClass;
1896 StringClass.empty() ? "OBJC_CLASS_$_NSConstantString"
1897 : "OBJC_CLASS_$_" + StringClass;
1898 auto GV = GetClassGlobal(str, NotForDefinition);
1900 // Make sure the result is of the correct type.
1901 auto V = llvm::ConstantExpr::getBitCast(GV, CGM.IntTy->getPointerTo());
1903 ConstantStringClassRef = V;
1908 CGObjCCommonMac::GenerateConstantNSString(const StringLiteral *Literal) {
1909 unsigned StringLength = 0;
1910 llvm::StringMapEntry<llvm::GlobalVariable *> &Entry =
1911 GetConstantStringEntry(NSConstantStringMap, Literal, StringLength);
1913 if (auto *C = Entry.second)
1914 return ConstantAddress(C, CharUnits::fromQuantity(C->getAlignment()));
1916 // If we don't already have it, get _NSConstantStringClassReference.
1917 llvm::Constant *Class = getNSConstantStringClassRef();
1919 // If we don't already have it, construct the type for a constant NSString.
1920 if (!NSConstantStringType) {
1921 NSConstantStringType =
1922 llvm::StructType::create({
1923 CGM.Int32Ty->getPointerTo(),
1926 }, "struct.__builtin_NSString");
1929 ConstantInitBuilder Builder(CGM);
1930 auto Fields = Builder.beginStruct(NSConstantStringType);
1937 llvm::ConstantDataArray::getString(VMContext, Entry.first());
1939 llvm::GlobalValue::LinkageTypes Linkage = llvm::GlobalValue::PrivateLinkage;
1940 bool isConstant = !CGM.getLangOpts().WritableStrings;
1942 auto *GV = new llvm::GlobalVariable(CGM.getModule(), C->getType(), isConstant,
1943 Linkage, C, ".str");
1944 GV->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
1945 // Don't enforce the target's minimum global alignment, since the only use
1946 // of the string is via this class initializer.
1947 GV->setAlignment(1);
1948 Fields.addBitCast(GV, CGM.Int8PtrTy);
1951 Fields.addInt(CGM.IntTy, StringLength);
1954 CharUnits Alignment = CGM.getPointerAlign();
1955 GV = Fields.finishAndCreateGlobal("_unnamed_nsstring_", Alignment,
1957 llvm::GlobalVariable::PrivateLinkage);
1958 const char *NSStringSection = "__OBJC,__cstring_object,regular,no_dead_strip";
1959 const char *NSStringNonFragileABISection =
1960 "__DATA,__objc_stringobj,regular,no_dead_strip";
1961 // FIXME. Fix section.
1962 GV->setSection(CGM.getLangOpts().ObjCRuntime.isNonFragile()
1963 ? NSStringNonFragileABISection
1967 return ConstantAddress(GV, Alignment);
1971 kCFTaggedObjectID_Integer = (1 << 1) + 1
1974 /// Generates a message send where the super is the receiver. This is
1975 /// a message send to self with special delivery semantics indicating
1976 /// which class's method should be called.
1978 CGObjCMac::GenerateMessageSendSuper(CodeGen::CodeGenFunction &CGF,
1979 ReturnValueSlot Return,
1980 QualType ResultType,
1982 const ObjCInterfaceDecl *Class,
1983 bool isCategoryImpl,
1984 llvm::Value *Receiver,
1985 bool IsClassMessage,
1986 const CodeGen::CallArgList &CallArgs,
1987 const ObjCMethodDecl *Method) {
1988 // Create and init a super structure; this is a (receiver, class)
1989 // pair we will pass to objc_msgSendSuper.
1991 CGF.CreateTempAlloca(ObjCTypes.SuperTy, CGF.getPointerAlign(),
1993 llvm::Value *ReceiverAsObject =
1994 CGF.Builder.CreateBitCast(Receiver, ObjCTypes.ObjectPtrTy);
1995 CGF.Builder.CreateStore(
1997 CGF.Builder.CreateStructGEP(ObjCSuper, 0, CharUnits::Zero()));
1999 // If this is a class message the metaclass is passed as the target.
2000 llvm::Value *Target;
2001 if (IsClassMessage) {
2002 if (isCategoryImpl) {
2003 // Message sent to 'super' in a class method defined in a category
2004 // implementation requires an odd treatment.
2005 // If we are in a class method, we must retrieve the
2006 // _metaclass_ for the current class, pointed at by
2007 // the class's "isa" pointer. The following assumes that
2008 // isa" is the first ivar in a class (which it must be).
2009 Target = EmitClassRef(CGF, Class->getSuperClass());
2010 Target = CGF.Builder.CreateStructGEP(ObjCTypes.ClassTy, Target, 0);
2011 Target = CGF.Builder.CreateAlignedLoad(Target, CGF.getPointerAlign());
2013 llvm::Constant *MetaClassPtr = EmitMetaClassRef(Class);
2014 llvm::Value *SuperPtr =
2015 CGF.Builder.CreateStructGEP(ObjCTypes.ClassTy, MetaClassPtr, 1);
2016 llvm::Value *Super =
2017 CGF.Builder.CreateAlignedLoad(SuperPtr, CGF.getPointerAlign());
2020 } else if (isCategoryImpl)
2021 Target = EmitClassRef(CGF, Class->getSuperClass());
2023 llvm::Value *ClassPtr = EmitSuperClassRef(Class);
2024 ClassPtr = CGF.Builder.CreateStructGEP(ObjCTypes.ClassTy, ClassPtr, 1);
2025 Target = CGF.Builder.CreateAlignedLoad(ClassPtr, CGF.getPointerAlign());
2027 // FIXME: We shouldn't need to do this cast, rectify the ASTContext and
2029 llvm::Type *ClassTy =
2030 CGM.getTypes().ConvertType(CGF.getContext().getObjCClassType());
2031 Target = CGF.Builder.CreateBitCast(Target, ClassTy);
2032 CGF.Builder.CreateStore(Target,
2033 CGF.Builder.CreateStructGEP(ObjCSuper, 1, CGF.getPointerSize()));
2034 return EmitMessageSend(CGF, Return, ResultType,
2035 EmitSelector(CGF, Sel),
2036 ObjCSuper.getPointer(), ObjCTypes.SuperPtrCTy,
2037 true, CallArgs, Method, Class, ObjCTypes);
2040 /// Generate code for a message send expression.
2041 CodeGen::RValue CGObjCMac::GenerateMessageSend(CodeGen::CodeGenFunction &CGF,
2042 ReturnValueSlot Return,
2043 QualType ResultType,
2045 llvm::Value *Receiver,
2046 const CallArgList &CallArgs,
2047 const ObjCInterfaceDecl *Class,
2048 const ObjCMethodDecl *Method) {
2049 return EmitMessageSend(CGF, Return, ResultType,
2050 EmitSelector(CGF, Sel),
2051 Receiver, CGF.getContext().getObjCIdType(),
2052 false, CallArgs, Method, Class, ObjCTypes);
2055 static bool isWeakLinkedClass(const ObjCInterfaceDecl *ID) {
2057 if (ID->isWeakImported())
2059 } while ((ID = ID->getSuperClass()));
2065 CGObjCCommonMac::EmitMessageSend(CodeGen::CodeGenFunction &CGF,
2066 ReturnValueSlot Return,
2067 QualType ResultType,
2072 const CallArgList &CallArgs,
2073 const ObjCMethodDecl *Method,
2074 const ObjCInterfaceDecl *ClassReceiver,
2075 const ObjCCommonTypesHelper &ObjCTypes) {
2076 CallArgList ActualArgs;
2078 Arg0 = CGF.Builder.CreateBitCast(Arg0, ObjCTypes.ObjectPtrTy);
2079 ActualArgs.add(RValue::get(Arg0), Arg0Ty);
2080 ActualArgs.add(RValue::get(Sel), CGF.getContext().getObjCSelType());
2081 ActualArgs.addFrom(CallArgs);
2083 // If we're calling a method, use the formal signature.
2084 MessageSendInfo MSI = getMessageSendInfo(Method, ResultType, ActualArgs);
2087 assert(CGM.getContext().getCanonicalType(Method->getReturnType()) ==
2088 CGM.getContext().getCanonicalType(ResultType) &&
2089 "Result type mismatch!");
2091 bool ReceiverCanBeNull = true;
2093 // Super dispatch assumes that self is non-null; even the messenger
2094 // doesn't have a null check internally.
2096 ReceiverCanBeNull = false;
2098 // If this is a direct dispatch of a class method, check whether the class,
2099 // or anything in its hierarchy, was weak-linked.
2100 } else if (ClassReceiver && Method && Method->isClassMethod()) {
2101 ReceiverCanBeNull = isWeakLinkedClass(ClassReceiver);
2103 // If we're emitting a method, and self is const (meaning just ARC, for now),
2104 // and the receiver is a load of self, then self is a valid object.
2105 } else if (auto CurMethod =
2106 dyn_cast_or_null<ObjCMethodDecl>(CGF.CurCodeDecl)) {
2107 auto Self = CurMethod->getSelfDecl();
2108 if (Self->getType().isConstQualified()) {
2109 if (auto LI = dyn_cast<llvm::LoadInst>(Arg0->stripPointerCasts())) {
2110 llvm::Value *SelfAddr = CGF.GetAddrOfLocalVar(Self).getPointer();
2111 if (SelfAddr == LI->getPointerOperand()) {
2112 ReceiverCanBeNull = false;
2118 NullReturnState nullReturn;
2120 llvm::Constant *Fn = nullptr;
2121 if (CGM.ReturnSlotInterferesWithArgs(MSI.CallInfo)) {
2122 if (ReceiverCanBeNull) nullReturn.init(CGF, Arg0);
2123 Fn = (ObjCABI == 2) ? ObjCTypes.getSendStretFn2(IsSuper)
2124 : ObjCTypes.getSendStretFn(IsSuper);
2125 } else if (CGM.ReturnTypeUsesFPRet(ResultType)) {
2126 Fn = (ObjCABI == 2) ? ObjCTypes.getSendFpretFn2(IsSuper)
2127 : ObjCTypes.getSendFpretFn(IsSuper);
2128 } else if (CGM.ReturnTypeUsesFP2Ret(ResultType)) {
2129 Fn = (ObjCABI == 2) ? ObjCTypes.getSendFp2RetFn2(IsSuper)
2130 : ObjCTypes.getSendFp2retFn(IsSuper);
2132 // arm64 uses objc_msgSend for stret methods and yet null receiver check
2133 // must be made for it.
2134 if (ReceiverCanBeNull && CGM.ReturnTypeUsesSRet(MSI.CallInfo))
2135 nullReturn.init(CGF, Arg0);
2136 Fn = (ObjCABI == 2) ? ObjCTypes.getSendFn2(IsSuper)
2137 : ObjCTypes.getSendFn(IsSuper);
2140 // Emit a null-check if there's a consumed argument other than the receiver.
2141 bool RequiresNullCheck = false;
2142 if (ReceiverCanBeNull && CGM.getLangOpts().ObjCAutoRefCount && Method) {
2143 for (const auto *ParamDecl : Method->parameters()) {
2144 if (ParamDecl->hasAttr<NSConsumedAttr>()) {
2145 if (!nullReturn.NullBB)
2146 nullReturn.init(CGF, Arg0);
2147 RequiresNullCheck = true;
2153 llvm::Instruction *CallSite;
2154 Fn = llvm::ConstantExpr::getBitCast(Fn, MSI.MessengerType);
2155 CGCallee Callee = CGCallee::forDirect(Fn);
2156 RValue rvalue = CGF.EmitCall(MSI.CallInfo, Callee, Return, ActualArgs,
2159 // Mark the call as noreturn if the method is marked noreturn and the
2160 // receiver cannot be null.
2161 if (Method && Method->hasAttr<NoReturnAttr>() && !ReceiverCanBeNull) {
2162 llvm::CallSite(CallSite).setDoesNotReturn();
2165 return nullReturn.complete(CGF, rvalue, ResultType, CallArgs,
2166 RequiresNullCheck ? Method : nullptr);
2169 static Qualifiers::GC GetGCAttrTypeForType(ASTContext &Ctx, QualType FQT,
2170 bool pointee = false) {
2171 // Note that GC qualification applies recursively to C pointer types
2172 // that aren't otherwise decorated. This is weird, but it's probably
2173 // an intentional workaround to the unreliable placement of GC qualifiers.
2174 if (FQT.isObjCGCStrong())
2175 return Qualifiers::Strong;
2177 if (FQT.isObjCGCWeak())
2178 return Qualifiers::Weak;
2180 if (auto ownership = FQT.getObjCLifetime()) {
2181 // Ownership does not apply recursively to C pointer types.
2182 if (pointee) return Qualifiers::GCNone;
2183 switch (ownership) {
2184 case Qualifiers::OCL_Weak: return Qualifiers::Weak;
2185 case Qualifiers::OCL_Strong: return Qualifiers::Strong;
2186 case Qualifiers::OCL_ExplicitNone: return Qualifiers::GCNone;
2187 case Qualifiers::OCL_Autoreleasing: llvm_unreachable("autoreleasing ivar?");
2188 case Qualifiers::OCL_None: llvm_unreachable("known nonzero");
2190 llvm_unreachable("bad objc ownership");
2193 // Treat unqualified retainable pointers as strong.
2194 if (FQT->isObjCObjectPointerType() || FQT->isBlockPointerType())
2195 return Qualifiers::Strong;
2197 // Walk into C pointer types, but only in GC.
2198 if (Ctx.getLangOpts().getGC() != LangOptions::NonGC) {
2199 if (const PointerType *PT = FQT->getAs<PointerType>())
2200 return GetGCAttrTypeForType(Ctx, PT->getPointeeType(), /*pointee*/ true);
2203 return Qualifiers::GCNone;
2209 uint64_t SizeInWords;
2210 IvarInfo(CharUnits offset, uint64_t sizeInWords)
2211 : Offset(offset), SizeInWords(sizeInWords) {}
2213 // Allow sorting based on byte pos.
2214 bool operator<(const IvarInfo &other) const {
2215 return Offset < other.Offset;
2219 /// A helper class for building GC layout strings.
2220 class IvarLayoutBuilder {
2223 /// The start of the layout. Offsets will be relative to this value,
2224 /// and entries less than this value will be silently discarded.
2225 CharUnits InstanceBegin;
2227 /// The end of the layout. Offsets will never exceed this value.
2228 CharUnits InstanceEnd;
2230 /// Whether we're generating the strong layout or the weak layout.
2231 bool ForStrongLayout;
2233 /// Whether the offsets in IvarsInfo might be out-of-order.
2234 bool IsDisordered = false;
2236 llvm::SmallVector<IvarInfo, 8> IvarsInfo;
2239 IvarLayoutBuilder(CodeGenModule &CGM, CharUnits instanceBegin,
2240 CharUnits instanceEnd, bool forStrongLayout)
2241 : CGM(CGM), InstanceBegin(instanceBegin), InstanceEnd(instanceEnd),
2242 ForStrongLayout(forStrongLayout) {
2245 void visitRecord(const RecordType *RT, CharUnits offset);
2247 template <class Iterator, class GetOffsetFn>
2248 void visitAggregate(Iterator begin, Iterator end,
2249 CharUnits aggrOffset,
2250 const GetOffsetFn &getOffset);
2252 void visitField(const FieldDecl *field, CharUnits offset);
2254 /// Add the layout of a block implementation.
2255 void visitBlock(const CGBlockInfo &blockInfo);
2257 /// Is there any information for an interesting bitmap?
2258 bool hasBitmapData() const { return !IvarsInfo.empty(); }
2260 llvm::Constant *buildBitmap(CGObjCCommonMac &CGObjC,
2261 llvm::SmallVectorImpl<unsigned char> &buffer);
2263 static void dump(ArrayRef<unsigned char> buffer) {
2264 const unsigned char *s = buffer.data();
2265 for (unsigned i = 0, e = buffer.size(); i < e; i++)
2267 printf("0x0%x%s", s[i], s[i] != 0 ? ", " : "");
2269 printf("0x%x%s", s[i], s[i] != 0 ? ", " : "");
2273 } // end anonymous namespace
2275 llvm::Constant *CGObjCCommonMac::BuildGCBlockLayout(CodeGenModule &CGM,
2276 const CGBlockInfo &blockInfo) {
2278 llvm::Constant *nullPtr = llvm::Constant::getNullValue(CGM.Int8PtrTy);
2279 if (CGM.getLangOpts().getGC() == LangOptions::NonGC)
2282 IvarLayoutBuilder builder(CGM, CharUnits::Zero(), blockInfo.BlockSize,
2283 /*for strong layout*/ true);
2285 builder.visitBlock(blockInfo);
2287 if (!builder.hasBitmapData())
2290 llvm::SmallVector<unsigned char, 32> buffer;
2291 llvm::Constant *C = builder.buildBitmap(*this, buffer);
2292 if (CGM.getLangOpts().ObjCGCBitmapPrint && !buffer.empty()) {
2293 printf("\n block variable layout for block: ");
2294 builder.dump(buffer);
2300 void IvarLayoutBuilder::visitBlock(const CGBlockInfo &blockInfo) {
2301 // __isa is the first field in block descriptor and must assume by runtime's
2302 // convention that it is GC'able.
2303 IvarsInfo.push_back(IvarInfo(CharUnits::Zero(), 1));
2305 const BlockDecl *blockDecl = blockInfo.getBlockDecl();
2307 // Ignore the optional 'this' capture: C++ objects are not assumed
2310 CharUnits lastFieldOffset;
2312 // Walk the captured variables.
2313 for (const auto &CI : blockDecl->captures()) {
2314 const VarDecl *variable = CI.getVariable();
2315 QualType type = variable->getType();
2317 const CGBlockInfo::Capture &capture = blockInfo.getCapture(variable);
2319 // Ignore constant captures.
2320 if (capture.isConstant()) continue;
2322 CharUnits fieldOffset = capture.getOffset();
2324 // Block fields are not necessarily ordered; if we detect that we're
2325 // adding them out-of-order, make sure we sort later.
2326 if (fieldOffset < lastFieldOffset)
2327 IsDisordered = true;
2328 lastFieldOffset = fieldOffset;
2330 // __block variables are passed by their descriptor address.
2332 IvarsInfo.push_back(IvarInfo(fieldOffset, /*size in words*/ 1));
2336 assert(!type->isArrayType() && "array variable should not be caught");
2337 if (const RecordType *record = type->getAs<RecordType>()) {
2338 visitRecord(record, fieldOffset);
2342 Qualifiers::GC GCAttr = GetGCAttrTypeForType(CGM.getContext(), type);
2344 if (GCAttr == Qualifiers::Strong) {
2345 assert(CGM.getContext().getTypeSize(type)
2346 == CGM.getTarget().getPointerWidth(0));
2347 IvarsInfo.push_back(IvarInfo(fieldOffset, /*size in words*/ 1));
2352 /// getBlockCaptureLifetime - This routine returns life time of the captured
2353 /// block variable for the purpose of block layout meta-data generation. FQT is
2354 /// the type of the variable captured in the block.
2355 Qualifiers::ObjCLifetime CGObjCCommonMac::getBlockCaptureLifetime(QualType FQT,
2357 // If it has an ownership qualifier, we're done.
2358 if (auto lifetime = FQT.getObjCLifetime())
2361 // If it doesn't, and this is ARC, it has no ownership.
2362 if (CGM.getLangOpts().ObjCAutoRefCount)
2363 return Qualifiers::OCL_None;
2365 // In MRC, retainable pointers are owned by non-__block variables.
2366 if (FQT->isObjCObjectPointerType() || FQT->isBlockPointerType())
2367 return ByrefLayout ? Qualifiers::OCL_ExplicitNone : Qualifiers::OCL_Strong;
2369 return Qualifiers::OCL_None;
2372 void CGObjCCommonMac::UpdateRunSkipBlockVars(bool IsByref,
2373 Qualifiers::ObjCLifetime LifeTime,
2374 CharUnits FieldOffset,
2375 CharUnits FieldSize) {
2376 // __block variables are passed by their descriptor address.
2378 RunSkipBlockVars.push_back(RUN_SKIP(BLOCK_LAYOUT_BYREF, FieldOffset,
2380 else if (LifeTime == Qualifiers::OCL_Strong)
2381 RunSkipBlockVars.push_back(RUN_SKIP(BLOCK_LAYOUT_STRONG, FieldOffset,
2383 else if (LifeTime == Qualifiers::OCL_Weak)
2384 RunSkipBlockVars.push_back(RUN_SKIP(BLOCK_LAYOUT_WEAK, FieldOffset,
2386 else if (LifeTime == Qualifiers::OCL_ExplicitNone)
2387 RunSkipBlockVars.push_back(RUN_SKIP(BLOCK_LAYOUT_UNRETAINED, FieldOffset,
2390 RunSkipBlockVars.push_back(RUN_SKIP(BLOCK_LAYOUT_NON_OBJECT_BYTES,
2395 void CGObjCCommonMac::BuildRCRecordLayout(const llvm::StructLayout *RecLayout,
2396 const RecordDecl *RD,
2397 ArrayRef<const FieldDecl*> RecFields,
2398 CharUnits BytePos, bool &HasUnion,
2400 bool IsUnion = (RD && RD->isUnion());
2401 CharUnits MaxUnionSize = CharUnits::Zero();
2402 const FieldDecl *MaxField = nullptr;
2403 const FieldDecl *LastFieldBitfieldOrUnnamed = nullptr;
2404 CharUnits MaxFieldOffset = CharUnits::Zero();
2405 CharUnits LastBitfieldOrUnnamedOffset = CharUnits::Zero();
2407 if (RecFields.empty())
2409 unsigned ByteSizeInBits = CGM.getTarget().getCharWidth();
2411 for (unsigned i = 0, e = RecFields.size(); i != e; ++i) {
2412 const FieldDecl *Field = RecFields[i];
2413 // Note that 'i' here is actually the field index inside RD of Field,
2414 // although this dependency is hidden.
2415 const ASTRecordLayout &RL = CGM.getContext().getASTRecordLayout(RD);
2416 CharUnits FieldOffset =
2417 CGM.getContext().toCharUnitsFromBits(RL.getFieldOffset(i));
2419 // Skip over unnamed or bitfields
2420 if (!Field->getIdentifier() || Field->isBitField()) {
2421 LastFieldBitfieldOrUnnamed = Field;
2422 LastBitfieldOrUnnamedOffset = FieldOffset;
2426 LastFieldBitfieldOrUnnamed = nullptr;
2427 QualType FQT = Field->getType();
2428 if (FQT->isRecordType() || FQT->isUnionType()) {
2429 if (FQT->isUnionType())
2432 BuildRCBlockVarRecordLayout(FQT->getAs<RecordType>(),
2433 BytePos + FieldOffset, HasUnion);
2437 if (const ArrayType *Array = CGM.getContext().getAsArrayType(FQT)) {
2438 const ConstantArrayType *CArray =
2439 dyn_cast_or_null<ConstantArrayType>(Array);
2440 uint64_t ElCount = CArray->getSize().getZExtValue();
2441 assert(CArray && "only array with known element size is supported");
2442 FQT = CArray->getElementType();
2443 while (const ArrayType *Array = CGM.getContext().getAsArrayType(FQT)) {
2444 const ConstantArrayType *CArray =
2445 dyn_cast_or_null<ConstantArrayType>(Array);
2446 ElCount *= CArray->getSize().getZExtValue();
2447 FQT = CArray->getElementType();
2449 if (FQT->isRecordType() && ElCount) {
2450 int OldIndex = RunSkipBlockVars.size() - 1;
2451 const RecordType *RT = FQT->getAs<RecordType>();
2452 BuildRCBlockVarRecordLayout(RT, BytePos + FieldOffset,
2455 // Replicate layout information for each array element. Note that
2456 // one element is already done.
2458 for (int FirstIndex = RunSkipBlockVars.size() - 1 ;ElIx < ElCount; ElIx++) {
2459 CharUnits Size = CGM.getContext().getTypeSizeInChars(RT);
2460 for (int i = OldIndex+1; i <= FirstIndex; ++i)
2461 RunSkipBlockVars.push_back(
2462 RUN_SKIP(RunSkipBlockVars[i].opcode,
2463 RunSkipBlockVars[i].block_var_bytepos + Size*ElIx,
2464 RunSkipBlockVars[i].block_var_size));
2469 CharUnits FieldSize = CGM.getContext().getTypeSizeInChars(Field->getType());
2471 CharUnits UnionIvarSize = FieldSize;
2472 if (UnionIvarSize > MaxUnionSize) {
2473 MaxUnionSize = UnionIvarSize;
2475 MaxFieldOffset = FieldOffset;
2478 UpdateRunSkipBlockVars(false,
2479 getBlockCaptureLifetime(FQT, ByrefLayout),
2480 BytePos + FieldOffset,
2485 if (LastFieldBitfieldOrUnnamed) {
2486 if (LastFieldBitfieldOrUnnamed->isBitField()) {
2487 // Last field was a bitfield. Must update the info.
2488 uint64_t BitFieldSize
2489 = LastFieldBitfieldOrUnnamed->getBitWidthValue(CGM.getContext());
2490 unsigned UnsSize = (BitFieldSize / ByteSizeInBits) +
2491 ((BitFieldSize % ByteSizeInBits) != 0);
2492 CharUnits Size = CharUnits::fromQuantity(UnsSize);
2493 Size += LastBitfieldOrUnnamedOffset;
2494 UpdateRunSkipBlockVars(false,
2495 getBlockCaptureLifetime(LastFieldBitfieldOrUnnamed->getType(),
2497 BytePos + LastBitfieldOrUnnamedOffset,
2500 assert(!LastFieldBitfieldOrUnnamed->getIdentifier() &&"Expected unnamed");
2501 // Last field was unnamed. Must update skip info.
2503 = CGM.getContext().getTypeSizeInChars(LastFieldBitfieldOrUnnamed->getType());
2504 UpdateRunSkipBlockVars(false,
2505 getBlockCaptureLifetime(LastFieldBitfieldOrUnnamed->getType(),
2507 BytePos + LastBitfieldOrUnnamedOffset,
2513 UpdateRunSkipBlockVars(false,
2514 getBlockCaptureLifetime(MaxField->getType(), ByrefLayout),
2515 BytePos + MaxFieldOffset,
2519 void CGObjCCommonMac::BuildRCBlockVarRecordLayout(const RecordType *RT,
2523 const RecordDecl *RD = RT->getDecl();
2524 SmallVector<const FieldDecl*, 16> Fields(RD->fields());
2525 llvm::Type *Ty = CGM.getTypes().ConvertType(QualType(RT, 0));
2526 const llvm::StructLayout *RecLayout =
2527 CGM.getDataLayout().getStructLayout(cast<llvm::StructType>(Ty));
2529 BuildRCRecordLayout(RecLayout, RD, Fields, BytePos, HasUnion, ByrefLayout);
2532 /// InlineLayoutInstruction - This routine produce an inline instruction for the
2533 /// block variable layout if it can. If not, it returns 0. Rules are as follow:
2534 /// If ((uintptr_t) layout) < (1 << 12), the layout is inline. In the 64bit world,
2535 /// an inline layout of value 0x0000000000000xyz is interpreted as follows:
2536 /// x captured object pointers of BLOCK_LAYOUT_STRONG. Followed by
2537 /// y captured object of BLOCK_LAYOUT_BYREF. Followed by
2538 /// z captured object of BLOCK_LAYOUT_WEAK. If any of the above is missing, zero
2539 /// replaces it. For example, 0x00000x00 means x BLOCK_LAYOUT_STRONG and no
2540 /// BLOCK_LAYOUT_BYREF and no BLOCK_LAYOUT_WEAK objects are captured.
2541 uint64_t CGObjCCommonMac::InlineLayoutInstruction(
2542 SmallVectorImpl<unsigned char> &Layout) {
2543 uint64_t Result = 0;
2544 if (Layout.size() <= 3) {
2545 unsigned size = Layout.size();
2546 unsigned strong_word_count = 0, byref_word_count=0, weak_word_count=0;
2548 enum BLOCK_LAYOUT_OPCODE opcode ;
2552 opcode = (enum BLOCK_LAYOUT_OPCODE) (inst >> 4);
2553 if (opcode == BLOCK_LAYOUT_STRONG)
2554 strong_word_count = (inst & 0xF)+1;
2558 opcode = (enum BLOCK_LAYOUT_OPCODE) (inst >> 4);
2559 if (opcode == BLOCK_LAYOUT_BYREF)
2560 byref_word_count = (inst & 0xF)+1;
2564 opcode = (enum BLOCK_LAYOUT_OPCODE) (inst >> 4);
2565 if (opcode == BLOCK_LAYOUT_WEAK)
2566 weak_word_count = (inst & 0xF)+1;
2573 opcode = (enum BLOCK_LAYOUT_OPCODE) (inst >> 4);
2574 if (opcode == BLOCK_LAYOUT_STRONG) {
2575 strong_word_count = (inst & 0xF)+1;
2577 opcode = (enum BLOCK_LAYOUT_OPCODE) (inst >> 4);
2578 if (opcode == BLOCK_LAYOUT_BYREF)
2579 byref_word_count = (inst & 0xF)+1;
2580 else if (opcode == BLOCK_LAYOUT_WEAK)
2581 weak_word_count = (inst & 0xF)+1;
2585 else if (opcode == BLOCK_LAYOUT_BYREF) {
2586 byref_word_count = (inst & 0xF)+1;
2588 opcode = (enum BLOCK_LAYOUT_OPCODE) (inst >> 4);
2589 if (opcode == BLOCK_LAYOUT_WEAK)
2590 weak_word_count = (inst & 0xF)+1;
2600 opcode = (enum BLOCK_LAYOUT_OPCODE) (inst >> 4);
2601 if (opcode == BLOCK_LAYOUT_STRONG)
2602 strong_word_count = (inst & 0xF)+1;
2603 else if (opcode == BLOCK_LAYOUT_BYREF)
2604 byref_word_count = (inst & 0xF)+1;
2605 else if (opcode == BLOCK_LAYOUT_WEAK)
2606 weak_word_count = (inst & 0xF)+1;
2615 // Cannot inline when any of the word counts is 15. Because this is one less
2616 // than the actual work count (so 15 means 16 actual word counts),
2617 // and we can only display 0 thru 15 word counts.
2618 if (strong_word_count == 16 || byref_word_count == 16 || weak_word_count == 16)
2622 (strong_word_count != 0) + (byref_word_count != 0) + (weak_word_count != 0);
2624 if (size == count) {
2625 if (strong_word_count)
2626 Result = strong_word_count;
2628 if (byref_word_count)
2629 Result += byref_word_count;
2631 if (weak_word_count)
2632 Result += weak_word_count;
2638 llvm::Constant *CGObjCCommonMac::getBitmapBlockLayout(bool ComputeByrefLayout) {
2639 llvm::Constant *nullPtr = llvm::Constant::getNullValue(CGM.Int8PtrTy);
2640 if (RunSkipBlockVars.empty())
2642 unsigned WordSizeInBits = CGM.getTarget().getPointerWidth(0);
2643 unsigned ByteSizeInBits = CGM.getTarget().getCharWidth();
2644 unsigned WordSizeInBytes = WordSizeInBits/ByteSizeInBits;
2646 // Sort on byte position; captures might not be allocated in order,
2647 // and unions can do funny things.
2648 llvm::array_pod_sort(RunSkipBlockVars.begin(), RunSkipBlockVars.end());
2649 SmallVector<unsigned char, 16> Layout;
2651 unsigned size = RunSkipBlockVars.size();
2652 for (unsigned i = 0; i < size; i++) {
2653 enum BLOCK_LAYOUT_OPCODE opcode = RunSkipBlockVars[i].opcode;
2654 CharUnits start_byte_pos = RunSkipBlockVars[i].block_var_bytepos;
2655 CharUnits end_byte_pos = start_byte_pos;
2658 if (opcode == RunSkipBlockVars[j].opcode) {
2659 end_byte_pos = RunSkipBlockVars[j++].block_var_bytepos;
2665 CharUnits size_in_bytes =
2666 end_byte_pos - start_byte_pos + RunSkipBlockVars[j-1].block_var_size;
2669 RunSkipBlockVars[j].block_var_bytepos -
2670 RunSkipBlockVars[j-1].block_var_bytepos - RunSkipBlockVars[j-1].block_var_size;
2671 size_in_bytes += gap;
2673 CharUnits residue_in_bytes = CharUnits::Zero();
2674 if (opcode == BLOCK_LAYOUT_NON_OBJECT_BYTES) {
2675 residue_in_bytes = size_in_bytes % WordSizeInBytes;
2676 size_in_bytes -= residue_in_bytes;
2677 opcode = BLOCK_LAYOUT_NON_OBJECT_WORDS;
2680 unsigned size_in_words = size_in_bytes.getQuantity() / WordSizeInBytes;
2681 while (size_in_words >= 16) {
2682 // Note that value in imm. is one less that the actual
2683 // value. So, 0xf means 16 words follow!
2684 unsigned char inst = (opcode << 4) | 0xf;
2685 Layout.push_back(inst);
2686 size_in_words -= 16;
2688 if (size_in_words > 0) {
2689 // Note that value in imm. is one less that the actual
2690 // value. So, we subtract 1 away!
2691 unsigned char inst = (opcode << 4) | (size_in_words-1);
2692 Layout.push_back(inst);
2694 if (residue_in_bytes > CharUnits::Zero()) {
2695 unsigned char inst =
2696 (BLOCK_LAYOUT_NON_OBJECT_BYTES << 4) | (residue_in_bytes.getQuantity()-1);
2697 Layout.push_back(inst);
2701 while (!Layout.empty()) {
2702 unsigned char inst = Layout.back();
2703 enum BLOCK_LAYOUT_OPCODE opcode = (enum BLOCK_LAYOUT_OPCODE) (inst >> 4);
2704 if (opcode == BLOCK_LAYOUT_NON_OBJECT_BYTES || opcode == BLOCK_LAYOUT_NON_OBJECT_WORDS)
2710 uint64_t Result = InlineLayoutInstruction(Layout);
2712 // Block variable layout instruction has been inlined.
2713 if (CGM.getLangOpts().ObjCGCBitmapPrint) {
2714 if (ComputeByrefLayout)
2715 printf("\n Inline BYREF variable layout: ");
2717 printf("\n Inline block variable layout: ");
2718 printf("0x0%" PRIx64 "", Result);
2719 if (auto numStrong = (Result & 0xF00) >> 8)
2720 printf(", BL_STRONG:%d", (int) numStrong);
2721 if (auto numByref = (Result & 0x0F0) >> 4)
2722 printf(", BL_BYREF:%d", (int) numByref);
2723 if (auto numWeak = (Result & 0x00F) >> 0)
2724 printf(", BL_WEAK:%d", (int) numWeak);
2725 printf(", BL_OPERATOR:0\n");
2727 return llvm::ConstantInt::get(CGM.IntPtrTy, Result);
2730 unsigned char inst = (BLOCK_LAYOUT_OPERATOR << 4) | 0;
2731 Layout.push_back(inst);
2733 for (unsigned i = 0, e = Layout.size(); i != e; i++)
2734 BitMap += Layout[i];
2736 if (CGM.getLangOpts().ObjCGCBitmapPrint) {
2737 if (ComputeByrefLayout)
2738 printf("\n Byref variable layout: ");
2740 printf("\n Block variable layout: ");
2741 for (unsigned i = 0, e = BitMap.size(); i != e; i++) {
2742 unsigned char inst = BitMap[i];
2743 enum BLOCK_LAYOUT_OPCODE opcode = (enum BLOCK_LAYOUT_OPCODE) (inst >> 4);
2746 case BLOCK_LAYOUT_OPERATOR:
2747 printf("BL_OPERATOR:");
2750 case BLOCK_LAYOUT_NON_OBJECT_BYTES:
2751 printf("BL_NON_OBJECT_BYTES:");
2753 case BLOCK_LAYOUT_NON_OBJECT_WORDS:
2754 printf("BL_NON_OBJECT_WORD:");
2756 case BLOCK_LAYOUT_STRONG:
2757 printf("BL_STRONG:");
2759 case BLOCK_LAYOUT_BYREF:
2760 printf("BL_BYREF:");
2762 case BLOCK_LAYOUT_WEAK:
2765 case BLOCK_LAYOUT_UNRETAINED:
2766 printf("BL_UNRETAINED:");
2769 // Actual value of word count is one more that what is in the imm.
2770 // field of the instruction
2771 printf("%d", (inst & 0xf) + delta);
2779 auto *Entry = CreateCStringLiteral(BitMap, ObjCLabelType::ClassName,
2780 /*ForceNonFragileABI=*/true,
2781 /*NullTerminate=*/false);
2782 return getConstantGEP(VMContext, Entry, 0, 0);
2785 llvm::Constant *CGObjCCommonMac::BuildRCBlockLayout(CodeGenModule &CGM,
2786 const CGBlockInfo &blockInfo) {
2787 assert(CGM.getLangOpts().getGC() == LangOptions::NonGC);
2789 RunSkipBlockVars.clear();
2790 bool hasUnion = false;
2792 unsigned WordSizeInBits = CGM.getTarget().getPointerWidth(0);
2793 unsigned ByteSizeInBits = CGM.getTarget().getCharWidth();
2794 unsigned WordSizeInBytes = WordSizeInBits/ByteSizeInBits;
2796 const BlockDecl *blockDecl = blockInfo.getBlockDecl();
2798 // Calculate the basic layout of the block structure.
2799 const llvm::StructLayout *layout =
2800 CGM.getDataLayout().getStructLayout(blockInfo.StructureType);
2802 // Ignore the optional 'this' capture: C++ objects are not assumed
2804 if (blockInfo.BlockHeaderForcedGapSize != CharUnits::Zero())
2805 UpdateRunSkipBlockVars(false, Qualifiers::OCL_None,
2806 blockInfo.BlockHeaderForcedGapOffset,
2807 blockInfo.BlockHeaderForcedGapSize);
2808 // Walk the captured variables.
2809 for (const auto &CI : blockDecl->captures()) {
2810 const VarDecl *variable = CI.getVariable();
2811 QualType type = variable->getType();
2813 const CGBlockInfo::Capture &capture = blockInfo.getCapture(variable);
2815 // Ignore constant captures.
2816 if (capture.isConstant()) continue;
2818 CharUnits fieldOffset =
2819 CharUnits::fromQuantity(layout->getElementOffset(capture.getIndex()));
2821 assert(!type->isArrayType() && "array variable should not be caught");
2823 if (const RecordType *record = type->getAs<RecordType>()) {
2824 BuildRCBlockVarRecordLayout(record, fieldOffset, hasUnion);
2827 CharUnits fieldSize;
2829 fieldSize = CharUnits::fromQuantity(WordSizeInBytes);
2831 fieldSize = CGM.getContext().getTypeSizeInChars(type);
2832 UpdateRunSkipBlockVars(CI.isByRef(), getBlockCaptureLifetime(type, false),
2833 fieldOffset, fieldSize);
2835 return getBitmapBlockLayout(false);
2838 llvm::Constant *CGObjCCommonMac::BuildByrefLayout(CodeGen::CodeGenModule &CGM,
2840 assert(CGM.getLangOpts().getGC() == LangOptions::NonGC);
2841 assert(!T->isArrayType() && "__block array variable should not be caught");
2842 CharUnits fieldOffset;
2843 RunSkipBlockVars.clear();
2844 bool hasUnion = false;
2845 if (const RecordType *record = T->getAs<RecordType>()) {
2846 BuildRCBlockVarRecordLayout(record, fieldOffset, hasUnion, true /*ByrefLayout */);
2847 llvm::Constant *Result = getBitmapBlockLayout(true);
2848 if (isa<llvm::ConstantInt>(Result))
2849 Result = llvm::ConstantExpr::getIntToPtr(Result, CGM.Int8PtrTy);
2852 llvm::Constant *nullPtr = llvm::Constant::getNullValue(CGM.Int8PtrTy);
2856 llvm::Value *CGObjCMac::GenerateProtocolRef(CodeGenFunction &CGF,
2857 const ObjCProtocolDecl *PD) {
2858 // FIXME: I don't understand why gcc generates this, or where it is
2859 // resolved. Investigate. Its also wasteful to look this up over and over.
2860 LazySymbols.insert(&CGM.getContext().Idents.get("Protocol"));
2862 return llvm::ConstantExpr::getBitCast(GetProtocolRef(PD),
2863 ObjCTypes.getExternalProtocolPtrTy());
2866 void CGObjCCommonMac::GenerateProtocol(const ObjCProtocolDecl *PD) {
2867 // FIXME: We shouldn't need this, the protocol decl should contain enough
2868 // information to tell us whether this was a declaration or a definition.
2869 DefinedProtocols.insert(PD->getIdentifier());
2871 // If we have generated a forward reference to this protocol, emit
2872 // it now. Otherwise do nothing, the protocol objects are lazily
2874 if (Protocols.count(PD->getIdentifier()))
2875 GetOrEmitProtocol(PD);
2878 llvm::Constant *CGObjCCommonMac::GetProtocolRef(const ObjCProtocolDecl *PD) {
2879 if (DefinedProtocols.count(PD->getIdentifier()))
2880 return GetOrEmitProtocol(PD);
2882 return GetOrEmitProtocolRef(PD);
2885 llvm::Value *CGObjCCommonMac::EmitClassRefViaRuntime(
2886 CodeGenFunction &CGF,
2887 const ObjCInterfaceDecl *ID,
2888 ObjCCommonTypesHelper &ObjCTypes) {
2889 llvm::Constant *lookUpClassFn = ObjCTypes.getLookUpClassFn();
2891 llvm::Value *className =
2892 CGF.CGM.GetAddrOfConstantCString(ID->getObjCRuntimeNameAsString())
2894 ASTContext &ctx = CGF.CGM.getContext();
2896 CGF.Builder.CreateBitCast(className,
2898 ctx.getPointerType(ctx.CharTy.withConst())));
2899 llvm::CallInst *call = CGF.Builder.CreateCall(lookUpClassFn, className);
2900 call->setDoesNotThrow();
2905 // Objective-C 1.0 extensions
2906 struct _objc_protocol {
2907 struct _objc_protocol_extension *isa;
2908 char *protocol_name;
2909 struct _objc_protocol_list *protocol_list;
2910 struct _objc__method_prototype_list *instance_methods;
2911 struct _objc__method_prototype_list *class_methods
2914 See EmitProtocolExtension().
2916 llvm::Constant *CGObjCMac::GetOrEmitProtocol(const ObjCProtocolDecl *PD) {
2917 llvm::GlobalVariable *Entry = Protocols[PD->getIdentifier()];
2919 // Early exit if a defining object has already been generated.
2920 if (Entry && Entry->hasInitializer())
2923 // Use the protocol definition, if there is one.
2924 if (const ObjCProtocolDecl *Def = PD->getDefinition())
2927 // FIXME: I don't understand why gcc generates this, or where it is
2928 // resolved. Investigate. Its also wasteful to look this up over and over.
2929 LazySymbols.insert(&CGM.getContext().Idents.get("Protocol"));
2931 // Construct method lists.
2932 auto methodLists = ProtocolMethodLists::get(PD);
2934 ConstantInitBuilder builder(CGM);
2935 auto values = builder.beginStruct(ObjCTypes.ProtocolTy);
2936 values.add(EmitProtocolExtension(PD, methodLists));
2937 values.add(GetClassName(PD->getObjCRuntimeNameAsString()));
2938 values.add(EmitProtocolList("OBJC_PROTOCOL_REFS_" + PD->getName(),
2939 PD->protocol_begin(), PD->protocol_end()));
2940 values.add(methodLists.emitMethodList(this, PD,
2941 ProtocolMethodLists::RequiredInstanceMethods));
2942 values.add(methodLists.emitMethodList(this, PD,
2943 ProtocolMethodLists::RequiredClassMethods));
2946 // Already created, update the initializer.
2947 assert(Entry->hasPrivateLinkage());
2948 values.finishAndSetAsInitializer(Entry);
2950 Entry = values.finishAndCreateGlobal("OBJC_PROTOCOL_" + PD->getName(),
2951 CGM.getPointerAlign(),
2953 llvm::GlobalValue::PrivateLinkage);
2954 Entry->setSection("__OBJC,__protocol,regular,no_dead_strip");
2956 Protocols[PD->getIdentifier()] = Entry;
2958 CGM.addCompilerUsedGlobal(Entry);
2963 llvm::Constant *CGObjCMac::GetOrEmitProtocolRef(const ObjCProtocolDecl *PD) {
2964 llvm::GlobalVariable *&Entry = Protocols[PD->getIdentifier()];
2967 // We use the initializer as a marker of whether this is a forward
2968 // reference or not. At module finalization we add the empty
2969 // contents for protocols which were referenced but never defined.
2970 Entry = new llvm::GlobalVariable(CGM.getModule(), ObjCTypes.ProtocolTy,
2971 false, llvm::GlobalValue::PrivateLinkage,
2972 nullptr, "OBJC_PROTOCOL_" + PD->getName());
2973 Entry->setSection("__OBJC,__protocol,regular,no_dead_strip");
2974 // FIXME: Is this necessary? Why only for protocol?
2975 Entry->setAlignment(4);
2982 struct _objc_protocol_extension {
2984 struct objc_method_description_list *optional_instance_methods;
2985 struct objc_method_description_list *optional_class_methods;
2986 struct objc_property_list *instance_properties;
2987 const char ** extendedMethodTypes;
2988 struct objc_property_list *class_properties;
2992 CGObjCMac::EmitProtocolExtension(const ObjCProtocolDecl *PD,
2993 const ProtocolMethodLists &methodLists) {
2994 auto optInstanceMethods =
2995 methodLists.emitMethodList(this, PD,
2996 ProtocolMethodLists::OptionalInstanceMethods);
2997 auto optClassMethods =
2998 methodLists.emitMethodList(this, PD,
2999 ProtocolMethodLists::OptionalClassMethods);
3001 auto extendedMethodTypes =
3002 EmitProtocolMethodTypes("OBJC_PROTOCOL_METHOD_TYPES_" + PD->getName(),
3003 methodLists.emitExtendedTypesArray(this),
3006 auto instanceProperties =
3007 EmitPropertyList("OBJC_$_PROP_PROTO_LIST_" + PD->getName(), nullptr, PD,
3009 auto classProperties =
3010 EmitPropertyList("OBJC_$_CLASS_PROP_PROTO_LIST_" + PD->getName(), nullptr,
3011 PD, ObjCTypes, true);
3013 // Return null if no extension bits are used.
3014 if (optInstanceMethods->isNullValue() &&
3015 optClassMethods->isNullValue() &&
3016 extendedMethodTypes->isNullValue() &&
3017 instanceProperties->isNullValue() &&
3018 classProperties->isNullValue()) {
3019 return llvm::Constant::getNullValue(ObjCTypes.ProtocolExtensionPtrTy);
3023 CGM.getDataLayout().getTypeAllocSize(ObjCTypes.ProtocolExtensionTy);
3025 ConstantInitBuilder builder(CGM);
3026 auto values = builder.beginStruct(ObjCTypes.ProtocolExtensionTy);
3027 values.addInt(ObjCTypes.IntTy, size);
3028 values.add(optInstanceMethods);
3029 values.add(optClassMethods);
3030 values.add(instanceProperties);
3031 values.add(extendedMethodTypes);
3032 values.add(classProperties);
3034 // No special section, but goes in llvm.used
3035 return CreateMetadataVar("\01l_OBJC_PROTOCOLEXT_" + PD->getName(), values,
3036 StringRef(), CGM.getPointerAlign(), true);
3040 struct objc_protocol_list {
3041 struct objc_protocol_list *next;
3047 CGObjCMac::EmitProtocolList(Twine name,
3048 ObjCProtocolDecl::protocol_iterator begin,
3049 ObjCProtocolDecl::protocol_iterator end) {
3050 // Just return null for empty protocol lists
3052 return llvm::Constant::getNullValue(ObjCTypes.ProtocolListPtrTy);
3054 ConstantInitBuilder builder(CGM);
3055 auto values = builder.beginStruct();
3057 // This field is only used by the runtime.
3058 values.addNullPointer(ObjCTypes.ProtocolListPtrTy);
3060 // Reserve a slot for the count.
3061 auto countSlot = values.addPlaceholder();
3063 auto refsArray = values.beginArray(ObjCTypes.ProtocolPtrTy);
3064 for (; begin != end; ++begin) {
3065 refsArray.add(GetProtocolRef(*begin));
3067 auto count = refsArray.size();
3069 // This list is null terminated.
3070 refsArray.addNullPointer(ObjCTypes.ProtocolPtrTy);
3072 refsArray.finishAndAddTo(values);
3073 values.fillPlaceholderWithInt(countSlot, ObjCTypes.LongTy, count);
3076 if (CGM.getTriple().isOSBinFormatMachO())
3077 section = "__OBJC,__cat_cls_meth,regular,no_dead_strip";
3079 llvm::GlobalVariable *GV =
3080 CreateMetadataVar(name, values, section, CGM.getPointerAlign(), false);
3081 return llvm::ConstantExpr::getBitCast(GV, ObjCTypes.ProtocolListPtrTy);
3085 PushProtocolProperties(llvm::SmallPtrSet<const IdentifierInfo*,16> &PropertySet,
3086 SmallVectorImpl<const ObjCPropertyDecl *> &Properties,
3087 const ObjCProtocolDecl *Proto,
3088 bool IsClassProperty) {
3089 for (const auto *P : Proto->protocols())
3090 PushProtocolProperties(PropertySet, Properties, P, IsClassProperty);
3092 for (const auto *PD : Proto->properties()) {
3093 if (IsClassProperty != PD->isClassProperty())
3095 if (!PropertySet.insert(PD->getIdentifier()).second)
3097 Properties.push_back(PD);
3102 struct _objc_property {
3103 const char * const name;
3104 const char * const attributes;
3107 struct _objc_property_list {
3108 uint32_t entsize; // sizeof (struct _objc_property)
3109 uint32_t prop_count;
3110 struct _objc_property[prop_count];
3113 llvm::Constant *CGObjCCommonMac::EmitPropertyList(Twine Name,
3114 const Decl *Container,
3115 const ObjCContainerDecl *OCD,
3116 const ObjCCommonTypesHelper &ObjCTypes,
3117 bool IsClassProperty) {
3118 if (IsClassProperty) {
3119 // Make this entry NULL for OS X with deployment target < 10.11, for iOS
3120 // with deployment target < 9.0.
3121 const llvm::Triple &Triple = CGM.getTarget().getTriple();
3122 if ((Triple.isMacOSX() && Triple.isMacOSXVersionLT(10, 11)) ||
3123 (Triple.isiOS() && Triple.isOSVersionLT(9)))
3124 return llvm::Constant::getNullValue(ObjCTypes.PropertyListPtrTy);
3127 SmallVector<const ObjCPropertyDecl *, 16> Properties;
3128 llvm::SmallPtrSet<const IdentifierInfo*, 16> PropertySet;
3130 if (const ObjCInterfaceDecl *OID = dyn_cast<ObjCInterfaceDecl>(OCD))
3131 for (const ObjCCategoryDecl *ClassExt : OID->known_extensions())
3132 for (auto *PD : ClassExt->properties()) {
3133 if (IsClassProperty != PD->isClassProperty())
3135 PropertySet.insert(PD->getIdentifier());
3136 Properties.push_back(PD);
3139 for (const auto *PD : OCD->properties()) {
3140 if (IsClassProperty != PD->isClassProperty())
3142 // Don't emit duplicate metadata for properties that were already in a
3144 if (!PropertySet.insert(PD->getIdentifier()).second)
3146 Properties.push_back(PD);
3149 if (const ObjCInterfaceDecl *OID = dyn_cast<ObjCInterfaceDecl>(OCD)) {
3150 for (const auto *P : OID->all_referenced_protocols())
3151 PushProtocolProperties(PropertySet, Properties, P, IsClassProperty);
3153 else if (const ObjCCategoryDecl *CD = dyn_cast<ObjCCategoryDecl>(OCD)) {
3154 for (const auto *P : CD->protocols())
3155 PushProtocolProperties(PropertySet, Properties, P, IsClassProperty);
3158 // Return null for empty list.
3159 if (Properties.empty())
3160 return llvm::Constant::getNullValue(ObjCTypes.PropertyListPtrTy);
3162 unsigned propertySize =
3163 CGM.getDataLayout().getTypeAllocSize(ObjCTypes.PropertyTy);
3165 ConstantInitBuilder builder(CGM);
3166 auto values = builder.beginStruct();
3167 values.addInt(ObjCTypes.IntTy, propertySize);
3168 values.addInt(ObjCTypes.IntTy, Properties.size());
3169 auto propertiesArray = values.beginArray(ObjCTypes.PropertyTy);
3170 for (auto PD : Properties) {
3171 auto property = propertiesArray.beginStruct(ObjCTypes.PropertyTy);
3172 property.add(GetPropertyName(PD->getIdentifier()));
3173 property.add(GetPropertyTypeString(PD, Container));
3174 property.finishAndAddTo(propertiesArray);
3176 propertiesArray.finishAndAddTo(values);
3179 if (CGM.getTriple().isOSBinFormatMachO())
3180 Section = (ObjCABI == 2) ? "__DATA, __objc_const"
3181 : "__OBJC,__property,regular,no_dead_strip";
3183 llvm::GlobalVariable *GV =
3184 CreateMetadataVar(Name, values, Section, CGM.getPointerAlign(), true);
3185 return llvm::ConstantExpr::getBitCast(GV, ObjCTypes.PropertyListPtrTy);
3189 CGObjCCommonMac::EmitProtocolMethodTypes(Twine Name,
3190 ArrayRef<llvm::Constant*> MethodTypes,
3191 const ObjCCommonTypesHelper &ObjCTypes) {
3192 // Return null for empty list.
3193 if (MethodTypes.empty())
3194 return llvm::Constant::getNullValue(ObjCTypes.Int8PtrPtrTy);
3196 llvm::ArrayType *AT = llvm::ArrayType::get(ObjCTypes.Int8PtrTy,
3197 MethodTypes.size());
3198 llvm::Constant *Init = llvm::ConstantArray::get(AT, MethodTypes);
3201 if (CGM.getTriple().isOSBinFormatMachO() && ObjCABI == 2)
3202 Section = "__DATA, __objc_const";
3204 llvm::GlobalVariable *GV =
3205 CreateMetadataVar(Name, Init, Section, CGM.getPointerAlign(), true);
3206 return llvm::ConstantExpr::getBitCast(GV, ObjCTypes.Int8PtrPtrTy);
3210 struct _objc_category {
3211 char *category_name;
3213 struct _objc_method_list *instance_methods;
3214 struct _objc_method_list *class_methods;
3215 struct _objc_protocol_list *protocols;
3216 uint32_t size; // <rdar://4585769>
3217 struct _objc_property_list *instance_properties;
3218 struct _objc_property_list *class_properties;
3221 void CGObjCMac::GenerateCategory(const ObjCCategoryImplDecl *OCD) {
3222 unsigned Size = CGM.getDataLayout().getTypeAllocSize(ObjCTypes.CategoryTy);
3224 // FIXME: This is poor design, the OCD should have a pointer to the category
3225 // decl. Additionally, note that Category can be null for the @implementation
3226 // w/o an @interface case. Sema should just create one for us as it does for
3227 // @implementation so everyone else can live life under a clear blue sky.
3228 const ObjCInterfaceDecl *Interface = OCD->getClassInterface();
3229 const ObjCCategoryDecl *Category =
3230 Interface->FindCategoryDeclaration(OCD->getIdentifier());
3232 SmallString<256> ExtName;
3233 llvm::raw_svector_ostream(ExtName) << Interface->getName() << '_'
3236 ConstantInitBuilder Builder(CGM);
3237 auto Values = Builder.beginStruct(ObjCTypes.CategoryTy);
3244 SmallVector<const ObjCMethodDecl *, 16> Methods[NumMethodLists];
3245 for (const auto *MD : OCD->methods()) {
3246 Methods[unsigned(MD->isClassMethod())].push_back(MD);
3249 Values.add(GetClassName(OCD->getName()));
3250 Values.add(GetClassName(Interface->getObjCRuntimeNameAsString()));
3251 LazySymbols.insert(Interface->getIdentifier());
3253 Values.add(emitMethodList(ExtName, MethodListType::CategoryInstanceMethods,
3254 Methods[InstanceMethods]));
3255 Values.add(emitMethodList(ExtName, MethodListType::CategoryClassMethods,
3256 Methods[ClassMethods]));
3259 EmitProtocolList("OBJC_CATEGORY_PROTOCOLS_" + ExtName.str(),
3260 Category->protocol_begin(), Category->protocol_end()));
3262 Values.addNullPointer(ObjCTypes.ProtocolListPtrTy);
3264 Values.addInt(ObjCTypes.IntTy, Size);
3266 // If there is no category @interface then there can be no properties.
3268 Values.add(EmitPropertyList("\01l_OBJC_$_PROP_LIST_" + ExtName.str(),
3269 OCD, Category, ObjCTypes, false));
3270 Values.add(EmitPropertyList("\01l_OBJC_$_CLASS_PROP_LIST_" + ExtName.str(),
3271 OCD, Category, ObjCTypes, true));
3273 Values.addNullPointer(ObjCTypes.PropertyListPtrTy);
3274 Values.addNullPointer(ObjCTypes.PropertyListPtrTy);
3277 llvm::GlobalVariable *GV =
3278 CreateMetadataVar("OBJC_CATEGORY_" + ExtName.str(), Values,
3279 "__OBJC,__category,regular,no_dead_strip",
3280 CGM.getPointerAlign(), true);
3281 DefinedCategories.push_back(GV);
3282 DefinedCategoryNames.insert(llvm::CachedHashString(ExtName));
3283 // method definition entries must be clear for next implementation.
3284 MethodDefinitions.clear();
3287 enum FragileClassFlags {
3288 /// Apparently: is not a meta-class.
3289 FragileABI_Class_Factory = 0x00001,
3291 /// Is a meta-class.
3292 FragileABI_Class_Meta = 0x00002,
3294 /// Has a non-trivial constructor or destructor.
3295 FragileABI_Class_HasCXXStructors = 0x02000,
3297 /// Has hidden visibility.
3298 FragileABI_Class_Hidden = 0x20000,
3300 /// Class implementation was compiled under ARC.
3301 FragileABI_Class_CompiledByARC = 0x04000000,
3303 /// Class implementation was compiled under MRC and has MRC weak ivars.
3304 /// Exclusive with CompiledByARC.
3305 FragileABI_Class_HasMRCWeakIvars = 0x08000000,
3308 enum NonFragileClassFlags {
3309 /// Is a meta-class.
3310 NonFragileABI_Class_Meta = 0x00001,
3312 /// Is a root class.
3313 NonFragileABI_Class_Root = 0x00002,
3315 /// Has a non-trivial constructor or destructor.
3316 NonFragileABI_Class_HasCXXStructors = 0x00004,
3318 /// Has hidden visibility.
3319 NonFragileABI_Class_Hidden = 0x00010,
3321 /// Has the exception attribute.
3322 NonFragileABI_Class_Exception = 0x00020,
3324 /// (Obsolete) ARC-specific: this class has a .release_ivars method
3325 NonFragileABI_Class_HasIvarReleaser = 0x00040,
3327 /// Class implementation was compiled under ARC.
3328 NonFragileABI_Class_CompiledByARC = 0x00080,
3330 /// Class has non-trivial destructors, but zero-initialization is okay.
3331 NonFragileABI_Class_HasCXXDestructorOnly = 0x00100,
3333 /// Class implementation was compiled under MRC and has MRC weak ivars.
3334 /// Exclusive with CompiledByARC.
3335 NonFragileABI_Class_HasMRCWeakIvars = 0x00200,
3338 static bool hasWeakMember(QualType type) {
3339 if (type.getObjCLifetime() == Qualifiers::OCL_Weak) {
3343 if (auto recType = type->getAs<RecordType>()) {
3344 for (auto field : recType->getDecl()->fields()) {
3345 if (hasWeakMember(field->getType()))
3353 /// For compatibility, we only want to set the "HasMRCWeakIvars" flag
3354 /// (and actually fill in a layout string) if we really do have any
3356 static bool hasMRCWeakIvars(CodeGenModule &CGM,
3357 const ObjCImplementationDecl *ID) {
3358 if (!CGM.getLangOpts().ObjCWeak) return false;
3359 assert(CGM.getLangOpts().getGC() == LangOptions::NonGC);
3361 for (const ObjCIvarDecl *ivar =
3362 ID->getClassInterface()->all_declared_ivar_begin();
3363 ivar; ivar = ivar->getNextIvar()) {
3364 if (hasWeakMember(ivar->getType()))
3372 struct _objc_class {
3379 struct _objc_ivar_list *ivars;
3380 struct _objc_method_list *methods;
3381 struct _objc_cache *cache;
3382 struct _objc_protocol_list *protocols;
3383 // Objective-C 1.0 extensions (<rdr://4585769>)
3384 const char *ivar_layout;
3385 struct _objc_class_ext *ext;
3388 See EmitClassExtension();
3390 void CGObjCMac::GenerateClass(const ObjCImplementationDecl *ID) {
3391 DefinedSymbols.insert(ID->getIdentifier());
3393 std::string ClassName = ID->getNameAsString();
3395 ObjCInterfaceDecl *Interface =
3396 const_cast<ObjCInterfaceDecl*>(ID->getClassInterface());
3397 llvm::Constant *Protocols =
3398 EmitProtocolList("OBJC_CLASS_PROTOCOLS_" + ID->getName(),
3399 Interface->all_referenced_protocol_begin(),
3400 Interface->all_referenced_protocol_end());
3401 unsigned Flags = FragileABI_Class_Factory;
3402 if (ID->hasNonZeroConstructors() || ID->hasDestructors())
3403 Flags |= FragileABI_Class_HasCXXStructors;
3405 bool hasMRCWeak = false;
3407 if (CGM.getLangOpts().ObjCAutoRefCount)
3408 Flags |= FragileABI_Class_CompiledByARC;
3409 else if ((hasMRCWeak = hasMRCWeakIvars(CGM, ID)))
3410 Flags |= FragileABI_Class_HasMRCWeakIvars;
3413 CGM.getContext().getASTObjCImplementationLayout(ID).getSize();
3415 // FIXME: Set CXX-structors flag.
3416 if (ID->getClassInterface()->getVisibility() == HiddenVisibility)
3417 Flags |= FragileABI_Class_Hidden;
3424 SmallVector<const ObjCMethodDecl *, 16> Methods[NumMethodLists];
3425 for (const auto *MD : ID->methods()) {
3426 Methods[unsigned(MD->isClassMethod())].push_back(MD);
3429 for (const auto *PID : ID->property_impls()) {
3430 if (PID->getPropertyImplementation() == ObjCPropertyImplDecl::Synthesize) {
3431 ObjCPropertyDecl *PD = PID->getPropertyDecl();
3433 if (ObjCMethodDecl *MD = PD->getGetterMethodDecl())
3434 if (GetMethodDefinition(MD))
3435 Methods[InstanceMethods].push_back(MD);
3436 if (ObjCMethodDecl *MD = PD->getSetterMethodDecl())
3437 if (GetMethodDefinition(MD))
3438 Methods[InstanceMethods].push_back(MD);
3442 ConstantInitBuilder builder(CGM);
3443 auto values = builder.beginStruct(ObjCTypes.ClassTy);
3444 values.add(EmitMetaClass(ID, Protocols, Methods[ClassMethods]));
3445 if (ObjCInterfaceDecl *Super = Interface->getSuperClass()) {
3446 // Record a reference to the super class.
3447 LazySymbols.insert(Super->getIdentifier());
3449 values.addBitCast(GetClassName(Super->getObjCRuntimeNameAsString()),
3450 ObjCTypes.ClassPtrTy);
3452 values.addNullPointer(ObjCTypes.ClassPtrTy);
3454 values.add(GetClassName(ID->getObjCRuntimeNameAsString()));
3455 // Version is always 0.
3456 values.addInt(ObjCTypes.LongTy, 0);
3457 values.addInt(ObjCTypes.LongTy, Flags);
3458 values.addInt(ObjCTypes.LongTy, Size.getQuantity());
3459 values.add(EmitIvarList(ID, false));
3460 values.add(emitMethodList(ID->getName(), MethodListType::InstanceMethods,
3461 Methods[InstanceMethods]));
3462 // cache is always NULL.
3463 values.addNullPointer(ObjCTypes.CachePtrTy);
3464 values.add(Protocols);
3465 values.add(BuildStrongIvarLayout(ID, CharUnits::Zero(), Size));
3466 values.add(EmitClassExtension(ID, Size, hasMRCWeak,
3467 /*isMetaclass*/ false));
3469 std::string Name("OBJC_CLASS_");
3471 const char *Section = "__OBJC,__class,regular,no_dead_strip";
3472 // Check for a forward reference.
3473 llvm::GlobalVariable *GV = CGM.getModule().getGlobalVariable(Name, true);
3475 assert(GV->getType()->getElementType() == ObjCTypes.ClassTy &&
3476 "Forward metaclass reference has incorrect type.");
3477 values.finishAndSetAsInitializer(GV);
3478 GV->setSection(Section);
3479 GV->setAlignment(CGM.getPointerAlign().getQuantity());
3480 CGM.addCompilerUsedGlobal(GV);
3482 GV = CreateMetadataVar(Name, values, Section, CGM.getPointerAlign(), true);
3483 DefinedClasses.push_back(GV);
3484 ImplementedClasses.push_back(Interface);
3485 // method definition entries must be clear for next implementation.
3486 MethodDefinitions.clear();
3489 llvm::Constant *CGObjCMac::EmitMetaClass(const ObjCImplementationDecl *ID,
3490 llvm::Constant *Protocols,
3491 ArrayRef<const ObjCMethodDecl*> Methods) {
3492 unsigned Flags = FragileABI_Class_Meta;
3493 unsigned Size = CGM.getDataLayout().getTypeAllocSize(ObjCTypes.ClassTy);
3495 if (ID->getClassInterface()->getVisibility() == HiddenVisibility)
3496 Flags |= FragileABI_Class_Hidden;
3498 ConstantInitBuilder builder(CGM);
3499 auto values = builder.beginStruct(ObjCTypes.ClassTy);
3500 // The isa for the metaclass is the root of the hierarchy.
3501 const ObjCInterfaceDecl *Root = ID->getClassInterface();
3502 while (const ObjCInterfaceDecl *Super = Root->getSuperClass())
3504 values.addBitCast(GetClassName(Root->getObjCRuntimeNameAsString()),
3505 ObjCTypes.ClassPtrTy);
3506 // The super class for the metaclass is emitted as the name of the
3507 // super class. The runtime fixes this up to point to the
3508 // *metaclass* for the super class.
3509 if (ObjCInterfaceDecl *Super = ID->getClassInterface()->getSuperClass()) {
3510 values.addBitCast(GetClassName(Super->getObjCRuntimeNameAsString()),
3511 ObjCTypes.ClassPtrTy);
3513 values.addNullPointer(ObjCTypes.ClassPtrTy);
3515 values.add(GetClassName(ID->getObjCRuntimeNameAsString()));
3516 // Version is always 0.
3517 values.addInt(ObjCTypes.LongTy, 0);
3518 values.addInt(ObjCTypes.LongTy, Flags);
3519 values.addInt(ObjCTypes.LongTy, Size);
3520 values.add(EmitIvarList(ID, true));
3521 values.add(emitMethodList(ID->getName(), MethodListType::ClassMethods,
3523 // cache is always NULL.
3524 values.addNullPointer(ObjCTypes.CachePtrTy);
3525 values.add(Protocols);
3526 // ivar_layout for metaclass is always NULL.
3527 values.addNullPointer(ObjCTypes.Int8PtrTy);
3528 // The class extension is used to store class properties for metaclasses.
3529 values.add(EmitClassExtension(ID, CharUnits::Zero(), false/*hasMRCWeak*/,
3530 /*isMetaclass*/true));
3532 std::string Name("OBJC_METACLASS_");
3533 Name += ID->getName();
3535 // Check for a forward reference.
3536 llvm::GlobalVariable *GV = CGM.getModule().getGlobalVariable(Name, true);
3538 assert(GV->getType()->getElementType() == ObjCTypes.ClassTy &&
3539 "Forward metaclass reference has incorrect type.");
3540 values.finishAndSetAsInitializer(GV);
3542 GV = values.finishAndCreateGlobal(Name, CGM.getPointerAlign(),
3544 llvm::GlobalValue::PrivateLinkage);
3546 GV->setSection("__OBJC,__meta_class,regular,no_dead_strip");
3547 CGM.addCompilerUsedGlobal(GV);
3552 llvm::Constant *CGObjCMac::EmitMetaClassRef(const ObjCInterfaceDecl *ID) {
3553 std::string Name = "OBJC_METACLASS_" + ID->getNameAsString();
3555 // FIXME: Should we look these up somewhere other than the module. Its a bit
3556 // silly since we only generate these while processing an implementation, so
3557 // exactly one pointer would work if know when we entered/exitted an
3558 // implementation block.
3560 // Check for an existing forward reference.
3561 // Previously, metaclass with internal linkage may have been defined.
3562 // pass 'true' as 2nd argument so it is returned.
3563 llvm::GlobalVariable *GV = CGM.getModule().getGlobalVariable(Name, true);
3565 GV = new llvm::GlobalVariable(CGM.getModule(), ObjCTypes.ClassTy, false,
3566 llvm::GlobalValue::PrivateLinkage, nullptr,
3569 assert(GV->getType()->getElementType() == ObjCTypes.ClassTy &&
3570 "Forward metaclass reference has incorrect type.");
3574 llvm::Value *CGObjCMac::EmitSuperClassRef(const ObjCInterfaceDecl *ID) {
3575 std::string Name = "OBJC_CLASS_" + ID->getNameAsString();
3576 llvm::GlobalVariable *GV = CGM.getModule().getGlobalVariable(Name, true);
3579 GV = new llvm::GlobalVariable(CGM.getModule(), ObjCTypes.ClassTy, false,
3580 llvm::GlobalValue::PrivateLinkage, nullptr,
3583 assert(GV->getType()->getElementType() == ObjCTypes.ClassTy &&
3584 "Forward class metadata reference has incorrect type.");
3589 Emit a "class extension", which in this specific context means extra
3590 data that doesn't fit in the normal fragile-ABI class structure, and
3591 has nothing to do with the language concept of a class extension.
3593 struct objc_class_ext {
3595 const char *weak_ivar_layout;
3596 struct _objc_property_list *properties;
3600 CGObjCMac::EmitClassExtension(const ObjCImplementationDecl *ID,
3601 CharUnits InstanceSize, bool hasMRCWeakIvars,
3603 // Weak ivar layout.
3604 llvm::Constant *layout;
3606 layout = llvm::ConstantPointerNull::get(CGM.Int8PtrTy);
3608 layout = BuildWeakIvarLayout(ID, CharUnits::Zero(), InstanceSize,
3613 llvm::Constant *propertyList =
3614 EmitPropertyList((isMetaclass ? Twine("\01l_OBJC_$_CLASS_PROP_LIST_")
3615 : Twine("\01l_OBJC_$_PROP_LIST_"))
3617 ID, ID->getClassInterface(), ObjCTypes, isMetaclass);
3619 // Return null if no extension bits are used.
3620 if (layout->isNullValue() && propertyList->isNullValue()) {
3621 return llvm::Constant::getNullValue(ObjCTypes.ClassExtensionPtrTy);
3625 CGM.getDataLayout().getTypeAllocSize(ObjCTypes.ClassExtensionTy);
3627 ConstantInitBuilder builder(CGM);
3628 auto values = builder.beginStruct(ObjCTypes.ClassExtensionTy);
3629 values.addInt(ObjCTypes.IntTy, size);
3631 values.add(propertyList);
3633 return CreateMetadataVar("OBJC_CLASSEXT_" + ID->getName(), values,
3634 "__OBJC,__class_ext,regular,no_dead_strip",
3635 CGM.getPointerAlign(), true);
3645 struct objc_ivar_list {
3647 struct objc_ivar list[count];
3650 llvm::Constant *CGObjCMac::EmitIvarList(const ObjCImplementationDecl *ID,
3652 // When emitting the root class GCC emits ivar entries for the
3653 // actual class structure. It is not clear if we need to follow this
3654 // behavior; for now lets try and get away with not doing it. If so,
3655 // the cleanest solution would be to make up an ObjCInterfaceDecl
3658 return llvm::Constant::getNullValue(ObjCTypes.IvarListPtrTy);
3660 const ObjCInterfaceDecl *OID = ID->getClassInterface();
3662 ConstantInitBuilder builder(CGM);
3663 auto ivarList = builder.beginStruct();
3664 auto countSlot = ivarList.addPlaceholder();
3665 auto ivars = ivarList.beginArray(ObjCTypes.IvarTy);
3667 for (const ObjCIvarDecl *IVD = OID->all_declared_ivar_begin();
3668 IVD; IVD = IVD->getNextIvar()) {
3669 // Ignore unnamed bit-fields.
3670 if (!IVD->getDeclName())
3673 auto ivar = ivars.beginStruct(ObjCTypes.IvarTy);
3674 ivar.add(GetMethodVarName(IVD->getIdentifier()));
3675 ivar.add(GetMethodVarType(IVD));
3676 ivar.addInt(ObjCTypes.IntTy, ComputeIvarBaseOffset(CGM, OID, IVD));
3677 ivar.finishAndAddTo(ivars);
3680 // Return null for empty list.
3681 auto count = ivars.size();
3685 return llvm::Constant::getNullValue(ObjCTypes.IvarListPtrTy);
3688 ivars.finishAndAddTo(ivarList);
3689 ivarList.fillPlaceholderWithInt(countSlot, ObjCTypes.IntTy, count);
3691 llvm::GlobalVariable *GV;
3694 CreateMetadataVar("OBJC_CLASS_VARIABLES_" + ID->getName(), ivarList,
3695 "__OBJC,__class_vars,regular,no_dead_strip",
3696 CGM.getPointerAlign(), true);
3698 GV = CreateMetadataVar("OBJC_INSTANCE_VARIABLES_" + ID->getName(), ivarList,
3699 "__OBJC,__instance_vars,regular,no_dead_strip",
3700 CGM.getPointerAlign(), true);
3701 return llvm::ConstantExpr::getBitCast(GV, ObjCTypes.IvarListPtrTy);
3704 /// Build a struct objc_method_description constant for the given method.
3706 /// struct objc_method_description {
3707 /// SEL method_name;
3708 /// char *method_types;
3710 void CGObjCMac::emitMethodDescriptionConstant(ConstantArrayBuilder &builder,
3711 const ObjCMethodDecl *MD) {
3712 auto description = builder.beginStruct(ObjCTypes.MethodDescriptionTy);
3713 description.addBitCast(GetMethodVarName(MD->getSelector()),
3714 ObjCTypes.SelectorPtrTy);
3715 description.add(GetMethodVarType(MD));
3716 description.finishAndAddTo(builder);
3719 /// Build a struct objc_method constant for the given method.
3721 /// struct objc_method {
3722 /// SEL method_name;
3723 /// char *method_types;
3726 void CGObjCMac::emitMethodConstant(ConstantArrayBuilder &builder,
3727 const ObjCMethodDecl *MD) {
3728 llvm::Function *fn = GetMethodDefinition(MD);
3729 assert(fn && "no definition registered for method");
3731 auto method = builder.beginStruct(ObjCTypes.MethodTy);
3732 method.addBitCast(GetMethodVarName(MD->getSelector()),
3733 ObjCTypes.SelectorPtrTy);
3734 method.add(GetMethodVarType(MD));
3735 method.addBitCast(fn, ObjCTypes.Int8PtrTy);
3736 method.finishAndAddTo(builder);
3739 /// Build a struct objc_method_list or struct objc_method_description_list,
3742 /// struct objc_method_list {
3743 /// struct objc_method_list *obsolete;
3745 /// struct objc_method methods_list[count];
3748 /// struct objc_method_description_list {
3750 /// struct objc_method_description list[count];
3752 llvm::Constant *CGObjCMac::emitMethodList(Twine name, MethodListType MLT,
3753 ArrayRef<const ObjCMethodDecl *> methods) {
3756 bool forProtocol = false;
3758 case MethodListType::CategoryInstanceMethods:
3759 prefix = "OBJC_CATEGORY_INSTANCE_METHODS_";
3760 section = "__OBJC,__cat_inst_meth,regular,no_dead_strip";
3761 forProtocol = false;
3763 case MethodListType::CategoryClassMethods:
3764 prefix = "OBJC_CATEGORY_CLASS_METHODS_";
3765 section = "__OBJC,__cat_cls_meth,regular,no_dead_strip";
3766 forProtocol = false;
3768 case MethodListType::InstanceMethods:
3769 prefix = "OBJC_INSTANCE_METHODS_";
3770 section = "__OBJC,__inst_meth,regular,no_dead_strip";
3771 forProtocol = false;
3773 case MethodListType::ClassMethods:
3774 prefix = "OBJC_CLASS_METHODS_";
3775 section = "__OBJC,__cls_meth,regular,no_dead_strip";
3776 forProtocol = false;
3778 case MethodListType::ProtocolInstanceMethods:
3779 prefix = "OBJC_PROTOCOL_INSTANCE_METHODS_";
3780 section = "__OBJC,__cat_inst_meth,regular,no_dead_strip";
3783 case MethodListType::ProtocolClassMethods:
3784 prefix = "OBJC_PROTOCOL_CLASS_METHODS_";
3785 section = "__OBJC,__cat_cls_meth,regular,no_dead_strip";
3788 case MethodListType::OptionalProtocolInstanceMethods:
3789 prefix = "OBJC_PROTOCOL_INSTANCE_METHODS_OPT_";
3790 section = "__OBJC,__cat_inst_meth,regular,no_dead_strip";
3793 case MethodListType::OptionalProtocolClassMethods:
3794 prefix = "OBJC_PROTOCOL_CLASS_METHODS_OPT_";
3795 section = "__OBJC,__cat_cls_meth,regular,no_dead_strip";
3800 // Return null for empty list.
3801 if (methods.empty())
3802 return llvm::Constant::getNullValue(forProtocol
3803 ? ObjCTypes.MethodDescriptionListPtrTy
3804 : ObjCTypes.MethodListPtrTy);
3806 // For protocols, this is an objc_method_description_list, which has
3807 // a slightly different structure.
3809 ConstantInitBuilder builder(CGM);
3810 auto values = builder.beginStruct();
3811 values.addInt(ObjCTypes.IntTy, methods.size());
3812 auto methodArray = values.beginArray(ObjCTypes.MethodDescriptionTy);
3813 for (auto MD : methods) {
3814 emitMethodDescriptionConstant(methodArray, MD);
3816 methodArray.finishAndAddTo(values);
3818 llvm::GlobalVariable *GV = CreateMetadataVar(prefix + name, values, section,
3819 CGM.getPointerAlign(), true);
3820 return llvm::ConstantExpr::getBitCast(GV,
3821 ObjCTypes.MethodDescriptionListPtrTy);
3824 // Otherwise, it's an objc_method_list.
3825 ConstantInitBuilder builder(CGM);
3826 auto values = builder.beginStruct();
3827 values.addNullPointer(ObjCTypes.Int8PtrTy);
3828 values.addInt(ObjCTypes.IntTy, methods.size());
3829 auto methodArray = values.beginArray(ObjCTypes.MethodTy);
3830 for (auto MD : methods) {
3831 emitMethodConstant(methodArray, MD);
3833 methodArray.finishAndAddTo(values);
3835 llvm::GlobalVariable *GV = CreateMetadataVar(prefix + name, values, section,
3836 CGM.getPointerAlign(), true);
3837 return llvm::ConstantExpr::getBitCast(GV, ObjCTypes.MethodListPtrTy);
3840 llvm::Function *CGObjCCommonMac::GenerateMethod(const ObjCMethodDecl *OMD,
3841 const ObjCContainerDecl *CD) {
3842 SmallString<256> Name;
3843 GetNameForMethod(OMD, CD, Name);
3845 CodeGenTypes &Types = CGM.getTypes();
3846 llvm::FunctionType *MethodTy =
3847 Types.GetFunctionType(Types.arrangeObjCMethodDeclaration(OMD));
3848 llvm::Function *Method =
3849 llvm::Function::Create(MethodTy,
3850 llvm::GlobalValue::InternalLinkage,
3853 MethodDefinitions.insert(std::make_pair(OMD, Method));
3858 llvm::GlobalVariable *CGObjCCommonMac::CreateMetadataVar(Twine Name,
3859 ConstantStructBuilder &Init,
3863 llvm::GlobalVariable *GV =
3864 Init.finishAndCreateGlobal(Name, Align, /*constant*/ false,
3865 llvm::GlobalValue::PrivateLinkage);
3866 if (!Section.empty())
3867 GV->setSection(Section);
3869 CGM.addCompilerUsedGlobal(GV);
3873 llvm::GlobalVariable *CGObjCCommonMac::CreateMetadataVar(Twine Name,
3874 llvm::Constant *Init,
3878 llvm::Type *Ty = Init->getType();
3879 llvm::GlobalVariable *GV =
3880 new llvm::GlobalVariable(CGM.getModule(), Ty, false,
3881 llvm::GlobalValue::PrivateLinkage, Init, Name);
3882 if (!Section.empty())
3883 GV->setSection(Section);
3884 GV->setAlignment(Align.getQuantity());
3886 CGM.addCompilerUsedGlobal(GV);
3890 llvm::GlobalVariable *
3891 CGObjCCommonMac::CreateCStringLiteral(StringRef Name, ObjCLabelType Type,
3892 bool ForceNonFragileABI,
3893 bool NullTerminate) {
3896 case ObjCLabelType::ClassName: Label = "OBJC_CLASS_NAME_"; break;
3897 case ObjCLabelType::MethodVarName: Label = "OBJC_METH_VAR_NAME_"; break;
3898 case ObjCLabelType::MethodVarType: Label = "OBJC_METH_VAR_TYPE_"; break;
3899 case ObjCLabelType::PropertyName: Label = "OBJC_PROP_NAME_ATTR_"; break;
3902 bool NonFragile = ForceNonFragileABI || isNonFragileABI();
3906 case ObjCLabelType::ClassName:
3907 Section = NonFragile ? "__TEXT,__objc_classname,cstring_literals"
3908 : "__TEXT,__cstring,cstring_literals";
3910 case ObjCLabelType::MethodVarName:
3911 Section = NonFragile ? "__TEXT,__objc_methname,cstring_literals"
3912 : "__TEXT,__cstring,cstring_literals";
3914 case ObjCLabelType::MethodVarType:
3915 Section = NonFragile ? "__TEXT,__objc_methtype,cstring_literals"
3916 : "__TEXT,__cstring,cstring_literals";
3918 case ObjCLabelType::PropertyName:
3919 Section = "__TEXT,__cstring,cstring_literals";
3923 llvm::Constant *Value =
3924 llvm::ConstantDataArray::getString(VMContext, Name, NullTerminate);
3925 llvm::GlobalVariable *GV =
3926 new llvm::GlobalVariable(CGM.getModule(), Value->getType(),
3927 /*isConstant=*/true,
3928 llvm::GlobalValue::PrivateLinkage, Value, Label);
3929 if (CGM.getTriple().isOSBinFormatMachO())
3930 GV->setSection(Section);
3931 GV->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
3932 GV->setAlignment(CharUnits::One().getQuantity());
3933 CGM.addCompilerUsedGlobal(GV);
3938 llvm::Function *CGObjCMac::ModuleInitFunction() {
3939 // Abuse this interface function as a place to finalize.
3944 llvm::Constant *CGObjCMac::GetPropertyGetFunction() {
3945 return ObjCTypes.getGetPropertyFn();
3948 llvm::Constant *CGObjCMac::GetPropertySetFunction() {
3949 return ObjCTypes.getSetPropertyFn();
3952 llvm::Constant *CGObjCMac::GetOptimizedPropertySetFunction(bool atomic,
3954 return ObjCTypes.getOptimizedSetPropertyFn(atomic, copy);
3957 llvm::Constant *CGObjCMac::GetGetStructFunction() {
3958 return ObjCTypes.getCopyStructFn();
3961 llvm::Constant *CGObjCMac::GetSetStructFunction() {
3962 return ObjCTypes.getCopyStructFn();
3965 llvm::Constant *CGObjCMac::GetCppAtomicObjectGetFunction() {
3966 return ObjCTypes.getCppAtomicObjectFunction();
3969 llvm::Constant *CGObjCMac::GetCppAtomicObjectSetFunction() {
3970 return ObjCTypes.getCppAtomicObjectFunction();
3973 llvm::Constant *CGObjCMac::EnumerationMutationFunction() {
3974 return ObjCTypes.getEnumerationMutationFn();
3977 void CGObjCMac::EmitTryStmt(CodeGenFunction &CGF, const ObjCAtTryStmt &S) {
3978 return EmitTryOrSynchronizedStmt(CGF, S);
3981 void CGObjCMac::EmitSynchronizedStmt(CodeGenFunction &CGF,
3982 const ObjCAtSynchronizedStmt &S) {
3983 return EmitTryOrSynchronizedStmt(CGF, S);
3987 struct PerformFragileFinally final : EHScopeStack::Cleanup {
3989 Address SyncArgSlot;
3990 Address CallTryExitVar;
3991 Address ExceptionData;
3992 ObjCTypesHelper &ObjCTypes;
3993 PerformFragileFinally(const Stmt *S,
3994 Address SyncArgSlot,
3995 Address CallTryExitVar,
3996 Address ExceptionData,
3997 ObjCTypesHelper *ObjCTypes)
3998 : S(*S), SyncArgSlot(SyncArgSlot), CallTryExitVar(CallTryExitVar),
3999 ExceptionData(ExceptionData), ObjCTypes(*ObjCTypes) {}
4001 void Emit(CodeGenFunction &CGF, Flags flags) override {
4002 // Check whether we need to call objc_exception_try_exit.
4003 // In optimized code, this branch will always be folded.
4004 llvm::BasicBlock *FinallyCallExit =
4005 CGF.createBasicBlock("finally.call_exit");
4006 llvm::BasicBlock *FinallyNoCallExit =
4007 CGF.createBasicBlock("finally.no_call_exit");
4008 CGF.Builder.CreateCondBr(CGF.Builder.CreateLoad(CallTryExitVar),
4009 FinallyCallExit, FinallyNoCallExit);
4011 CGF.EmitBlock(FinallyCallExit);
4012 CGF.EmitNounwindRuntimeCall(ObjCTypes.getExceptionTryExitFn(),
4013 ExceptionData.getPointer());
4015 CGF.EmitBlock(FinallyNoCallExit);
4017 if (isa<ObjCAtTryStmt>(S)) {
4018 if (const ObjCAtFinallyStmt* FinallyStmt =
4019 cast<ObjCAtTryStmt>(S).getFinallyStmt()) {
4020 // Don't try to do the @finally if this is an EH cleanup.
4021 if (flags.isForEHCleanup()) return;
4023 // Save the current cleanup destination in case there's
4024 // control flow inside the finally statement.
4025 llvm::Value *CurCleanupDest =
4026 CGF.Builder.CreateLoad(CGF.getNormalCleanupDestSlot());
4028 CGF.EmitStmt(FinallyStmt->getFinallyBody());
4030 if (CGF.HaveInsertPoint()) {
4031 CGF.Builder.CreateStore(CurCleanupDest,
4032 CGF.getNormalCleanupDestSlot());
4034 // Currently, the end of the cleanup must always exist.
4035 CGF.EnsureInsertPoint();
4039 // Emit objc_sync_exit(expr); as finally's sole statement for
4041 llvm::Value *SyncArg = CGF.Builder.CreateLoad(SyncArgSlot);
4042 CGF.EmitNounwindRuntimeCall(ObjCTypes.getSyncExitFn(), SyncArg);
4047 class FragileHazards {
4048 CodeGenFunction &CGF;
4049 SmallVector<llvm::Value*, 20> Locals;
4050 llvm::DenseSet<llvm::BasicBlock*> BlocksBeforeTry;
4052 llvm::InlineAsm *ReadHazard;
4053 llvm::InlineAsm *WriteHazard;
4055 llvm::FunctionType *GetAsmFnType();
4057 void collectLocals();
4058 void emitReadHazard(CGBuilderTy &Builder);
4061 FragileHazards(CodeGenFunction &CGF);
4063 void emitWriteHazard();
4064 void emitHazardsInNewBlocks();
4066 } // end anonymous namespace
4068 /// Create the fragile-ABI read and write hazards based on the current
4069 /// state of the function, which is presumed to be immediately prior
4070 /// to a @try block. These hazards are used to maintain correct
4071 /// semantics in the face of optimization and the fragile ABI's
4072 /// cavalier use of setjmp/longjmp.
4073 FragileHazards::FragileHazards(CodeGenFunction &CGF) : CGF(CGF) {
4076 if (Locals.empty()) return;
4078 // Collect all the blocks in the function.
4079 for (llvm::Function::iterator
4080 I = CGF.CurFn->begin(), E = CGF.CurFn->end(); I != E; ++I)
4081 BlocksBeforeTry.insert(&*I);
4083 llvm::FunctionType *AsmFnTy = GetAsmFnType();
4085 // Create a read hazard for the allocas. This inhibits dead-store
4086 // optimizations and forces the values to memory. This hazard is
4087 // inserted before any 'throwing' calls in the protected scope to
4088 // reflect the possibility that the variables might be read from the
4089 // catch block if the call throws.
4091 std::string Constraint;
4092 for (unsigned I = 0, E = Locals.size(); I != E; ++I) {
4093 if (I) Constraint += ',';
4097 ReadHazard = llvm::InlineAsm::get(AsmFnTy, "", Constraint, true, false);
4100 // Create a write hazard for the allocas. This inhibits folding
4101 // loads across the hazard. This hazard is inserted at the
4102 // beginning of the catch path to reflect the possibility that the
4103 // variables might have been written within the protected scope.
4105 std::string Constraint;
4106 for (unsigned I = 0, E = Locals.size(); I != E; ++I) {
4107 if (I) Constraint += ',';
4108 Constraint += "=*m";
4111 WriteHazard = llvm::InlineAsm::get(AsmFnTy, "", Constraint, true, false);
4115 /// Emit a write hazard at the current location.
4116 void FragileHazards::emitWriteHazard() {
4117 if (Locals.empty()) return;
4119 CGF.EmitNounwindRuntimeCall(WriteHazard, Locals);
4122 void FragileHazards::emitReadHazard(CGBuilderTy &Builder) {
4123 assert(!Locals.empty());
4124 llvm::CallInst *call = Builder.CreateCall(ReadHazard, Locals);
4125 call->setDoesNotThrow();
4126 call->setCallingConv(CGF.getRuntimeCC());
4129 /// Emit read hazards in all the protected blocks, i.e. all the blocks
4130 /// which have been inserted since the beginning of the try.
4131 void FragileHazards::emitHazardsInNewBlocks() {
4132 if (Locals.empty()) return;
4134 CGBuilderTy Builder(CGF, CGF.getLLVMContext());
4136 // Iterate through all blocks, skipping those prior to the try.
4137 for (llvm::Function::iterator
4138 FI = CGF.CurFn->begin(), FE = CGF.CurFn->end(); FI != FE; ++FI) {
4139 llvm::BasicBlock &BB = *FI;
4140 if (BlocksBeforeTry.count(&BB)) continue;
4142 // Walk through all the calls in the block.
4143 for (llvm::BasicBlock::iterator
4144 BI = BB.begin(), BE = BB.end(); BI != BE; ++BI) {
4145 llvm::Instruction &I = *BI;
4147 // Ignore instructions that aren't non-intrinsic calls.
4148 // These are the only calls that can possibly call longjmp.
4149 if (!isa<llvm::CallInst>(I) && !isa<llvm::InvokeInst>(I)) continue;
4150 if (isa<llvm::IntrinsicInst>(I))
4153 // Ignore call sites marked nounwind. This may be questionable,
4154 // since 'nounwind' doesn't necessarily mean 'does not call longjmp'.
4155 llvm::CallSite CS(&I);
4156 if (CS.doesNotThrow()) continue;
4158 // Insert a read hazard before the call. This will ensure that
4159 // any writes to the locals are performed before making the
4160 // call. If the call throws, then this is sufficient to
4161 // guarantee correctness as long as it doesn't also write to any
4163 Builder.SetInsertPoint(&BB, BI);
4164 emitReadHazard(Builder);
4169 static void addIfPresent(llvm::DenseSet<llvm::Value*> &S, llvm::Value *V) {
4173 static void addIfPresent(llvm::DenseSet<llvm::Value*> &S, Address V) {
4174 if (V.isValid()) S.insert(V.getPointer());
4177 void FragileHazards::collectLocals() {
4178 // Compute a set of allocas to ignore.
4179 llvm::DenseSet<llvm::Value*> AllocasToIgnore;
4180 addIfPresent(AllocasToIgnore, CGF.ReturnValue);
4181 addIfPresent(AllocasToIgnore, CGF.NormalCleanupDest);
4183 // Collect all the allocas currently in the function. This is
4184 // probably way too aggressive.
4185 llvm::BasicBlock &Entry = CGF.CurFn->getEntryBlock();
4186 for (llvm::BasicBlock::iterator
4187 I = Entry.begin(), E = Entry.end(); I != E; ++I)
4188 if (isa<llvm::AllocaInst>(*I) && !AllocasToIgnore.count(&*I))
4189 Locals.push_back(&*I);
4192 llvm::FunctionType *FragileHazards::GetAsmFnType() {
4193 SmallVector<llvm::Type *, 16> tys(Locals.size());
4194 for (unsigned i = 0, e = Locals.size(); i != e; ++i)
4195 tys[i] = Locals[i]->getType();
4196 return llvm::FunctionType::get(CGF.VoidTy, tys, false);
4201 Objective-C setjmp-longjmp (sjlj) Exception Handling
4204 A catch buffer is a setjmp buffer plus:
4205 - a pointer to the exception that was caught
4206 - a pointer to the previous exception data buffer
4207 - two pointers of reserved storage
4208 Therefore catch buffers form a stack, with a pointer to the top
4209 of the stack kept in thread-local storage.
4211 objc_exception_try_enter pushes a catch buffer onto the EH stack.
4212 objc_exception_try_exit pops the given catch buffer, which is
4213 required to be the top of the EH stack.
4214 objc_exception_throw pops the top of the EH stack, writes the
4215 thrown exception into the appropriate field, and longjmps
4216 to the setjmp buffer. It crashes the process (with a printf
4217 and an abort()) if there are no catch buffers on the stack.
4218 objc_exception_extract just reads the exception pointer out of the
4221 There's no reason an implementation couldn't use a light-weight
4222 setjmp here --- something like __builtin_setjmp, but API-compatible
4223 with the heavyweight setjmp. This will be more important if we ever
4224 want to implement correct ObjC/C++ exception interactions for the
4227 Note that for this use of setjmp/longjmp to be correct, we may need
4228 to mark some local variables volatile: if a non-volatile local
4229 variable is modified between the setjmp and the longjmp, it has
4230 indeterminate value. For the purposes of LLVM IR, it may be
4231 sufficient to make loads and stores within the @try (to variables
4232 declared outside the @try) volatile. This is necessary for
4233 optimized correctness, but is not currently being done; this is
4234 being tracked as rdar://problem/8160285
4236 The basic framework for a @try-catch-finally is as follows:
4238 objc_exception_data d;
4240 bool _call_try_exit = true;
4242 objc_exception_try_enter(&d);
4243 if (!setjmp(d.jmp_buf)) {
4247 id _caught = objc_exception_extract(&d);
4249 // enter new try scope for handlers
4250 if (!setjmp(d.jmp_buf)) {
4251 ... match exception and execute catch blocks ...
4253 // fell off end, rethrow.
4255 ... jump-through-finally to finally_rethrow ...
4257 // exception in catch block
4258 _rethrow = objc_exception_extract(&d);
4259 _call_try_exit = false;
4260 ... jump-through-finally to finally_rethrow ...
4263 ... jump-through-finally to finally_end ...
4267 objc_exception_try_exit(&d);
4269 ... finally block ....
4270 ... dispatch to finally destination ...
4273 objc_exception_throw(_rethrow);
4278 This framework differs slightly from the one gcc uses, in that gcc
4279 uses _rethrow to determine if objc_exception_try_exit should be called
4280 and if the object should be rethrown. This breaks in the face of
4281 throwing nil and introduces unnecessary branches.
4283 We specialize this framework for a few particular circumstances:
4285 - If there are no catch blocks, then we avoid emitting the second
4286 exception handling context.
4288 - If there is a catch-all catch block (i.e. @catch(...) or @catch(id
4289 e)) we avoid emitting the code to rethrow an uncaught exception.
4291 - FIXME: If there is no @finally block we can do a few more
4294 Rethrows and Jumps-Through-Finally
4297 '@throw;' is supported by pushing the currently-caught exception
4298 onto ObjCEHStack while the @catch blocks are emitted.
4300 Branches through the @finally block are handled with an ordinary
4301 normal cleanup. We do not register an EH cleanup; fragile-ABI ObjC
4302 exceptions are not compatible with C++ exceptions, and this is
4303 hardly the only place where this will go wrong.
4305 @synchronized(expr) { stmt; } is emitted as if it were:
4306 id synch_value = expr;
4307 objc_sync_enter(synch_value);
4308 @try { stmt; } @finally { objc_sync_exit(synch_value); }
4311 void CGObjCMac::EmitTryOrSynchronizedStmt(CodeGen::CodeGenFunction &CGF,
4313 bool isTry = isa<ObjCAtTryStmt>(S);
4315 // A destination for the fall-through edges of the catch handlers to
4317 CodeGenFunction::JumpDest FinallyEnd =
4318 CGF.getJumpDestInCurrentScope("finally.end");
4320 // A destination for the rethrow edge of the catch handlers to jump
4322 CodeGenFunction::JumpDest FinallyRethrow =
4323 CGF.getJumpDestInCurrentScope("finally.rethrow");
4325 // For @synchronized, call objc_sync_enter(sync.expr). The
4326 // evaluation of the expression must occur before we enter the
4327 // @synchronized. We can't avoid a temp here because we need the
4328 // value to be preserved. If the backend ever does liveness
4329 // correctly after setjmp, this will be unnecessary.
4330 Address SyncArgSlot = Address::invalid();
4332 llvm::Value *SyncArg =
4333 CGF.EmitScalarExpr(cast<ObjCAtSynchronizedStmt>(S).getSynchExpr());
4334 SyncArg = CGF.Builder.CreateBitCast(SyncArg, ObjCTypes.ObjectPtrTy);
4335 CGF.EmitNounwindRuntimeCall(ObjCTypes.getSyncEnterFn(), SyncArg);
4337 SyncArgSlot = CGF.CreateTempAlloca(SyncArg->getType(),
4338 CGF.getPointerAlign(), "sync.arg");
4339 CGF.Builder.CreateStore(SyncArg, SyncArgSlot);
4342 // Allocate memory for the setjmp buffer. This needs to be kept
4343 // live throughout the try and catch blocks.
4344 Address ExceptionData = CGF.CreateTempAlloca(ObjCTypes.ExceptionDataTy,
4345 CGF.getPointerAlign(),
4346 "exceptiondata.ptr");
4348 // Create the fragile hazards. Note that this will not capture any
4349 // of the allocas required for exception processing, but will
4350 // capture the current basic block (which extends all the way to the
4351 // setjmp call) as "before the @try".
4352 FragileHazards Hazards(CGF);
4354 // Create a flag indicating whether the cleanup needs to call
4355 // objc_exception_try_exit. This is true except when
4356 // - no catches match and we're branching through the cleanup
4357 // just to rethrow the exception, or
4358 // - a catch matched and we're falling out of the catch handler.
4359 // The setjmp-safety rule here is that we should always store to this
4360 // variable in a place that dominates the branch through the cleanup
4361 // without passing through any setjmps.
4362 Address CallTryExitVar = CGF.CreateTempAlloca(CGF.Builder.getInt1Ty(),
4366 // A slot containing the exception to rethrow. Only needed when we
4367 // have both a @catch and a @finally.
4368 Address PropagatingExnVar = Address::invalid();
4370 // Push a normal cleanup to leave the try scope.
4371 CGF.EHStack.pushCleanup<PerformFragileFinally>(NormalAndEHCleanup, &S,
4377 // Enter a try block:
4378 // - Call objc_exception_try_enter to push ExceptionData on top of
4380 CGF.EmitNounwindRuntimeCall(ObjCTypes.getExceptionTryEnterFn(),
4381 ExceptionData.getPointer());
4383 // - Call setjmp on the exception data buffer.
4384 llvm::Constant *Zero = llvm::ConstantInt::get(CGF.Builder.getInt32Ty(), 0);
4385 llvm::Value *GEPIndexes[] = { Zero, Zero, Zero };
4386 llvm::Value *SetJmpBuffer = CGF.Builder.CreateGEP(
4387 ObjCTypes.ExceptionDataTy, ExceptionData.getPointer(), GEPIndexes,
4389 llvm::CallInst *SetJmpResult = CGF.EmitNounwindRuntimeCall(
4390 ObjCTypes.getSetJmpFn(), SetJmpBuffer, "setjmp_result");
4391 SetJmpResult->setCanReturnTwice();
4393 // If setjmp returned 0, enter the protected block; otherwise,
4394 // branch to the handler.
4395 llvm::BasicBlock *TryBlock = CGF.createBasicBlock("try");
4396 llvm::BasicBlock *TryHandler = CGF.createBasicBlock("try.handler");
4397 llvm::Value *DidCatch =
4398 CGF.Builder.CreateIsNotNull(SetJmpResult, "did_catch_exception");
4399 CGF.Builder.CreateCondBr(DidCatch, TryHandler, TryBlock);
4401 // Emit the protected block.
4402 CGF.EmitBlock(TryBlock);
4403 CGF.Builder.CreateStore(CGF.Builder.getTrue(), CallTryExitVar);
4404 CGF.EmitStmt(isTry ? cast<ObjCAtTryStmt>(S).getTryBody()
4405 : cast<ObjCAtSynchronizedStmt>(S).getSynchBody());
4407 CGBuilderTy::InsertPoint TryFallthroughIP = CGF.Builder.saveAndClearIP();
4409 // Emit the exception handler block.
4410 CGF.EmitBlock(TryHandler);
4412 // Don't optimize loads of the in-scope locals across this point.
4413 Hazards.emitWriteHazard();
4415 // For a @synchronized (or a @try with no catches), just branch
4416 // through the cleanup to the rethrow block.
4417 if (!isTry || !cast<ObjCAtTryStmt>(S).getNumCatchStmts()) {
4418 // Tell the cleanup not to re-pop the exit.
4419 CGF.Builder.CreateStore(CGF.Builder.getFalse(), CallTryExitVar);
4420 CGF.EmitBranchThroughCleanup(FinallyRethrow);
4422 // Otherwise, we have to match against the caught exceptions.
4424 // Retrieve the exception object. We may emit multiple blocks but
4425 // nothing can cross this so the value is already in SSA form.
4426 llvm::CallInst *Caught =
4427 CGF.EmitNounwindRuntimeCall(ObjCTypes.getExceptionExtractFn(),
4428 ExceptionData.getPointer(), "caught");
4430 // Push the exception to rethrow onto the EH value stack for the
4431 // benefit of any @throws in the handlers.
4432 CGF.ObjCEHValueStack.push_back(Caught);
4434 const ObjCAtTryStmt* AtTryStmt = cast<ObjCAtTryStmt>(&S);
4436 bool HasFinally = (AtTryStmt->getFinallyStmt() != nullptr);
4438 llvm::BasicBlock *CatchBlock = nullptr;
4439 llvm::BasicBlock *CatchHandler = nullptr;
4441 // Save the currently-propagating exception before
4442 // objc_exception_try_enter clears the exception slot.
4443 PropagatingExnVar = CGF.CreateTempAlloca(Caught->getType(),
4444 CGF.getPointerAlign(),
4445 "propagating_exception");
4446 CGF.Builder.CreateStore(Caught, PropagatingExnVar);
4448 // Enter a new exception try block (in case a @catch block
4449 // throws an exception).
4450 CGF.EmitNounwindRuntimeCall(ObjCTypes.getExceptionTryEnterFn(),
4451 ExceptionData.getPointer());
4453 llvm::CallInst *SetJmpResult =
4454 CGF.EmitNounwindRuntimeCall(ObjCTypes.getSetJmpFn(),
4455 SetJmpBuffer, "setjmp.result");
4456 SetJmpResult->setCanReturnTwice();
4458 llvm::Value *Threw =
4459 CGF.Builder.CreateIsNotNull(SetJmpResult, "did_catch_exception");
4461 CatchBlock = CGF.createBasicBlock("catch");
4462 CatchHandler = CGF.createBasicBlock("catch_for_catch");
4463 CGF.Builder.CreateCondBr(Threw, CatchHandler, CatchBlock);
4465 CGF.EmitBlock(CatchBlock);
4468 CGF.Builder.CreateStore(CGF.Builder.getInt1(HasFinally), CallTryExitVar);
4470 // Handle catch list. As a special case we check if everything is
4471 // matched and avoid generating code for falling off the end if
4473 bool AllMatched = false;
4474 for (unsigned I = 0, N = AtTryStmt->getNumCatchStmts(); I != N; ++I) {
4475 const ObjCAtCatchStmt *CatchStmt = AtTryStmt->getCatchStmt(I);
4477 const VarDecl *CatchParam = CatchStmt->getCatchParamDecl();
4478 const ObjCObjectPointerType *OPT = nullptr;
4480 // catch(...) always matches.
4484 OPT = CatchParam->getType()->getAs<ObjCObjectPointerType>();
4486 // catch(id e) always matches under this ABI, since only
4487 // ObjC exceptions end up here in the first place.
4488 // FIXME: For the time being we also match id<X>; this should
4489 // be rejected by Sema instead.
4490 if (OPT && (OPT->isObjCIdType() || OPT->isObjCQualifiedIdType()))
4494 // If this is a catch-all, we don't need to test anything.
4496 CodeGenFunction::RunCleanupsScope CatchVarCleanups(CGF);
4499 CGF.EmitAutoVarDecl(*CatchParam);
4500 assert(CGF.HaveInsertPoint() && "DeclStmt destroyed insert point?");
4502 // These types work out because ConvertType(id) == i8*.
4503 EmitInitOfCatchParam(CGF, Caught, CatchParam);
4506 CGF.EmitStmt(CatchStmt->getCatchBody());
4508 // The scope of the catch variable ends right here.
4509 CatchVarCleanups.ForceCleanup();
4511 CGF.EmitBranchThroughCleanup(FinallyEnd);
4515 assert(OPT && "Unexpected non-object pointer type in @catch");
4516 const ObjCObjectType *ObjTy = OPT->getObjectType();
4518 // FIXME: @catch (Class c) ?
4519 ObjCInterfaceDecl *IDecl = ObjTy->getInterface();
4520 assert(IDecl && "Catch parameter must have Objective-C type!");
4522 // Check if the @catch block matches the exception object.
4523 llvm::Value *Class = EmitClassRef(CGF, IDecl);
4525 llvm::Value *matchArgs[] = { Class, Caught };
4526 llvm::CallInst *Match =
4527 CGF.EmitNounwindRuntimeCall(ObjCTypes.getExceptionMatchFn(),
4528 matchArgs, "match");
4530 llvm::BasicBlock *MatchedBlock = CGF.createBasicBlock("match");
4531 llvm::BasicBlock *NextCatchBlock = CGF.createBasicBlock("catch.next");
4533 CGF.Builder.CreateCondBr(CGF.Builder.CreateIsNotNull(Match, "matched"),
4534 MatchedBlock, NextCatchBlock);
4536 // Emit the @catch block.
4537 CGF.EmitBlock(MatchedBlock);
4539 // Collect any cleanups for the catch variable. The scope lasts until
4540 // the end of the catch body.
4541 CodeGenFunction::RunCleanupsScope CatchVarCleanups(CGF);
4543 CGF.EmitAutoVarDecl(*CatchParam);
4544 assert(CGF.HaveInsertPoint() && "DeclStmt destroyed insert point?");
4546 // Initialize the catch variable.
4548 CGF.Builder.CreateBitCast(Caught,
4549 CGF.ConvertType(CatchParam->getType()));
4550 EmitInitOfCatchParam(CGF, Tmp, CatchParam);
4552 CGF.EmitStmt(CatchStmt->getCatchBody());
4554 // We're done with the catch variable.
4555 CatchVarCleanups.ForceCleanup();
4557 CGF.EmitBranchThroughCleanup(FinallyEnd);
4559 CGF.EmitBlock(NextCatchBlock);
4562 CGF.ObjCEHValueStack.pop_back();
4564 // If nothing wanted anything to do with the caught exception,
4565 // kill the extract call.
4566 if (Caught->use_empty())
4567 Caught->eraseFromParent();
4570 CGF.EmitBranchThroughCleanup(FinallyRethrow);
4573 // Emit the exception handler for the @catch blocks.
4574 CGF.EmitBlock(CatchHandler);
4576 // In theory we might now need a write hazard, but actually it's
4577 // unnecessary because there's no local-accessing code between
4578 // the try's write hazard and here.
4579 //Hazards.emitWriteHazard();
4581 // Extract the new exception and save it to the
4582 // propagating-exception slot.
4583 assert(PropagatingExnVar.isValid());
4584 llvm::CallInst *NewCaught =
4585 CGF.EmitNounwindRuntimeCall(ObjCTypes.getExceptionExtractFn(),
4586 ExceptionData.getPointer(), "caught");
4587 CGF.Builder.CreateStore(NewCaught, PropagatingExnVar);
4589 // Don't pop the catch handler; the throw already did.
4590 CGF.Builder.CreateStore(CGF.Builder.getFalse(), CallTryExitVar);
4591 CGF.EmitBranchThroughCleanup(FinallyRethrow);
4595 // Insert read hazards as required in the new blocks.
4596 Hazards.emitHazardsInNewBlocks();
4599 CGF.Builder.restoreIP(TryFallthroughIP);
4600 if (CGF.HaveInsertPoint())
4601 CGF.Builder.CreateStore(CGF.Builder.getTrue(), CallTryExitVar);
4602 CGF.PopCleanupBlock();
4603 CGF.EmitBlock(FinallyEnd.getBlock(), true);
4605 // Emit the rethrow block.
4606 CGBuilderTy::InsertPoint SavedIP = CGF.Builder.saveAndClearIP();
4607 CGF.EmitBlock(FinallyRethrow.getBlock(), true);
4608 if (CGF.HaveInsertPoint()) {
4609 // If we have a propagating-exception variable, check it.
4610 llvm::Value *PropagatingExn;
4611 if (PropagatingExnVar.isValid()) {
4612 PropagatingExn = CGF.Builder.CreateLoad(PropagatingExnVar);
4614 // Otherwise, just look in the buffer for the exception to throw.
4616 llvm::CallInst *Caught =
4617 CGF.EmitNounwindRuntimeCall(ObjCTypes.getExceptionExtractFn(),
4618 ExceptionData.getPointer());
4619 PropagatingExn = Caught;
4622 CGF.EmitNounwindRuntimeCall(ObjCTypes.getExceptionThrowFn(),
4624 CGF.Builder.CreateUnreachable();
4627 CGF.Builder.restoreIP(SavedIP);
4630 void CGObjCMac::EmitThrowStmt(CodeGen::CodeGenFunction &CGF,
4631 const ObjCAtThrowStmt &S,
4632 bool ClearInsertionPoint) {
4633 llvm::Value *ExceptionAsObject;
4635 if (const Expr *ThrowExpr = S.getThrowExpr()) {
4636 llvm::Value *Exception = CGF.EmitObjCThrowOperand(ThrowExpr);
4638 CGF.Builder.CreateBitCast(Exception, ObjCTypes.ObjectPtrTy);
4640 assert((!CGF.ObjCEHValueStack.empty() && CGF.ObjCEHValueStack.back()) &&
4641 "Unexpected rethrow outside @catch block.");
4642 ExceptionAsObject = CGF.ObjCEHValueStack.back();
4645 CGF.EmitRuntimeCall(ObjCTypes.getExceptionThrowFn(), ExceptionAsObject)
4646 ->setDoesNotReturn();
4647 CGF.Builder.CreateUnreachable();
4649 // Clear the insertion point to indicate we are in unreachable code.
4650 if (ClearInsertionPoint)
4651 CGF.Builder.ClearInsertionPoint();
4654 /// EmitObjCWeakRead - Code gen for loading value of a __weak
4655 /// object: objc_read_weak (id *src)
4657 llvm::Value * CGObjCMac::EmitObjCWeakRead(CodeGen::CodeGenFunction &CGF,
4658 Address AddrWeakObj) {
4659 llvm::Type* DestTy = AddrWeakObj.getElementType();
4660 AddrWeakObj = CGF.Builder.CreateBitCast(AddrWeakObj,
4661 ObjCTypes.PtrObjectPtrTy);
4662 llvm::Value *read_weak =
4663 CGF.EmitNounwindRuntimeCall(ObjCTypes.getGcReadWeakFn(),
4664 AddrWeakObj.getPointer(), "weakread");
4665 read_weak = CGF.Builder.CreateBitCast(read_weak, DestTy);
4669 /// EmitObjCWeakAssign - Code gen for assigning to a __weak object.
4670 /// objc_assign_weak (id src, id *dst)
4672 void CGObjCMac::EmitObjCWeakAssign(CodeGen::CodeGenFunction &CGF,
4673 llvm::Value *src, Address dst) {
4674 llvm::Type * SrcTy = src->getType();
4675 if (!isa<llvm::PointerType>(SrcTy)) {
4676 unsigned Size = CGM.getDataLayout().getTypeAllocSize(SrcTy);
4677 assert(Size <= 8 && "does not support size > 8");
4678 src = (Size == 4) ? CGF.Builder.CreateBitCast(src, CGM.Int32Ty)
4679 : CGF.Builder.CreateBitCast(src, CGM.Int64Ty);
4680 src = CGF.Builder.CreateIntToPtr(src, ObjCTypes.Int8PtrTy);
4682 src = CGF.Builder.CreateBitCast(src, ObjCTypes.ObjectPtrTy);
4683 dst = CGF.Builder.CreateBitCast(dst, ObjCTypes.PtrObjectPtrTy);
4684 llvm::Value *args[] = { src, dst.getPointer() };
4685 CGF.EmitNounwindRuntimeCall(ObjCTypes.getGcAssignWeakFn(),
4686 args, "weakassign");
4689 /// EmitObjCGlobalAssign - Code gen for assigning to a __strong object.
4690 /// objc_assign_global (id src, id *dst)
4692 void CGObjCMac::EmitObjCGlobalAssign(CodeGen::CodeGenFunction &CGF,
4693 llvm::Value *src, Address dst,
4695 llvm::Type * SrcTy = src->getType();
4696 if (!isa<llvm::PointerType>(SrcTy)) {
4697 unsigned Size = CGM.getDataLayout().getTypeAllocSize(SrcTy);
4698 assert(Size <= 8 && "does not support size > 8");
4699 src = (Size == 4) ? CGF.Builder.CreateBitCast(src, CGM.Int32Ty)
4700 : CGF.Builder.CreateBitCast(src, CGM.Int64Ty);
4701 src = CGF.Builder.CreateIntToPtr(src, ObjCTypes.Int8PtrTy);
4703 src = CGF.Builder.CreateBitCast(src, ObjCTypes.ObjectPtrTy);
4704 dst = CGF.Builder.CreateBitCast(dst, ObjCTypes.PtrObjectPtrTy);
4705 llvm::Value *args[] = { src, dst.getPointer() };
4707 CGF.EmitNounwindRuntimeCall(ObjCTypes.getGcAssignGlobalFn(),
4708 args, "globalassign");
4710 CGF.EmitNounwindRuntimeCall(ObjCTypes.getGcAssignThreadLocalFn(),
4711 args, "threadlocalassign");
4714 /// EmitObjCIvarAssign - Code gen for assigning to a __strong object.
4715 /// objc_assign_ivar (id src, id *dst, ptrdiff_t ivaroffset)
4717 void CGObjCMac::EmitObjCIvarAssign(CodeGen::CodeGenFunction &CGF,
4718 llvm::Value *src, Address dst,
4719 llvm::Value *ivarOffset) {
4720 assert(ivarOffset && "EmitObjCIvarAssign - ivarOffset is NULL");
4721 llvm::Type * SrcTy = src->getType();
4722 if (!isa<llvm::PointerType>(SrcTy)) {
4723 unsigned Size = CGM.getDataLayout().getTypeAllocSize(SrcTy);
4724 assert(Size <= 8 && "does not support size > 8");
4725 src = (Size == 4) ? CGF.Builder.CreateBitCast(src, CGM.Int32Ty)
4726 : CGF.Builder.CreateBitCast(src, CGM.Int64Ty);
4727 src = CGF.Builder.CreateIntToPtr(src, ObjCTypes.Int8PtrTy);
4729 src = CGF.Builder.CreateBitCast(src, ObjCTypes.ObjectPtrTy);
4730 dst = CGF.Builder.CreateBitCast(dst, ObjCTypes.PtrObjectPtrTy);
4731 llvm::Value *args[] = { src, dst.getPointer(), ivarOffset };
4732 CGF.EmitNounwindRuntimeCall(ObjCTypes.getGcAssignIvarFn(), args);
4735 /// EmitObjCStrongCastAssign - Code gen for assigning to a __strong cast object.
4736 /// objc_assign_strongCast (id src, id *dst)
4738 void CGObjCMac::EmitObjCStrongCastAssign(CodeGen::CodeGenFunction &CGF,
4739 llvm::Value *src, Address dst) {
4740 llvm::Type * SrcTy = src->getType();
4741 if (!isa<llvm::PointerType>(SrcTy)) {
4742 unsigned Size = CGM.getDataLayout().getTypeAllocSize(SrcTy);
4743 assert(Size <= 8 && "does not support size > 8");
4744 src = (Size == 4) ? CGF.Builder.CreateBitCast(src, CGM.Int32Ty)
4745 : CGF.Builder.CreateBitCast(src, CGM.Int64Ty);
4746 src = CGF.Builder.CreateIntToPtr(src, ObjCTypes.Int8PtrTy);
4748 src = CGF.Builder.CreateBitCast(src, ObjCTypes.ObjectPtrTy);
4749 dst = CGF.Builder.CreateBitCast(dst, ObjCTypes.PtrObjectPtrTy);
4750 llvm::Value *args[] = { src, dst.getPointer() };
4751 CGF.EmitNounwindRuntimeCall(ObjCTypes.getGcAssignStrongCastFn(),
4752 args, "strongassign");
4755 void CGObjCMac::EmitGCMemmoveCollectable(CodeGen::CodeGenFunction &CGF,
4758 llvm::Value *size) {
4759 SrcPtr = CGF.Builder.CreateBitCast(SrcPtr, ObjCTypes.Int8PtrTy);
4760 DestPtr = CGF.Builder.CreateBitCast(DestPtr, ObjCTypes.Int8PtrTy);
4761 llvm::Value *args[] = { DestPtr.getPointer(), SrcPtr.getPointer(), size };
4762 CGF.EmitNounwindRuntimeCall(ObjCTypes.GcMemmoveCollectableFn(), args);
4765 /// EmitObjCValueForIvar - Code Gen for ivar reference.
4767 LValue CGObjCMac::EmitObjCValueForIvar(CodeGen::CodeGenFunction &CGF,
4769 llvm::Value *BaseValue,
4770 const ObjCIvarDecl *Ivar,
4771 unsigned CVRQualifiers) {
4772 const ObjCInterfaceDecl *ID =
4773 ObjectTy->getAs<ObjCObjectType>()->getInterface();
4774 return EmitValueForIvarAtOffset(CGF, ID, BaseValue, Ivar, CVRQualifiers,
4775 EmitIvarOffset(CGF, ID, Ivar));
4778 llvm::Value *CGObjCMac::EmitIvarOffset(CodeGen::CodeGenFunction &CGF,
4779 const ObjCInterfaceDecl *Interface,
4780 const ObjCIvarDecl *Ivar) {
4781 uint64_t Offset = ComputeIvarBaseOffset(CGM, Interface, Ivar);
4782 return llvm::ConstantInt::get(
4783 CGM.getTypes().ConvertType(CGM.getContext().LongTy),
4787 /* *** Private Interface *** */
4789 /// EmitImageInfo - Emit the image info marker used to encode some module
4790 /// level information.
4792 /// See: <rdr://4810609&4810587&4810587>
4793 /// struct IMAGE_INFO {
4794 /// unsigned version;
4797 enum ImageInfoFlags {
4798 eImageInfo_FixAndContinue = (1 << 0), // This flag is no longer set by clang.
4799 eImageInfo_GarbageCollected = (1 << 1),
4800 eImageInfo_GCOnly = (1 << 2),
4801 eImageInfo_OptimizedByDyld = (1 << 3), // This flag is set by the dyld shared cache.
4803 // A flag indicating that the module has no instances of a @synthesize of a
4804 // superclass variable. <rdar://problem/6803242>
4805 eImageInfo_CorrectedSynthesize = (1 << 4), // This flag is no longer set by clang.
4806 eImageInfo_ImageIsSimulated = (1 << 5),
4807 eImageInfo_ClassProperties = (1 << 6)
4810 void CGObjCCommonMac::EmitImageInfo() {
4811 unsigned version = 0; // Version is unused?
4812 const char *Section = (ObjCABI == 1) ?
4813 "__OBJC, __image_info,regular" :
4814 "__DATA, __objc_imageinfo, regular, no_dead_strip";
4816 // Generate module-level named metadata to convey this information to the
4817 // linker and code-gen.
4818 llvm::Module &Mod = CGM.getModule();
4820 // Add the ObjC ABI version to the module flags.
4821 Mod.addModuleFlag(llvm::Module::Error, "Objective-C Version", ObjCABI);
4822 Mod.addModuleFlag(llvm::Module::Error, "Objective-C Image Info Version",
4824 Mod.addModuleFlag(llvm::Module::Error, "Objective-C Image Info Section",
4825 llvm::MDString::get(VMContext,Section));
4827 if (CGM.getLangOpts().getGC() == LangOptions::NonGC) {
4828 // Non-GC overrides those files which specify GC.
4829 Mod.addModuleFlag(llvm::Module::Override,
4830 "Objective-C Garbage Collection", (uint32_t)0);
4832 // Add the ObjC garbage collection value.
4833 Mod.addModuleFlag(llvm::Module::Error,
4834 "Objective-C Garbage Collection",
4835 eImageInfo_GarbageCollected);
4837 if (CGM.getLangOpts().getGC() == LangOptions::GCOnly) {
4838 // Add the ObjC GC Only value.
4839 Mod.addModuleFlag(llvm::Module::Error, "Objective-C GC Only",
4842 // Require that GC be specified and set to eImageInfo_GarbageCollected.
4843 llvm::Metadata *Ops[2] = {
4844 llvm::MDString::get(VMContext, "Objective-C Garbage Collection"),
4845 llvm::ConstantAsMetadata::get(llvm::ConstantInt::get(
4846 llvm::Type::getInt32Ty(VMContext), eImageInfo_GarbageCollected))};
4847 Mod.addModuleFlag(llvm::Module::Require, "Objective-C GC Only",
4848 llvm::MDNode::get(VMContext, Ops));
4852 // Indicate whether we're compiling this to run on a simulator.
4853 const llvm::Triple &Triple = CGM.getTarget().getTriple();
4854 if ((Triple.isiOS() || Triple.isWatchOS()) &&
4855 (Triple.getArch() == llvm::Triple::x86 ||
4856 Triple.getArch() == llvm::Triple::x86_64))
4857 Mod.addModuleFlag(llvm::Module::Error, "Objective-C Is Simulated",
4858 eImageInfo_ImageIsSimulated);
4860 // Indicate whether we are generating class properties.
4861 Mod.addModuleFlag(llvm::Module::Error, "Objective-C Class Properties",
4862 eImageInfo_ClassProperties);
4865 // struct objc_module {
4866 // unsigned long version;
4867 // unsigned long size;
4868 // const char *name;
4872 // FIXME: Get from somewhere
4873 static const int ModuleVersion = 7;
4875 void CGObjCMac::EmitModuleInfo() {
4876 uint64_t Size = CGM.getDataLayout().getTypeAllocSize(ObjCTypes.ModuleTy);
4878 ConstantInitBuilder builder(CGM);
4879 auto values = builder.beginStruct(ObjCTypes.ModuleTy);
4880 values.addInt(ObjCTypes.LongTy, ModuleVersion);
4881 values.addInt(ObjCTypes.LongTy, Size);
4882 // This used to be the filename, now it is unused. <rdr://4327263>
4883 values.add(GetClassName(StringRef("")));
4884 values.add(EmitModuleSymbols());
4885 CreateMetadataVar("OBJC_MODULES", values,
4886 "__OBJC,__module_info,regular,no_dead_strip",
4887 CGM.getPointerAlign(), true);
4890 llvm::Constant *CGObjCMac::EmitModuleSymbols() {
4891 unsigned NumClasses = DefinedClasses.size();
4892 unsigned NumCategories = DefinedCategories.size();
4894 // Return null if no symbols were defined.
4895 if (!NumClasses && !NumCategories)
4896 return llvm::Constant::getNullValue(ObjCTypes.SymtabPtrTy);
4898 ConstantInitBuilder builder(CGM);
4899 auto values = builder.beginStruct();
4900 values.addInt(ObjCTypes.LongTy, 0);
4901 values.addNullPointer(ObjCTypes.SelectorPtrTy);
4902 values.addInt(ObjCTypes.ShortTy, NumClasses);
4903 values.addInt(ObjCTypes.ShortTy, NumCategories);
4905 // The runtime expects exactly the list of defined classes followed
4906 // by the list of defined categories, in a single array.
4907 auto array = values.beginArray(ObjCTypes.Int8PtrTy);
4908 for (unsigned i=0; i<NumClasses; i++) {
4909 const ObjCInterfaceDecl *ID = ImplementedClasses[i];
4911 if (ObjCImplementationDecl *IMP = ID->getImplementation())
4912 // We are implementing a weak imported interface. Give it external linkage
4913 if (ID->isWeakImported() && !IMP->isWeakImported())
4914 DefinedClasses[i]->setLinkage(llvm::GlobalVariable::ExternalLinkage);
4916 array.addBitCast(DefinedClasses[i], ObjCTypes.Int8PtrTy);
4918 for (unsigned i=0; i<NumCategories; i++)
4919 array.addBitCast(DefinedCategories[i], ObjCTypes.Int8PtrTy);
4921 array.finishAndAddTo(values);
4923 llvm::GlobalVariable *GV = CreateMetadataVar(
4924 "OBJC_SYMBOLS", values, "__OBJC,__symbols,regular,no_dead_strip",
4925 CGM.getPointerAlign(), true);
4926 return llvm::ConstantExpr::getBitCast(GV, ObjCTypes.SymtabPtrTy);
4929 llvm::Value *CGObjCMac::EmitClassRefFromId(CodeGenFunction &CGF,
4930 IdentifierInfo *II) {
4931 LazySymbols.insert(II);
4933 llvm::GlobalVariable *&Entry = ClassReferences[II];
4936 llvm::Constant *Casted =
4937 llvm::ConstantExpr::getBitCast(GetClassName(II->getName()),
4938 ObjCTypes.ClassPtrTy);
4939 Entry = CreateMetadataVar(
4940 "OBJC_CLASS_REFERENCES_", Casted,
4941 "__OBJC,__cls_refs,literal_pointers,no_dead_strip",
4942 CGM.getPointerAlign(), true);
4945 return CGF.Builder.CreateAlignedLoad(Entry, CGF.getPointerAlign());
4948 llvm::Value *CGObjCMac::EmitClassRef(CodeGenFunction &CGF,
4949 const ObjCInterfaceDecl *ID) {
4950 // If the class has the objc_runtime_visible attribute, we need to
4951 // use the Objective-C runtime to get the class.
4952 if (ID->hasAttr<ObjCRuntimeVisibleAttr>())
4953 return EmitClassRefViaRuntime(CGF, ID, ObjCTypes);
4955 return EmitClassRefFromId(CGF, ID->getIdentifier());
4958 llvm::Value *CGObjCMac::EmitNSAutoreleasePoolClassRef(CodeGenFunction &CGF) {
4959 IdentifierInfo *II = &CGM.getContext().Idents.get("NSAutoreleasePool");
4960 return EmitClassRefFromId(CGF, II);
4963 llvm::Value *CGObjCMac::EmitSelector(CodeGenFunction &CGF, Selector Sel) {
4964 return CGF.Builder.CreateLoad(EmitSelectorAddr(CGF, Sel));
4967 Address CGObjCMac::EmitSelectorAddr(CodeGenFunction &CGF, Selector Sel) {
4968 CharUnits Align = CGF.getPointerAlign();
4970 llvm::GlobalVariable *&Entry = SelectorReferences[Sel];
4972 llvm::Constant *Casted =
4973 llvm::ConstantExpr::getBitCast(GetMethodVarName(Sel),
4974 ObjCTypes.SelectorPtrTy);
4975 Entry = CreateMetadataVar(
4976 "OBJC_SELECTOR_REFERENCES_", Casted,
4977 "__OBJC,__message_refs,literal_pointers,no_dead_strip", Align, true);
4978 Entry->setExternallyInitialized(true);
4981 return Address(Entry, Align);
4984 llvm::Constant *CGObjCCommonMac::GetClassName(StringRef RuntimeName) {
4985 llvm::GlobalVariable *&Entry = ClassNames[RuntimeName];
4987 Entry = CreateCStringLiteral(RuntimeName, ObjCLabelType::ClassName);
4988 return getConstantGEP(VMContext, Entry, 0, 0);
4991 llvm::Function *CGObjCCommonMac::GetMethodDefinition(const ObjCMethodDecl *MD) {
4992 llvm::DenseMap<const ObjCMethodDecl*, llvm::Function*>::iterator
4993 I = MethodDefinitions.find(MD);
4994 if (I != MethodDefinitions.end())
5000 /// GetIvarLayoutName - Returns a unique constant for the given
5001 /// ivar layout bitmap.
5002 llvm::Constant *CGObjCCommonMac::GetIvarLayoutName(IdentifierInfo *Ident,
5003 const ObjCCommonTypesHelper &ObjCTypes) {
5004 return llvm::Constant::getNullValue(ObjCTypes.Int8PtrTy);
5007 void IvarLayoutBuilder::visitRecord(const RecordType *RT,
5009 const RecordDecl *RD = RT->getDecl();
5011 // If this is a union, remember that we had one, because it might mess
5012 // up the ordering of layout entries.
5014 IsDisordered = true;
5016 const ASTRecordLayout *recLayout = nullptr;
5017 visitAggregate(RD->field_begin(), RD->field_end(), offset,
5018 [&](const FieldDecl *field) -> CharUnits {
5020 recLayout = &CGM.getContext().getASTRecordLayout(RD);
5021 auto offsetInBits = recLayout->getFieldOffset(field->getFieldIndex());
5022 return CGM.getContext().toCharUnitsFromBits(offsetInBits);
5026 template <class Iterator, class GetOffsetFn>
5027 void IvarLayoutBuilder::visitAggregate(Iterator begin, Iterator end,
5028 CharUnits aggregateOffset,
5029 const GetOffsetFn &getOffset) {
5030 for (; begin != end; ++begin) {
5031 auto field = *begin;
5033 // Skip over bitfields.
5034 if (field->isBitField()) {
5038 // Compute the offset of the field within the aggregate.
5039 CharUnits fieldOffset = aggregateOffset + getOffset(field);
5041 visitField(field, fieldOffset);
5045 /// Collect layout information for the given fields into IvarsInfo.
5046 void IvarLayoutBuilder::visitField(const FieldDecl *field,
5047 CharUnits fieldOffset) {
5048 QualType fieldType = field->getType();
5050 // Drill down into arrays.
5051 uint64_t numElts = 1;
5052 while (auto arrayType = CGM.getContext().getAsConstantArrayType(fieldType)) {
5053 numElts *= arrayType->getSize().getZExtValue();
5054 fieldType = arrayType->getElementType();
5057 assert(!fieldType->isArrayType() && "ivar of non-constant array type?");
5059 // If we ended up with a zero-sized array, we've done what we can do within
5060 // the limits of this layout encoding.
5061 if (numElts == 0) return;
5063 // Recurse if the base element type is a record type.
5064 if (auto recType = fieldType->getAs<RecordType>()) {
5065 size_t oldEnd = IvarsInfo.size();
5067 visitRecord(recType, fieldOffset);
5069 // If we have an array, replicate the first entry's layout information.
5070 auto numEltEntries = IvarsInfo.size() - oldEnd;
5071 if (numElts != 1 && numEltEntries != 0) {
5072 CharUnits eltSize = CGM.getContext().getTypeSizeInChars(recType);
5073 for (uint64_t eltIndex = 1; eltIndex != numElts; ++eltIndex) {
5074 // Copy the last numEltEntries onto the end of the array, adjusting
5075 // each for the element size.
5076 for (size_t i = 0; i != numEltEntries; ++i) {
5077 auto firstEntry = IvarsInfo[oldEnd + i];
5078 IvarsInfo.push_back(IvarInfo(firstEntry.Offset + eltIndex * eltSize,
5079 firstEntry.SizeInWords));
5087 // Classify the element type.
5088 Qualifiers::GC GCAttr = GetGCAttrTypeForType(CGM.getContext(), fieldType);
5090 // If it matches what we're looking for, add an entry.
5091 if ((ForStrongLayout && GCAttr == Qualifiers::Strong)
5092 || (!ForStrongLayout && GCAttr == Qualifiers::Weak)) {
5093 assert(CGM.getContext().getTypeSizeInChars(fieldType)
5094 == CGM.getPointerSize());
5095 IvarsInfo.push_back(IvarInfo(fieldOffset, numElts));
5099 /// buildBitmap - This routine does the horsework of taking the offsets of
5100 /// strong/weak references and creating a bitmap. The bitmap is also
5101 /// returned in the given buffer, suitable for being passed to \c dump().
5102 llvm::Constant *IvarLayoutBuilder::buildBitmap(CGObjCCommonMac &CGObjC,
5103 llvm::SmallVectorImpl<unsigned char> &buffer) {
5104 // The bitmap is a series of skip/scan instructions, aligned to word
5105 // boundaries. The skip is performed first.
5106 const unsigned char MaxNibble = 0xF;
5107 const unsigned char SkipMask = 0xF0, SkipShift = 4;
5108 const unsigned char ScanMask = 0x0F, ScanShift = 0;
5110 assert(!IvarsInfo.empty() && "generating bitmap for no data");
5112 // Sort the ivar info on byte position in case we encounterred a
5113 // union nested in the ivar list.
5115 // This isn't a stable sort, but our algorithm should handle it fine.
5116 llvm::array_pod_sort(IvarsInfo.begin(), IvarsInfo.end());
5118 assert(std::is_sorted(IvarsInfo.begin(), IvarsInfo.end()));
5120 assert(IvarsInfo.back().Offset < InstanceEnd);
5122 assert(buffer.empty());
5124 // Skip the next N words.
5125 auto skip = [&](unsigned numWords) {
5126 assert(numWords > 0);
5128 // Try to merge into the previous byte. Since scans happen second, we
5129 // can't do this if it includes a scan.
5130 if (!buffer.empty() && !(buffer.back() & ScanMask)) {
5131 unsigned lastSkip = buffer.back() >> SkipShift;
5132 if (lastSkip < MaxNibble) {
5133 unsigned claimed = std::min(MaxNibble - lastSkip, numWords);
5134 numWords -= claimed;
5135 lastSkip += claimed;
5136 buffer.back() = (lastSkip << SkipShift);
5140 while (numWords >= MaxNibble) {
5141 buffer.push_back(MaxNibble << SkipShift);
5142 numWords -= MaxNibble;
5145 buffer.push_back(numWords << SkipShift);
5149 // Scan the next N words.
5150 auto scan = [&](unsigned numWords) {
5151 assert(numWords > 0);
5153 // Try to merge into the previous byte. Since scans happen second, we can
5154 // do this even if it includes a skip.
5155 if (!buffer.empty()) {
5156 unsigned lastScan = (buffer.back() & ScanMask) >> ScanShift;
5157 if (lastScan < MaxNibble) {
5158 unsigned claimed = std::min(MaxNibble - lastScan, numWords);
5159 numWords -= claimed;
5160 lastScan += claimed;
5161 buffer.back() = (buffer.back() & SkipMask) | (lastScan << ScanShift);
5165 while (numWords >= MaxNibble) {
5166 buffer.push_back(MaxNibble << ScanShift);
5167 numWords -= MaxNibble;
5170 buffer.push_back(numWords << ScanShift);
5174 // One past the end of the last scan.
5175 unsigned endOfLastScanInWords = 0;
5176 const CharUnits WordSize = CGM.getPointerSize();
5178 // Consider all the scan requests.
5179 for (auto &request : IvarsInfo) {
5180 CharUnits beginOfScan = request.Offset - InstanceBegin;
5182 // Ignore scan requests that don't start at an even multiple of the
5183 // word size. We can't encode them.
5184 if ((beginOfScan % WordSize) != 0) continue;
5186 // Ignore scan requests that start before the instance start.
5187 // This assumes that scans never span that boundary. The boundary
5188 // isn't the true start of the ivars, because in the fragile-ARC case
5189 // it's rounded up to word alignment, but the test above should leave
5190 // us ignoring that possibility.
5191 if (beginOfScan.isNegative()) {
5192 assert(request.Offset + request.SizeInWords * WordSize <= InstanceBegin);
5196 unsigned beginOfScanInWords = beginOfScan / WordSize;
5197 unsigned endOfScanInWords = beginOfScanInWords + request.SizeInWords;
5199 // If the scan starts some number of words after the last one ended,
5201 if (beginOfScanInWords > endOfLastScanInWords) {
5202 skip(beginOfScanInWords - endOfLastScanInWords);
5204 // Otherwise, start scanning where the last left off.
5206 beginOfScanInWords = endOfLastScanInWords;
5208 // If that leaves us with nothing to scan, ignore this request.
5209 if (beginOfScanInWords >= endOfScanInWords) continue;
5212 // Scan to the end of the request.
5213 assert(beginOfScanInWords < endOfScanInWords);
5214 scan(endOfScanInWords - beginOfScanInWords);
5215 endOfLastScanInWords = endOfScanInWords;
5219 return llvm::ConstantPointerNull::get(CGM.Int8PtrTy);
5221 // For GC layouts, emit a skip to the end of the allocation so that we
5222 // have precise information about the entire thing. This isn't useful
5223 // or necessary for the ARC-style layout strings.
5224 if (CGM.getLangOpts().getGC() != LangOptions::NonGC) {
5225 unsigned lastOffsetInWords =
5226 (InstanceEnd - InstanceBegin + WordSize - CharUnits::One()) / WordSize;
5227 if (lastOffsetInWords > endOfLastScanInWords) {
5228 skip(lastOffsetInWords - endOfLastScanInWords);
5232 // Null terminate the string.
5233 buffer.push_back(0);
5235 auto *Entry = CGObjC.CreateCStringLiteral(
5236 reinterpret_cast<char *>(buffer.data()), ObjCLabelType::ClassName);
5237 return getConstantGEP(CGM.getLLVMContext(), Entry, 0, 0);
5240 /// BuildIvarLayout - Builds ivar layout bitmap for the class
5241 /// implementation for the __strong or __weak case.
5242 /// The layout map displays which words in ivar list must be skipped
5243 /// and which must be scanned by GC (see below). String is built of bytes.
5244 /// Each byte is divided up in two nibbles (4-bit each). Left nibble is count
5245 /// of words to skip and right nibble is count of words to scan. So, each
5246 /// nibble represents up to 15 workds to skip or scan. Skipping the rest is
5247 /// represented by a 0x00 byte which also ends the string.
5248 /// 1. when ForStrongLayout is true, following ivars are scanned:
5251 /// - __strong anything
5253 /// 2. When ForStrongLayout is false, following ivars are scanned:
5254 /// - __weak anything
5257 CGObjCCommonMac::BuildIvarLayout(const ObjCImplementationDecl *OMD,
5258 CharUnits beginOffset, CharUnits endOffset,
5259 bool ForStrongLayout, bool HasMRCWeakIvars) {
5260 // If this is MRC, and we're either building a strong layout or there
5261 // are no weak ivars, bail out early.
5262 llvm::Type *PtrTy = CGM.Int8PtrTy;
5263 if (CGM.getLangOpts().getGC() == LangOptions::NonGC &&
5264 !CGM.getLangOpts().ObjCAutoRefCount &&
5265 (ForStrongLayout || !HasMRCWeakIvars))
5266 return llvm::Constant::getNullValue(PtrTy);
5268 const ObjCInterfaceDecl *OI = OMD->getClassInterface();
5269 SmallVector<const ObjCIvarDecl*, 32> ivars;
5271 // GC layout strings include the complete object layout, possibly
5272 // inaccurately in the non-fragile ABI; the runtime knows how to fix this
5275 // ARC layout strings only include the class's ivars. In non-fragile
5276 // runtimes, that means starting at InstanceStart, rounded up to word
5277 // alignment. In fragile runtimes, there's no InstanceStart, so it means
5278 // starting at the offset of the first ivar, rounded up to word alignment.
5280 // MRC weak layout strings follow the ARC style.
5281 CharUnits baseOffset;
5282 if (CGM.getLangOpts().getGC() == LangOptions::NonGC) {
5283 for (const ObjCIvarDecl *IVD = OI->all_declared_ivar_begin();
5284 IVD; IVD = IVD->getNextIvar())
5285 ivars.push_back(IVD);
5287 if (isNonFragileABI()) {
5288 baseOffset = beginOffset; // InstanceStart
5289 } else if (!ivars.empty()) {
5291 CharUnits::fromQuantity(ComputeIvarBaseOffset(CGM, OMD, ivars[0]));
5293 baseOffset = CharUnits::Zero();
5296 baseOffset = baseOffset.alignTo(CGM.getPointerAlign());
5299 CGM.getContext().DeepCollectObjCIvars(OI, true, ivars);
5301 baseOffset = CharUnits::Zero();
5305 return llvm::Constant::getNullValue(PtrTy);
5307 IvarLayoutBuilder builder(CGM, baseOffset, endOffset, ForStrongLayout);
5309 builder.visitAggregate(ivars.begin(), ivars.end(), CharUnits::Zero(),
5310 [&](const ObjCIvarDecl *ivar) -> CharUnits {
5311 return CharUnits::fromQuantity(ComputeIvarBaseOffset(CGM, OMD, ivar));
5314 if (!builder.hasBitmapData())
5315 return llvm::Constant::getNullValue(PtrTy);
5317 llvm::SmallVector<unsigned char, 4> buffer;
5318 llvm::Constant *C = builder.buildBitmap(*this, buffer);
5320 if (CGM.getLangOpts().ObjCGCBitmapPrint && !buffer.empty()) {
5321 printf("\n%s ivar layout for class '%s': ",
5322 ForStrongLayout ? "strong" : "weak",
5323 OMD->getClassInterface()->getName().str().c_str());
5324 builder.dump(buffer);
5329 llvm::Constant *CGObjCCommonMac::GetMethodVarName(Selector Sel) {
5330 llvm::GlobalVariable *&Entry = MethodVarNames[Sel];
5331 // FIXME: Avoid std::string in "Sel.getAsString()"
5333 Entry = CreateCStringLiteral(Sel.getAsString(), ObjCLabelType::MethodVarName);
5334 return getConstantGEP(VMContext, Entry, 0, 0);
5337 // FIXME: Merge into a single cstring creation function.
5338 llvm::Constant *CGObjCCommonMac::GetMethodVarName(IdentifierInfo *ID) {
5339 return GetMethodVarName(CGM.getContext().Selectors.getNullarySelector(ID));
5342 llvm::Constant *CGObjCCommonMac::GetMethodVarType(const FieldDecl *Field) {
5343 std::string TypeStr;
5344 CGM.getContext().getObjCEncodingForType(Field->getType(), TypeStr, Field);
5346 llvm::GlobalVariable *&Entry = MethodVarTypes[TypeStr];
5348 Entry = CreateCStringLiteral(TypeStr, ObjCLabelType::MethodVarType);
5349 return getConstantGEP(VMContext, Entry, 0, 0);
5352 llvm::Constant *CGObjCCommonMac::GetMethodVarType(const ObjCMethodDecl *D,
5354 std::string TypeStr =
5355 CGM.getContext().getObjCEncodingForMethodDecl(D, Extended);
5357 llvm::GlobalVariable *&Entry = MethodVarTypes[TypeStr];
5359 Entry = CreateCStringLiteral(TypeStr, ObjCLabelType::MethodVarType);
5360 return getConstantGEP(VMContext, Entry, 0, 0);
5363 // FIXME: Merge into a single cstring creation function.
5364 llvm::Constant *CGObjCCommonMac::GetPropertyName(IdentifierInfo *Ident) {
5365 llvm::GlobalVariable *&Entry = PropertyNames[Ident];
5367 Entry = CreateCStringLiteral(Ident->getName(), ObjCLabelType::PropertyName);
5368 return getConstantGEP(VMContext, Entry, 0, 0);
5371 // FIXME: Merge into a single cstring creation function.
5372 // FIXME: This Decl should be more precise.
5374 CGObjCCommonMac::GetPropertyTypeString(const ObjCPropertyDecl *PD,
5375 const Decl *Container) {
5376 std::string TypeStr =
5377 CGM.getContext().getObjCEncodingForPropertyDecl(PD, Container);
5378 return GetPropertyName(&CGM.getContext().Idents.get(TypeStr));
5381 void CGObjCCommonMac::GetNameForMethod(const ObjCMethodDecl *D,
5382 const ObjCContainerDecl *CD,
5383 SmallVectorImpl<char> &Name) {
5384 llvm::raw_svector_ostream OS(Name);
5385 assert (CD && "Missing container decl in GetNameForMethod");
5386 OS << '\01' << (D->isInstanceMethod() ? '-' : '+')
5387 << '[' << CD->getName();
5388 if (const ObjCCategoryImplDecl *CID =
5389 dyn_cast<ObjCCategoryImplDecl>(D->getDeclContext()))
5390 OS << '(' << *CID << ')';
5391 OS << ' ' << D->getSelector().getAsString() << ']';
5394 void CGObjCMac::FinishModule() {
5397 // Emit the dummy bodies for any protocols which were referenced but
5399 for (auto &entry : Protocols) {
5400 llvm::GlobalVariable *global = entry.second;
5401 if (global->hasInitializer())
5404 ConstantInitBuilder builder(CGM);
5405 auto values = builder.beginStruct(ObjCTypes.ProtocolTy);
5406 values.addNullPointer(ObjCTypes.ProtocolExtensionPtrTy);
5407 values.add(GetClassName(entry.first->getName()));
5408 values.addNullPointer(ObjCTypes.ProtocolListPtrTy);
5409 values.addNullPointer(ObjCTypes.MethodDescriptionListPtrTy);
5410 values.addNullPointer(ObjCTypes.MethodDescriptionListPtrTy);
5411 values.finishAndSetAsInitializer(global);
5412 CGM.addCompilerUsedGlobal(global);
5415 // Add assembler directives to add lazy undefined symbol references
5416 // for classes which are referenced but not defined. This is
5417 // important for correct linker interaction.
5419 // FIXME: It would be nice if we had an LLVM construct for this.
5420 if ((!LazySymbols.empty() || !DefinedSymbols.empty()) &&
5421 CGM.getTriple().isOSBinFormatMachO()) {
5422 SmallString<256> Asm;
5423 Asm += CGM.getModule().getModuleInlineAsm();
5424 if (!Asm.empty() && Asm.back() != '\n')
5427 llvm::raw_svector_ostream OS(Asm);
5428 for (const auto *Sym : DefinedSymbols)
5429 OS << "\t.objc_class_name_" << Sym->getName() << "=0\n"
5430 << "\t.globl .objc_class_name_" << Sym->getName() << "\n";
5431 for (const auto *Sym : LazySymbols)
5432 OS << "\t.lazy_reference .objc_class_name_" << Sym->getName() << "\n";
5433 for (const auto &Category : DefinedCategoryNames)
5434 OS << "\t.objc_category_name_" << Category << "=0\n"
5435 << "\t.globl .objc_category_name_" << Category << "\n";
5437 CGM.getModule().setModuleInlineAsm(OS.str());
5441 CGObjCNonFragileABIMac::CGObjCNonFragileABIMac(CodeGen::CodeGenModule &cgm)
5442 : CGObjCCommonMac(cgm), ObjCTypes(cgm), ObjCEmptyCacheVar(nullptr),
5443 ObjCEmptyVtableVar(nullptr) {
5449 ObjCCommonTypesHelper::ObjCCommonTypesHelper(CodeGen::CodeGenModule &cgm)
5450 : VMContext(cgm.getLLVMContext()), CGM(cgm), ExternalProtocolPtrTy(nullptr)
5452 CodeGen::CodeGenTypes &Types = CGM.getTypes();
5453 ASTContext &Ctx = CGM.getContext();
5455 ShortTy = cast<llvm::IntegerType>(Types.ConvertType(Ctx.ShortTy));
5457 LongTy = cast<llvm::IntegerType>(Types.ConvertType(Ctx.LongTy));
5458 Int8PtrTy = CGM.Int8PtrTy;
5459 Int8PtrPtrTy = CGM.Int8PtrPtrTy;
5461 // arm64 targets use "int" ivar offset variables. All others,
5462 // including OS X x86_64 and Windows x86_64, use "long" ivar offsets.
5463 if (CGM.getTarget().getTriple().getArch() == llvm::Triple::aarch64)
5464 IvarOffsetVarTy = IntTy;
5466 IvarOffsetVarTy = LongTy;
5469 cast<llvm::PointerType>(Types.ConvertType(Ctx.getObjCIdType()));
5471 llvm::PointerType::getUnqual(ObjectPtrTy);
5473 cast<llvm::PointerType>(Types.ConvertType(Ctx.getObjCSelType()));
5475 // I'm not sure I like this. The implicit coordination is a bit
5476 // gross. We should solve this in a reasonable fashion because this
5477 // is a pretty common task (match some runtime data structure with
5478 // an LLVM data structure).
5480 // FIXME: This is leaked.
5481 // FIXME: Merge with rewriter code?
5483 // struct _objc_super {
5487 RecordDecl *RD = RecordDecl::Create(Ctx, TTK_Struct,
5488 Ctx.getTranslationUnitDecl(),
5489 SourceLocation(), SourceLocation(),
5490 &Ctx.Idents.get("_objc_super"));
5491 RD->addDecl(FieldDecl::Create(Ctx, RD, SourceLocation(), SourceLocation(),
5492 nullptr, Ctx.getObjCIdType(), nullptr, nullptr,
5493 false, ICIS_NoInit));
5494 RD->addDecl(FieldDecl::Create(Ctx, RD, SourceLocation(), SourceLocation(),
5495 nullptr, Ctx.getObjCClassType(), nullptr,
5496 nullptr, false, ICIS_NoInit));
5497 RD->completeDefinition();
5499 SuperCTy = Ctx.getTagDeclType(RD);
5500 SuperPtrCTy = Ctx.getPointerType(SuperCTy);
5502 SuperTy = cast<llvm::StructType>(Types.ConvertType(SuperCTy));
5503 SuperPtrTy = llvm::PointerType::getUnqual(SuperTy);
5507 // char *attributes;
5509 PropertyTy = llvm::StructType::create("struct._prop_t", Int8PtrTy, Int8PtrTy);
5511 // struct _prop_list_t {
5512 // uint32_t entsize; // sizeof(struct _prop_t)
5513 // uint32_t count_of_properties;
5514 // struct _prop_t prop_list[count_of_properties];
5516 PropertyListTy = llvm::StructType::create(
5517 "struct._prop_list_t", IntTy, IntTy, llvm::ArrayType::get(PropertyTy, 0));
5518 // struct _prop_list_t *
5519 PropertyListPtrTy = llvm::PointerType::getUnqual(PropertyListTy);
5521 // struct _objc_method {
5523 // char *method_type;
5526 MethodTy = llvm::StructType::create("struct._objc_method", SelectorPtrTy,
5527 Int8PtrTy, Int8PtrTy);
5529 // struct _objc_cache *
5530 CacheTy = llvm::StructType::create(VMContext, "struct._objc_cache");
5531 CachePtrTy = llvm::PointerType::getUnqual(CacheTy);
5534 ObjCTypesHelper::ObjCTypesHelper(CodeGen::CodeGenModule &cgm)
5535 : ObjCCommonTypesHelper(cgm) {
5536 // struct _objc_method_description {
5540 MethodDescriptionTy = llvm::StructType::create(
5541 "struct._objc_method_description", SelectorPtrTy, Int8PtrTy);
5543 // struct _objc_method_description_list {
5545 // struct _objc_method_description[1];
5547 MethodDescriptionListTy =
5548 llvm::StructType::create("struct._objc_method_description_list", IntTy,
5549 llvm::ArrayType::get(MethodDescriptionTy, 0));
5551 // struct _objc_method_description_list *
5552 MethodDescriptionListPtrTy =
5553 llvm::PointerType::getUnqual(MethodDescriptionListTy);
5555 // Protocol description structures
5557 // struct _objc_protocol_extension {
5558 // uint32_t size; // sizeof(struct _objc_protocol_extension)
5559 // struct _objc_method_description_list *optional_instance_methods;
5560 // struct _objc_method_description_list *optional_class_methods;
5561 // struct _objc_property_list *instance_properties;
5562 // const char ** extendedMethodTypes;
5563 // struct _objc_property_list *class_properties;
5565 ProtocolExtensionTy = llvm::StructType::create(
5566 "struct._objc_protocol_extension", IntTy, MethodDescriptionListPtrTy,
5567 MethodDescriptionListPtrTy, PropertyListPtrTy, Int8PtrPtrTy,
5570 // struct _objc_protocol_extension *
5571 ProtocolExtensionPtrTy = llvm::PointerType::getUnqual(ProtocolExtensionTy);
5573 // Handle recursive construction of Protocol and ProtocolList types
5576 llvm::StructType::create(VMContext, "struct._objc_protocol");
5579 llvm::StructType::create(VMContext, "struct._objc_protocol_list");
5580 ProtocolListTy->setBody(llvm::PointerType::getUnqual(ProtocolListTy), LongTy,
5581 llvm::ArrayType::get(ProtocolTy, 0));
5583 // struct _objc_protocol {
5584 // struct _objc_protocol_extension *isa;
5585 // char *protocol_name;
5586 // struct _objc_protocol **_objc_protocol_list;
5587 // struct _objc_method_description_list *instance_methods;
5588 // struct _objc_method_description_list *class_methods;
5590 ProtocolTy->setBody(ProtocolExtensionPtrTy, Int8PtrTy,
5591 llvm::PointerType::getUnqual(ProtocolListTy),
5592 MethodDescriptionListPtrTy, MethodDescriptionListPtrTy);
5594 // struct _objc_protocol_list *
5595 ProtocolListPtrTy = llvm::PointerType::getUnqual(ProtocolListTy);
5597 ProtocolPtrTy = llvm::PointerType::getUnqual(ProtocolTy);
5599 // Class description structures
5601 // struct _objc_ivar {
5606 IvarTy = llvm::StructType::create("struct._objc_ivar", Int8PtrTy, Int8PtrTy,
5609 // struct _objc_ivar_list *
5611 llvm::StructType::create(VMContext, "struct._objc_ivar_list");
5612 IvarListPtrTy = llvm::PointerType::getUnqual(IvarListTy);
5614 // struct _objc_method_list *
5616 llvm::StructType::create(VMContext, "struct._objc_method_list");
5617 MethodListPtrTy = llvm::PointerType::getUnqual(MethodListTy);
5619 // struct _objc_class_extension *
5620 ClassExtensionTy = llvm::StructType::create(
5621 "struct._objc_class_extension", IntTy, Int8PtrTy, PropertyListPtrTy);
5622 ClassExtensionPtrTy = llvm::PointerType::getUnqual(ClassExtensionTy);
5624 ClassTy = llvm::StructType::create(VMContext, "struct._objc_class");
5626 // struct _objc_class {
5628 // Class super_class;
5632 // long instance_size;
5633 // struct _objc_ivar_list *ivars;
5634 // struct _objc_method_list *methods;
5635 // struct _objc_cache *cache;
5636 // struct _objc_protocol_list *protocols;
5637 // char *ivar_layout;
5638 // struct _objc_class_ext *ext;
5640 ClassTy->setBody(llvm::PointerType::getUnqual(ClassTy),
5641 llvm::PointerType::getUnqual(ClassTy), Int8PtrTy, LongTy,
5642 LongTy, LongTy, IvarListPtrTy, MethodListPtrTy, CachePtrTy,
5643 ProtocolListPtrTy, Int8PtrTy, ClassExtensionPtrTy);
5645 ClassPtrTy = llvm::PointerType::getUnqual(ClassTy);
5647 // struct _objc_category {
5648 // char *category_name;
5649 // char *class_name;
5650 // struct _objc_method_list *instance_method;
5651 // struct _objc_method_list *class_method;
5652 // struct _objc_protocol_list *protocols;
5653 // uint32_t size; // sizeof(struct _objc_category)
5654 // struct _objc_property_list *instance_properties;// category's @property
5655 // struct _objc_property_list *class_properties;
5657 CategoryTy = llvm::StructType::create(
5658 "struct._objc_category", Int8PtrTy, Int8PtrTy, MethodListPtrTy,
5659 MethodListPtrTy, ProtocolListPtrTy, IntTy, PropertyListPtrTy,
5662 // Global metadata structures
5664 // struct _objc_symtab {
5665 // long sel_ref_cnt;
5667 // short cls_def_cnt;
5668 // short cat_def_cnt;
5669 // char *defs[cls_def_cnt + cat_def_cnt];
5671 SymtabTy = llvm::StructType::create("struct._objc_symtab", LongTy,
5672 SelectorPtrTy, ShortTy, ShortTy,
5673 llvm::ArrayType::get(Int8PtrTy, 0));
5674 SymtabPtrTy = llvm::PointerType::getUnqual(SymtabTy);
5676 // struct _objc_module {
5678 // long size; // sizeof(struct _objc_module)
5680 // struct _objc_symtab* symtab;
5682 ModuleTy = llvm::StructType::create("struct._objc_module", LongTy, LongTy,
5683 Int8PtrTy, SymtabPtrTy);
5685 // FIXME: This is the size of the setjmp buffer and should be target
5686 // specific. 18 is what's used on 32-bit X86.
5687 uint64_t SetJmpBufferSize = 18;
5690 llvm::Type *StackPtrTy = llvm::ArrayType::get(CGM.Int8PtrTy, 4);
5692 ExceptionDataTy = llvm::StructType::create(
5693 "struct._objc_exception_data",
5694 llvm::ArrayType::get(CGM.Int32Ty, SetJmpBufferSize), StackPtrTy);
5697 ObjCNonFragileABITypesHelper::ObjCNonFragileABITypesHelper(CodeGen::CodeGenModule &cgm)
5698 : ObjCCommonTypesHelper(cgm) {
5699 // struct _method_list_t {
5700 // uint32_t entsize; // sizeof(struct _objc_method)
5701 // uint32_t method_count;
5702 // struct _objc_method method_list[method_count];
5705 llvm::StructType::create("struct.__method_list_t", IntTy, IntTy,
5706 llvm::ArrayType::get(MethodTy, 0));
5707 // struct method_list_t *
5708 MethodListnfABIPtrTy = llvm::PointerType::getUnqual(MethodListnfABITy);
5710 // struct _protocol_t {
5712 // const char * const protocol_name;
5713 // const struct _protocol_list_t * protocol_list; // super protocols
5714 // const struct method_list_t * const instance_methods;
5715 // const struct method_list_t * const class_methods;
5716 // const struct method_list_t *optionalInstanceMethods;
5717 // const struct method_list_t *optionalClassMethods;
5718 // const struct _prop_list_t * properties;
5719 // const uint32_t size; // sizeof(struct _protocol_t)
5720 // const uint32_t flags; // = 0
5721 // const char ** extendedMethodTypes;
5722 // const char *demangledName;
5723 // const struct _prop_list_t * class_properties;
5726 // Holder for struct _protocol_list_t *
5727 ProtocolListnfABITy =
5728 llvm::StructType::create(VMContext, "struct._objc_protocol_list");
5730 ProtocolnfABITy = llvm::StructType::create(
5731 "struct._protocol_t", ObjectPtrTy, Int8PtrTy,
5732 llvm::PointerType::getUnqual(ProtocolListnfABITy), MethodListnfABIPtrTy,
5733 MethodListnfABIPtrTy, MethodListnfABIPtrTy, MethodListnfABIPtrTy,
5734 PropertyListPtrTy, IntTy, IntTy, Int8PtrPtrTy, Int8PtrTy,
5737 // struct _protocol_t*
5738 ProtocolnfABIPtrTy = llvm::PointerType::getUnqual(ProtocolnfABITy);
5740 // struct _protocol_list_t {
5741 // long protocol_count; // Note, this is 32/64 bit
5742 // struct _protocol_t *[protocol_count];
5744 ProtocolListnfABITy->setBody(LongTy,
5745 llvm::ArrayType::get(ProtocolnfABIPtrTy, 0));
5747 // struct _objc_protocol_list*
5748 ProtocolListnfABIPtrTy = llvm::PointerType::getUnqual(ProtocolListnfABITy);
5751 // unsigned [long] int *offset; // pointer to ivar offset location
5754 // uint32_t alignment;
5757 IvarnfABITy = llvm::StructType::create(
5758 "struct._ivar_t", llvm::PointerType::getUnqual(IvarOffsetVarTy),
5759 Int8PtrTy, Int8PtrTy, IntTy, IntTy);
5761 // struct _ivar_list_t {
5762 // uint32 entsize; // sizeof(struct _ivar_t)
5764 // struct _iver_t list[count];
5767 llvm::StructType::create("struct._ivar_list_t", IntTy, IntTy,
5768 llvm::ArrayType::get(IvarnfABITy, 0));
5770 IvarListnfABIPtrTy = llvm::PointerType::getUnqual(IvarListnfABITy);
5772 // struct _class_ro_t {
5773 // uint32_t const flags;
5774 // uint32_t const instanceStart;
5775 // uint32_t const instanceSize;
5776 // uint32_t const reserved; // only when building for 64bit targets
5777 // const uint8_t * const ivarLayout;
5778 // const char *const name;
5779 // const struct _method_list_t * const baseMethods;
5780 // const struct _objc_protocol_list *const baseProtocols;
5781 // const struct _ivar_list_t *const ivars;
5782 // const uint8_t * const weakIvarLayout;
5783 // const struct _prop_list_t * const properties;
5786 // FIXME. Add 'reserved' field in 64bit abi mode!
5787 ClassRonfABITy = llvm::StructType::create(
5788 "struct._class_ro_t", IntTy, IntTy, IntTy, Int8PtrTy, Int8PtrTy,
5789 MethodListnfABIPtrTy, ProtocolListnfABIPtrTy, IvarListnfABIPtrTy,
5790 Int8PtrTy, PropertyListPtrTy);
5792 // ImpnfABITy - LLVM for id (*)(id, SEL, ...)
5793 llvm::Type *params[] = { ObjectPtrTy, SelectorPtrTy };
5794 ImpnfABITy = llvm::FunctionType::get(ObjectPtrTy, params, false)
5797 // struct _class_t {
5798 // struct _class_t *isa;
5799 // struct _class_t * const superclass;
5802 // struct class_ro_t *ro;
5805 ClassnfABITy = llvm::StructType::create(VMContext, "struct._class_t");
5806 ClassnfABITy->setBody(llvm::PointerType::getUnqual(ClassnfABITy),
5807 llvm::PointerType::getUnqual(ClassnfABITy), CachePtrTy,
5808 llvm::PointerType::getUnqual(ImpnfABITy),
5809 llvm::PointerType::getUnqual(ClassRonfABITy));
5811 // LLVM for struct _class_t *
5812 ClassnfABIPtrTy = llvm::PointerType::getUnqual(ClassnfABITy);
5814 // struct _category_t {
5815 // const char * const name;
5816 // struct _class_t *const cls;
5817 // const struct _method_list_t * const instance_methods;
5818 // const struct _method_list_t * const class_methods;
5819 // const struct _protocol_list_t * const protocols;
5820 // const struct _prop_list_t * const properties;
5821 // const struct _prop_list_t * const class_properties;
5822 // const uint32_t size;
5824 CategorynfABITy = llvm::StructType::create(
5825 "struct._category_t", Int8PtrTy, ClassnfABIPtrTy, MethodListnfABIPtrTy,
5826 MethodListnfABIPtrTy, ProtocolListnfABIPtrTy, PropertyListPtrTy,
5827 PropertyListPtrTy, IntTy);
5829 // New types for nonfragile abi messaging.
5830 CodeGen::CodeGenTypes &Types = CGM.getTypes();
5831 ASTContext &Ctx = CGM.getContext();
5833 // MessageRefTy - LLVM for:
5834 // struct _message_ref_t {
5839 // First the clang type for struct _message_ref_t
5840 RecordDecl *RD = RecordDecl::Create(Ctx, TTK_Struct,
5841 Ctx.getTranslationUnitDecl(),
5842 SourceLocation(), SourceLocation(),
5843 &Ctx.Idents.get("_message_ref_t"));
5844 RD->addDecl(FieldDecl::Create(Ctx, RD, SourceLocation(), SourceLocation(),
5845 nullptr, Ctx.VoidPtrTy, nullptr, nullptr, false,
5847 RD->addDecl(FieldDecl::Create(Ctx, RD, SourceLocation(), SourceLocation(),
5848 nullptr, Ctx.getObjCSelType(), nullptr, nullptr,
5849 false, ICIS_NoInit));
5850 RD->completeDefinition();
5852 MessageRefCTy = Ctx.getTagDeclType(RD);
5853 MessageRefCPtrTy = Ctx.getPointerType(MessageRefCTy);
5854 MessageRefTy = cast<llvm::StructType>(Types.ConvertType(MessageRefCTy));
5856 // MessageRefPtrTy - LLVM for struct _message_ref_t*
5857 MessageRefPtrTy = llvm::PointerType::getUnqual(MessageRefTy);
5859 // SuperMessageRefTy - LLVM for:
5860 // struct _super_message_ref_t {
5861 // SUPER_IMP messenger;
5864 SuperMessageRefTy = llvm::StructType::create("struct._super_message_ref_t",
5865 ImpnfABITy, SelectorPtrTy);
5867 // SuperMessageRefPtrTy - LLVM for struct _super_message_ref_t*
5868 SuperMessageRefPtrTy = llvm::PointerType::getUnqual(SuperMessageRefTy);
5871 // struct objc_typeinfo {
5872 // const void** vtable; // objc_ehtype_vtable + 2
5873 // const char* name; // c++ typeinfo string
5876 EHTypeTy = llvm::StructType::create("struct._objc_typeinfo",
5877 llvm::PointerType::getUnqual(Int8PtrTy),
5878 Int8PtrTy, ClassnfABIPtrTy);
5879 EHTypePtrTy = llvm::PointerType::getUnqual(EHTypeTy);
5882 llvm::Function *CGObjCNonFragileABIMac::ModuleInitFunction() {
5883 FinishNonFragileABIModule();
5888 void CGObjCNonFragileABIMac::AddModuleClassList(
5889 ArrayRef<llvm::GlobalValue *> Container, StringRef SymbolName,
5890 StringRef SectionName) {
5891 unsigned NumClasses = Container.size();
5896 SmallVector<llvm::Constant*, 8> Symbols(NumClasses);
5897 for (unsigned i=0; i<NumClasses; i++)
5898 Symbols[i] = llvm::ConstantExpr::getBitCast(Container[i],
5899 ObjCTypes.Int8PtrTy);
5900 llvm::Constant *Init =
5901 llvm::ConstantArray::get(llvm::ArrayType::get(ObjCTypes.Int8PtrTy,
5905 llvm::GlobalVariable *GV =
5906 new llvm::GlobalVariable(CGM.getModule(), Init->getType(), false,
5907 llvm::GlobalValue::PrivateLinkage,
5910 GV->setAlignment(CGM.getDataLayout().getABITypeAlignment(Init->getType()));
5911 GV->setSection(SectionName);
5912 CGM.addCompilerUsedGlobal(GV);
5915 void CGObjCNonFragileABIMac::FinishNonFragileABIModule() {
5916 // nonfragile abi has no module definition.
5918 // Build list of all implemented class addresses in array
5919 // L_OBJC_LABEL_CLASS_$.
5921 for (unsigned i=0, NumClasses=ImplementedClasses.size(); i<NumClasses; i++) {
5922 const ObjCInterfaceDecl *ID = ImplementedClasses[i];
5924 if (ObjCImplementationDecl *IMP = ID->getImplementation())
5925 // We are implementing a weak imported interface. Give it external linkage
5926 if (ID->isWeakImported() && !IMP->isWeakImported()) {
5927 DefinedClasses[i]->setLinkage(llvm::GlobalVariable::ExternalLinkage);
5928 DefinedMetaClasses[i]->setLinkage(llvm::GlobalVariable::ExternalLinkage);
5932 AddModuleClassList(DefinedClasses, "OBJC_LABEL_CLASS_$",
5933 "__DATA, __objc_classlist, regular, no_dead_strip");
5935 AddModuleClassList(DefinedNonLazyClasses, "OBJC_LABEL_NONLAZY_CLASS_$",
5936 "__DATA, __objc_nlclslist, regular, no_dead_strip");
5938 // Build list of all implemented category addresses in array
5939 // L_OBJC_LABEL_CATEGORY_$.
5940 AddModuleClassList(DefinedCategories, "OBJC_LABEL_CATEGORY_$",
5941 "__DATA, __objc_catlist, regular, no_dead_strip");
5942 AddModuleClassList(DefinedNonLazyCategories, "OBJC_LABEL_NONLAZY_CATEGORY_$",
5943 "__DATA, __objc_nlcatlist, regular, no_dead_strip");
5948 /// isVTableDispatchedSelector - Returns true if SEL is not in the list of
5949 /// VTableDispatchMethods; false otherwise. What this means is that
5950 /// except for the 19 selectors in the list, we generate 32bit-style
5951 /// message dispatch call for all the rest.
5952 bool CGObjCNonFragileABIMac::isVTableDispatchedSelector(Selector Sel) {
5953 // At various points we've experimented with using vtable-based
5954 // dispatch for all methods.
5955 switch (CGM.getCodeGenOpts().getObjCDispatchMethod()) {
5956 case CodeGenOptions::Legacy:
5958 case CodeGenOptions::NonLegacy:
5960 case CodeGenOptions::Mixed:
5964 // If so, see whether this selector is in the white-list of things which must
5965 // use the new dispatch convention. We lazily build a dense set for this.
5966 if (VTableDispatchMethods.empty()) {
5967 VTableDispatchMethods.insert(GetNullarySelector("alloc"));
5968 VTableDispatchMethods.insert(GetNullarySelector("class"));
5969 VTableDispatchMethods.insert(GetNullarySelector("self"));
5970 VTableDispatchMethods.insert(GetNullarySelector("isFlipped"));
5971 VTableDispatchMethods.insert(GetNullarySelector("length"));
5972 VTableDispatchMethods.insert(GetNullarySelector("count"));
5974 // These are vtable-based if GC is disabled.
5975 // Optimistically use vtable dispatch for hybrid compiles.
5976 if (CGM.getLangOpts().getGC() != LangOptions::GCOnly) {
5977 VTableDispatchMethods.insert(GetNullarySelector("retain"));
5978 VTableDispatchMethods.insert(GetNullarySelector("release"));
5979 VTableDispatchMethods.insert(GetNullarySelector("autorelease"));
5982 VTableDispatchMethods.insert(GetUnarySelector("allocWithZone"));
5983 VTableDispatchMethods.insert(GetUnarySelector("isKindOfClass"));
5984 VTableDispatchMethods.insert(GetUnarySelector("respondsToSelector"));
5985 VTableDispatchMethods.insert(GetUnarySelector("objectForKey"));
5986 VTableDispatchMethods.insert(GetUnarySelector("objectAtIndex"));
5987 VTableDispatchMethods.insert(GetUnarySelector("isEqualToString"));
5988 VTableDispatchMethods.insert(GetUnarySelector("isEqual"));
5990 // These are vtable-based if GC is enabled.
5991 // Optimistically use vtable dispatch for hybrid compiles.
5992 if (CGM.getLangOpts().getGC() != LangOptions::NonGC) {
5993 VTableDispatchMethods.insert(GetNullarySelector("hash"));
5994 VTableDispatchMethods.insert(GetUnarySelector("addObject"));
5996 // "countByEnumeratingWithState:objects:count"
5997 IdentifierInfo *KeyIdents[] = {
5998 &CGM.getContext().Idents.get("countByEnumeratingWithState"),
5999 &CGM.getContext().Idents.get("objects"),
6000 &CGM.getContext().Idents.get("count")
6002 VTableDispatchMethods.insert(
6003 CGM.getContext().Selectors.getSelector(3, KeyIdents));
6007 return VTableDispatchMethods.count(Sel);
6010 /// BuildClassRoTInitializer - generate meta-data for:
6011 /// struct _class_ro_t {
6012 /// uint32_t const flags;
6013 /// uint32_t const instanceStart;
6014 /// uint32_t const instanceSize;
6015 /// uint32_t const reserved; // only when building for 64bit targets
6016 /// const uint8_t * const ivarLayout;
6017 /// const char *const name;
6018 /// const struct _method_list_t * const baseMethods;
6019 /// const struct _protocol_list_t *const baseProtocols;
6020 /// const struct _ivar_list_t *const ivars;
6021 /// const uint8_t * const weakIvarLayout;
6022 /// const struct _prop_list_t * const properties;
6025 llvm::GlobalVariable * CGObjCNonFragileABIMac::BuildClassRoTInitializer(
6027 unsigned InstanceStart,
6028 unsigned InstanceSize,
6029 const ObjCImplementationDecl *ID) {
6030 std::string ClassName = ID->getObjCRuntimeNameAsString();
6032 CharUnits beginInstance = CharUnits::fromQuantity(InstanceStart);
6033 CharUnits endInstance = CharUnits::fromQuantity(InstanceSize);
6035 bool hasMRCWeak = false;
6036 if (CGM.getLangOpts().ObjCAutoRefCount)
6037 flags |= NonFragileABI_Class_CompiledByARC;
6038 else if ((hasMRCWeak = hasMRCWeakIvars(CGM, ID)))
6039 flags |= NonFragileABI_Class_HasMRCWeakIvars;
6041 ConstantInitBuilder builder(CGM);
6042 auto values = builder.beginStruct(ObjCTypes.ClassRonfABITy);
6044 values.addInt(ObjCTypes.IntTy, flags);
6045 values.addInt(ObjCTypes.IntTy, InstanceStart);
6046 values.addInt(ObjCTypes.IntTy, InstanceSize);
6047 values.add((flags & NonFragileABI_Class_Meta)
6048 ? GetIvarLayoutName(nullptr, ObjCTypes)
6049 : BuildStrongIvarLayout(ID, beginInstance, endInstance));
6050 values.add(GetClassName(ID->getObjCRuntimeNameAsString()));
6052 // const struct _method_list_t * const baseMethods;
6053 SmallVector<const ObjCMethodDecl*, 16> methods;
6054 if (flags & NonFragileABI_Class_Meta) {
6055 for (const auto *MD : ID->class_methods())
6056 methods.push_back(MD);
6058 for (const auto *MD : ID->instance_methods())
6059 methods.push_back(MD);
6061 for (const auto *PID : ID->property_impls()) {
6062 if (PID->getPropertyImplementation() == ObjCPropertyImplDecl::Synthesize){
6063 ObjCPropertyDecl *PD = PID->getPropertyDecl();
6065 if (auto MD = PD->getGetterMethodDecl())
6066 if (GetMethodDefinition(MD))
6067 methods.push_back(MD);
6068 if (auto MD = PD->getSetterMethodDecl())
6069 if (GetMethodDefinition(MD))
6070 methods.push_back(MD);
6075 values.add(emitMethodList(ID->getObjCRuntimeNameAsString(),
6076 (flags & NonFragileABI_Class_Meta)
6077 ? MethodListType::ClassMethods
6078 : MethodListType::InstanceMethods,
6081 const ObjCInterfaceDecl *OID = ID->getClassInterface();
6082 assert(OID && "CGObjCNonFragileABIMac::BuildClassRoTInitializer");
6083 values.add(EmitProtocolList("\01l_OBJC_CLASS_PROTOCOLS_$_"
6084 + OID->getObjCRuntimeNameAsString(),
6085 OID->all_referenced_protocol_begin(),
6086 OID->all_referenced_protocol_end()));
6088 if (flags & NonFragileABI_Class_Meta) {
6089 values.addNullPointer(ObjCTypes.IvarListnfABIPtrTy);
6090 values.add(GetIvarLayoutName(nullptr, ObjCTypes));
6091 values.add(EmitPropertyList(
6092 "\01l_OBJC_$_CLASS_PROP_LIST_" + ID->getObjCRuntimeNameAsString(),
6093 ID, ID->getClassInterface(), ObjCTypes, true));
6095 values.add(EmitIvarList(ID));
6096 values.add(BuildWeakIvarLayout(ID, beginInstance, endInstance, hasMRCWeak));
6097 values.add(EmitPropertyList(
6098 "\01l_OBJC_$_PROP_LIST_" + ID->getObjCRuntimeNameAsString(),
6099 ID, ID->getClassInterface(), ObjCTypes, false));
6102 llvm::SmallString<64> roLabel;
6103 llvm::raw_svector_ostream(roLabel)
6104 << ((flags & NonFragileABI_Class_Meta) ? "\01l_OBJC_METACLASS_RO_$_"
6105 : "\01l_OBJC_CLASS_RO_$_")
6108 llvm::GlobalVariable *CLASS_RO_GV =
6109 values.finishAndCreateGlobal(roLabel, CGM.getPointerAlign(),
6111 llvm::GlobalValue::PrivateLinkage);
6112 if (CGM.getTriple().isOSBinFormatMachO())
6113 CLASS_RO_GV->setSection("__DATA, __objc_const");
6117 /// Build the metaclass object for a class.
6119 /// struct _class_t {
6120 /// struct _class_t *isa;
6121 /// struct _class_t * const superclass;
6124 /// struct class_ro_t *ro;
6127 llvm::GlobalVariable *
6128 CGObjCNonFragileABIMac::BuildClassObject(const ObjCInterfaceDecl *CI,
6130 llvm::Constant *IsAGV,
6131 llvm::Constant *SuperClassGV,
6132 llvm::Constant *ClassRoGV,
6133 bool HiddenVisibility) {
6134 ConstantInitBuilder builder(CGM);
6135 auto values = builder.beginStruct(ObjCTypes.ClassnfABITy);
6138 values.add(SuperClassGV);
6140 values.addNullPointer(ObjCTypes.ClassnfABIPtrTy);
6142 values.add(ObjCEmptyCacheVar);
6143 values.add(ObjCEmptyVtableVar);
6144 values.add(ClassRoGV);
6146 llvm::GlobalVariable *GV =
6147 cast<llvm::GlobalVariable>(GetClassGlobal(CI, isMetaclass, ForDefinition));
6148 values.finishAndSetAsInitializer(GV);
6150 if (CGM.getTriple().isOSBinFormatMachO())
6151 GV->setSection("__DATA, __objc_data");
6153 CGM.getDataLayout().getABITypeAlignment(ObjCTypes.ClassnfABITy));
6154 if (!CGM.getTriple().isOSBinFormatCOFF())
6155 if (HiddenVisibility)
6156 GV->setVisibility(llvm::GlobalValue::HiddenVisibility);
6161 CGObjCNonFragileABIMac::ImplementationIsNonLazy(const ObjCImplDecl *OD) const {
6162 return OD->getClassMethod(GetNullarySelector("load")) != nullptr;
6165 void CGObjCNonFragileABIMac::GetClassSizeInfo(const ObjCImplementationDecl *OID,
6166 uint32_t &InstanceStart,
6167 uint32_t &InstanceSize) {
6168 const ASTRecordLayout &RL =
6169 CGM.getContext().getASTObjCImplementationLayout(OID);
6171 // InstanceSize is really instance end.
6172 InstanceSize = RL.getDataSize().getQuantity();
6174 // If there are no fields, the start is the same as the end.
6175 if (!RL.getFieldCount())
6176 InstanceStart = InstanceSize;
6178 InstanceStart = RL.getFieldOffset(0) / CGM.getContext().getCharWidth();
6181 static llvm::GlobalValue::DLLStorageClassTypes getStorage(CodeGenModule &CGM,
6183 IdentifierInfo &II = CGM.getContext().Idents.get(Name);
6184 TranslationUnitDecl *TUDecl = CGM.getContext().getTranslationUnitDecl();
6185 DeclContext *DC = TranslationUnitDecl::castToDeclContext(TUDecl);
6187 const VarDecl *VD = nullptr;
6188 for (const auto &Result : DC->lookup(&II))
6189 if ((VD = dyn_cast<VarDecl>(Result)))
6193 return llvm::GlobalValue::DLLImportStorageClass;
6194 if (VD->hasAttr<DLLExportAttr>())
6195 return llvm::GlobalValue::DLLExportStorageClass;
6196 if (VD->hasAttr<DLLImportAttr>())
6197 return llvm::GlobalValue::DLLImportStorageClass;
6198 return llvm::GlobalValue::DefaultStorageClass;
6201 void CGObjCNonFragileABIMac::GenerateClass(const ObjCImplementationDecl *ID) {
6202 if (!ObjCEmptyCacheVar) {
6204 new llvm::GlobalVariable(CGM.getModule(), ObjCTypes.CacheTy, false,
6205 llvm::GlobalValue::ExternalLinkage, nullptr,
6206 "_objc_empty_cache");
6207 if (CGM.getTriple().isOSBinFormatCOFF())
6208 ObjCEmptyCacheVar->setDLLStorageClass(getStorage(CGM, "_objc_empty_cache"));
6210 // Only OS X with deployment version <10.9 use the empty vtable symbol
6211 const llvm::Triple &Triple = CGM.getTarget().getTriple();
6212 if (Triple.isMacOSX() && Triple.isMacOSXVersionLT(10, 9))
6213 ObjCEmptyVtableVar =
6214 new llvm::GlobalVariable(CGM.getModule(), ObjCTypes.ImpnfABITy, false,
6215 llvm::GlobalValue::ExternalLinkage, nullptr,
6216 "_objc_empty_vtable");
6218 ObjCEmptyVtableVar =
6219 llvm::ConstantPointerNull::get(ObjCTypes.ImpnfABITy->getPointerTo());
6222 // FIXME: Is this correct (that meta class size is never computed)?
6223 uint32_t InstanceStart =
6224 CGM.getDataLayout().getTypeAllocSize(ObjCTypes.ClassnfABITy);
6225 uint32_t InstanceSize = InstanceStart;
6226 uint32_t flags = NonFragileABI_Class_Meta;
6228 llvm::Constant *SuperClassGV, *IsAGV;
6230 const auto *CI = ID->getClassInterface();
6231 assert(CI && "CGObjCNonFragileABIMac::GenerateClass - class is 0");
6233 // Build the flags for the metaclass.
6234 bool classIsHidden = (CGM.getTriple().isOSBinFormatCOFF())
6235 ? !CI->hasAttr<DLLExportAttr>()
6236 : CI->getVisibility() == HiddenVisibility;
6238 flags |= NonFragileABI_Class_Hidden;
6240 // FIXME: why is this flag set on the metaclass?
6241 // ObjC metaclasses have no fields and don't really get constructed.
6242 if (ID->hasNonZeroConstructors() || ID->hasDestructors()) {
6243 flags |= NonFragileABI_Class_HasCXXStructors;
6244 if (!ID->hasNonZeroConstructors())
6245 flags |= NonFragileABI_Class_HasCXXDestructorOnly;
6248 if (!CI->getSuperClass()) {
6250 flags |= NonFragileABI_Class_Root;
6252 SuperClassGV = GetClassGlobal(CI, /*metaclass*/ false, NotForDefinition);
6253 IsAGV = GetClassGlobal(CI, /*metaclass*/ true, NotForDefinition);
6255 // Has a root. Current class is not a root.
6256 const ObjCInterfaceDecl *Root = ID->getClassInterface();
6257 while (const ObjCInterfaceDecl *Super = Root->getSuperClass())
6260 const auto *Super = CI->getSuperClass();
6261 IsAGV = GetClassGlobal(Root, /*metaclass*/ true, NotForDefinition);
6262 SuperClassGV = GetClassGlobal(Super, /*metaclass*/ true, NotForDefinition);
6265 llvm::GlobalVariable *CLASS_RO_GV =
6266 BuildClassRoTInitializer(flags, InstanceStart, InstanceSize, ID);
6268 llvm::GlobalVariable *MetaTClass =
6269 BuildClassObject(CI, /*metaclass*/ true,
6270 IsAGV, SuperClassGV, CLASS_RO_GV, classIsHidden);
6271 if (CGM.getTriple().isOSBinFormatCOFF())
6272 if (CI->hasAttr<DLLExportAttr>())
6273 MetaTClass->setDLLStorageClass(llvm::GlobalValue::DLLExportStorageClass);
6274 DefinedMetaClasses.push_back(MetaTClass);
6276 // Metadata for the class
6279 flags |= NonFragileABI_Class_Hidden;
6281 if (ID->hasNonZeroConstructors() || ID->hasDestructors()) {
6282 flags |= NonFragileABI_Class_HasCXXStructors;
6284 // Set a flag to enable a runtime optimization when a class has
6285 // fields that require destruction but which don't require
6286 // anything except zero-initialization during construction. This
6287 // is most notably true of __strong and __weak types, but you can
6288 // also imagine there being C++ types with non-trivial default
6289 // constructors that merely set all fields to null.
6290 if (!ID->hasNonZeroConstructors())
6291 flags |= NonFragileABI_Class_HasCXXDestructorOnly;
6294 if (hasObjCExceptionAttribute(CGM.getContext(), CI))
6295 flags |= NonFragileABI_Class_Exception;
6297 if (!CI->getSuperClass()) {
6298 flags |= NonFragileABI_Class_Root;
6299 SuperClassGV = nullptr;
6301 // Has a root. Current class is not a root.
6302 const auto *Super = CI->getSuperClass();
6303 SuperClassGV = GetClassGlobal(Super, /*metaclass*/ false, NotForDefinition);
6306 GetClassSizeInfo(ID, InstanceStart, InstanceSize);
6308 BuildClassRoTInitializer(flags, InstanceStart, InstanceSize, ID);
6310 llvm::GlobalVariable *ClassMD =
6311 BuildClassObject(CI, /*metaclass*/ false,
6312 MetaTClass, SuperClassGV, CLASS_RO_GV, classIsHidden);
6313 if (CGM.getTriple().isOSBinFormatCOFF())
6314 if (CI->hasAttr<DLLExportAttr>())
6315 ClassMD->setDLLStorageClass(llvm::GlobalValue::DLLExportStorageClass);
6316 DefinedClasses.push_back(ClassMD);
6317 ImplementedClasses.push_back(CI);
6319 // Determine if this class is also "non-lazy".
6320 if (ImplementationIsNonLazy(ID))
6321 DefinedNonLazyClasses.push_back(ClassMD);
6323 // Force the definition of the EHType if necessary.
6324 if (flags & NonFragileABI_Class_Exception)
6325 (void) GetInterfaceEHType(CI, ForDefinition);
6326 // Make sure method definition entries are all clear for next implementation.
6327 MethodDefinitions.clear();
6330 /// GenerateProtocolRef - This routine is called to generate code for
6331 /// a protocol reference expression; as in:
6333 /// @protocol(Proto1);
6335 /// It generates a weak reference to l_OBJC_PROTOCOL_REFERENCE_$_Proto1
6336 /// which will hold address of the protocol meta-data.
6338 llvm::Value *CGObjCNonFragileABIMac::GenerateProtocolRef(CodeGenFunction &CGF,
6339 const ObjCProtocolDecl *PD) {
6341 // This routine is called for @protocol only. So, we must build definition
6342 // of protocol's meta-data (not a reference to it!)
6344 llvm::Constant *Init =
6345 llvm::ConstantExpr::getBitCast(GetOrEmitProtocol(PD),
6346 ObjCTypes.getExternalProtocolPtrTy());
6348 std::string ProtocolName("\01l_OBJC_PROTOCOL_REFERENCE_$_");
6349 ProtocolName += PD->getObjCRuntimeNameAsString();
6351 CharUnits Align = CGF.getPointerAlign();
6353 llvm::GlobalVariable *PTGV = CGM.getModule().getGlobalVariable(ProtocolName);
6355 return CGF.Builder.CreateAlignedLoad(PTGV, Align);
6356 PTGV = new llvm::GlobalVariable(
6358 Init->getType(), false,
6359 llvm::GlobalValue::WeakAnyLinkage,
6362 PTGV->setSection("__DATA, __objc_protorefs, coalesced, no_dead_strip");
6363 PTGV->setVisibility(llvm::GlobalValue::HiddenVisibility);
6364 PTGV->setAlignment(Align.getQuantity());
6365 CGM.addCompilerUsedGlobal(PTGV);
6366 return CGF.Builder.CreateAlignedLoad(PTGV, Align);
6369 /// GenerateCategory - Build metadata for a category implementation.
6370 /// struct _category_t {
6371 /// const char * const name;
6372 /// struct _class_t *const cls;
6373 /// const struct _method_list_t * const instance_methods;
6374 /// const struct _method_list_t * const class_methods;
6375 /// const struct _protocol_list_t * const protocols;
6376 /// const struct _prop_list_t * const properties;
6377 /// const struct _prop_list_t * const class_properties;
6378 /// const uint32_t size;
6381 void CGObjCNonFragileABIMac::GenerateCategory(const ObjCCategoryImplDecl *OCD) {
6382 const ObjCInterfaceDecl *Interface = OCD->getClassInterface();
6383 const char *Prefix = "\01l_OBJC_$_CATEGORY_";
6385 llvm::SmallString<64> ExtCatName(Prefix);
6386 ExtCatName += Interface->getObjCRuntimeNameAsString();
6387 ExtCatName += "_$_";
6388 ExtCatName += OCD->getNameAsString();
6390 ConstantInitBuilder builder(CGM);
6391 auto values = builder.beginStruct(ObjCTypes.CategorynfABITy);
6392 values.add(GetClassName(OCD->getIdentifier()->getName()));
6393 // meta-class entry symbol
6394 values.add(GetClassGlobal(Interface, /*metaclass*/ false, NotForDefinition));
6395 std::string listName =
6396 (Interface->getObjCRuntimeNameAsString() + "_$_" + OCD->getName()).str();
6398 SmallVector<const ObjCMethodDecl *, 16> instanceMethods;
6399 SmallVector<const ObjCMethodDecl *, 8> classMethods;
6400 for (const auto *MD : OCD->methods()) {
6401 if (MD->isInstanceMethod()) {
6402 instanceMethods.push_back(MD);
6404 classMethods.push_back(MD);
6408 values.add(emitMethodList(listName, MethodListType::CategoryInstanceMethods,
6410 values.add(emitMethodList(listName, MethodListType::CategoryClassMethods,
6413 const ObjCCategoryDecl *Category =
6414 Interface->FindCategoryDeclaration(OCD->getIdentifier());
6416 SmallString<256> ExtName;
6417 llvm::raw_svector_ostream(ExtName) << Interface->getObjCRuntimeNameAsString() << "_$_"
6419 values.add(EmitProtocolList("\01l_OBJC_CATEGORY_PROTOCOLS_$_"
6420 + Interface->getObjCRuntimeNameAsString() + "_$_"
6421 + Category->getName(),
6422 Category->protocol_begin(),
6423 Category->protocol_end()));
6424 values.add(EmitPropertyList("\01l_OBJC_$_PROP_LIST_" + ExtName.str(),
6425 OCD, Category, ObjCTypes, false));
6426 values.add(EmitPropertyList("\01l_OBJC_$_CLASS_PROP_LIST_" + ExtName.str(),
6427 OCD, Category, ObjCTypes, true));
6429 values.addNullPointer(ObjCTypes.ProtocolListnfABIPtrTy);
6430 values.addNullPointer(ObjCTypes.PropertyListPtrTy);
6431 values.addNullPointer(ObjCTypes.PropertyListPtrTy);
6434 unsigned Size = CGM.getDataLayout().getTypeAllocSize(ObjCTypes.CategorynfABITy);
6435 values.addInt(ObjCTypes.IntTy, Size);
6437 llvm::GlobalVariable *GCATV =
6438 values.finishAndCreateGlobal(ExtCatName.str(), CGM.getPointerAlign(),
6440 llvm::GlobalValue::PrivateLinkage);
6441 if (CGM.getTriple().isOSBinFormatMachO())
6442 GCATV->setSection("__DATA, __objc_const");
6443 CGM.addCompilerUsedGlobal(GCATV);
6444 DefinedCategories.push_back(GCATV);
6446 // Determine if this category is also "non-lazy".
6447 if (ImplementationIsNonLazy(OCD))
6448 DefinedNonLazyCategories.push_back(GCATV);
6449 // method definition entries must be clear for next implementation.
6450 MethodDefinitions.clear();
6453 /// emitMethodConstant - Return a struct objc_method constant. If
6454 /// forProtocol is true, the implementation will be null; otherwise,
6455 /// the method must have a definition registered with the runtime.
6457 /// struct _objc_method {
6459 /// char *method_type;
6462 void CGObjCNonFragileABIMac::emitMethodConstant(ConstantArrayBuilder &builder,
6463 const ObjCMethodDecl *MD,
6465 auto method = builder.beginStruct(ObjCTypes.MethodTy);
6466 method.addBitCast(GetMethodVarName(MD->getSelector()),
6467 ObjCTypes.SelectorPtrTy);
6468 method.add(GetMethodVarType(MD));
6471 // Protocol methods have no implementation. So, this entry is always NULL.
6472 method.addNullPointer(ObjCTypes.Int8PtrTy);
6474 llvm::Function *fn = GetMethodDefinition(MD);
6475 assert(fn && "no definition for method?");
6476 method.addBitCast(fn, ObjCTypes.Int8PtrTy);
6479 method.finishAndAddTo(builder);
6482 /// Build meta-data for method declarations.
6484 /// struct _method_list_t {
6485 /// uint32_t entsize; // sizeof(struct _objc_method)
6486 /// uint32_t method_count;
6487 /// struct _objc_method method_list[method_count];
6491 CGObjCNonFragileABIMac::emitMethodList(Twine name, MethodListType kind,
6492 ArrayRef<const ObjCMethodDecl *> methods) {
6493 // Return null for empty list.
6494 if (methods.empty())
6495 return llvm::Constant::getNullValue(ObjCTypes.MethodListnfABIPtrTy);
6500 case MethodListType::CategoryInstanceMethods:
6501 prefix = "\01l_OBJC_$_CATEGORY_INSTANCE_METHODS_";
6502 forProtocol = false;
6504 case MethodListType::CategoryClassMethods:
6505 prefix = "\01l_OBJC_$_CATEGORY_CLASS_METHODS_";
6506 forProtocol = false;
6508 case MethodListType::InstanceMethods:
6509 prefix = "\01l_OBJC_$_INSTANCE_METHODS_";
6510 forProtocol = false;
6512 case MethodListType::ClassMethods:
6513 prefix = "\01l_OBJC_$_CLASS_METHODS_";
6514 forProtocol = false;
6517 case MethodListType::ProtocolInstanceMethods:
6518 prefix = "\01l_OBJC_$_PROTOCOL_INSTANCE_METHODS_";
6521 case MethodListType::ProtocolClassMethods:
6522 prefix = "\01l_OBJC_$_PROTOCOL_CLASS_METHODS_";
6525 case MethodListType::OptionalProtocolInstanceMethods:
6526 prefix = "\01l_OBJC_$_PROTOCOL_INSTANCE_METHODS_OPT_";
6529 case MethodListType::OptionalProtocolClassMethods:
6530 prefix = "\01l_OBJC_$_PROTOCOL_CLASS_METHODS_OPT_";
6535 ConstantInitBuilder builder(CGM);
6536 auto values = builder.beginStruct();
6538 // sizeof(struct _objc_method)
6539 unsigned Size = CGM.getDataLayout().getTypeAllocSize(ObjCTypes.MethodTy);
6540 values.addInt(ObjCTypes.IntTy, Size);
6542 values.addInt(ObjCTypes.IntTy, methods.size());
6543 auto methodArray = values.beginArray(ObjCTypes.MethodTy);
6544 for (auto MD : methods) {
6545 emitMethodConstant(methodArray, MD, forProtocol);
6547 methodArray.finishAndAddTo(values);
6549 auto *GV = values.finishAndCreateGlobal(prefix + name, CGM.getPointerAlign(),
6551 llvm::GlobalValue::PrivateLinkage);
6552 if (CGM.getTriple().isOSBinFormatMachO())
6553 GV->setSection("__DATA, __objc_const");
6554 CGM.addCompilerUsedGlobal(GV);
6555 return llvm::ConstantExpr::getBitCast(GV, ObjCTypes.MethodListnfABIPtrTy);
6558 /// ObjCIvarOffsetVariable - Returns the ivar offset variable for
6560 llvm::GlobalVariable *
6561 CGObjCNonFragileABIMac::ObjCIvarOffsetVariable(const ObjCInterfaceDecl *ID,
6562 const ObjCIvarDecl *Ivar) {
6563 const ObjCInterfaceDecl *Container = Ivar->getContainingInterface();
6564 llvm::SmallString<64> Name("OBJC_IVAR_$_");
6565 Name += Container->getObjCRuntimeNameAsString();
6567 Name += Ivar->getName();
6568 llvm::GlobalVariable *IvarOffsetGV = CGM.getModule().getGlobalVariable(Name);
6569 if (!IvarOffsetGV) {
6571 new llvm::GlobalVariable(CGM.getModule(), ObjCTypes.IvarOffsetVarTy,
6572 false, llvm::GlobalValue::ExternalLinkage,
6573 nullptr, Name.str());
6574 if (CGM.getTriple().isOSBinFormatCOFF()) {
6575 bool IsPrivateOrPackage =
6576 Ivar->getAccessControl() == ObjCIvarDecl::Private ||
6577 Ivar->getAccessControl() == ObjCIvarDecl::Package;
6579 if (ID->hasAttr<DLLExportAttr>() && !IsPrivateOrPackage)
6580 IvarOffsetGV->setDLLStorageClass(llvm::GlobalValue::DLLExportStorageClass);
6581 else if (ID->hasAttr<DLLImportAttr>())
6582 IvarOffsetGV->setDLLStorageClass(llvm::GlobalValue::DLLImportStorageClass);
6585 return IvarOffsetGV;
6589 CGObjCNonFragileABIMac::EmitIvarOffsetVar(const ObjCInterfaceDecl *ID,
6590 const ObjCIvarDecl *Ivar,
6591 unsigned long int Offset) {
6592 llvm::GlobalVariable *IvarOffsetGV = ObjCIvarOffsetVariable(ID, Ivar);
6593 IvarOffsetGV->setInitializer(
6594 llvm::ConstantInt::get(ObjCTypes.IvarOffsetVarTy, Offset));
6595 IvarOffsetGV->setAlignment(
6596 CGM.getDataLayout().getABITypeAlignment(ObjCTypes.IvarOffsetVarTy));
6598 if (!CGM.getTriple().isOSBinFormatCOFF()) {
6599 // FIXME: This matches gcc, but shouldn't the visibility be set on the use
6600 // as well (i.e., in ObjCIvarOffsetVariable).
6601 if (Ivar->getAccessControl() == ObjCIvarDecl::Private ||
6602 Ivar->getAccessControl() == ObjCIvarDecl::Package ||
6603 ID->getVisibility() == HiddenVisibility)
6604 IvarOffsetGV->setVisibility(llvm::GlobalValue::HiddenVisibility);
6606 IvarOffsetGV->setVisibility(llvm::GlobalValue::DefaultVisibility);
6609 if (CGM.getTriple().isOSBinFormatMachO())
6610 IvarOffsetGV->setSection("__DATA, __objc_ivar");
6611 return IvarOffsetGV;
6614 /// EmitIvarList - Emit the ivar list for the given
6615 /// implementation. The return value has type
6616 /// IvarListnfABIPtrTy.
6617 /// struct _ivar_t {
6618 /// unsigned [long] int *offset; // pointer to ivar offset location
6621 /// uint32_t alignment;
6624 /// struct _ivar_list_t {
6625 /// uint32 entsize; // sizeof(struct _ivar_t)
6627 /// struct _iver_t list[count];
6631 llvm::Constant *CGObjCNonFragileABIMac::EmitIvarList(
6632 const ObjCImplementationDecl *ID) {
6634 ConstantInitBuilder builder(CGM);
6635 auto ivarList = builder.beginStruct();
6636 ivarList.addInt(ObjCTypes.IntTy,
6637 CGM.getDataLayout().getTypeAllocSize(ObjCTypes.IvarnfABITy));
6638 auto ivarCountSlot = ivarList.addPlaceholder();
6639 auto ivars = ivarList.beginArray(ObjCTypes.IvarnfABITy);
6641 const ObjCInterfaceDecl *OID = ID->getClassInterface();
6642 assert(OID && "CGObjCNonFragileABIMac::EmitIvarList - null interface");
6644 // FIXME. Consolidate this with similar code in GenerateClass.
6646 for (const ObjCIvarDecl *IVD = OID->all_declared_ivar_begin();
6647 IVD; IVD = IVD->getNextIvar()) {
6648 // Ignore unnamed bit-fields.
6649 if (!IVD->getDeclName())
6652 auto ivar = ivars.beginStruct(ObjCTypes.IvarnfABITy);
6653 ivar.add(EmitIvarOffsetVar(ID->getClassInterface(), IVD,
6654 ComputeIvarBaseOffset(CGM, ID, IVD)));
6655 ivar.add(GetMethodVarName(IVD->getIdentifier()));
6656 ivar.add(GetMethodVarType(IVD));
6657 llvm::Type *FieldTy =
6658 CGM.getTypes().ConvertTypeForMem(IVD->getType());
6659 unsigned Size = CGM.getDataLayout().getTypeAllocSize(FieldTy);
6660 unsigned Align = CGM.getContext().getPreferredTypeAlign(
6661 IVD->getType().getTypePtr()) >> 3;
6662 Align = llvm::Log2_32(Align);
6663 ivar.addInt(ObjCTypes.IntTy, Align);
6664 // NOTE. Size of a bitfield does not match gcc's, because of the
6665 // way bitfields are treated special in each. But I am told that
6666 // 'size' for bitfield ivars is ignored by the runtime so it does
6667 // not matter. If it matters, there is enough info to get the
6669 ivar.addInt(ObjCTypes.IntTy, Size);
6670 ivar.finishAndAddTo(ivars);
6672 // Return null for empty list.
6673 if (ivars.empty()) {
6676 return llvm::Constant::getNullValue(ObjCTypes.IvarListnfABIPtrTy);
6679 auto ivarCount = ivars.size();
6680 ivars.finishAndAddTo(ivarList);
6681 ivarList.fillPlaceholderWithInt(ivarCountSlot, ObjCTypes.IntTy, ivarCount);
6683 const char *Prefix = "\01l_OBJC_$_INSTANCE_VARIABLES_";
6684 llvm::GlobalVariable *GV =
6685 ivarList.finishAndCreateGlobal(Prefix + OID->getObjCRuntimeNameAsString(),
6686 CGM.getPointerAlign(), /*constant*/ false,
6687 llvm::GlobalValue::PrivateLinkage);
6688 if (CGM.getTriple().isOSBinFormatMachO())
6689 GV->setSection("__DATA, __objc_const");
6690 CGM.addCompilerUsedGlobal(GV);
6691 return llvm::ConstantExpr::getBitCast(GV, ObjCTypes.IvarListnfABIPtrTy);
6694 llvm::Constant *CGObjCNonFragileABIMac::GetOrEmitProtocolRef(
6695 const ObjCProtocolDecl *PD) {
6696 llvm::GlobalVariable *&Entry = Protocols[PD->getIdentifier()];
6699 // We use the initializer as a marker of whether this is a forward
6700 // reference or not. At module finalization we add the empty
6701 // contents for protocols which were referenced but never defined.
6702 llvm::SmallString<64> Protocol;
6703 llvm::raw_svector_ostream(Protocol) << "\01l_OBJC_PROTOCOL_$_"
6704 << PD->getObjCRuntimeNameAsString();
6706 Entry = new llvm::GlobalVariable(CGM.getModule(), ObjCTypes.ProtocolnfABITy,
6707 false, llvm::GlobalValue::ExternalLinkage,
6709 if (!CGM.getTriple().isOSBinFormatMachO())
6710 Entry->setComdat(CGM.getModule().getOrInsertComdat(Protocol));
6716 /// GetOrEmitProtocol - Generate the protocol meta-data:
6718 /// struct _protocol_t {
6720 /// const char * const protocol_name;
6721 /// const struct _protocol_list_t * protocol_list; // super protocols
6722 /// const struct method_list_t * const instance_methods;
6723 /// const struct method_list_t * const class_methods;
6724 /// const struct method_list_t *optionalInstanceMethods;
6725 /// const struct method_list_t *optionalClassMethods;
6726 /// const struct _prop_list_t * properties;
6727 /// const uint32_t size; // sizeof(struct _protocol_t)
6728 /// const uint32_t flags; // = 0
6729 /// const char ** extendedMethodTypes;
6730 /// const char *demangledName;
6731 /// const struct _prop_list_t * class_properties;
6736 llvm::Constant *CGObjCNonFragileABIMac::GetOrEmitProtocol(
6737 const ObjCProtocolDecl *PD) {
6738 llvm::GlobalVariable *Entry = Protocols[PD->getIdentifier()];
6740 // Early exit if a defining object has already been generated.
6741 if (Entry && Entry->hasInitializer())
6744 // Use the protocol definition, if there is one.
6745 if (const ObjCProtocolDecl *Def = PD->getDefinition())
6748 auto methodLists = ProtocolMethodLists::get(PD);
6750 ConstantInitBuilder builder(CGM);
6751 auto values = builder.beginStruct(ObjCTypes.ProtocolnfABITy);
6754 values.addNullPointer(ObjCTypes.ObjectPtrTy);
6755 values.add(GetClassName(PD->getObjCRuntimeNameAsString()));
6756 values.add(EmitProtocolList("\01l_OBJC_$_PROTOCOL_REFS_"
6757 + PD->getObjCRuntimeNameAsString(),
6758 PD->protocol_begin(),
6759 PD->protocol_end()));
6760 values.add(methodLists.emitMethodList(this, PD,
6761 ProtocolMethodLists::RequiredInstanceMethods));
6762 values.add(methodLists.emitMethodList(this, PD,
6763 ProtocolMethodLists::RequiredClassMethods));
6764 values.add(methodLists.emitMethodList(this, PD,
6765 ProtocolMethodLists::OptionalInstanceMethods));
6766 values.add(methodLists.emitMethodList(this, PD,
6767 ProtocolMethodLists::OptionalClassMethods));
6768 values.add(EmitPropertyList(
6769 "\01l_OBJC_$_PROP_LIST_" + PD->getObjCRuntimeNameAsString(),
6770 nullptr, PD, ObjCTypes, false));
6772 CGM.getDataLayout().getTypeAllocSize(ObjCTypes.ProtocolnfABITy);
6773 values.addInt(ObjCTypes.IntTy, Size);
6774 values.addInt(ObjCTypes.IntTy, 0);
6775 values.add(EmitProtocolMethodTypes("\01l_OBJC_$_PROTOCOL_METHOD_TYPES_"
6776 + PD->getObjCRuntimeNameAsString(),
6777 methodLists.emitExtendedTypesArray(this),
6780 // const char *demangledName;
6781 values.addNullPointer(ObjCTypes.Int8PtrTy);
6783 values.add(EmitPropertyList(
6784 "\01l_OBJC_$_CLASS_PROP_LIST_" + PD->getObjCRuntimeNameAsString(),
6785 nullptr, PD, ObjCTypes, true));
6788 // Already created, fix the linkage and update the initializer.
6789 Entry->setLinkage(llvm::GlobalValue::WeakAnyLinkage);
6790 values.finishAndSetAsInitializer(Entry);
6792 llvm::SmallString<64> symbolName;
6793 llvm::raw_svector_ostream(symbolName)
6794 << "\01l_OBJC_PROTOCOL_$_" << PD->getObjCRuntimeNameAsString();
6796 Entry = values.finishAndCreateGlobal(symbolName, CGM.getPointerAlign(),
6798 llvm::GlobalValue::WeakAnyLinkage);
6799 if (!CGM.getTriple().isOSBinFormatMachO())
6800 Entry->setComdat(CGM.getModule().getOrInsertComdat(symbolName));
6802 Protocols[PD->getIdentifier()] = Entry;
6804 Entry->setVisibility(llvm::GlobalValue::HiddenVisibility);
6805 CGM.addCompilerUsedGlobal(Entry);
6807 // Use this protocol meta-data to build protocol list table in section
6808 // __DATA, __objc_protolist
6809 llvm::SmallString<64> ProtocolRef;
6810 llvm::raw_svector_ostream(ProtocolRef) << "\01l_OBJC_LABEL_PROTOCOL_$_"
6811 << PD->getObjCRuntimeNameAsString();
6813 llvm::GlobalVariable *PTGV =
6814 new llvm::GlobalVariable(CGM.getModule(), ObjCTypes.ProtocolnfABIPtrTy,
6815 false, llvm::GlobalValue::WeakAnyLinkage, Entry,
6817 if (!CGM.getTriple().isOSBinFormatMachO())
6818 PTGV->setComdat(CGM.getModule().getOrInsertComdat(ProtocolRef));
6820 CGM.getDataLayout().getABITypeAlignment(ObjCTypes.ProtocolnfABIPtrTy));
6821 if (CGM.getTriple().isOSBinFormatMachO())
6822 PTGV->setSection("__DATA, __objc_protolist, coalesced, no_dead_strip");
6823 PTGV->setVisibility(llvm::GlobalValue::HiddenVisibility);
6824 CGM.addCompilerUsedGlobal(PTGV);
6828 /// EmitProtocolList - Generate protocol list meta-data:
6830 /// struct _protocol_list_t {
6831 /// long protocol_count; // Note, this is 32/64 bit
6832 /// struct _protocol_t[protocol_count];
6837 CGObjCNonFragileABIMac::EmitProtocolList(Twine Name,
6838 ObjCProtocolDecl::protocol_iterator begin,
6839 ObjCProtocolDecl::protocol_iterator end) {
6840 SmallVector<llvm::Constant *, 16> ProtocolRefs;
6842 // Just return null for empty protocol lists
6844 return llvm::Constant::getNullValue(ObjCTypes.ProtocolListnfABIPtrTy);
6846 // FIXME: We shouldn't need to do this lookup here, should we?
6847 SmallString<256> TmpName;
6848 Name.toVector(TmpName);
6849 llvm::GlobalVariable *GV =
6850 CGM.getModule().getGlobalVariable(TmpName.str(), true);
6852 return llvm::ConstantExpr::getBitCast(GV, ObjCTypes.ProtocolListnfABIPtrTy);
6854 ConstantInitBuilder builder(CGM);
6855 auto values = builder.beginStruct();
6856 auto countSlot = values.addPlaceholder();
6858 // A null-terminated array of protocols.
6859 auto array = values.beginArray(ObjCTypes.ProtocolnfABIPtrTy);
6860 for (; begin != end; ++begin)
6861 array.add(GetProtocolRef(*begin)); // Implemented???
6862 auto count = array.size();
6863 array.addNullPointer(ObjCTypes.ProtocolnfABIPtrTy);
6865 array.finishAndAddTo(values);
6866 values.fillPlaceholderWithInt(countSlot, ObjCTypes.LongTy, count);
6868 GV = values.finishAndCreateGlobal(Name, CGM.getPointerAlign(),
6870 llvm::GlobalValue::PrivateLinkage);
6871 if (CGM.getTriple().isOSBinFormatMachO())
6872 GV->setSection("__DATA, __objc_const");
6873 CGM.addCompilerUsedGlobal(GV);
6874 return llvm::ConstantExpr::getBitCast(GV,
6875 ObjCTypes.ProtocolListnfABIPtrTy);
6878 /// EmitObjCValueForIvar - Code Gen for nonfragile ivar reference.
6879 /// This code gen. amounts to generating code for:
6881 /// (type *)((char *)base + _OBJC_IVAR_$_.ivar;
6884 LValue CGObjCNonFragileABIMac::EmitObjCValueForIvar(
6885 CodeGen::CodeGenFunction &CGF,
6887 llvm::Value *BaseValue,
6888 const ObjCIvarDecl *Ivar,
6889 unsigned CVRQualifiers) {
6890 ObjCInterfaceDecl *ID = ObjectTy->getAs<ObjCObjectType>()->getInterface();
6891 llvm::Value *Offset = EmitIvarOffset(CGF, ID, Ivar);
6892 return EmitValueForIvarAtOffset(CGF, ID, BaseValue, Ivar, CVRQualifiers,
6896 llvm::Value *CGObjCNonFragileABIMac::EmitIvarOffset(
6897 CodeGen::CodeGenFunction &CGF,
6898 const ObjCInterfaceDecl *Interface,
6899 const ObjCIvarDecl *Ivar) {
6900 llvm::Value *IvarOffsetValue = ObjCIvarOffsetVariable(Interface, Ivar);
6901 IvarOffsetValue = CGF.Builder.CreateAlignedLoad(IvarOffsetValue,
6902 CGF.getSizeAlign(), "ivar");
6903 if (IsIvarOffsetKnownIdempotent(CGF, Ivar))
6904 cast<llvm::LoadInst>(IvarOffsetValue)
6905 ->setMetadata(CGM.getModule().getMDKindID("invariant.load"),
6906 llvm::MDNode::get(VMContext, None));
6908 // This could be 32bit int or 64bit integer depending on the architecture.
6909 // Cast it to 64bit integer value, if it is a 32bit integer ivar offset value
6910 // as this is what caller always expectes.
6911 if (ObjCTypes.IvarOffsetVarTy == ObjCTypes.IntTy)
6912 IvarOffsetValue = CGF.Builder.CreateIntCast(
6913 IvarOffsetValue, ObjCTypes.LongTy, true, "ivar.conv");
6914 return IvarOffsetValue;
6917 static void appendSelectorForMessageRefTable(std::string &buffer,
6918 Selector selector) {
6919 if (selector.isUnarySelector()) {
6920 buffer += selector.getNameForSlot(0);
6924 for (unsigned i = 0, e = selector.getNumArgs(); i != e; ++i) {
6925 buffer += selector.getNameForSlot(i);
6930 /// Emit a "vtable" message send. We emit a weak hidden-visibility
6931 /// struct, initially containing the selector pointer and a pointer to
6932 /// a "fixup" variant of the appropriate objc_msgSend. To call, we
6933 /// load and call the function pointer, passing the address of the
6934 /// struct as the second parameter. The runtime determines whether
6935 /// the selector is currently emitted using vtable dispatch; if so, it
6936 /// substitutes a stub function which simply tail-calls through the
6937 /// appropriate vtable slot, and if not, it substitues a stub function
6938 /// which tail-calls objc_msgSend. Both stubs adjust the selector
6939 /// argument to correctly point to the selector.
6941 CGObjCNonFragileABIMac::EmitVTableMessageSend(CodeGenFunction &CGF,
6942 ReturnValueSlot returnSlot,
6943 QualType resultType,
6948 const CallArgList &formalArgs,
6949 const ObjCMethodDecl *method) {
6950 // Compute the actual arguments.
6953 // First argument: the receiver / super-call structure.
6955 arg0 = CGF.Builder.CreateBitCast(arg0, ObjCTypes.ObjectPtrTy);
6956 args.add(RValue::get(arg0), arg0Type);
6958 // Second argument: a pointer to the message ref structure. Leave
6959 // the actual argument value blank for now.
6960 args.add(RValue::get(nullptr), ObjCTypes.MessageRefCPtrTy);
6962 args.insert(args.end(), formalArgs.begin(), formalArgs.end());
6964 MessageSendInfo MSI = getMessageSendInfo(method, resultType, args);
6966 NullReturnState nullReturn;
6968 // Find the function to call and the mangled name for the message
6969 // ref structure. Using a different mangled name wouldn't actually
6970 // be a problem; it would just be a waste.
6972 // The runtime currently never uses vtable dispatch for anything
6973 // except normal, non-super message-sends.
6974 // FIXME: don't use this for that.
6975 llvm::Constant *fn = nullptr;
6976 std::string messageRefName("\01l_");
6977 if (CGM.ReturnSlotInterferesWithArgs(MSI.CallInfo)) {
6979 fn = ObjCTypes.getMessageSendSuper2StretFixupFn();
6980 messageRefName += "objc_msgSendSuper2_stret_fixup";
6982 nullReturn.init(CGF, arg0);
6983 fn = ObjCTypes.getMessageSendStretFixupFn();
6984 messageRefName += "objc_msgSend_stret_fixup";
6986 } else if (!isSuper && CGM.ReturnTypeUsesFPRet(resultType)) {
6987 fn = ObjCTypes.getMessageSendFpretFixupFn();
6988 messageRefName += "objc_msgSend_fpret_fixup";
6991 fn = ObjCTypes.getMessageSendSuper2FixupFn();
6992 messageRefName += "objc_msgSendSuper2_fixup";
6994 fn = ObjCTypes.getMessageSendFixupFn();
6995 messageRefName += "objc_msgSend_fixup";
6998 assert(fn && "CGObjCNonFragileABIMac::EmitMessageSend");
6999 messageRefName += '_';
7001 // Append the selector name, except use underscores anywhere we
7002 // would have used colons.
7003 appendSelectorForMessageRefTable(messageRefName, selector);
7005 llvm::GlobalVariable *messageRef
7006 = CGM.getModule().getGlobalVariable(messageRefName);
7008 // Build the message ref structure.
7009 ConstantInitBuilder builder(CGM);
7010 auto values = builder.beginStruct();
7012 values.add(GetMethodVarName(selector));
7013 messageRef = values.finishAndCreateGlobal(messageRefName,
7014 CharUnits::fromQuantity(16),
7016 llvm::GlobalValue::WeakAnyLinkage);
7017 messageRef->setVisibility(llvm::GlobalValue::HiddenVisibility);
7018 messageRef->setSection("__DATA, __objc_msgrefs, coalesced");
7021 bool requiresnullCheck = false;
7022 if (CGM.getLangOpts().ObjCAutoRefCount && method)
7023 for (const auto *ParamDecl : method->parameters()) {
7024 if (ParamDecl->hasAttr<NSConsumedAttr>()) {
7025 if (!nullReturn.NullBB)
7026 nullReturn.init(CGF, arg0);
7027 requiresnullCheck = true;
7033 Address(CGF.Builder.CreateBitCast(messageRef, ObjCTypes.MessageRefPtrTy),
7034 CGF.getPointerAlign());
7036 // Update the message ref argument.
7037 args[1].RV = RValue::get(mref.getPointer());
7039 // Load the function to call from the message ref table.
7040 Address calleeAddr =
7041 CGF.Builder.CreateStructGEP(mref, 0, CharUnits::Zero());
7042 llvm::Value *calleePtr = CGF.Builder.CreateLoad(calleeAddr, "msgSend_fn");
7044 calleePtr = CGF.Builder.CreateBitCast(calleePtr, MSI.MessengerType);
7045 CGCallee callee(CGCalleeInfo(), calleePtr);
7047 RValue result = CGF.EmitCall(MSI.CallInfo, callee, returnSlot, args);
7048 return nullReturn.complete(CGF, result, resultType, formalArgs,
7049 requiresnullCheck ? method : nullptr);
7052 /// Generate code for a message send expression in the nonfragile abi.
7054 CGObjCNonFragileABIMac::GenerateMessageSend(CodeGen::CodeGenFunction &CGF,
7055 ReturnValueSlot Return,
7056 QualType ResultType,
7058 llvm::Value *Receiver,
7059 const CallArgList &CallArgs,
7060 const ObjCInterfaceDecl *Class,
7061 const ObjCMethodDecl *Method) {
7062 return isVTableDispatchedSelector(Sel)
7063 ? EmitVTableMessageSend(CGF, Return, ResultType, Sel,
7064 Receiver, CGF.getContext().getObjCIdType(),
7065 false, CallArgs, Method)
7066 : EmitMessageSend(CGF, Return, ResultType,
7067 EmitSelector(CGF, Sel),
7068 Receiver, CGF.getContext().getObjCIdType(),
7069 false, CallArgs, Method, Class, ObjCTypes);
7073 CGObjCNonFragileABIMac::GetClassGlobal(const ObjCInterfaceDecl *ID,
7075 ForDefinition_t isForDefinition) {
7077 (metaclass ? getMetaclassSymbolPrefix() : getClassSymbolPrefix());
7078 return GetClassGlobal((prefix + ID->getObjCRuntimeNameAsString()).str(),
7080 ID->isWeakImported(),
7082 && CGM.getTriple().isOSBinFormatCOFF()
7083 && ID->hasAttr<DLLImportAttr>());
7087 CGObjCNonFragileABIMac::GetClassGlobal(StringRef Name,
7088 ForDefinition_t IsForDefinition,
7089 bool Weak, bool DLLImport) {
7090 llvm::GlobalValue::LinkageTypes L =
7091 Weak ? llvm::GlobalValue::ExternalWeakLinkage
7092 : llvm::GlobalValue::ExternalLinkage;
7096 llvm::GlobalVariable *GV = CGM.getModule().getGlobalVariable(Name);
7098 GV = new llvm::GlobalVariable(CGM.getModule(), ObjCTypes.ClassnfABITy,
7099 false, L, nullptr, Name);
7102 GV->setDLLStorageClass(llvm::GlobalValue::DLLImportStorageClass);
7105 assert(GV->getLinkage() == L);
7110 CGObjCNonFragileABIMac::EmitClassRefFromId(CodeGenFunction &CGF,
7112 const ObjCInterfaceDecl *ID) {
7113 CharUnits Align = CGF.getPointerAlign();
7114 llvm::GlobalVariable *&Entry = ClassReferences[II];
7117 llvm::Constant *ClassGV;
7119 ClassGV = GetClassGlobal(ID, /*metaclass*/ false, NotForDefinition);
7121 ClassGV = GetClassGlobal((getClassSymbolPrefix() + II->getName()).str(),
7125 Entry = new llvm::GlobalVariable(CGM.getModule(), ObjCTypes.ClassnfABIPtrTy,
7126 false, llvm::GlobalValue::PrivateLinkage,
7127 ClassGV, "OBJC_CLASSLIST_REFERENCES_$_");
7128 Entry->setAlignment(Align.getQuantity());
7129 Entry->setSection("__DATA, __objc_classrefs, regular, no_dead_strip");
7130 CGM.addCompilerUsedGlobal(Entry);
7132 return CGF.Builder.CreateAlignedLoad(Entry, Align);
7135 llvm::Value *CGObjCNonFragileABIMac::EmitClassRef(CodeGenFunction &CGF,
7136 const ObjCInterfaceDecl *ID) {
7137 // If the class has the objc_runtime_visible attribute, we need to
7138 // use the Objective-C runtime to get the class.
7139 if (ID->hasAttr<ObjCRuntimeVisibleAttr>())
7140 return EmitClassRefViaRuntime(CGF, ID, ObjCTypes);
7142 return EmitClassRefFromId(CGF, ID->getIdentifier(), ID);
7145 llvm::Value *CGObjCNonFragileABIMac::EmitNSAutoreleasePoolClassRef(
7146 CodeGenFunction &CGF) {
7147 IdentifierInfo *II = &CGM.getContext().Idents.get("NSAutoreleasePool");
7148 return EmitClassRefFromId(CGF, II, nullptr);
7152 CGObjCNonFragileABIMac::EmitSuperClassRef(CodeGenFunction &CGF,
7153 const ObjCInterfaceDecl *ID) {
7154 CharUnits Align = CGF.getPointerAlign();
7155 llvm::GlobalVariable *&Entry = SuperClassReferences[ID->getIdentifier()];
7158 auto ClassGV = GetClassGlobal(ID, /*metaclass*/ false, NotForDefinition);
7159 Entry = new llvm::GlobalVariable(CGM.getModule(), ObjCTypes.ClassnfABIPtrTy,
7160 false, llvm::GlobalValue::PrivateLinkage,
7161 ClassGV, "OBJC_CLASSLIST_SUP_REFS_$_");
7162 Entry->setAlignment(Align.getQuantity());
7163 Entry->setSection("__DATA, __objc_superrefs, regular, no_dead_strip");
7164 CGM.addCompilerUsedGlobal(Entry);
7166 return CGF.Builder.CreateAlignedLoad(Entry, Align);
7169 /// EmitMetaClassRef - Return a Value * of the address of _class_t
7172 llvm::Value *CGObjCNonFragileABIMac::EmitMetaClassRef(CodeGenFunction &CGF,
7173 const ObjCInterfaceDecl *ID,
7175 CharUnits Align = CGF.getPointerAlign();
7176 llvm::GlobalVariable * &Entry = MetaClassReferences[ID->getIdentifier()];
7178 auto MetaClassGV = GetClassGlobal(ID, /*metaclass*/ true, NotForDefinition);
7180 Entry = new llvm::GlobalVariable(CGM.getModule(), ObjCTypes.ClassnfABIPtrTy,
7181 false, llvm::GlobalValue::PrivateLinkage,
7182 MetaClassGV, "OBJC_CLASSLIST_SUP_REFS_$_");
7183 Entry->setAlignment(Align.getQuantity());
7185 Entry->setSection("__DATA, __objc_superrefs, regular, no_dead_strip");
7186 CGM.addCompilerUsedGlobal(Entry);
7189 return CGF.Builder.CreateAlignedLoad(Entry, Align);
7192 /// GetClass - Return a reference to the class for the given interface
7194 llvm::Value *CGObjCNonFragileABIMac::GetClass(CodeGenFunction &CGF,
7195 const ObjCInterfaceDecl *ID) {
7196 if (ID->isWeakImported()) {
7197 auto ClassGV = GetClassGlobal(ID, /*metaclass*/ false, NotForDefinition);
7199 assert(!isa<llvm::GlobalVariable>(ClassGV) ||
7200 cast<llvm::GlobalVariable>(ClassGV)->hasExternalWeakLinkage());
7203 return EmitClassRef(CGF, ID);
7206 /// Generates a message send where the super is the receiver. This is
7207 /// a message send to self with special delivery semantics indicating
7208 /// which class's method should be called.
7210 CGObjCNonFragileABIMac::GenerateMessageSendSuper(CodeGen::CodeGenFunction &CGF,
7211 ReturnValueSlot Return,
7212 QualType ResultType,
7214 const ObjCInterfaceDecl *Class,
7215 bool isCategoryImpl,
7216 llvm::Value *Receiver,
7217 bool IsClassMessage,
7218 const CodeGen::CallArgList &CallArgs,
7219 const ObjCMethodDecl *Method) {
7221 // Create and init a super structure; this is a (receiver, class)
7222 // pair we will pass to objc_msgSendSuper.
7224 CGF.CreateTempAlloca(ObjCTypes.SuperTy, CGF.getPointerAlign(),
7227 llvm::Value *ReceiverAsObject =
7228 CGF.Builder.CreateBitCast(Receiver, ObjCTypes.ObjectPtrTy);
7229 CGF.Builder.CreateStore(
7231 CGF.Builder.CreateStructGEP(ObjCSuper, 0, CharUnits::Zero()));
7233 // If this is a class message the metaclass is passed as the target.
7234 llvm::Value *Target;
7236 Target = EmitMetaClassRef(CGF, Class, Class->isWeakImported());
7238 Target = EmitSuperClassRef(CGF, Class);
7240 // FIXME: We shouldn't need to do this cast, rectify the ASTContext and
7242 llvm::Type *ClassTy =
7243 CGM.getTypes().ConvertType(CGF.getContext().getObjCClassType());
7244 Target = CGF.Builder.CreateBitCast(Target, ClassTy);
7245 CGF.Builder.CreateStore(
7246 Target, CGF.Builder.CreateStructGEP(ObjCSuper, 1, CGF.getPointerSize()));
7248 return (isVTableDispatchedSelector(Sel))
7249 ? EmitVTableMessageSend(CGF, Return, ResultType, Sel,
7250 ObjCSuper.getPointer(), ObjCTypes.SuperPtrCTy,
7251 true, CallArgs, Method)
7252 : EmitMessageSend(CGF, Return, ResultType,
7253 EmitSelector(CGF, Sel),
7254 ObjCSuper.getPointer(), ObjCTypes.SuperPtrCTy,
7255 true, CallArgs, Method, Class, ObjCTypes);
7258 llvm::Value *CGObjCNonFragileABIMac::EmitSelector(CodeGenFunction &CGF,
7260 Address Addr = EmitSelectorAddr(CGF, Sel);
7262 llvm::LoadInst* LI = CGF.Builder.CreateLoad(Addr);
7263 LI->setMetadata(CGM.getModule().getMDKindID("invariant.load"),
7264 llvm::MDNode::get(VMContext, None));
7268 Address CGObjCNonFragileABIMac::EmitSelectorAddr(CodeGenFunction &CGF,
7270 llvm::GlobalVariable *&Entry = SelectorReferences[Sel];
7272 CharUnits Align = CGF.getPointerAlign();
7274 llvm::Constant *Casted =
7275 llvm::ConstantExpr::getBitCast(GetMethodVarName(Sel),
7276 ObjCTypes.SelectorPtrTy);
7277 Entry = new llvm::GlobalVariable(CGM.getModule(), ObjCTypes.SelectorPtrTy,
7278 false, llvm::GlobalValue::PrivateLinkage,
7279 Casted, "OBJC_SELECTOR_REFERENCES_");
7280 Entry->setExternallyInitialized(true);
7281 Entry->setSection("__DATA, __objc_selrefs, literal_pointers, no_dead_strip");
7282 Entry->setAlignment(Align.getQuantity());
7283 CGM.addCompilerUsedGlobal(Entry);
7286 return Address(Entry, Align);
7289 /// EmitObjCIvarAssign - Code gen for assigning to a __strong object.
7290 /// objc_assign_ivar (id src, id *dst, ptrdiff_t)
7292 void CGObjCNonFragileABIMac::EmitObjCIvarAssign(CodeGen::CodeGenFunction &CGF,
7295 llvm::Value *ivarOffset) {
7296 llvm::Type * SrcTy = src->getType();
7297 if (!isa<llvm::PointerType>(SrcTy)) {
7298 unsigned Size = CGM.getDataLayout().getTypeAllocSize(SrcTy);
7299 assert(Size <= 8 && "does not support size > 8");
7300 src = (Size == 4 ? CGF.Builder.CreateBitCast(src, ObjCTypes.IntTy)
7301 : CGF.Builder.CreateBitCast(src, ObjCTypes.LongTy));
7302 src = CGF.Builder.CreateIntToPtr(src, ObjCTypes.Int8PtrTy);
7304 src = CGF.Builder.CreateBitCast(src, ObjCTypes.ObjectPtrTy);
7305 dst = CGF.Builder.CreateBitCast(dst, ObjCTypes.PtrObjectPtrTy);
7306 llvm::Value *args[] = { src, dst.getPointer(), ivarOffset };
7307 CGF.EmitNounwindRuntimeCall(ObjCTypes.getGcAssignIvarFn(), args);
7310 /// EmitObjCStrongCastAssign - Code gen for assigning to a __strong cast object.
7311 /// objc_assign_strongCast (id src, id *dst)
7313 void CGObjCNonFragileABIMac::EmitObjCStrongCastAssign(
7314 CodeGen::CodeGenFunction &CGF,
7315 llvm::Value *src, Address dst) {
7316 llvm::Type * SrcTy = src->getType();
7317 if (!isa<llvm::PointerType>(SrcTy)) {
7318 unsigned Size = CGM.getDataLayout().getTypeAllocSize(SrcTy);
7319 assert(Size <= 8 && "does not support size > 8");
7320 src = (Size == 4 ? CGF.Builder.CreateBitCast(src, ObjCTypes.IntTy)
7321 : CGF.Builder.CreateBitCast(src, ObjCTypes.LongTy));
7322 src = CGF.Builder.CreateIntToPtr(src, ObjCTypes.Int8PtrTy);
7324 src = CGF.Builder.CreateBitCast(src, ObjCTypes.ObjectPtrTy);
7325 dst = CGF.Builder.CreateBitCast(dst, ObjCTypes.PtrObjectPtrTy);
7326 llvm::Value *args[] = { src, dst.getPointer() };
7327 CGF.EmitNounwindRuntimeCall(ObjCTypes.getGcAssignStrongCastFn(),
7328 args, "weakassign");
7331 void CGObjCNonFragileABIMac::EmitGCMemmoveCollectable(
7332 CodeGen::CodeGenFunction &CGF,
7335 llvm::Value *Size) {
7336 SrcPtr = CGF.Builder.CreateBitCast(SrcPtr, ObjCTypes.Int8PtrTy);
7337 DestPtr = CGF.Builder.CreateBitCast(DestPtr, ObjCTypes.Int8PtrTy);
7338 llvm::Value *args[] = { DestPtr.getPointer(), SrcPtr.getPointer(), Size };
7339 CGF.EmitNounwindRuntimeCall(ObjCTypes.GcMemmoveCollectableFn(), args);
7342 /// EmitObjCWeakRead - Code gen for loading value of a __weak
7343 /// object: objc_read_weak (id *src)
7345 llvm::Value * CGObjCNonFragileABIMac::EmitObjCWeakRead(
7346 CodeGen::CodeGenFunction &CGF,
7347 Address AddrWeakObj) {
7348 llvm::Type *DestTy = AddrWeakObj.getElementType();
7349 AddrWeakObj = CGF.Builder.CreateBitCast(AddrWeakObj, ObjCTypes.PtrObjectPtrTy);
7350 llvm::Value *read_weak =
7351 CGF.EmitNounwindRuntimeCall(ObjCTypes.getGcReadWeakFn(),
7352 AddrWeakObj.getPointer(), "weakread");
7353 read_weak = CGF.Builder.CreateBitCast(read_weak, DestTy);
7357 /// EmitObjCWeakAssign - Code gen for assigning to a __weak object.
7358 /// objc_assign_weak (id src, id *dst)
7360 void CGObjCNonFragileABIMac::EmitObjCWeakAssign(CodeGen::CodeGenFunction &CGF,
7361 llvm::Value *src, Address dst) {
7362 llvm::Type * SrcTy = src->getType();
7363 if (!isa<llvm::PointerType>(SrcTy)) {
7364 unsigned Size = CGM.getDataLayout().getTypeAllocSize(SrcTy);
7365 assert(Size <= 8 && "does not support size > 8");
7366 src = (Size == 4 ? CGF.Builder.CreateBitCast(src, ObjCTypes.IntTy)
7367 : CGF.Builder.CreateBitCast(src, ObjCTypes.LongTy));
7368 src = CGF.Builder.CreateIntToPtr(src, ObjCTypes.Int8PtrTy);
7370 src = CGF.Builder.CreateBitCast(src, ObjCTypes.ObjectPtrTy);
7371 dst = CGF.Builder.CreateBitCast(dst, ObjCTypes.PtrObjectPtrTy);
7372 llvm::Value *args[] = { src, dst.getPointer() };
7373 CGF.EmitNounwindRuntimeCall(ObjCTypes.getGcAssignWeakFn(),
7374 args, "weakassign");
7377 /// EmitObjCGlobalAssign - Code gen for assigning to a __strong object.
7378 /// objc_assign_global (id src, id *dst)
7380 void CGObjCNonFragileABIMac::EmitObjCGlobalAssign(CodeGen::CodeGenFunction &CGF,
7381 llvm::Value *src, Address dst,
7383 llvm::Type * SrcTy = src->getType();
7384 if (!isa<llvm::PointerType>(SrcTy)) {
7385 unsigned Size = CGM.getDataLayout().getTypeAllocSize(SrcTy);
7386 assert(Size <= 8 && "does not support size > 8");
7387 src = (Size == 4 ? CGF.Builder.CreateBitCast(src, ObjCTypes.IntTy)
7388 : CGF.Builder.CreateBitCast(src, ObjCTypes.LongTy));
7389 src = CGF.Builder.CreateIntToPtr(src, ObjCTypes.Int8PtrTy);
7391 src = CGF.Builder.CreateBitCast(src, ObjCTypes.ObjectPtrTy);
7392 dst = CGF.Builder.CreateBitCast(dst, ObjCTypes.PtrObjectPtrTy);
7393 llvm::Value *args[] = { src, dst.getPointer() };
7395 CGF.EmitNounwindRuntimeCall(ObjCTypes.getGcAssignGlobalFn(),
7396 args, "globalassign");
7398 CGF.EmitNounwindRuntimeCall(ObjCTypes.getGcAssignThreadLocalFn(),
7399 args, "threadlocalassign");
7403 CGObjCNonFragileABIMac::EmitSynchronizedStmt(CodeGen::CodeGenFunction &CGF,
7404 const ObjCAtSynchronizedStmt &S) {
7405 EmitAtSynchronizedStmt(CGF, S,
7406 cast<llvm::Function>(ObjCTypes.getSyncEnterFn()),
7407 cast<llvm::Function>(ObjCTypes.getSyncExitFn()));
7411 CGObjCNonFragileABIMac::GetEHType(QualType T) {
7412 // There's a particular fixed type info for 'id'.
7413 if (T->isObjCIdType() || T->isObjCQualifiedIdType()) {
7414 auto *IDEHType = CGM.getModule().getGlobalVariable("OBJC_EHTYPE_id");
7417 new llvm::GlobalVariable(CGM.getModule(), ObjCTypes.EHTypeTy, false,
7418 llvm::GlobalValue::ExternalLinkage, nullptr,
7420 if (CGM.getTriple().isOSBinFormatCOFF())
7421 IDEHType->setDLLStorageClass(getStorage(CGM, "OBJC_EHTYPE_id"));
7426 // All other types should be Objective-C interface pointer types.
7427 const ObjCObjectPointerType *PT = T->getAs<ObjCObjectPointerType>();
7428 assert(PT && "Invalid @catch type.");
7430 const ObjCInterfaceType *IT = PT->getInterfaceType();
7431 assert(IT && "Invalid @catch type.");
7433 return GetInterfaceEHType(IT->getDecl(), NotForDefinition);
7436 void CGObjCNonFragileABIMac::EmitTryStmt(CodeGen::CodeGenFunction &CGF,
7437 const ObjCAtTryStmt &S) {
7438 EmitTryCatchStmt(CGF, S,
7439 cast<llvm::Function>(ObjCTypes.getObjCBeginCatchFn()),
7440 cast<llvm::Function>(ObjCTypes.getObjCEndCatchFn()),
7441 cast<llvm::Function>(ObjCTypes.getExceptionRethrowFn()));
7444 /// EmitThrowStmt - Generate code for a throw statement.
7445 void CGObjCNonFragileABIMac::EmitThrowStmt(CodeGen::CodeGenFunction &CGF,
7446 const ObjCAtThrowStmt &S,
7447 bool ClearInsertionPoint) {
7448 if (const Expr *ThrowExpr = S.getThrowExpr()) {
7449 llvm::Value *Exception = CGF.EmitObjCThrowOperand(ThrowExpr);
7450 Exception = CGF.Builder.CreateBitCast(Exception, ObjCTypes.ObjectPtrTy);
7451 CGF.EmitRuntimeCallOrInvoke(ObjCTypes.getExceptionThrowFn(), Exception)
7452 .setDoesNotReturn();
7454 CGF.EmitRuntimeCallOrInvoke(ObjCTypes.getExceptionRethrowFn())
7455 .setDoesNotReturn();
7458 CGF.Builder.CreateUnreachable();
7459 if (ClearInsertionPoint)
7460 CGF.Builder.ClearInsertionPoint();
7464 CGObjCNonFragileABIMac::GetInterfaceEHType(const ObjCInterfaceDecl *ID,
7465 ForDefinition_t IsForDefinition) {
7466 llvm::GlobalVariable * &Entry = EHTypeReferences[ID->getIdentifier()];
7467 StringRef ClassName = ID->getObjCRuntimeNameAsString();
7469 // If we don't need a definition, return the entry if found or check
7470 // if we use an external reference.
7471 if (!IsForDefinition) {
7475 // If this type (or a super class) has the __objc_exception__
7476 // attribute, emit an external reference.
7477 if (hasObjCExceptionAttribute(CGM.getContext(), ID)) {
7478 std::string EHTypeName = ("OBJC_EHTYPE_$_" + ClassName).str();
7479 Entry = new llvm::GlobalVariable(CGM.getModule(), ObjCTypes.EHTypeTy,
7480 false, llvm::GlobalValue::ExternalLinkage,
7481 nullptr, EHTypeName);
7482 if (CGM.getTriple().isOSBinFormatCOFF()) {
7483 if (ID->hasAttr<DLLExportAttr>())
7484 Entry->setDLLStorageClass(llvm::GlobalValue::DLLExportStorageClass);
7485 else if (ID->hasAttr<DLLImportAttr>())
7486 Entry->setDLLStorageClass(llvm::GlobalValue::DLLImportStorageClass);
7492 // Otherwise we need to either make a new entry or fill in the initializer.
7493 assert((!Entry || !Entry->hasInitializer()) && "Duplicate EHType definition");
7495 std::string VTableName = "objc_ehtype_vtable";
7496 auto *VTableGV = CGM.getModule().getGlobalVariable(VTableName);
7499 new llvm::GlobalVariable(CGM.getModule(), ObjCTypes.Int8PtrTy, false,
7500 llvm::GlobalValue::ExternalLinkage, nullptr,
7502 if (CGM.getTriple().isOSBinFormatCOFF())
7503 VTableGV->setDLLStorageClass(getStorage(CGM, VTableName));
7506 llvm::Value *VTableIdx = llvm::ConstantInt::get(CGM.Int32Ty, 2);
7507 ConstantInitBuilder builder(CGM);
7508 auto values = builder.beginStruct(ObjCTypes.EHTypeTy);
7509 values.add(llvm::ConstantExpr::getGetElementPtr(VTableGV->getValueType(),
7510 VTableGV, VTableIdx));
7511 values.add(GetClassName(ClassName));
7512 values.add(GetClassGlobal(ID, /*metaclass*/ false, NotForDefinition));
7514 llvm::GlobalValue::LinkageTypes L = IsForDefinition
7515 ? llvm::GlobalValue::ExternalLinkage
7516 : llvm::GlobalValue::WeakAnyLinkage;
7518 values.finishAndSetAsInitializer(Entry);
7519 Entry->setAlignment(CGM.getPointerAlign().getQuantity());
7521 Entry = values.finishAndCreateGlobal("OBJC_EHTYPE_$_" + ClassName,
7522 CGM.getPointerAlign(),
7525 if (CGM.getTriple().isOSBinFormatCOFF())
7526 if (hasObjCExceptionAttribute(CGM.getContext(), ID))
7527 if (ID->hasAttr<DLLExportAttr>())
7528 Entry->setDLLStorageClass(llvm::GlobalValue::DLLExportStorageClass);
7530 assert(Entry->getLinkage() == L);
7532 if (!CGM.getTriple().isOSBinFormatCOFF())
7533 if (ID->getVisibility() == HiddenVisibility)
7534 Entry->setVisibility(llvm::GlobalValue::HiddenVisibility);
7536 if (IsForDefinition)
7537 if (CGM.getTriple().isOSBinFormatMachO())
7538 Entry->setSection("__DATA,__objc_const");
7545 CodeGen::CGObjCRuntime *
7546 CodeGen::CreateMacObjCRuntime(CodeGen::CodeGenModule &CGM) {
7547 switch (CGM.getLangOpts().ObjCRuntime.getKind()) {
7548 case ObjCRuntime::FragileMacOSX:
7549 return new CGObjCMac(CGM);
7551 case ObjCRuntime::MacOSX:
7552 case ObjCRuntime::iOS:
7553 case ObjCRuntime::WatchOS:
7554 return new CGObjCNonFragileABIMac(CGM);
7556 case ObjCRuntime::GNUstep:
7557 case ObjCRuntime::GCC:
7558 case ObjCRuntime::ObjFW:
7559 llvm_unreachable("these runtimes are not Mac runtimes");
7561 llvm_unreachable("bad runtime");