Coverage Report

Created: 2024-01-17 10:31

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