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