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