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