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