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