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