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