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