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