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