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 SmallString<256> Name; 4005 llvm::raw_svector_ostream OS(Name); 4006 const auto &MC = CGM.getContext().createMangleContext(); 4007 MC->mangleObjCMethodName(OMD, OS, /*includePrefixByte=*/true, 4008 /*includeCategoryNamespace=*/true); 4009 4010 CodeGenTypes &Types = CGM.getTypes(); 4011 llvm::FunctionType *MethodTy = 4012 Types.GetFunctionType(Types.arrangeObjCMethodDeclaration(OMD)); 4013 Method = 4014 llvm::Function::Create(MethodTy, llvm::GlobalValue::InternalLinkage, 4015 Name.str(), &CGM.getModule()); 4016 } 4017 4018 MethodDefinitions.insert(std::make_pair(OMD, Method)); 4019 4020 return Method; 4021 } 4022 4023 llvm::Function * 4024 CGObjCCommonMac::GenerateDirectMethod(const ObjCMethodDecl *OMD, 4025 const ObjCContainerDecl *CD) { 4026 auto *COMD = OMD->getCanonicalDecl(); 4027 auto I = DirectMethodDefinitions.find(COMD); 4028 llvm::Function *OldFn = nullptr, *Fn = nullptr; 4029 4030 if (I != DirectMethodDefinitions.end()) { 4031 // Objective-C allows for the declaration and implementation types 4032 // to differ slightly. 4033 // 4034 // If we're being asked for the Function associated for a method 4035 // implementation, a previous value might have been cached 4036 // based on the type of the canonical declaration. 4037 // 4038 // If these do not match, then we'll replace this function with 4039 // a new one that has the proper type below. 4040 if (!OMD->getBody() || COMD->getReturnType() == OMD->getReturnType()) 4041 return I->second; 4042 OldFn = I->second; 4043 } 4044 4045 CodeGenTypes &Types = CGM.getTypes(); 4046 llvm::FunctionType *MethodTy = 4047 Types.GetFunctionType(Types.arrangeObjCMethodDeclaration(OMD)); 4048 4049 if (OldFn) { 4050 Fn = llvm::Function::Create(MethodTy, llvm::GlobalValue::ExternalLinkage, 4051 "", &CGM.getModule()); 4052 Fn->takeName(OldFn); 4053 OldFn->replaceAllUsesWith( 4054 llvm::ConstantExpr::getBitCast(Fn, OldFn->getType())); 4055 OldFn->eraseFromParent(); 4056 4057 // Replace the cached function in the map. 4058 I->second = Fn; 4059 } else { 4060 SmallString<256> Name; 4061 llvm::raw_svector_ostream OS(Name); 4062 const auto &MC = CGM.getContext().createMangleContext(); 4063 MC->mangleObjCMethodName(OMD, OS, /*includePrefixByte=*/true, 4064 /*includeCategoryNamespace=*/false); 4065 4066 Fn = llvm::Function::Create(MethodTy, llvm::GlobalValue::ExternalLinkage, 4067 Name.str(), &CGM.getModule()); 4068 DirectMethodDefinitions.insert(std::make_pair(COMD, Fn)); 4069 } 4070 4071 return Fn; 4072 } 4073 4074 void CGObjCCommonMac::GenerateDirectMethodPrologue( 4075 CodeGenFunction &CGF, llvm::Function *Fn, const ObjCMethodDecl *OMD, 4076 const ObjCContainerDecl *CD) { 4077 auto &Builder = CGF.Builder; 4078 bool ReceiverCanBeNull = true; 4079 auto selfAddr = CGF.GetAddrOfLocalVar(OMD->getSelfDecl()); 4080 auto selfValue = Builder.CreateLoad(selfAddr); 4081 4082 // Generate: 4083 // 4084 // /* for class methods only to force class lazy initialization */ 4085 // self = [self self]; 4086 // 4087 // /* unless the receiver is never NULL */ 4088 // if (self == nil) { 4089 // return (ReturnType){ }; 4090 // } 4091 // 4092 // _cmd = @selector(...) 4093 // ... 4094 4095 if (OMD->isClassMethod()) { 4096 const ObjCInterfaceDecl *OID = cast<ObjCInterfaceDecl>(CD); 4097 assert(OID && 4098 "GenerateDirectMethod() should be called with the Class Interface"); 4099 Selector SelfSel = GetNullarySelector("self", CGM.getContext()); 4100 auto ResultType = CGF.getContext().getObjCIdType(); 4101 RValue result; 4102 CallArgList Args; 4103 4104 // TODO: If this method is inlined, the caller might know that `self` is 4105 // already initialized; for example, it might be an ordinary Objective-C 4106 // method which always receives an initialized `self`, or it might have just 4107 // forced initialization on its own. 4108 // 4109 // We should find a way to eliminate this unnecessary initialization in such 4110 // cases in LLVM. 4111 result = GeneratePossiblySpecializedMessageSend( 4112 CGF, ReturnValueSlot(), ResultType, SelfSel, selfValue, Args, OID, 4113 nullptr, true); 4114 Builder.CreateStore(result.getScalarVal(), selfAddr); 4115 4116 // Nullable `Class` expressions cannot be messaged with a direct method 4117 // so the only reason why the receive can be null would be because 4118 // of weak linking. 4119 ReceiverCanBeNull = isWeakLinkedClass(OID); 4120 } 4121 4122 if (ReceiverCanBeNull) { 4123 llvm::BasicBlock *SelfIsNilBlock = 4124 CGF.createBasicBlock("objc_direct_method.self_is_nil"); 4125 llvm::BasicBlock *ContBlock = 4126 CGF.createBasicBlock("objc_direct_method.cont"); 4127 4128 // if (self == nil) { 4129 auto selfTy = cast<llvm::PointerType>(selfValue->getType()); 4130 auto Zero = llvm::ConstantPointerNull::get(selfTy); 4131 4132 llvm::MDBuilder MDHelper(CGM.getLLVMContext()); 4133 Builder.CreateCondBr(Builder.CreateICmpEQ(selfValue, Zero), SelfIsNilBlock, 4134 ContBlock, MDHelper.createBranchWeights(1, 1 << 20)); 4135 4136 CGF.EmitBlock(SelfIsNilBlock); 4137 4138 // return (ReturnType){ }; 4139 auto retTy = OMD->getReturnType(); 4140 Builder.SetInsertPoint(SelfIsNilBlock); 4141 if (!retTy->isVoidType()) { 4142 CGF.EmitNullInitialization(CGF.ReturnValue, retTy); 4143 } 4144 CGF.EmitBranchThroughCleanup(CGF.ReturnBlock); 4145 // } 4146 4147 // rest of the body 4148 CGF.EmitBlock(ContBlock); 4149 Builder.SetInsertPoint(ContBlock); 4150 } 4151 4152 // only synthesize _cmd if it's referenced 4153 if (OMD->getCmdDecl()->isUsed()) { 4154 Builder.CreateStore(GetSelector(CGF, OMD), 4155 CGF.GetAddrOfLocalVar(OMD->getCmdDecl())); 4156 } 4157 } 4158 4159 llvm::GlobalVariable *CGObjCCommonMac::CreateMetadataVar(Twine Name, 4160 ConstantStructBuilder &Init, 4161 StringRef Section, 4162 CharUnits Align, 4163 bool AddToUsed) { 4164 llvm::GlobalValue::LinkageTypes LT = 4165 getLinkageTypeForObjCMetadata(CGM, Section); 4166 llvm::GlobalVariable *GV = 4167 Init.finishAndCreateGlobal(Name, Align, /*constant*/ false, LT); 4168 if (!Section.empty()) 4169 GV->setSection(Section); 4170 if (AddToUsed) 4171 CGM.addCompilerUsedGlobal(GV); 4172 return GV; 4173 } 4174 4175 llvm::GlobalVariable *CGObjCCommonMac::CreateMetadataVar(Twine Name, 4176 llvm::Constant *Init, 4177 StringRef Section, 4178 CharUnits Align, 4179 bool AddToUsed) { 4180 llvm::Type *Ty = Init->getType(); 4181 llvm::GlobalValue::LinkageTypes LT = 4182 getLinkageTypeForObjCMetadata(CGM, Section); 4183 llvm::GlobalVariable *GV = 4184 new llvm::GlobalVariable(CGM.getModule(), Ty, false, LT, Init, Name); 4185 if (!Section.empty()) 4186 GV->setSection(Section); 4187 GV->setAlignment(Align.getAsAlign()); 4188 if (AddToUsed) 4189 CGM.addCompilerUsedGlobal(GV); 4190 return GV; 4191 } 4192 4193 llvm::GlobalVariable * 4194 CGObjCCommonMac::CreateCStringLiteral(StringRef Name, ObjCLabelType Type, 4195 bool ForceNonFragileABI, 4196 bool NullTerminate) { 4197 StringRef Label; 4198 switch (Type) { 4199 case ObjCLabelType::ClassName: Label = "OBJC_CLASS_NAME_"; break; 4200 case ObjCLabelType::MethodVarName: Label = "OBJC_METH_VAR_NAME_"; break; 4201 case ObjCLabelType::MethodVarType: Label = "OBJC_METH_VAR_TYPE_"; break; 4202 case ObjCLabelType::PropertyName: Label = "OBJC_PROP_NAME_ATTR_"; break; 4203 } 4204 4205 bool NonFragile = ForceNonFragileABI || isNonFragileABI(); 4206 4207 StringRef Section; 4208 switch (Type) { 4209 case ObjCLabelType::ClassName: 4210 Section = NonFragile ? "__TEXT,__objc_classname,cstring_literals" 4211 : "__TEXT,__cstring,cstring_literals"; 4212 break; 4213 case ObjCLabelType::MethodVarName: 4214 Section = NonFragile ? "__TEXT,__objc_methname,cstring_literals" 4215 : "__TEXT,__cstring,cstring_literals"; 4216 break; 4217 case ObjCLabelType::MethodVarType: 4218 Section = NonFragile ? "__TEXT,__objc_methtype,cstring_literals" 4219 : "__TEXT,__cstring,cstring_literals"; 4220 break; 4221 case ObjCLabelType::PropertyName: 4222 Section = NonFragile ? "__TEXT,__objc_methname,cstring_literals" 4223 : "__TEXT,__cstring,cstring_literals"; 4224 break; 4225 } 4226 4227 llvm::Constant *Value = 4228 llvm::ConstantDataArray::getString(VMContext, Name, NullTerminate); 4229 llvm::GlobalVariable *GV = 4230 new llvm::GlobalVariable(CGM.getModule(), Value->getType(), 4231 /*isConstant=*/true, 4232 llvm::GlobalValue::PrivateLinkage, Value, Label); 4233 if (CGM.getTriple().isOSBinFormatMachO()) 4234 GV->setSection(Section); 4235 GV->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global); 4236 GV->setAlignment(CharUnits::One().getAsAlign()); 4237 CGM.addCompilerUsedGlobal(GV); 4238 4239 return GV; 4240 } 4241 4242 llvm::Function *CGObjCMac::ModuleInitFunction() { 4243 // Abuse this interface function as a place to finalize. 4244 FinishModule(); 4245 return nullptr; 4246 } 4247 4248 llvm::FunctionCallee CGObjCMac::GetPropertyGetFunction() { 4249 return ObjCTypes.getGetPropertyFn(); 4250 } 4251 4252 llvm::FunctionCallee CGObjCMac::GetPropertySetFunction() { 4253 return ObjCTypes.getSetPropertyFn(); 4254 } 4255 4256 llvm::FunctionCallee CGObjCMac::GetOptimizedPropertySetFunction(bool atomic, 4257 bool copy) { 4258 return ObjCTypes.getOptimizedSetPropertyFn(atomic, copy); 4259 } 4260 4261 llvm::FunctionCallee CGObjCMac::GetGetStructFunction() { 4262 return ObjCTypes.getCopyStructFn(); 4263 } 4264 4265 llvm::FunctionCallee CGObjCMac::GetSetStructFunction() { 4266 return ObjCTypes.getCopyStructFn(); 4267 } 4268 4269 llvm::FunctionCallee CGObjCMac::GetCppAtomicObjectGetFunction() { 4270 return ObjCTypes.getCppAtomicObjectFunction(); 4271 } 4272 4273 llvm::FunctionCallee CGObjCMac::GetCppAtomicObjectSetFunction() { 4274 return ObjCTypes.getCppAtomicObjectFunction(); 4275 } 4276 4277 llvm::FunctionCallee CGObjCMac::EnumerationMutationFunction() { 4278 return ObjCTypes.getEnumerationMutationFn(); 4279 } 4280 4281 void CGObjCMac::EmitTryStmt(CodeGenFunction &CGF, const ObjCAtTryStmt &S) { 4282 return EmitTryOrSynchronizedStmt(CGF, S); 4283 } 4284 4285 void CGObjCMac::EmitSynchronizedStmt(CodeGenFunction &CGF, 4286 const ObjCAtSynchronizedStmt &S) { 4287 return EmitTryOrSynchronizedStmt(CGF, S); 4288 } 4289 4290 namespace { 4291 struct PerformFragileFinally final : EHScopeStack::Cleanup { 4292 const Stmt &S; 4293 Address SyncArgSlot; 4294 Address CallTryExitVar; 4295 Address ExceptionData; 4296 ObjCTypesHelper &ObjCTypes; 4297 PerformFragileFinally(const Stmt *S, 4298 Address SyncArgSlot, 4299 Address CallTryExitVar, 4300 Address ExceptionData, 4301 ObjCTypesHelper *ObjCTypes) 4302 : S(*S), SyncArgSlot(SyncArgSlot), CallTryExitVar(CallTryExitVar), 4303 ExceptionData(ExceptionData), ObjCTypes(*ObjCTypes) {} 4304 4305 void Emit(CodeGenFunction &CGF, Flags flags) override { 4306 // Check whether we need to call objc_exception_try_exit. 4307 // In optimized code, this branch will always be folded. 4308 llvm::BasicBlock *FinallyCallExit = 4309 CGF.createBasicBlock("finally.call_exit"); 4310 llvm::BasicBlock *FinallyNoCallExit = 4311 CGF.createBasicBlock("finally.no_call_exit"); 4312 CGF.Builder.CreateCondBr(CGF.Builder.CreateLoad(CallTryExitVar), 4313 FinallyCallExit, FinallyNoCallExit); 4314 4315 CGF.EmitBlock(FinallyCallExit); 4316 CGF.EmitNounwindRuntimeCall(ObjCTypes.getExceptionTryExitFn(), 4317 ExceptionData.getPointer()); 4318 4319 CGF.EmitBlock(FinallyNoCallExit); 4320 4321 if (isa<ObjCAtTryStmt>(S)) { 4322 if (const ObjCAtFinallyStmt* FinallyStmt = 4323 cast<ObjCAtTryStmt>(S).getFinallyStmt()) { 4324 // Don't try to do the @finally if this is an EH cleanup. 4325 if (flags.isForEHCleanup()) return; 4326 4327 // Save the current cleanup destination in case there's 4328 // control flow inside the finally statement. 4329 llvm::Value *CurCleanupDest = 4330 CGF.Builder.CreateLoad(CGF.getNormalCleanupDestSlot()); 4331 4332 CGF.EmitStmt(FinallyStmt->getFinallyBody()); 4333 4334 if (CGF.HaveInsertPoint()) { 4335 CGF.Builder.CreateStore(CurCleanupDest, 4336 CGF.getNormalCleanupDestSlot()); 4337 } else { 4338 // Currently, the end of the cleanup must always exist. 4339 CGF.EnsureInsertPoint(); 4340 } 4341 } 4342 } else { 4343 // Emit objc_sync_exit(expr); as finally's sole statement for 4344 // @synchronized. 4345 llvm::Value *SyncArg = CGF.Builder.CreateLoad(SyncArgSlot); 4346 CGF.EmitNounwindRuntimeCall(ObjCTypes.getSyncExitFn(), SyncArg); 4347 } 4348 } 4349 }; 4350 4351 class FragileHazards { 4352 CodeGenFunction &CGF; 4353 SmallVector<llvm::Value*, 20> Locals; 4354 llvm::DenseSet<llvm::BasicBlock*> BlocksBeforeTry; 4355 4356 llvm::InlineAsm *ReadHazard; 4357 llvm::InlineAsm *WriteHazard; 4358 4359 llvm::FunctionType *GetAsmFnType(); 4360 4361 void collectLocals(); 4362 void emitReadHazard(CGBuilderTy &Builder); 4363 4364 public: 4365 FragileHazards(CodeGenFunction &CGF); 4366 4367 void emitWriteHazard(); 4368 void emitHazardsInNewBlocks(); 4369 }; 4370 } // end anonymous namespace 4371 4372 /// Create the fragile-ABI read and write hazards based on the current 4373 /// state of the function, which is presumed to be immediately prior 4374 /// to a @try block. These hazards are used to maintain correct 4375 /// semantics in the face of optimization and the fragile ABI's 4376 /// cavalier use of setjmp/longjmp. 4377 FragileHazards::FragileHazards(CodeGenFunction &CGF) : CGF(CGF) { 4378 collectLocals(); 4379 4380 if (Locals.empty()) return; 4381 4382 // Collect all the blocks in the function. 4383 for (llvm::Function::iterator 4384 I = CGF.CurFn->begin(), E = CGF.CurFn->end(); I != E; ++I) 4385 BlocksBeforeTry.insert(&*I); 4386 4387 llvm::FunctionType *AsmFnTy = GetAsmFnType(); 4388 4389 // Create a read hazard for the allocas. This inhibits dead-store 4390 // optimizations and forces the values to memory. This hazard is 4391 // inserted before any 'throwing' calls in the protected scope to 4392 // reflect the possibility that the variables might be read from the 4393 // catch block if the call throws. 4394 { 4395 std::string Constraint; 4396 for (unsigned I = 0, E = Locals.size(); I != E; ++I) { 4397 if (I) Constraint += ','; 4398 Constraint += "*m"; 4399 } 4400 4401 ReadHazard = llvm::InlineAsm::get(AsmFnTy, "", Constraint, true, false); 4402 } 4403 4404 // Create a write hazard for the allocas. This inhibits folding 4405 // loads across the hazard. This hazard is inserted at the 4406 // beginning of the catch path to reflect the possibility that the 4407 // variables might have been written within the protected scope. 4408 { 4409 std::string Constraint; 4410 for (unsigned I = 0, E = Locals.size(); I != E; ++I) { 4411 if (I) Constraint += ','; 4412 Constraint += "=*m"; 4413 } 4414 4415 WriteHazard = llvm::InlineAsm::get(AsmFnTy, "", Constraint, true, false); 4416 } 4417 } 4418 4419 /// Emit a write hazard at the current location. 4420 void FragileHazards::emitWriteHazard() { 4421 if (Locals.empty()) return; 4422 4423 CGF.EmitNounwindRuntimeCall(WriteHazard, Locals); 4424 } 4425 4426 void FragileHazards::emitReadHazard(CGBuilderTy &Builder) { 4427 assert(!Locals.empty()); 4428 llvm::CallInst *call = Builder.CreateCall(ReadHazard, Locals); 4429 call->setDoesNotThrow(); 4430 call->setCallingConv(CGF.getRuntimeCC()); 4431 } 4432 4433 /// Emit read hazards in all the protected blocks, i.e. all the blocks 4434 /// which have been inserted since the beginning of the try. 4435 void FragileHazards::emitHazardsInNewBlocks() { 4436 if (Locals.empty()) return; 4437 4438 CGBuilderTy Builder(CGF, CGF.getLLVMContext()); 4439 4440 // Iterate through all blocks, skipping those prior to the try. 4441 for (llvm::Function::iterator 4442 FI = CGF.CurFn->begin(), FE = CGF.CurFn->end(); FI != FE; ++FI) { 4443 llvm::BasicBlock &BB = *FI; 4444 if (BlocksBeforeTry.count(&BB)) continue; 4445 4446 // Walk through all the calls in the block. 4447 for (llvm::BasicBlock::iterator 4448 BI = BB.begin(), BE = BB.end(); BI != BE; ++BI) { 4449 llvm::Instruction &I = *BI; 4450 4451 // Ignore instructions that aren't non-intrinsic calls. 4452 // These are the only calls that can possibly call longjmp. 4453 if (!isa<llvm::CallInst>(I) && !isa<llvm::InvokeInst>(I)) 4454 continue; 4455 if (isa<llvm::IntrinsicInst>(I)) 4456 continue; 4457 4458 // Ignore call sites marked nounwind. This may be questionable, 4459 // since 'nounwind' doesn't necessarily mean 'does not call longjmp'. 4460 if (cast<llvm::CallBase>(I).doesNotThrow()) 4461 continue; 4462 4463 // Insert a read hazard before the call. This will ensure that 4464 // any writes to the locals are performed before making the 4465 // call. If the call throws, then this is sufficient to 4466 // guarantee correctness as long as it doesn't also write to any 4467 // locals. 4468 Builder.SetInsertPoint(&BB, BI); 4469 emitReadHazard(Builder); 4470 } 4471 } 4472 } 4473 4474 static void addIfPresent(llvm::DenseSet<llvm::Value*> &S, Address V) { 4475 if (V.isValid()) S.insert(V.getPointer()); 4476 } 4477 4478 void FragileHazards::collectLocals() { 4479 // Compute a set of allocas to ignore. 4480 llvm::DenseSet<llvm::Value*> AllocasToIgnore; 4481 addIfPresent(AllocasToIgnore, CGF.ReturnValue); 4482 addIfPresent(AllocasToIgnore, CGF.NormalCleanupDest); 4483 4484 // Collect all the allocas currently in the function. This is 4485 // probably way too aggressive. 4486 llvm::BasicBlock &Entry = CGF.CurFn->getEntryBlock(); 4487 for (llvm::BasicBlock::iterator 4488 I = Entry.begin(), E = Entry.end(); I != E; ++I) 4489 if (isa<llvm::AllocaInst>(*I) && !AllocasToIgnore.count(&*I)) 4490 Locals.push_back(&*I); 4491 } 4492 4493 llvm::FunctionType *FragileHazards::GetAsmFnType() { 4494 SmallVector<llvm::Type *, 16> tys(Locals.size()); 4495 for (unsigned i = 0, e = Locals.size(); i != e; ++i) 4496 tys[i] = Locals[i]->getType(); 4497 return llvm::FunctionType::get(CGF.VoidTy, tys, false); 4498 } 4499 4500 /* 4501 4502 Objective-C setjmp-longjmp (sjlj) Exception Handling 4503 -- 4504 4505 A catch buffer is a setjmp buffer plus: 4506 - a pointer to the exception that was caught 4507 - a pointer to the previous exception data buffer 4508 - two pointers of reserved storage 4509 Therefore catch buffers form a stack, with a pointer to the top 4510 of the stack kept in thread-local storage. 4511 4512 objc_exception_try_enter pushes a catch buffer onto the EH stack. 4513 objc_exception_try_exit pops the given catch buffer, which is 4514 required to be the top of the EH stack. 4515 objc_exception_throw pops the top of the EH stack, writes the 4516 thrown exception into the appropriate field, and longjmps 4517 to the setjmp buffer. It crashes the process (with a printf 4518 and an abort()) if there are no catch buffers on the stack. 4519 objc_exception_extract just reads the exception pointer out of the 4520 catch buffer. 4521 4522 There's no reason an implementation couldn't use a light-weight 4523 setjmp here --- something like __builtin_setjmp, but API-compatible 4524 with the heavyweight setjmp. This will be more important if we ever 4525 want to implement correct ObjC/C++ exception interactions for the 4526 fragile ABI. 4527 4528 Note that for this use of setjmp/longjmp to be correct, we may need 4529 to mark some local variables volatile: if a non-volatile local 4530 variable is modified between the setjmp and the longjmp, it has 4531 indeterminate value. For the purposes of LLVM IR, it may be 4532 sufficient to make loads and stores within the @try (to variables 4533 declared outside the @try) volatile. This is necessary for 4534 optimized correctness, but is not currently being done; this is 4535 being tracked as rdar://problem/8160285 4536 4537 The basic framework for a @try-catch-finally is as follows: 4538 { 4539 objc_exception_data d; 4540 id _rethrow = null; 4541 bool _call_try_exit = true; 4542 4543 objc_exception_try_enter(&d); 4544 if (!setjmp(d.jmp_buf)) { 4545 ... try body ... 4546 } else { 4547 // exception path 4548 id _caught = objc_exception_extract(&d); 4549 4550 // enter new try scope for handlers 4551 if (!setjmp(d.jmp_buf)) { 4552 ... match exception and execute catch blocks ... 4553 4554 // fell off end, rethrow. 4555 _rethrow = _caught; 4556 ... jump-through-finally to finally_rethrow ... 4557 } else { 4558 // exception in catch block 4559 _rethrow = objc_exception_extract(&d); 4560 _call_try_exit = false; 4561 ... jump-through-finally to finally_rethrow ... 4562 } 4563 } 4564 ... jump-through-finally to finally_end ... 4565 4566 finally: 4567 if (_call_try_exit) 4568 objc_exception_try_exit(&d); 4569 4570 ... finally block .... 4571 ... dispatch to finally destination ... 4572 4573 finally_rethrow: 4574 objc_exception_throw(_rethrow); 4575 4576 finally_end: 4577 } 4578 4579 This framework differs slightly from the one gcc uses, in that gcc 4580 uses _rethrow to determine if objc_exception_try_exit should be called 4581 and if the object should be rethrown. This breaks in the face of 4582 throwing nil and introduces unnecessary branches. 4583 4584 We specialize this framework for a few particular circumstances: 4585 4586 - If there are no catch blocks, then we avoid emitting the second 4587 exception handling context. 4588 4589 - If there is a catch-all catch block (i.e. @catch(...) or @catch(id 4590 e)) we avoid emitting the code to rethrow an uncaught exception. 4591 4592 - FIXME: If there is no @finally block we can do a few more 4593 simplifications. 4594 4595 Rethrows and Jumps-Through-Finally 4596 -- 4597 4598 '@throw;' is supported by pushing the currently-caught exception 4599 onto ObjCEHStack while the @catch blocks are emitted. 4600 4601 Branches through the @finally block are handled with an ordinary 4602 normal cleanup. We do not register an EH cleanup; fragile-ABI ObjC 4603 exceptions are not compatible with C++ exceptions, and this is 4604 hardly the only place where this will go wrong. 4605 4606 @synchronized(expr) { stmt; } is emitted as if it were: 4607 id synch_value = expr; 4608 objc_sync_enter(synch_value); 4609 @try { stmt; } @finally { objc_sync_exit(synch_value); } 4610 */ 4611 4612 void CGObjCMac::EmitTryOrSynchronizedStmt(CodeGen::CodeGenFunction &CGF, 4613 const Stmt &S) { 4614 bool isTry = isa<ObjCAtTryStmt>(S); 4615 4616 // A destination for the fall-through edges of the catch handlers to 4617 // jump to. 4618 CodeGenFunction::JumpDest FinallyEnd = 4619 CGF.getJumpDestInCurrentScope("finally.end"); 4620 4621 // A destination for the rethrow edge of the catch handlers to jump 4622 // to. 4623 CodeGenFunction::JumpDest FinallyRethrow = 4624 CGF.getJumpDestInCurrentScope("finally.rethrow"); 4625 4626 // For @synchronized, call objc_sync_enter(sync.expr). The 4627 // evaluation of the expression must occur before we enter the 4628 // @synchronized. We can't avoid a temp here because we need the 4629 // value to be preserved. If the backend ever does liveness 4630 // correctly after setjmp, this will be unnecessary. 4631 Address SyncArgSlot = Address::invalid(); 4632 if (!isTry) { 4633 llvm::Value *SyncArg = 4634 CGF.EmitScalarExpr(cast<ObjCAtSynchronizedStmt>(S).getSynchExpr()); 4635 SyncArg = CGF.Builder.CreateBitCast(SyncArg, ObjCTypes.ObjectPtrTy); 4636 CGF.EmitNounwindRuntimeCall(ObjCTypes.getSyncEnterFn(), SyncArg); 4637 4638 SyncArgSlot = CGF.CreateTempAlloca(SyncArg->getType(), 4639 CGF.getPointerAlign(), "sync.arg"); 4640 CGF.Builder.CreateStore(SyncArg, SyncArgSlot); 4641 } 4642 4643 // Allocate memory for the setjmp buffer. This needs to be kept 4644 // live throughout the try and catch blocks. 4645 Address ExceptionData = CGF.CreateTempAlloca(ObjCTypes.ExceptionDataTy, 4646 CGF.getPointerAlign(), 4647 "exceptiondata.ptr"); 4648 4649 // Create the fragile hazards. Note that this will not capture any 4650 // of the allocas required for exception processing, but will 4651 // capture the current basic block (which extends all the way to the 4652 // setjmp call) as "before the @try". 4653 FragileHazards Hazards(CGF); 4654 4655 // Create a flag indicating whether the cleanup needs to call 4656 // objc_exception_try_exit. This is true except when 4657 // - no catches match and we're branching through the cleanup 4658 // just to rethrow the exception, or 4659 // - a catch matched and we're falling out of the catch handler. 4660 // The setjmp-safety rule here is that we should always store to this 4661 // variable in a place that dominates the branch through the cleanup 4662 // without passing through any setjmps. 4663 Address CallTryExitVar = CGF.CreateTempAlloca(CGF.Builder.getInt1Ty(), 4664 CharUnits::One(), 4665 "_call_try_exit"); 4666 4667 // A slot containing the exception to rethrow. Only needed when we 4668 // have both a @catch and a @finally. 4669 Address PropagatingExnVar = Address::invalid(); 4670 4671 // Push a normal cleanup to leave the try scope. 4672 CGF.EHStack.pushCleanup<PerformFragileFinally>(NormalAndEHCleanup, &S, 4673 SyncArgSlot, 4674 CallTryExitVar, 4675 ExceptionData, 4676 &ObjCTypes); 4677 4678 // Enter a try block: 4679 // - Call objc_exception_try_enter to push ExceptionData on top of 4680 // the EH stack. 4681 CGF.EmitNounwindRuntimeCall(ObjCTypes.getExceptionTryEnterFn(), 4682 ExceptionData.getPointer()); 4683 4684 // - Call setjmp on the exception data buffer. 4685 llvm::Constant *Zero = llvm::ConstantInt::get(CGF.Builder.getInt32Ty(), 0); 4686 llvm::Value *GEPIndexes[] = { Zero, Zero, Zero }; 4687 llvm::Value *SetJmpBuffer = CGF.Builder.CreateGEP( 4688 ObjCTypes.ExceptionDataTy, ExceptionData.getPointer(), GEPIndexes, 4689 "setjmp_buffer"); 4690 llvm::CallInst *SetJmpResult = CGF.EmitNounwindRuntimeCall( 4691 ObjCTypes.getSetJmpFn(), SetJmpBuffer, "setjmp_result"); 4692 SetJmpResult->setCanReturnTwice(); 4693 4694 // If setjmp returned 0, enter the protected block; otherwise, 4695 // branch to the handler. 4696 llvm::BasicBlock *TryBlock = CGF.createBasicBlock("try"); 4697 llvm::BasicBlock *TryHandler = CGF.createBasicBlock("try.handler"); 4698 llvm::Value *DidCatch = 4699 CGF.Builder.CreateIsNotNull(SetJmpResult, "did_catch_exception"); 4700 CGF.Builder.CreateCondBr(DidCatch, TryHandler, TryBlock); 4701 4702 // Emit the protected block. 4703 CGF.EmitBlock(TryBlock); 4704 CGF.Builder.CreateStore(CGF.Builder.getTrue(), CallTryExitVar); 4705 CGF.EmitStmt(isTry ? cast<ObjCAtTryStmt>(S).getTryBody() 4706 : cast<ObjCAtSynchronizedStmt>(S).getSynchBody()); 4707 4708 CGBuilderTy::InsertPoint TryFallthroughIP = CGF.Builder.saveAndClearIP(); 4709 4710 // Emit the exception handler block. 4711 CGF.EmitBlock(TryHandler); 4712 4713 // Don't optimize loads of the in-scope locals across this point. 4714 Hazards.emitWriteHazard(); 4715 4716 // For a @synchronized (or a @try with no catches), just branch 4717 // through the cleanup to the rethrow block. 4718 if (!isTry || !cast<ObjCAtTryStmt>(S).getNumCatchStmts()) { 4719 // Tell the cleanup not to re-pop the exit. 4720 CGF.Builder.CreateStore(CGF.Builder.getFalse(), CallTryExitVar); 4721 CGF.EmitBranchThroughCleanup(FinallyRethrow); 4722 4723 // Otherwise, we have to match against the caught exceptions. 4724 } else { 4725 // Retrieve the exception object. We may emit multiple blocks but 4726 // nothing can cross this so the value is already in SSA form. 4727 llvm::CallInst *Caught = 4728 CGF.EmitNounwindRuntimeCall(ObjCTypes.getExceptionExtractFn(), 4729 ExceptionData.getPointer(), "caught"); 4730 4731 // Push the exception to rethrow onto the EH value stack for the 4732 // benefit of any @throws in the handlers. 4733 CGF.ObjCEHValueStack.push_back(Caught); 4734 4735 const ObjCAtTryStmt* AtTryStmt = cast<ObjCAtTryStmt>(&S); 4736 4737 bool HasFinally = (AtTryStmt->getFinallyStmt() != nullptr); 4738 4739 llvm::BasicBlock *CatchBlock = nullptr; 4740 llvm::BasicBlock *CatchHandler = nullptr; 4741 if (HasFinally) { 4742 // Save the currently-propagating exception before 4743 // objc_exception_try_enter clears the exception slot. 4744 PropagatingExnVar = CGF.CreateTempAlloca(Caught->getType(), 4745 CGF.getPointerAlign(), 4746 "propagating_exception"); 4747 CGF.Builder.CreateStore(Caught, PropagatingExnVar); 4748 4749 // Enter a new exception try block (in case a @catch block 4750 // throws an exception). 4751 CGF.EmitNounwindRuntimeCall(ObjCTypes.getExceptionTryEnterFn(), 4752 ExceptionData.getPointer()); 4753 4754 llvm::CallInst *SetJmpResult = 4755 CGF.EmitNounwindRuntimeCall(ObjCTypes.getSetJmpFn(), 4756 SetJmpBuffer, "setjmp.result"); 4757 SetJmpResult->setCanReturnTwice(); 4758 4759 llvm::Value *Threw = 4760 CGF.Builder.CreateIsNotNull(SetJmpResult, "did_catch_exception"); 4761 4762 CatchBlock = CGF.createBasicBlock("catch"); 4763 CatchHandler = CGF.createBasicBlock("catch_for_catch"); 4764 CGF.Builder.CreateCondBr(Threw, CatchHandler, CatchBlock); 4765 4766 CGF.EmitBlock(CatchBlock); 4767 } 4768 4769 CGF.Builder.CreateStore(CGF.Builder.getInt1(HasFinally), CallTryExitVar); 4770 4771 // Handle catch list. As a special case we check if everything is 4772 // matched and avoid generating code for falling off the end if 4773 // so. 4774 bool AllMatched = false; 4775 for (unsigned I = 0, N = AtTryStmt->getNumCatchStmts(); I != N; ++I) { 4776 const ObjCAtCatchStmt *CatchStmt = AtTryStmt->getCatchStmt(I); 4777 4778 const VarDecl *CatchParam = CatchStmt->getCatchParamDecl(); 4779 const ObjCObjectPointerType *OPT = nullptr; 4780 4781 // catch(...) always matches. 4782 if (!CatchParam) { 4783 AllMatched = true; 4784 } else { 4785 OPT = CatchParam->getType()->getAs<ObjCObjectPointerType>(); 4786 4787 // catch(id e) always matches under this ABI, since only 4788 // ObjC exceptions end up here in the first place. 4789 // FIXME: For the time being we also match id<X>; this should 4790 // be rejected by Sema instead. 4791 if (OPT && (OPT->isObjCIdType() || OPT->isObjCQualifiedIdType())) 4792 AllMatched = true; 4793 } 4794 4795 // If this is a catch-all, we don't need to test anything. 4796 if (AllMatched) { 4797 CodeGenFunction::RunCleanupsScope CatchVarCleanups(CGF); 4798 4799 if (CatchParam) { 4800 CGF.EmitAutoVarDecl(*CatchParam); 4801 assert(CGF.HaveInsertPoint() && "DeclStmt destroyed insert point?"); 4802 4803 // These types work out because ConvertType(id) == i8*. 4804 EmitInitOfCatchParam(CGF, Caught, CatchParam); 4805 } 4806 4807 CGF.EmitStmt(CatchStmt->getCatchBody()); 4808 4809 // The scope of the catch variable ends right here. 4810 CatchVarCleanups.ForceCleanup(); 4811 4812 CGF.EmitBranchThroughCleanup(FinallyEnd); 4813 break; 4814 } 4815 4816 assert(OPT && "Unexpected non-object pointer type in @catch"); 4817 const ObjCObjectType *ObjTy = OPT->getObjectType(); 4818 4819 // FIXME: @catch (Class c) ? 4820 ObjCInterfaceDecl *IDecl = ObjTy->getInterface(); 4821 assert(IDecl && "Catch parameter must have Objective-C type!"); 4822 4823 // Check if the @catch block matches the exception object. 4824 llvm::Value *Class = EmitClassRef(CGF, IDecl); 4825 4826 llvm::Value *matchArgs[] = { Class, Caught }; 4827 llvm::CallInst *Match = 4828 CGF.EmitNounwindRuntimeCall(ObjCTypes.getExceptionMatchFn(), 4829 matchArgs, "match"); 4830 4831 llvm::BasicBlock *MatchedBlock = CGF.createBasicBlock("match"); 4832 llvm::BasicBlock *NextCatchBlock = CGF.createBasicBlock("catch.next"); 4833 4834 CGF.Builder.CreateCondBr(CGF.Builder.CreateIsNotNull(Match, "matched"), 4835 MatchedBlock, NextCatchBlock); 4836 4837 // Emit the @catch block. 4838 CGF.EmitBlock(MatchedBlock); 4839 4840 // Collect any cleanups for the catch variable. The scope lasts until 4841 // the end of the catch body. 4842 CodeGenFunction::RunCleanupsScope CatchVarCleanups(CGF); 4843 4844 CGF.EmitAutoVarDecl(*CatchParam); 4845 assert(CGF.HaveInsertPoint() && "DeclStmt destroyed insert point?"); 4846 4847 // Initialize the catch variable. 4848 llvm::Value *Tmp = 4849 CGF.Builder.CreateBitCast(Caught, 4850 CGF.ConvertType(CatchParam->getType())); 4851 EmitInitOfCatchParam(CGF, Tmp, CatchParam); 4852 4853 CGF.EmitStmt(CatchStmt->getCatchBody()); 4854 4855 // We're done with the catch variable. 4856 CatchVarCleanups.ForceCleanup(); 4857 4858 CGF.EmitBranchThroughCleanup(FinallyEnd); 4859 4860 CGF.EmitBlock(NextCatchBlock); 4861 } 4862 4863 CGF.ObjCEHValueStack.pop_back(); 4864 4865 // If nothing wanted anything to do with the caught exception, 4866 // kill the extract call. 4867 if (Caught->use_empty()) 4868 Caught->eraseFromParent(); 4869 4870 if (!AllMatched) 4871 CGF.EmitBranchThroughCleanup(FinallyRethrow); 4872 4873 if (HasFinally) { 4874 // Emit the exception handler for the @catch blocks. 4875 CGF.EmitBlock(CatchHandler); 4876 4877 // In theory we might now need a write hazard, but actually it's 4878 // unnecessary because there's no local-accessing code between 4879 // the try's write hazard and here. 4880 //Hazards.emitWriteHazard(); 4881 4882 // Extract the new exception and save it to the 4883 // propagating-exception slot. 4884 assert(PropagatingExnVar.isValid()); 4885 llvm::CallInst *NewCaught = 4886 CGF.EmitNounwindRuntimeCall(ObjCTypes.getExceptionExtractFn(), 4887 ExceptionData.getPointer(), "caught"); 4888 CGF.Builder.CreateStore(NewCaught, PropagatingExnVar); 4889 4890 // Don't pop the catch handler; the throw already did. 4891 CGF.Builder.CreateStore(CGF.Builder.getFalse(), CallTryExitVar); 4892 CGF.EmitBranchThroughCleanup(FinallyRethrow); 4893 } 4894 } 4895 4896 // Insert read hazards as required in the new blocks. 4897 Hazards.emitHazardsInNewBlocks(); 4898 4899 // Pop the cleanup. 4900 CGF.Builder.restoreIP(TryFallthroughIP); 4901 if (CGF.HaveInsertPoint()) 4902 CGF.Builder.CreateStore(CGF.Builder.getTrue(), CallTryExitVar); 4903 CGF.PopCleanupBlock(); 4904 CGF.EmitBlock(FinallyEnd.getBlock(), true); 4905 4906 // Emit the rethrow block. 4907 CGBuilderTy::InsertPoint SavedIP = CGF.Builder.saveAndClearIP(); 4908 CGF.EmitBlock(FinallyRethrow.getBlock(), true); 4909 if (CGF.HaveInsertPoint()) { 4910 // If we have a propagating-exception variable, check it. 4911 llvm::Value *PropagatingExn; 4912 if (PropagatingExnVar.isValid()) { 4913 PropagatingExn = CGF.Builder.CreateLoad(PropagatingExnVar); 4914 4915 // Otherwise, just look in the buffer for the exception to throw. 4916 } else { 4917 llvm::CallInst *Caught = 4918 CGF.EmitNounwindRuntimeCall(ObjCTypes.getExceptionExtractFn(), 4919 ExceptionData.getPointer()); 4920 PropagatingExn = Caught; 4921 } 4922 4923 CGF.EmitNounwindRuntimeCall(ObjCTypes.getExceptionThrowFn(), 4924 PropagatingExn); 4925 CGF.Builder.CreateUnreachable(); 4926 } 4927 4928 CGF.Builder.restoreIP(SavedIP); 4929 } 4930 4931 void CGObjCMac::EmitThrowStmt(CodeGen::CodeGenFunction &CGF, 4932 const ObjCAtThrowStmt &S, 4933 bool ClearInsertionPoint) { 4934 llvm::Value *ExceptionAsObject; 4935 4936 if (const Expr *ThrowExpr = S.getThrowExpr()) { 4937 llvm::Value *Exception = CGF.EmitObjCThrowOperand(ThrowExpr); 4938 ExceptionAsObject = 4939 CGF.Builder.CreateBitCast(Exception, ObjCTypes.ObjectPtrTy); 4940 } else { 4941 assert((!CGF.ObjCEHValueStack.empty() && CGF.ObjCEHValueStack.back()) && 4942 "Unexpected rethrow outside @catch block."); 4943 ExceptionAsObject = CGF.ObjCEHValueStack.back(); 4944 } 4945 4946 CGF.EmitRuntimeCall(ObjCTypes.getExceptionThrowFn(), ExceptionAsObject) 4947 ->setDoesNotReturn(); 4948 CGF.Builder.CreateUnreachable(); 4949 4950 // Clear the insertion point to indicate we are in unreachable code. 4951 if (ClearInsertionPoint) 4952 CGF.Builder.ClearInsertionPoint(); 4953 } 4954 4955 /// EmitObjCWeakRead - Code gen for loading value of a __weak 4956 /// object: objc_read_weak (id *src) 4957 /// 4958 llvm::Value * CGObjCMac::EmitObjCWeakRead(CodeGen::CodeGenFunction &CGF, 4959 Address AddrWeakObj) { 4960 llvm::Type* DestTy = AddrWeakObj.getElementType(); 4961 AddrWeakObj = CGF.Builder.CreateBitCast(AddrWeakObj, 4962 ObjCTypes.PtrObjectPtrTy); 4963 llvm::Value *read_weak = 4964 CGF.EmitNounwindRuntimeCall(ObjCTypes.getGcReadWeakFn(), 4965 AddrWeakObj.getPointer(), "weakread"); 4966 read_weak = CGF.Builder.CreateBitCast(read_weak, DestTy); 4967 return read_weak; 4968 } 4969 4970 /// EmitObjCWeakAssign - Code gen for assigning to a __weak object. 4971 /// objc_assign_weak (id src, id *dst) 4972 /// 4973 void CGObjCMac::EmitObjCWeakAssign(CodeGen::CodeGenFunction &CGF, 4974 llvm::Value *src, Address dst) { 4975 llvm::Type * SrcTy = src->getType(); 4976 if (!isa<llvm::PointerType>(SrcTy)) { 4977 unsigned Size = CGM.getDataLayout().getTypeAllocSize(SrcTy); 4978 assert(Size <= 8 && "does not support size > 8"); 4979 src = (Size == 4) ? CGF.Builder.CreateBitCast(src, CGM.Int32Ty) 4980 : CGF.Builder.CreateBitCast(src, CGM.Int64Ty); 4981 src = CGF.Builder.CreateIntToPtr(src, ObjCTypes.Int8PtrTy); 4982 } 4983 src = CGF.Builder.CreateBitCast(src, ObjCTypes.ObjectPtrTy); 4984 dst = CGF.Builder.CreateBitCast(dst, ObjCTypes.PtrObjectPtrTy); 4985 llvm::Value *args[] = { src, dst.getPointer() }; 4986 CGF.EmitNounwindRuntimeCall(ObjCTypes.getGcAssignWeakFn(), 4987 args, "weakassign"); 4988 } 4989 4990 /// EmitObjCGlobalAssign - Code gen for assigning to a __strong object. 4991 /// objc_assign_global (id src, id *dst) 4992 /// 4993 void CGObjCMac::EmitObjCGlobalAssign(CodeGen::CodeGenFunction &CGF, 4994 llvm::Value *src, Address dst, 4995 bool threadlocal) { 4996 llvm::Type * SrcTy = src->getType(); 4997 if (!isa<llvm::PointerType>(SrcTy)) { 4998 unsigned Size = CGM.getDataLayout().getTypeAllocSize(SrcTy); 4999 assert(Size <= 8 && "does not support size > 8"); 5000 src = (Size == 4) ? CGF.Builder.CreateBitCast(src, CGM.Int32Ty) 5001 : CGF.Builder.CreateBitCast(src, CGM.Int64Ty); 5002 src = CGF.Builder.CreateIntToPtr(src, ObjCTypes.Int8PtrTy); 5003 } 5004 src = CGF.Builder.CreateBitCast(src, ObjCTypes.ObjectPtrTy); 5005 dst = CGF.Builder.CreateBitCast(dst, ObjCTypes.PtrObjectPtrTy); 5006 llvm::Value *args[] = { src, dst.getPointer() }; 5007 if (!threadlocal) 5008 CGF.EmitNounwindRuntimeCall(ObjCTypes.getGcAssignGlobalFn(), 5009 args, "globalassign"); 5010 else 5011 CGF.EmitNounwindRuntimeCall(ObjCTypes.getGcAssignThreadLocalFn(), 5012 args, "threadlocalassign"); 5013 } 5014 5015 /// EmitObjCIvarAssign - Code gen for assigning to a __strong object. 5016 /// objc_assign_ivar (id src, id *dst, ptrdiff_t ivaroffset) 5017 /// 5018 void CGObjCMac::EmitObjCIvarAssign(CodeGen::CodeGenFunction &CGF, 5019 llvm::Value *src, Address dst, 5020 llvm::Value *ivarOffset) { 5021 assert(ivarOffset && "EmitObjCIvarAssign - ivarOffset is NULL"); 5022 llvm::Type * SrcTy = src->getType(); 5023 if (!isa<llvm::PointerType>(SrcTy)) { 5024 unsigned Size = CGM.getDataLayout().getTypeAllocSize(SrcTy); 5025 assert(Size <= 8 && "does not support size > 8"); 5026 src = (Size == 4) ? CGF.Builder.CreateBitCast(src, CGM.Int32Ty) 5027 : CGF.Builder.CreateBitCast(src, CGM.Int64Ty); 5028 src = CGF.Builder.CreateIntToPtr(src, ObjCTypes.Int8PtrTy); 5029 } 5030 src = CGF.Builder.CreateBitCast(src, ObjCTypes.ObjectPtrTy); 5031 dst = CGF.Builder.CreateBitCast(dst, ObjCTypes.PtrObjectPtrTy); 5032 llvm::Value *args[] = { src, dst.getPointer(), ivarOffset }; 5033 CGF.EmitNounwindRuntimeCall(ObjCTypes.getGcAssignIvarFn(), args); 5034 } 5035 5036 /// EmitObjCStrongCastAssign - Code gen for assigning to a __strong cast object. 5037 /// objc_assign_strongCast (id src, id *dst) 5038 /// 5039 void CGObjCMac::EmitObjCStrongCastAssign(CodeGen::CodeGenFunction &CGF, 5040 llvm::Value *src, Address dst) { 5041 llvm::Type * SrcTy = src->getType(); 5042 if (!isa<llvm::PointerType>(SrcTy)) { 5043 unsigned Size = CGM.getDataLayout().getTypeAllocSize(SrcTy); 5044 assert(Size <= 8 && "does not support size > 8"); 5045 src = (Size == 4) ? CGF.Builder.CreateBitCast(src, CGM.Int32Ty) 5046 : CGF.Builder.CreateBitCast(src, CGM.Int64Ty); 5047 src = CGF.Builder.CreateIntToPtr(src, ObjCTypes.Int8PtrTy); 5048 } 5049 src = CGF.Builder.CreateBitCast(src, ObjCTypes.ObjectPtrTy); 5050 dst = CGF.Builder.CreateBitCast(dst, ObjCTypes.PtrObjectPtrTy); 5051 llvm::Value *args[] = { src, dst.getPointer() }; 5052 CGF.EmitNounwindRuntimeCall(ObjCTypes.getGcAssignStrongCastFn(), 5053 args, "strongassign"); 5054 } 5055 5056 void CGObjCMac::EmitGCMemmoveCollectable(CodeGen::CodeGenFunction &CGF, 5057 Address DestPtr, 5058 Address SrcPtr, 5059 llvm::Value *size) { 5060 SrcPtr = CGF.Builder.CreateBitCast(SrcPtr, ObjCTypes.Int8PtrTy); 5061 DestPtr = CGF.Builder.CreateBitCast(DestPtr, ObjCTypes.Int8PtrTy); 5062 llvm::Value *args[] = { DestPtr.getPointer(), SrcPtr.getPointer(), size }; 5063 CGF.EmitNounwindRuntimeCall(ObjCTypes.GcMemmoveCollectableFn(), args); 5064 } 5065 5066 /// EmitObjCValueForIvar - Code Gen for ivar reference. 5067 /// 5068 LValue CGObjCMac::EmitObjCValueForIvar(CodeGen::CodeGenFunction &CGF, 5069 QualType ObjectTy, 5070 llvm::Value *BaseValue, 5071 const ObjCIvarDecl *Ivar, 5072 unsigned CVRQualifiers) { 5073 const ObjCInterfaceDecl *ID = 5074 ObjectTy->castAs<ObjCObjectType>()->getInterface(); 5075 return EmitValueForIvarAtOffset(CGF, ID, BaseValue, Ivar, CVRQualifiers, 5076 EmitIvarOffset(CGF, ID, Ivar)); 5077 } 5078 5079 llvm::Value *CGObjCMac::EmitIvarOffset(CodeGen::CodeGenFunction &CGF, 5080 const ObjCInterfaceDecl *Interface, 5081 const ObjCIvarDecl *Ivar) { 5082 uint64_t Offset = ComputeIvarBaseOffset(CGM, Interface, Ivar); 5083 return llvm::ConstantInt::get( 5084 CGM.getTypes().ConvertType(CGM.getContext().LongTy), 5085 Offset); 5086 } 5087 5088 /* *** Private Interface *** */ 5089 5090 std::string CGObjCCommonMac::GetSectionName(StringRef Section, 5091 StringRef MachOAttributes) { 5092 switch (CGM.getTriple().getObjectFormat()) { 5093 case llvm::Triple::UnknownObjectFormat: 5094 llvm_unreachable("unexpected object file format"); 5095 case llvm::Triple::MachO: { 5096 if (MachOAttributes.empty()) 5097 return ("__DATA," + Section).str(); 5098 return ("__DATA," + Section + "," + MachOAttributes).str(); 5099 } 5100 case llvm::Triple::ELF: 5101 assert(Section.substr(0, 2) == "__" && 5102 "expected the name to begin with __"); 5103 return Section.substr(2).str(); 5104 case llvm::Triple::COFF: 5105 assert(Section.substr(0, 2) == "__" && 5106 "expected the name to begin with __"); 5107 return ("." + Section.substr(2) + "$B").str(); 5108 case llvm::Triple::Wasm: 5109 case llvm::Triple::GOFF: 5110 case llvm::Triple::XCOFF: 5111 llvm::report_fatal_error( 5112 "Objective-C support is unimplemented for object file format"); 5113 } 5114 5115 llvm_unreachable("Unhandled llvm::Triple::ObjectFormatType enum"); 5116 } 5117 5118 /// EmitImageInfo - Emit the image info marker used to encode some module 5119 /// level information. 5120 /// 5121 /// See: <rdr://4810609&4810587&4810587> 5122 /// struct IMAGE_INFO { 5123 /// unsigned version; 5124 /// unsigned flags; 5125 /// }; 5126 enum ImageInfoFlags { 5127 eImageInfo_FixAndContinue = (1 << 0), // This flag is no longer set by clang. 5128 eImageInfo_GarbageCollected = (1 << 1), 5129 eImageInfo_GCOnly = (1 << 2), 5130 eImageInfo_OptimizedByDyld = (1 << 3), // This flag is set by the dyld shared cache. 5131 5132 // A flag indicating that the module has no instances of a @synthesize of a 5133 // superclass variable. <rdar://problem/6803242> 5134 eImageInfo_CorrectedSynthesize = (1 << 4), // This flag is no longer set by clang. 5135 eImageInfo_ImageIsSimulated = (1 << 5), 5136 eImageInfo_ClassProperties = (1 << 6) 5137 }; 5138 5139 void CGObjCCommonMac::EmitImageInfo() { 5140 unsigned version = 0; // Version is unused? 5141 std::string Section = 5142 (ObjCABI == 1) 5143 ? "__OBJC,__image_info,regular" 5144 : GetSectionName("__objc_imageinfo", "regular,no_dead_strip"); 5145 5146 // Generate module-level named metadata to convey this information to the 5147 // linker and code-gen. 5148 llvm::Module &Mod = CGM.getModule(); 5149 5150 // Add the ObjC ABI version to the module flags. 5151 Mod.addModuleFlag(llvm::Module::Error, "Objective-C Version", ObjCABI); 5152 Mod.addModuleFlag(llvm::Module::Error, "Objective-C Image Info Version", 5153 version); 5154 Mod.addModuleFlag(llvm::Module::Error, "Objective-C Image Info Section", 5155 llvm::MDString::get(VMContext, Section)); 5156 5157 auto Int8Ty = llvm::Type::getInt8Ty(VMContext); 5158 if (CGM.getLangOpts().getGC() == LangOptions::NonGC) { 5159 // Non-GC overrides those files which specify GC. 5160 Mod.addModuleFlag(llvm::Module::Error, 5161 "Objective-C Garbage Collection", 5162 llvm::ConstantInt::get(Int8Ty,0)); 5163 } else { 5164 // Add the ObjC garbage collection value. 5165 Mod.addModuleFlag(llvm::Module::Error, 5166 "Objective-C Garbage Collection", 5167 llvm::ConstantInt::get(Int8Ty, 5168 (uint8_t)eImageInfo_GarbageCollected)); 5169 5170 if (CGM.getLangOpts().getGC() == LangOptions::GCOnly) { 5171 // Add the ObjC GC Only value. 5172 Mod.addModuleFlag(llvm::Module::Error, "Objective-C GC Only", 5173 eImageInfo_GCOnly); 5174 5175 // Require that GC be specified and set to eImageInfo_GarbageCollected. 5176 llvm::Metadata *Ops[2] = { 5177 llvm::MDString::get(VMContext, "Objective-C Garbage Collection"), 5178 llvm::ConstantAsMetadata::get(llvm::ConstantInt::get( 5179 Int8Ty, eImageInfo_GarbageCollected))}; 5180 Mod.addModuleFlag(llvm::Module::Require, "Objective-C GC Only", 5181 llvm::MDNode::get(VMContext, Ops)); 5182 } 5183 } 5184 5185 // Indicate whether we're compiling this to run on a simulator. 5186 if (CGM.getTarget().getTriple().isSimulatorEnvironment()) 5187 Mod.addModuleFlag(llvm::Module::Error, "Objective-C Is Simulated", 5188 eImageInfo_ImageIsSimulated); 5189 5190 // Indicate whether we are generating class properties. 5191 Mod.addModuleFlag(llvm::Module::Error, "Objective-C Class Properties", 5192 eImageInfo_ClassProperties); 5193 } 5194 5195 // struct objc_module { 5196 // unsigned long version; 5197 // unsigned long size; 5198 // const char *name; 5199 // Symtab symtab; 5200 // }; 5201 5202 // FIXME: Get from somewhere 5203 static const int ModuleVersion = 7; 5204 5205 void CGObjCMac::EmitModuleInfo() { 5206 uint64_t Size = CGM.getDataLayout().getTypeAllocSize(ObjCTypes.ModuleTy); 5207 5208 ConstantInitBuilder builder(CGM); 5209 auto values = builder.beginStruct(ObjCTypes.ModuleTy); 5210 values.addInt(ObjCTypes.LongTy, ModuleVersion); 5211 values.addInt(ObjCTypes.LongTy, Size); 5212 // This used to be the filename, now it is unused. <rdr://4327263> 5213 values.add(GetClassName(StringRef(""))); 5214 values.add(EmitModuleSymbols()); 5215 CreateMetadataVar("OBJC_MODULES", values, 5216 "__OBJC,__module_info,regular,no_dead_strip", 5217 CGM.getPointerAlign(), true); 5218 } 5219 5220 llvm::Constant *CGObjCMac::EmitModuleSymbols() { 5221 unsigned NumClasses = DefinedClasses.size(); 5222 unsigned NumCategories = DefinedCategories.size(); 5223 5224 // Return null if no symbols were defined. 5225 if (!NumClasses && !NumCategories) 5226 return llvm::Constant::getNullValue(ObjCTypes.SymtabPtrTy); 5227 5228 ConstantInitBuilder builder(CGM); 5229 auto values = builder.beginStruct(); 5230 values.addInt(ObjCTypes.LongTy, 0); 5231 values.addNullPointer(ObjCTypes.SelectorPtrTy); 5232 values.addInt(ObjCTypes.ShortTy, NumClasses); 5233 values.addInt(ObjCTypes.ShortTy, NumCategories); 5234 5235 // The runtime expects exactly the list of defined classes followed 5236 // by the list of defined categories, in a single array. 5237 auto array = values.beginArray(ObjCTypes.Int8PtrTy); 5238 for (unsigned i=0; i<NumClasses; i++) { 5239 const ObjCInterfaceDecl *ID = ImplementedClasses[i]; 5240 assert(ID); 5241 if (ObjCImplementationDecl *IMP = ID->getImplementation()) 5242 // We are implementing a weak imported interface. Give it external linkage 5243 if (ID->isWeakImported() && !IMP->isWeakImported()) 5244 DefinedClasses[i]->setLinkage(llvm::GlobalVariable::ExternalLinkage); 5245 5246 array.addBitCast(DefinedClasses[i], ObjCTypes.Int8PtrTy); 5247 } 5248 for (unsigned i=0; i<NumCategories; i++) 5249 array.addBitCast(DefinedCategories[i], ObjCTypes.Int8PtrTy); 5250 5251 array.finishAndAddTo(values); 5252 5253 llvm::GlobalVariable *GV = CreateMetadataVar( 5254 "OBJC_SYMBOLS", values, "__OBJC,__symbols,regular,no_dead_strip", 5255 CGM.getPointerAlign(), true); 5256 return llvm::ConstantExpr::getBitCast(GV, ObjCTypes.SymtabPtrTy); 5257 } 5258 5259 llvm::Value *CGObjCMac::EmitClassRefFromId(CodeGenFunction &CGF, 5260 IdentifierInfo *II) { 5261 LazySymbols.insert(II); 5262 5263 llvm::GlobalVariable *&Entry = ClassReferences[II]; 5264 5265 if (!Entry) { 5266 llvm::Constant *Casted = 5267 llvm::ConstantExpr::getBitCast(GetClassName(II->getName()), 5268 ObjCTypes.ClassPtrTy); 5269 Entry = CreateMetadataVar( 5270 "OBJC_CLASS_REFERENCES_", Casted, 5271 "__OBJC,__cls_refs,literal_pointers,no_dead_strip", 5272 CGM.getPointerAlign(), true); 5273 } 5274 5275 return CGF.Builder.CreateAlignedLoad(Entry, CGF.getPointerAlign()); 5276 } 5277 5278 llvm::Value *CGObjCMac::EmitClassRef(CodeGenFunction &CGF, 5279 const ObjCInterfaceDecl *ID) { 5280 // If the class has the objc_runtime_visible attribute, we need to 5281 // use the Objective-C runtime to get the class. 5282 if (ID->hasAttr<ObjCRuntimeVisibleAttr>()) 5283 return EmitClassRefViaRuntime(CGF, ID, ObjCTypes); 5284 5285 IdentifierInfo *RuntimeName = 5286 &CGM.getContext().Idents.get(ID->getObjCRuntimeNameAsString()); 5287 return EmitClassRefFromId(CGF, RuntimeName); 5288 } 5289 5290 llvm::Value *CGObjCMac::EmitNSAutoreleasePoolClassRef(CodeGenFunction &CGF) { 5291 IdentifierInfo *II = &CGM.getContext().Idents.get("NSAutoreleasePool"); 5292 return EmitClassRefFromId(CGF, II); 5293 } 5294 5295 llvm::Value *CGObjCMac::EmitSelector(CodeGenFunction &CGF, Selector Sel) { 5296 return CGF.Builder.CreateLoad(EmitSelectorAddr(Sel)); 5297 } 5298 5299 Address CGObjCMac::EmitSelectorAddr(Selector Sel) { 5300 CharUnits Align = CGM.getPointerAlign(); 5301 5302 llvm::GlobalVariable *&Entry = SelectorReferences[Sel]; 5303 if (!Entry) { 5304 llvm::Constant *Casted = 5305 llvm::ConstantExpr::getBitCast(GetMethodVarName(Sel), 5306 ObjCTypes.SelectorPtrTy); 5307 Entry = CreateMetadataVar( 5308 "OBJC_SELECTOR_REFERENCES_", Casted, 5309 "__OBJC,__message_refs,literal_pointers,no_dead_strip", Align, true); 5310 Entry->setExternallyInitialized(true); 5311 } 5312 5313 return Address(Entry, Align); 5314 } 5315 5316 llvm::Constant *CGObjCCommonMac::GetClassName(StringRef RuntimeName) { 5317 llvm::GlobalVariable *&Entry = ClassNames[RuntimeName]; 5318 if (!Entry) 5319 Entry = CreateCStringLiteral(RuntimeName, ObjCLabelType::ClassName); 5320 return getConstantGEP(VMContext, Entry, 0, 0); 5321 } 5322 5323 llvm::Function *CGObjCCommonMac::GetMethodDefinition(const ObjCMethodDecl *MD) { 5324 llvm::DenseMap<const ObjCMethodDecl*, llvm::Function*>::iterator 5325 I = MethodDefinitions.find(MD); 5326 if (I != MethodDefinitions.end()) 5327 return I->second; 5328 5329 return nullptr; 5330 } 5331 5332 /// GetIvarLayoutName - Returns a unique constant for the given 5333 /// ivar layout bitmap. 5334 llvm::Constant *CGObjCCommonMac::GetIvarLayoutName(IdentifierInfo *Ident, 5335 const ObjCCommonTypesHelper &ObjCTypes) { 5336 return llvm::Constant::getNullValue(ObjCTypes.Int8PtrTy); 5337 } 5338 5339 void IvarLayoutBuilder::visitRecord(const RecordType *RT, 5340 CharUnits offset) { 5341 const RecordDecl *RD = RT->getDecl(); 5342 5343 // If this is a union, remember that we had one, because it might mess 5344 // up the ordering of layout entries. 5345 if (RD->isUnion()) 5346 IsDisordered = true; 5347 5348 const ASTRecordLayout *recLayout = nullptr; 5349 visitAggregate(RD->field_begin(), RD->field_end(), offset, 5350 [&](const FieldDecl *field) -> CharUnits { 5351 if (!recLayout) 5352 recLayout = &CGM.getContext().getASTRecordLayout(RD); 5353 auto offsetInBits = recLayout->getFieldOffset(field->getFieldIndex()); 5354 return CGM.getContext().toCharUnitsFromBits(offsetInBits); 5355 }); 5356 } 5357 5358 template <class Iterator, class GetOffsetFn> 5359 void IvarLayoutBuilder::visitAggregate(Iterator begin, Iterator end, 5360 CharUnits aggregateOffset, 5361 const GetOffsetFn &getOffset) { 5362 for (; begin != end; ++begin) { 5363 auto field = *begin; 5364 5365 // Skip over bitfields. 5366 if (field->isBitField()) { 5367 continue; 5368 } 5369 5370 // Compute the offset of the field within the aggregate. 5371 CharUnits fieldOffset = aggregateOffset + getOffset(field); 5372 5373 visitField(field, fieldOffset); 5374 } 5375 } 5376 5377 /// Collect layout information for the given fields into IvarsInfo. 5378 void IvarLayoutBuilder::visitField(const FieldDecl *field, 5379 CharUnits fieldOffset) { 5380 QualType fieldType = field->getType(); 5381 5382 // Drill down into arrays. 5383 uint64_t numElts = 1; 5384 if (auto arrayType = CGM.getContext().getAsIncompleteArrayType(fieldType)) { 5385 numElts = 0; 5386 fieldType = arrayType->getElementType(); 5387 } 5388 // Unlike incomplete arrays, constant arrays can be nested. 5389 while (auto arrayType = CGM.getContext().getAsConstantArrayType(fieldType)) { 5390 numElts *= arrayType->getSize().getZExtValue(); 5391 fieldType = arrayType->getElementType(); 5392 } 5393 5394 assert(!fieldType->isArrayType() && "ivar of non-constant array type?"); 5395 5396 // If we ended up with a zero-sized array, we've done what we can do within 5397 // the limits of this layout encoding. 5398 if (numElts == 0) return; 5399 5400 // Recurse if the base element type is a record type. 5401 if (auto recType = fieldType->getAs<RecordType>()) { 5402 size_t oldEnd = IvarsInfo.size(); 5403 5404 visitRecord(recType, fieldOffset); 5405 5406 // If we have an array, replicate the first entry's layout information. 5407 auto numEltEntries = IvarsInfo.size() - oldEnd; 5408 if (numElts != 1 && numEltEntries != 0) { 5409 CharUnits eltSize = CGM.getContext().getTypeSizeInChars(recType); 5410 for (uint64_t eltIndex = 1; eltIndex != numElts; ++eltIndex) { 5411 // Copy the last numEltEntries onto the end of the array, adjusting 5412 // each for the element size. 5413 for (size_t i = 0; i != numEltEntries; ++i) { 5414 auto firstEntry = IvarsInfo[oldEnd + i]; 5415 IvarsInfo.push_back(IvarInfo(firstEntry.Offset + eltIndex * eltSize, 5416 firstEntry.SizeInWords)); 5417 } 5418 } 5419 } 5420 5421 return; 5422 } 5423 5424 // Classify the element type. 5425 Qualifiers::GC GCAttr = GetGCAttrTypeForType(CGM.getContext(), fieldType); 5426 5427 // If it matches what we're looking for, add an entry. 5428 if ((ForStrongLayout && GCAttr == Qualifiers::Strong) 5429 || (!ForStrongLayout && GCAttr == Qualifiers::Weak)) { 5430 assert(CGM.getContext().getTypeSizeInChars(fieldType) 5431 == CGM.getPointerSize()); 5432 IvarsInfo.push_back(IvarInfo(fieldOffset, numElts)); 5433 } 5434 } 5435 5436 /// buildBitmap - This routine does the horsework of taking the offsets of 5437 /// strong/weak references and creating a bitmap. The bitmap is also 5438 /// returned in the given buffer, suitable for being passed to \c dump(). 5439 llvm::Constant *IvarLayoutBuilder::buildBitmap(CGObjCCommonMac &CGObjC, 5440 llvm::SmallVectorImpl<unsigned char> &buffer) { 5441 // The bitmap is a series of skip/scan instructions, aligned to word 5442 // boundaries. The skip is performed first. 5443 const unsigned char MaxNibble = 0xF; 5444 const unsigned char SkipMask = 0xF0, SkipShift = 4; 5445 const unsigned char ScanMask = 0x0F, ScanShift = 0; 5446 5447 assert(!IvarsInfo.empty() && "generating bitmap for no data"); 5448 5449 // Sort the ivar info on byte position in case we encounterred a 5450 // union nested in the ivar list. 5451 if (IsDisordered) { 5452 // This isn't a stable sort, but our algorithm should handle it fine. 5453 llvm::array_pod_sort(IvarsInfo.begin(), IvarsInfo.end()); 5454 } else { 5455 assert(llvm::is_sorted(IvarsInfo)); 5456 } 5457 assert(IvarsInfo.back().Offset < InstanceEnd); 5458 5459 assert(buffer.empty()); 5460 5461 // Skip the next N words. 5462 auto skip = [&](unsigned numWords) { 5463 assert(numWords > 0); 5464 5465 // Try to merge into the previous byte. Since scans happen second, we 5466 // can't do this if it includes a scan. 5467 if (!buffer.empty() && !(buffer.back() & ScanMask)) { 5468 unsigned lastSkip = buffer.back() >> SkipShift; 5469 if (lastSkip < MaxNibble) { 5470 unsigned claimed = std::min(MaxNibble - lastSkip, numWords); 5471 numWords -= claimed; 5472 lastSkip += claimed; 5473 buffer.back() = (lastSkip << SkipShift); 5474 } 5475 } 5476 5477 while (numWords >= MaxNibble) { 5478 buffer.push_back(MaxNibble << SkipShift); 5479 numWords -= MaxNibble; 5480 } 5481 if (numWords) { 5482 buffer.push_back(numWords << SkipShift); 5483 } 5484 }; 5485 5486 // Scan the next N words. 5487 auto scan = [&](unsigned numWords) { 5488 assert(numWords > 0); 5489 5490 // Try to merge into the previous byte. Since scans happen second, we can 5491 // do this even if it includes a skip. 5492 if (!buffer.empty()) { 5493 unsigned lastScan = (buffer.back() & ScanMask) >> ScanShift; 5494 if (lastScan < MaxNibble) { 5495 unsigned claimed = std::min(MaxNibble - lastScan, numWords); 5496 numWords -= claimed; 5497 lastScan += claimed; 5498 buffer.back() = (buffer.back() & SkipMask) | (lastScan << ScanShift); 5499 } 5500 } 5501 5502 while (numWords >= MaxNibble) { 5503 buffer.push_back(MaxNibble << ScanShift); 5504 numWords -= MaxNibble; 5505 } 5506 if (numWords) { 5507 buffer.push_back(numWords << ScanShift); 5508 } 5509 }; 5510 5511 // One past the end of the last scan. 5512 unsigned endOfLastScanInWords = 0; 5513 const CharUnits WordSize = CGM.getPointerSize(); 5514 5515 // Consider all the scan requests. 5516 for (auto &request : IvarsInfo) { 5517 CharUnits beginOfScan = request.Offset - InstanceBegin; 5518 5519 // Ignore scan requests that don't start at an even multiple of the 5520 // word size. We can't encode them. 5521 if ((beginOfScan % WordSize) != 0) continue; 5522 5523 // Ignore scan requests that start before the instance start. 5524 // This assumes that scans never span that boundary. The boundary 5525 // isn't the true start of the ivars, because in the fragile-ARC case 5526 // it's rounded up to word alignment, but the test above should leave 5527 // us ignoring that possibility. 5528 if (beginOfScan.isNegative()) { 5529 assert(request.Offset + request.SizeInWords * WordSize <= InstanceBegin); 5530 continue; 5531 } 5532 5533 unsigned beginOfScanInWords = beginOfScan / WordSize; 5534 unsigned endOfScanInWords = beginOfScanInWords + request.SizeInWords; 5535 5536 // If the scan starts some number of words after the last one ended, 5537 // skip forward. 5538 if (beginOfScanInWords > endOfLastScanInWords) { 5539 skip(beginOfScanInWords - endOfLastScanInWords); 5540 5541 // Otherwise, start scanning where the last left off. 5542 } else { 5543 beginOfScanInWords = endOfLastScanInWords; 5544 5545 // If that leaves us with nothing to scan, ignore this request. 5546 if (beginOfScanInWords >= endOfScanInWords) continue; 5547 } 5548 5549 // Scan to the end of the request. 5550 assert(beginOfScanInWords < endOfScanInWords); 5551 scan(endOfScanInWords - beginOfScanInWords); 5552 endOfLastScanInWords = endOfScanInWords; 5553 } 5554 5555 if (buffer.empty()) 5556 return llvm::ConstantPointerNull::get(CGM.Int8PtrTy); 5557 5558 // For GC layouts, emit a skip to the end of the allocation so that we 5559 // have precise information about the entire thing. This isn't useful 5560 // or necessary for the ARC-style layout strings. 5561 if (CGM.getLangOpts().getGC() != LangOptions::NonGC) { 5562 unsigned lastOffsetInWords = 5563 (InstanceEnd - InstanceBegin + WordSize - CharUnits::One()) / WordSize; 5564 if (lastOffsetInWords > endOfLastScanInWords) { 5565 skip(lastOffsetInWords - endOfLastScanInWords); 5566 } 5567 } 5568 5569 // Null terminate the string. 5570 buffer.push_back(0); 5571 5572 auto *Entry = CGObjC.CreateCStringLiteral( 5573 reinterpret_cast<char *>(buffer.data()), ObjCLabelType::ClassName); 5574 return getConstantGEP(CGM.getLLVMContext(), Entry, 0, 0); 5575 } 5576 5577 /// BuildIvarLayout - Builds ivar layout bitmap for the class 5578 /// implementation for the __strong or __weak case. 5579 /// The layout map displays which words in ivar list must be skipped 5580 /// and which must be scanned by GC (see below). String is built of bytes. 5581 /// Each byte is divided up in two nibbles (4-bit each). Left nibble is count 5582 /// of words to skip and right nibble is count of words to scan. So, each 5583 /// nibble represents up to 15 workds to skip or scan. Skipping the rest is 5584 /// represented by a 0x00 byte which also ends the string. 5585 /// 1. when ForStrongLayout is true, following ivars are scanned: 5586 /// - id, Class 5587 /// - object * 5588 /// - __strong anything 5589 /// 5590 /// 2. When ForStrongLayout is false, following ivars are scanned: 5591 /// - __weak anything 5592 /// 5593 llvm::Constant * 5594 CGObjCCommonMac::BuildIvarLayout(const ObjCImplementationDecl *OMD, 5595 CharUnits beginOffset, CharUnits endOffset, 5596 bool ForStrongLayout, bool HasMRCWeakIvars) { 5597 // If this is MRC, and we're either building a strong layout or there 5598 // are no weak ivars, bail out early. 5599 llvm::Type *PtrTy = CGM.Int8PtrTy; 5600 if (CGM.getLangOpts().getGC() == LangOptions::NonGC && 5601 !CGM.getLangOpts().ObjCAutoRefCount && 5602 (ForStrongLayout || !HasMRCWeakIvars)) 5603 return llvm::Constant::getNullValue(PtrTy); 5604 5605 const ObjCInterfaceDecl *OI = OMD->getClassInterface(); 5606 SmallVector<const ObjCIvarDecl*, 32> ivars; 5607 5608 // GC layout strings include the complete object layout, possibly 5609 // inaccurately in the non-fragile ABI; the runtime knows how to fix this 5610 // up. 5611 // 5612 // ARC layout strings only include the class's ivars. In non-fragile 5613 // runtimes, that means starting at InstanceStart, rounded up to word 5614 // alignment. In fragile runtimes, there's no InstanceStart, so it means 5615 // starting at the offset of the first ivar, rounded up to word alignment. 5616 // 5617 // MRC weak layout strings follow the ARC style. 5618 CharUnits baseOffset; 5619 if (CGM.getLangOpts().getGC() == LangOptions::NonGC) { 5620 for (const ObjCIvarDecl *IVD = OI->all_declared_ivar_begin(); 5621 IVD; IVD = IVD->getNextIvar()) 5622 ivars.push_back(IVD); 5623 5624 if (isNonFragileABI()) { 5625 baseOffset = beginOffset; // InstanceStart 5626 } else if (!ivars.empty()) { 5627 baseOffset = 5628 CharUnits::fromQuantity(ComputeIvarBaseOffset(CGM, OMD, ivars[0])); 5629 } else { 5630 baseOffset = CharUnits::Zero(); 5631 } 5632 5633 baseOffset = baseOffset.alignTo(CGM.getPointerAlign()); 5634 } 5635 else { 5636 CGM.getContext().DeepCollectObjCIvars(OI, true, ivars); 5637 5638 baseOffset = CharUnits::Zero(); 5639 } 5640 5641 if (ivars.empty()) 5642 return llvm::Constant::getNullValue(PtrTy); 5643 5644 IvarLayoutBuilder builder(CGM, baseOffset, endOffset, ForStrongLayout); 5645 5646 builder.visitAggregate(ivars.begin(), ivars.end(), CharUnits::Zero(), 5647 [&](const ObjCIvarDecl *ivar) -> CharUnits { 5648 return CharUnits::fromQuantity(ComputeIvarBaseOffset(CGM, OMD, ivar)); 5649 }); 5650 5651 if (!builder.hasBitmapData()) 5652 return llvm::Constant::getNullValue(PtrTy); 5653 5654 llvm::SmallVector<unsigned char, 4> buffer; 5655 llvm::Constant *C = builder.buildBitmap(*this, buffer); 5656 5657 if (CGM.getLangOpts().ObjCGCBitmapPrint && !buffer.empty()) { 5658 printf("\n%s ivar layout for class '%s': ", 5659 ForStrongLayout ? "strong" : "weak", 5660 OMD->getClassInterface()->getName().str().c_str()); 5661 builder.dump(buffer); 5662 } 5663 return C; 5664 } 5665 5666 llvm::Constant *CGObjCCommonMac::GetMethodVarName(Selector Sel) { 5667 llvm::GlobalVariable *&Entry = MethodVarNames[Sel]; 5668 // FIXME: Avoid std::string in "Sel.getAsString()" 5669 if (!Entry) 5670 Entry = CreateCStringLiteral(Sel.getAsString(), ObjCLabelType::MethodVarName); 5671 return getConstantGEP(VMContext, Entry, 0, 0); 5672 } 5673 5674 // FIXME: Merge into a single cstring creation function. 5675 llvm::Constant *CGObjCCommonMac::GetMethodVarName(IdentifierInfo *ID) { 5676 return GetMethodVarName(CGM.getContext().Selectors.getNullarySelector(ID)); 5677 } 5678 5679 llvm::Constant *CGObjCCommonMac::GetMethodVarType(const FieldDecl *Field) { 5680 std::string TypeStr; 5681 CGM.getContext().getObjCEncodingForType(Field->getType(), TypeStr, Field); 5682 5683 llvm::GlobalVariable *&Entry = MethodVarTypes[TypeStr]; 5684 if (!Entry) 5685 Entry = CreateCStringLiteral(TypeStr, ObjCLabelType::MethodVarType); 5686 return getConstantGEP(VMContext, Entry, 0, 0); 5687 } 5688 5689 llvm::Constant *CGObjCCommonMac::GetMethodVarType(const ObjCMethodDecl *D, 5690 bool Extended) { 5691 std::string TypeStr = 5692 CGM.getContext().getObjCEncodingForMethodDecl(D, Extended); 5693 5694 llvm::GlobalVariable *&Entry = MethodVarTypes[TypeStr]; 5695 if (!Entry) 5696 Entry = CreateCStringLiteral(TypeStr, ObjCLabelType::MethodVarType); 5697 return getConstantGEP(VMContext, Entry, 0, 0); 5698 } 5699 5700 // FIXME: Merge into a single cstring creation function. 5701 llvm::Constant *CGObjCCommonMac::GetPropertyName(IdentifierInfo *Ident) { 5702 llvm::GlobalVariable *&Entry = PropertyNames[Ident]; 5703 if (!Entry) 5704 Entry = CreateCStringLiteral(Ident->getName(), ObjCLabelType::PropertyName); 5705 return getConstantGEP(VMContext, Entry, 0, 0); 5706 } 5707 5708 // FIXME: Merge into a single cstring creation function. 5709 // FIXME: This Decl should be more precise. 5710 llvm::Constant * 5711 CGObjCCommonMac::GetPropertyTypeString(const ObjCPropertyDecl *PD, 5712 const Decl *Container) { 5713 std::string TypeStr = 5714 CGM.getContext().getObjCEncodingForPropertyDecl(PD, Container); 5715 return GetPropertyName(&CGM.getContext().Idents.get(TypeStr)); 5716 } 5717 5718 void CGObjCMac::FinishModule() { 5719 EmitModuleInfo(); 5720 5721 // Emit the dummy bodies for any protocols which were referenced but 5722 // never defined. 5723 for (auto &entry : Protocols) { 5724 llvm::GlobalVariable *global = entry.second; 5725 if (global->hasInitializer()) 5726 continue; 5727 5728 ConstantInitBuilder builder(CGM); 5729 auto values = builder.beginStruct(ObjCTypes.ProtocolTy); 5730 values.addNullPointer(ObjCTypes.ProtocolExtensionPtrTy); 5731 values.add(GetClassName(entry.first->getName())); 5732 values.addNullPointer(ObjCTypes.ProtocolListPtrTy); 5733 values.addNullPointer(ObjCTypes.MethodDescriptionListPtrTy); 5734 values.addNullPointer(ObjCTypes.MethodDescriptionListPtrTy); 5735 values.finishAndSetAsInitializer(global); 5736 CGM.addCompilerUsedGlobal(global); 5737 } 5738 5739 // Add assembler directives to add lazy undefined symbol references 5740 // for classes which are referenced but not defined. This is 5741 // important for correct linker interaction. 5742 // 5743 // FIXME: It would be nice if we had an LLVM construct for this. 5744 if ((!LazySymbols.empty() || !DefinedSymbols.empty()) && 5745 CGM.getTriple().isOSBinFormatMachO()) { 5746 SmallString<256> Asm; 5747 Asm += CGM.getModule().getModuleInlineAsm(); 5748 if (!Asm.empty() && Asm.back() != '\n') 5749 Asm += '\n'; 5750 5751 llvm::raw_svector_ostream OS(Asm); 5752 for (const auto *Sym : DefinedSymbols) 5753 OS << "\t.objc_class_name_" << Sym->getName() << "=0\n" 5754 << "\t.globl .objc_class_name_" << Sym->getName() << "\n"; 5755 for (const auto *Sym : LazySymbols) 5756 OS << "\t.lazy_reference .objc_class_name_" << Sym->getName() << "\n"; 5757 for (const auto &Category : DefinedCategoryNames) 5758 OS << "\t.objc_category_name_" << Category << "=0\n" 5759 << "\t.globl .objc_category_name_" << Category << "\n"; 5760 5761 CGM.getModule().setModuleInlineAsm(OS.str()); 5762 } 5763 } 5764 5765 CGObjCNonFragileABIMac::CGObjCNonFragileABIMac(CodeGen::CodeGenModule &cgm) 5766 : CGObjCCommonMac(cgm), ObjCTypes(cgm), ObjCEmptyCacheVar(nullptr), 5767 ObjCEmptyVtableVar(nullptr) { 5768 ObjCABI = 2; 5769 } 5770 5771 /* *** */ 5772 5773 ObjCCommonTypesHelper::ObjCCommonTypesHelper(CodeGen::CodeGenModule &cgm) 5774 : VMContext(cgm.getLLVMContext()), CGM(cgm), ExternalProtocolPtrTy(nullptr) 5775 { 5776 CodeGen::CodeGenTypes &Types = CGM.getTypes(); 5777 ASTContext &Ctx = CGM.getContext(); 5778 5779 ShortTy = cast<llvm::IntegerType>(Types.ConvertType(Ctx.ShortTy)); 5780 IntTy = CGM.IntTy; 5781 LongTy = cast<llvm::IntegerType>(Types.ConvertType(Ctx.LongTy)); 5782 Int8PtrTy = CGM.Int8PtrTy; 5783 Int8PtrPtrTy = CGM.Int8PtrPtrTy; 5784 5785 // arm64 targets use "int" ivar offset variables. All others, 5786 // including OS X x86_64 and Windows x86_64, use "long" ivar offsets. 5787 if (CGM.getTarget().getTriple().getArch() == llvm::Triple::aarch64) 5788 IvarOffsetVarTy = IntTy; 5789 else 5790 IvarOffsetVarTy = LongTy; 5791 5792 ObjectPtrTy = 5793 cast<llvm::PointerType>(Types.ConvertType(Ctx.getObjCIdType())); 5794 PtrObjectPtrTy = 5795 llvm::PointerType::getUnqual(ObjectPtrTy); 5796 SelectorPtrTy = 5797 cast<llvm::PointerType>(Types.ConvertType(Ctx.getObjCSelType())); 5798 5799 // I'm not sure I like this. The implicit coordination is a bit 5800 // gross. We should solve this in a reasonable fashion because this 5801 // is a pretty common task (match some runtime data structure with 5802 // an LLVM data structure). 5803 5804 // FIXME: This is leaked. 5805 // FIXME: Merge with rewriter code? 5806 5807 // struct _objc_super { 5808 // id self; 5809 // Class cls; 5810 // } 5811 RecordDecl *RD = RecordDecl::Create(Ctx, TTK_Struct, 5812 Ctx.getTranslationUnitDecl(), 5813 SourceLocation(), SourceLocation(), 5814 &Ctx.Idents.get("_objc_super")); 5815 RD->addDecl(FieldDecl::Create(Ctx, RD, SourceLocation(), SourceLocation(), 5816 nullptr, Ctx.getObjCIdType(), nullptr, nullptr, 5817 false, ICIS_NoInit)); 5818 RD->addDecl(FieldDecl::Create(Ctx, RD, SourceLocation(), SourceLocation(), 5819 nullptr, Ctx.getObjCClassType(), nullptr, 5820 nullptr, false, ICIS_NoInit)); 5821 RD->completeDefinition(); 5822 5823 SuperCTy = Ctx.getTagDeclType(RD); 5824 SuperPtrCTy = Ctx.getPointerType(SuperCTy); 5825 5826 SuperTy = cast<llvm::StructType>(Types.ConvertType(SuperCTy)); 5827 SuperPtrTy = llvm::PointerType::getUnqual(SuperTy); 5828 5829 // struct _prop_t { 5830 // char *name; 5831 // char *attributes; 5832 // } 5833 PropertyTy = llvm::StructType::create("struct._prop_t", Int8PtrTy, Int8PtrTy); 5834 5835 // struct _prop_list_t { 5836 // uint32_t entsize; // sizeof(struct _prop_t) 5837 // uint32_t count_of_properties; 5838 // struct _prop_t prop_list[count_of_properties]; 5839 // } 5840 PropertyListTy = llvm::StructType::create( 5841 "struct._prop_list_t", IntTy, IntTy, llvm::ArrayType::get(PropertyTy, 0)); 5842 // struct _prop_list_t * 5843 PropertyListPtrTy = llvm::PointerType::getUnqual(PropertyListTy); 5844 5845 // struct _objc_method { 5846 // SEL _cmd; 5847 // char *method_type; 5848 // char *_imp; 5849 // } 5850 MethodTy = llvm::StructType::create("struct._objc_method", SelectorPtrTy, 5851 Int8PtrTy, Int8PtrTy); 5852 5853 // struct _objc_cache * 5854 CacheTy = llvm::StructType::create(VMContext, "struct._objc_cache"); 5855 CachePtrTy = llvm::PointerType::getUnqual(CacheTy); 5856 } 5857 5858 ObjCTypesHelper::ObjCTypesHelper(CodeGen::CodeGenModule &cgm) 5859 : ObjCCommonTypesHelper(cgm) { 5860 // struct _objc_method_description { 5861 // SEL name; 5862 // char *types; 5863 // } 5864 MethodDescriptionTy = llvm::StructType::create( 5865 "struct._objc_method_description", SelectorPtrTy, Int8PtrTy); 5866 5867 // struct _objc_method_description_list { 5868 // int count; 5869 // struct _objc_method_description[1]; 5870 // } 5871 MethodDescriptionListTy = 5872 llvm::StructType::create("struct._objc_method_description_list", IntTy, 5873 llvm::ArrayType::get(MethodDescriptionTy, 0)); 5874 5875 // struct _objc_method_description_list * 5876 MethodDescriptionListPtrTy = 5877 llvm::PointerType::getUnqual(MethodDescriptionListTy); 5878 5879 // Protocol description structures 5880 5881 // struct _objc_protocol_extension { 5882 // uint32_t size; // sizeof(struct _objc_protocol_extension) 5883 // struct _objc_method_description_list *optional_instance_methods; 5884 // struct _objc_method_description_list *optional_class_methods; 5885 // struct _objc_property_list *instance_properties; 5886 // const char ** extendedMethodTypes; 5887 // struct _objc_property_list *class_properties; 5888 // } 5889 ProtocolExtensionTy = llvm::StructType::create( 5890 "struct._objc_protocol_extension", IntTy, MethodDescriptionListPtrTy, 5891 MethodDescriptionListPtrTy, PropertyListPtrTy, Int8PtrPtrTy, 5892 PropertyListPtrTy); 5893 5894 // struct _objc_protocol_extension * 5895 ProtocolExtensionPtrTy = llvm::PointerType::getUnqual(ProtocolExtensionTy); 5896 5897 // Handle recursive construction of Protocol and ProtocolList types 5898 5899 ProtocolTy = 5900 llvm::StructType::create(VMContext, "struct._objc_protocol"); 5901 5902 ProtocolListTy = 5903 llvm::StructType::create(VMContext, "struct._objc_protocol_list"); 5904 ProtocolListTy->setBody(llvm::PointerType::getUnqual(ProtocolListTy), LongTy, 5905 llvm::ArrayType::get(ProtocolTy, 0)); 5906 5907 // struct _objc_protocol { 5908 // struct _objc_protocol_extension *isa; 5909 // char *protocol_name; 5910 // struct _objc_protocol **_objc_protocol_list; 5911 // struct _objc_method_description_list *instance_methods; 5912 // struct _objc_method_description_list *class_methods; 5913 // } 5914 ProtocolTy->setBody(ProtocolExtensionPtrTy, Int8PtrTy, 5915 llvm::PointerType::getUnqual(ProtocolListTy), 5916 MethodDescriptionListPtrTy, MethodDescriptionListPtrTy); 5917 5918 // struct _objc_protocol_list * 5919 ProtocolListPtrTy = llvm::PointerType::getUnqual(ProtocolListTy); 5920 5921 ProtocolPtrTy = llvm::PointerType::getUnqual(ProtocolTy); 5922 5923 // Class description structures 5924 5925 // struct _objc_ivar { 5926 // char *ivar_name; 5927 // char *ivar_type; 5928 // int ivar_offset; 5929 // } 5930 IvarTy = llvm::StructType::create("struct._objc_ivar", Int8PtrTy, Int8PtrTy, 5931 IntTy); 5932 5933 // struct _objc_ivar_list * 5934 IvarListTy = 5935 llvm::StructType::create(VMContext, "struct._objc_ivar_list"); 5936 IvarListPtrTy = llvm::PointerType::getUnqual(IvarListTy); 5937 5938 // struct _objc_method_list * 5939 MethodListTy = 5940 llvm::StructType::create(VMContext, "struct._objc_method_list"); 5941 MethodListPtrTy = llvm::PointerType::getUnqual(MethodListTy); 5942 5943 // struct _objc_class_extension * 5944 ClassExtensionTy = llvm::StructType::create( 5945 "struct._objc_class_extension", IntTy, Int8PtrTy, PropertyListPtrTy); 5946 ClassExtensionPtrTy = llvm::PointerType::getUnqual(ClassExtensionTy); 5947 5948 ClassTy = llvm::StructType::create(VMContext, "struct._objc_class"); 5949 5950 // struct _objc_class { 5951 // Class isa; 5952 // Class super_class; 5953 // char *name; 5954 // long version; 5955 // long info; 5956 // long instance_size; 5957 // struct _objc_ivar_list *ivars; 5958 // struct _objc_method_list *methods; 5959 // struct _objc_cache *cache; 5960 // struct _objc_protocol_list *protocols; 5961 // char *ivar_layout; 5962 // struct _objc_class_ext *ext; 5963 // }; 5964 ClassTy->setBody(llvm::PointerType::getUnqual(ClassTy), 5965 llvm::PointerType::getUnqual(ClassTy), Int8PtrTy, LongTy, 5966 LongTy, LongTy, IvarListPtrTy, MethodListPtrTy, CachePtrTy, 5967 ProtocolListPtrTy, Int8PtrTy, ClassExtensionPtrTy); 5968 5969 ClassPtrTy = llvm::PointerType::getUnqual(ClassTy); 5970 5971 // struct _objc_category { 5972 // char *category_name; 5973 // char *class_name; 5974 // struct _objc_method_list *instance_method; 5975 // struct _objc_method_list *class_method; 5976 // struct _objc_protocol_list *protocols; 5977 // uint32_t size; // sizeof(struct _objc_category) 5978 // struct _objc_property_list *instance_properties;// category's @property 5979 // struct _objc_property_list *class_properties; 5980 // } 5981 CategoryTy = llvm::StructType::create( 5982 "struct._objc_category", Int8PtrTy, Int8PtrTy, MethodListPtrTy, 5983 MethodListPtrTy, ProtocolListPtrTy, IntTy, PropertyListPtrTy, 5984 PropertyListPtrTy); 5985 5986 // Global metadata structures 5987 5988 // struct _objc_symtab { 5989 // long sel_ref_cnt; 5990 // SEL *refs; 5991 // short cls_def_cnt; 5992 // short cat_def_cnt; 5993 // char *defs[cls_def_cnt + cat_def_cnt]; 5994 // } 5995 SymtabTy = llvm::StructType::create("struct._objc_symtab", LongTy, 5996 SelectorPtrTy, ShortTy, ShortTy, 5997 llvm::ArrayType::get(Int8PtrTy, 0)); 5998 SymtabPtrTy = llvm::PointerType::getUnqual(SymtabTy); 5999 6000 // struct _objc_module { 6001 // long version; 6002 // long size; // sizeof(struct _objc_module) 6003 // char *name; 6004 // struct _objc_symtab* symtab; 6005 // } 6006 ModuleTy = llvm::StructType::create("struct._objc_module", LongTy, LongTy, 6007 Int8PtrTy, SymtabPtrTy); 6008 6009 // FIXME: This is the size of the setjmp buffer and should be target 6010 // specific. 18 is what's used on 32-bit X86. 6011 uint64_t SetJmpBufferSize = 18; 6012 6013 // Exceptions 6014 llvm::Type *StackPtrTy = llvm::ArrayType::get(CGM.Int8PtrTy, 4); 6015 6016 ExceptionDataTy = llvm::StructType::create( 6017 "struct._objc_exception_data", 6018 llvm::ArrayType::get(CGM.Int32Ty, SetJmpBufferSize), StackPtrTy); 6019 } 6020 6021 ObjCNonFragileABITypesHelper::ObjCNonFragileABITypesHelper(CodeGen::CodeGenModule &cgm) 6022 : ObjCCommonTypesHelper(cgm) { 6023 // struct _method_list_t { 6024 // uint32_t entsize; // sizeof(struct _objc_method) 6025 // uint32_t method_count; 6026 // struct _objc_method method_list[method_count]; 6027 // } 6028 MethodListnfABITy = 6029 llvm::StructType::create("struct.__method_list_t", IntTy, IntTy, 6030 llvm::ArrayType::get(MethodTy, 0)); 6031 // struct method_list_t * 6032 MethodListnfABIPtrTy = llvm::PointerType::getUnqual(MethodListnfABITy); 6033 6034 // struct _protocol_t { 6035 // id isa; // NULL 6036 // const char * const protocol_name; 6037 // const struct _protocol_list_t * protocol_list; // super protocols 6038 // const struct method_list_t * const instance_methods; 6039 // const struct method_list_t * const class_methods; 6040 // const struct method_list_t *optionalInstanceMethods; 6041 // const struct method_list_t *optionalClassMethods; 6042 // const struct _prop_list_t * properties; 6043 // const uint32_t size; // sizeof(struct _protocol_t) 6044 // const uint32_t flags; // = 0 6045 // const char ** extendedMethodTypes; 6046 // const char *demangledName; 6047 // const struct _prop_list_t * class_properties; 6048 // } 6049 6050 // Holder for struct _protocol_list_t * 6051 ProtocolListnfABITy = 6052 llvm::StructType::create(VMContext, "struct._objc_protocol_list"); 6053 6054 ProtocolnfABITy = llvm::StructType::create( 6055 "struct._protocol_t", ObjectPtrTy, Int8PtrTy, 6056 llvm::PointerType::getUnqual(ProtocolListnfABITy), MethodListnfABIPtrTy, 6057 MethodListnfABIPtrTy, MethodListnfABIPtrTy, MethodListnfABIPtrTy, 6058 PropertyListPtrTy, IntTy, IntTy, Int8PtrPtrTy, Int8PtrTy, 6059 PropertyListPtrTy); 6060 6061 // struct _protocol_t* 6062 ProtocolnfABIPtrTy = llvm::PointerType::getUnqual(ProtocolnfABITy); 6063 6064 // struct _protocol_list_t { 6065 // long protocol_count; // Note, this is 32/64 bit 6066 // struct _protocol_t *[protocol_count]; 6067 // } 6068 ProtocolListnfABITy->setBody(LongTy, 6069 llvm::ArrayType::get(ProtocolnfABIPtrTy, 0)); 6070 6071 // struct _objc_protocol_list* 6072 ProtocolListnfABIPtrTy = llvm::PointerType::getUnqual(ProtocolListnfABITy); 6073 6074 // struct _ivar_t { 6075 // unsigned [long] int *offset; // pointer to ivar offset location 6076 // char *name; 6077 // char *type; 6078 // uint32_t alignment; 6079 // uint32_t size; 6080 // } 6081 IvarnfABITy = llvm::StructType::create( 6082 "struct._ivar_t", llvm::PointerType::getUnqual(IvarOffsetVarTy), 6083 Int8PtrTy, Int8PtrTy, IntTy, IntTy); 6084 6085 // struct _ivar_list_t { 6086 // uint32 entsize; // sizeof(struct _ivar_t) 6087 // uint32 count; 6088 // struct _iver_t list[count]; 6089 // } 6090 IvarListnfABITy = 6091 llvm::StructType::create("struct._ivar_list_t", IntTy, IntTy, 6092 llvm::ArrayType::get(IvarnfABITy, 0)); 6093 6094 IvarListnfABIPtrTy = llvm::PointerType::getUnqual(IvarListnfABITy); 6095 6096 // struct _class_ro_t { 6097 // uint32_t const flags; 6098 // uint32_t const instanceStart; 6099 // uint32_t const instanceSize; 6100 // uint32_t const reserved; // only when building for 64bit targets 6101 // const uint8_t * const ivarLayout; 6102 // const char *const name; 6103 // const struct _method_list_t * const baseMethods; 6104 // const struct _objc_protocol_list *const baseProtocols; 6105 // const struct _ivar_list_t *const ivars; 6106 // const uint8_t * const weakIvarLayout; 6107 // const struct _prop_list_t * const properties; 6108 // } 6109 6110 // FIXME. Add 'reserved' field in 64bit abi mode! 6111 ClassRonfABITy = llvm::StructType::create( 6112 "struct._class_ro_t", IntTy, IntTy, IntTy, Int8PtrTy, Int8PtrTy, 6113 MethodListnfABIPtrTy, ProtocolListnfABIPtrTy, IvarListnfABIPtrTy, 6114 Int8PtrTy, PropertyListPtrTy); 6115 6116 // ImpnfABITy - LLVM for id (*)(id, SEL, ...) 6117 llvm::Type *params[] = { ObjectPtrTy, SelectorPtrTy }; 6118 ImpnfABITy = llvm::FunctionType::get(ObjectPtrTy, params, false) 6119 ->getPointerTo(); 6120 6121 // struct _class_t { 6122 // struct _class_t *isa; 6123 // struct _class_t * const superclass; 6124 // void *cache; 6125 // IMP *vtable; 6126 // struct class_ro_t *ro; 6127 // } 6128 6129 ClassnfABITy = llvm::StructType::create(VMContext, "struct._class_t"); 6130 ClassnfABITy->setBody(llvm::PointerType::getUnqual(ClassnfABITy), 6131 llvm::PointerType::getUnqual(ClassnfABITy), CachePtrTy, 6132 llvm::PointerType::getUnqual(ImpnfABITy), 6133 llvm::PointerType::getUnqual(ClassRonfABITy)); 6134 6135 // LLVM for struct _class_t * 6136 ClassnfABIPtrTy = llvm::PointerType::getUnqual(ClassnfABITy); 6137 6138 // struct _category_t { 6139 // const char * const name; 6140 // struct _class_t *const cls; 6141 // const struct _method_list_t * const instance_methods; 6142 // const struct _method_list_t * const class_methods; 6143 // const struct _protocol_list_t * const protocols; 6144 // const struct _prop_list_t * const properties; 6145 // const struct _prop_list_t * const class_properties; 6146 // const uint32_t size; 6147 // } 6148 CategorynfABITy = llvm::StructType::create( 6149 "struct._category_t", Int8PtrTy, ClassnfABIPtrTy, MethodListnfABIPtrTy, 6150 MethodListnfABIPtrTy, ProtocolListnfABIPtrTy, PropertyListPtrTy, 6151 PropertyListPtrTy, IntTy); 6152 6153 // New types for nonfragile abi messaging. 6154 CodeGen::CodeGenTypes &Types = CGM.getTypes(); 6155 ASTContext &Ctx = CGM.getContext(); 6156 6157 // MessageRefTy - LLVM for: 6158 // struct _message_ref_t { 6159 // IMP messenger; 6160 // SEL name; 6161 // }; 6162 6163 // First the clang type for struct _message_ref_t 6164 RecordDecl *RD = RecordDecl::Create(Ctx, TTK_Struct, 6165 Ctx.getTranslationUnitDecl(), 6166 SourceLocation(), SourceLocation(), 6167 &Ctx.Idents.get("_message_ref_t")); 6168 RD->addDecl(FieldDecl::Create(Ctx, RD, SourceLocation(), SourceLocation(), 6169 nullptr, Ctx.VoidPtrTy, nullptr, nullptr, false, 6170 ICIS_NoInit)); 6171 RD->addDecl(FieldDecl::Create(Ctx, RD, SourceLocation(), SourceLocation(), 6172 nullptr, Ctx.getObjCSelType(), nullptr, nullptr, 6173 false, ICIS_NoInit)); 6174 RD->completeDefinition(); 6175 6176 MessageRefCTy = Ctx.getTagDeclType(RD); 6177 MessageRefCPtrTy = Ctx.getPointerType(MessageRefCTy); 6178 MessageRefTy = cast<llvm::StructType>(Types.ConvertType(MessageRefCTy)); 6179 6180 // MessageRefPtrTy - LLVM for struct _message_ref_t* 6181 MessageRefPtrTy = llvm::PointerType::getUnqual(MessageRefTy); 6182 6183 // SuperMessageRefTy - LLVM for: 6184 // struct _super_message_ref_t { 6185 // SUPER_IMP messenger; 6186 // SEL name; 6187 // }; 6188 SuperMessageRefTy = llvm::StructType::create("struct._super_message_ref_t", 6189 ImpnfABITy, SelectorPtrTy); 6190 6191 // SuperMessageRefPtrTy - LLVM for struct _super_message_ref_t* 6192 SuperMessageRefPtrTy = llvm::PointerType::getUnqual(SuperMessageRefTy); 6193 6194 6195 // struct objc_typeinfo { 6196 // const void** vtable; // objc_ehtype_vtable + 2 6197 // const char* name; // c++ typeinfo string 6198 // Class cls; 6199 // }; 6200 EHTypeTy = llvm::StructType::create("struct._objc_typeinfo", 6201 llvm::PointerType::getUnqual(Int8PtrTy), 6202 Int8PtrTy, ClassnfABIPtrTy); 6203 EHTypePtrTy = llvm::PointerType::getUnqual(EHTypeTy); 6204 } 6205 6206 llvm::Function *CGObjCNonFragileABIMac::ModuleInitFunction() { 6207 FinishNonFragileABIModule(); 6208 6209 return nullptr; 6210 } 6211 6212 void CGObjCNonFragileABIMac::AddModuleClassList( 6213 ArrayRef<llvm::GlobalValue *> Container, StringRef SymbolName, 6214 StringRef SectionName) { 6215 unsigned NumClasses = Container.size(); 6216 6217 if (!NumClasses) 6218 return; 6219 6220 SmallVector<llvm::Constant*, 8> Symbols(NumClasses); 6221 for (unsigned i=0; i<NumClasses; i++) 6222 Symbols[i] = llvm::ConstantExpr::getBitCast(Container[i], 6223 ObjCTypes.Int8PtrTy); 6224 llvm::Constant *Init = 6225 llvm::ConstantArray::get(llvm::ArrayType::get(ObjCTypes.Int8PtrTy, 6226 Symbols.size()), 6227 Symbols); 6228 6229 // Section name is obtained by calling GetSectionName, which returns 6230 // sections in the __DATA segment on MachO. 6231 assert((!CGM.getTriple().isOSBinFormatMachO() || 6232 SectionName.startswith("__DATA")) && 6233 "SectionName expected to start with __DATA on MachO"); 6234 llvm::GlobalVariable *GV = new llvm::GlobalVariable( 6235 CGM.getModule(), Init->getType(), false, 6236 llvm::GlobalValue::PrivateLinkage, Init, SymbolName); 6237 GV->setAlignment( 6238 llvm::Align(CGM.getDataLayout().getABITypeAlignment(Init->getType()))); 6239 GV->setSection(SectionName); 6240 CGM.addCompilerUsedGlobal(GV); 6241 } 6242 6243 void CGObjCNonFragileABIMac::FinishNonFragileABIModule() { 6244 // nonfragile abi has no module definition. 6245 6246 // Build list of all implemented class addresses in array 6247 // L_OBJC_LABEL_CLASS_$. 6248 6249 for (unsigned i=0, NumClasses=ImplementedClasses.size(); i<NumClasses; i++) { 6250 const ObjCInterfaceDecl *ID = ImplementedClasses[i]; 6251 assert(ID); 6252 if (ObjCImplementationDecl *IMP = ID->getImplementation()) 6253 // We are implementing a weak imported interface. Give it external linkage 6254 if (ID->isWeakImported() && !IMP->isWeakImported()) { 6255 DefinedClasses[i]->setLinkage(llvm::GlobalVariable::ExternalLinkage); 6256 DefinedMetaClasses[i]->setLinkage(llvm::GlobalVariable::ExternalLinkage); 6257 } 6258 } 6259 6260 AddModuleClassList(DefinedClasses, "OBJC_LABEL_CLASS_$", 6261 GetSectionName("__objc_classlist", 6262 "regular,no_dead_strip")); 6263 6264 AddModuleClassList(DefinedNonLazyClasses, "OBJC_LABEL_NONLAZY_CLASS_$", 6265 GetSectionName("__objc_nlclslist", 6266 "regular,no_dead_strip")); 6267 6268 // Build list of all implemented category addresses in array 6269 // L_OBJC_LABEL_CATEGORY_$. 6270 AddModuleClassList(DefinedCategories, "OBJC_LABEL_CATEGORY_$", 6271 GetSectionName("__objc_catlist", 6272 "regular,no_dead_strip")); 6273 AddModuleClassList(DefinedStubCategories, "OBJC_LABEL_STUB_CATEGORY_$", 6274 GetSectionName("__objc_catlist2", 6275 "regular,no_dead_strip")); 6276 AddModuleClassList(DefinedNonLazyCategories, "OBJC_LABEL_NONLAZY_CATEGORY_$", 6277 GetSectionName("__objc_nlcatlist", 6278 "regular,no_dead_strip")); 6279 6280 EmitImageInfo(); 6281 } 6282 6283 /// isVTableDispatchedSelector - Returns true if SEL is not in the list of 6284 /// VTableDispatchMethods; false otherwise. What this means is that 6285 /// except for the 19 selectors in the list, we generate 32bit-style 6286 /// message dispatch call for all the rest. 6287 bool CGObjCNonFragileABIMac::isVTableDispatchedSelector(Selector Sel) { 6288 // At various points we've experimented with using vtable-based 6289 // dispatch for all methods. 6290 switch (CGM.getCodeGenOpts().getObjCDispatchMethod()) { 6291 case CodeGenOptions::Legacy: 6292 return false; 6293 case CodeGenOptions::NonLegacy: 6294 return true; 6295 case CodeGenOptions::Mixed: 6296 break; 6297 } 6298 6299 // If so, see whether this selector is in the white-list of things which must 6300 // use the new dispatch convention. We lazily build a dense set for this. 6301 if (VTableDispatchMethods.empty()) { 6302 VTableDispatchMethods.insert(GetNullarySelector("alloc")); 6303 VTableDispatchMethods.insert(GetNullarySelector("class")); 6304 VTableDispatchMethods.insert(GetNullarySelector("self")); 6305 VTableDispatchMethods.insert(GetNullarySelector("isFlipped")); 6306 VTableDispatchMethods.insert(GetNullarySelector("length")); 6307 VTableDispatchMethods.insert(GetNullarySelector("count")); 6308 6309 // These are vtable-based if GC is disabled. 6310 // Optimistically use vtable dispatch for hybrid compiles. 6311 if (CGM.getLangOpts().getGC() != LangOptions::GCOnly) { 6312 VTableDispatchMethods.insert(GetNullarySelector("retain")); 6313 VTableDispatchMethods.insert(GetNullarySelector("release")); 6314 VTableDispatchMethods.insert(GetNullarySelector("autorelease")); 6315 } 6316 6317 VTableDispatchMethods.insert(GetUnarySelector("allocWithZone")); 6318 VTableDispatchMethods.insert(GetUnarySelector("isKindOfClass")); 6319 VTableDispatchMethods.insert(GetUnarySelector("respondsToSelector")); 6320 VTableDispatchMethods.insert(GetUnarySelector("objectForKey")); 6321 VTableDispatchMethods.insert(GetUnarySelector("objectAtIndex")); 6322 VTableDispatchMethods.insert(GetUnarySelector("isEqualToString")); 6323 VTableDispatchMethods.insert(GetUnarySelector("isEqual")); 6324 6325 // These are vtable-based if GC is enabled. 6326 // Optimistically use vtable dispatch for hybrid compiles. 6327 if (CGM.getLangOpts().getGC() != LangOptions::NonGC) { 6328 VTableDispatchMethods.insert(GetNullarySelector("hash")); 6329 VTableDispatchMethods.insert(GetUnarySelector("addObject")); 6330 6331 // "countByEnumeratingWithState:objects:count" 6332 IdentifierInfo *KeyIdents[] = { 6333 &CGM.getContext().Idents.get("countByEnumeratingWithState"), 6334 &CGM.getContext().Idents.get("objects"), 6335 &CGM.getContext().Idents.get("count") 6336 }; 6337 VTableDispatchMethods.insert( 6338 CGM.getContext().Selectors.getSelector(3, KeyIdents)); 6339 } 6340 } 6341 6342 return VTableDispatchMethods.count(Sel); 6343 } 6344 6345 /// BuildClassRoTInitializer - generate meta-data for: 6346 /// struct _class_ro_t { 6347 /// uint32_t const flags; 6348 /// uint32_t const instanceStart; 6349 /// uint32_t const instanceSize; 6350 /// uint32_t const reserved; // only when building for 64bit targets 6351 /// const uint8_t * const ivarLayout; 6352 /// const char *const name; 6353 /// const struct _method_list_t * const baseMethods; 6354 /// const struct _protocol_list_t *const baseProtocols; 6355 /// const struct _ivar_list_t *const ivars; 6356 /// const uint8_t * const weakIvarLayout; 6357 /// const struct _prop_list_t * const properties; 6358 /// } 6359 /// 6360 llvm::GlobalVariable * CGObjCNonFragileABIMac::BuildClassRoTInitializer( 6361 unsigned flags, 6362 unsigned InstanceStart, 6363 unsigned InstanceSize, 6364 const ObjCImplementationDecl *ID) { 6365 std::string ClassName = std::string(ID->getObjCRuntimeNameAsString()); 6366 6367 CharUnits beginInstance = CharUnits::fromQuantity(InstanceStart); 6368 CharUnits endInstance = CharUnits::fromQuantity(InstanceSize); 6369 6370 bool hasMRCWeak = false; 6371 if (CGM.getLangOpts().ObjCAutoRefCount) 6372 flags |= NonFragileABI_Class_CompiledByARC; 6373 else if ((hasMRCWeak = hasMRCWeakIvars(CGM, ID))) 6374 flags |= NonFragileABI_Class_HasMRCWeakIvars; 6375 6376 ConstantInitBuilder builder(CGM); 6377 auto values = builder.beginStruct(ObjCTypes.ClassRonfABITy); 6378 6379 values.addInt(ObjCTypes.IntTy, flags); 6380 values.addInt(ObjCTypes.IntTy, InstanceStart); 6381 values.addInt(ObjCTypes.IntTy, InstanceSize); 6382 values.add((flags & NonFragileABI_Class_Meta) 6383 ? GetIvarLayoutName(nullptr, ObjCTypes) 6384 : BuildStrongIvarLayout(ID, beginInstance, endInstance)); 6385 values.add(GetClassName(ID->getObjCRuntimeNameAsString())); 6386 6387 // const struct _method_list_t * const baseMethods; 6388 SmallVector<const ObjCMethodDecl*, 16> methods; 6389 if (flags & NonFragileABI_Class_Meta) { 6390 for (const auto *MD : ID->class_methods()) 6391 if (!MD->isDirectMethod()) 6392 methods.push_back(MD); 6393 } else { 6394 for (const auto *MD : ID->instance_methods()) 6395 if (!MD->isDirectMethod()) 6396 methods.push_back(MD); 6397 } 6398 6399 values.add(emitMethodList(ID->getObjCRuntimeNameAsString(), 6400 (flags & NonFragileABI_Class_Meta) 6401 ? MethodListType::ClassMethods 6402 : MethodListType::InstanceMethods, 6403 methods)); 6404 6405 const ObjCInterfaceDecl *OID = ID->getClassInterface(); 6406 assert(OID && "CGObjCNonFragileABIMac::BuildClassRoTInitializer"); 6407 values.add(EmitProtocolList("_OBJC_CLASS_PROTOCOLS_$_" 6408 + OID->getObjCRuntimeNameAsString(), 6409 OID->all_referenced_protocol_begin(), 6410 OID->all_referenced_protocol_end())); 6411 6412 if (flags & NonFragileABI_Class_Meta) { 6413 values.addNullPointer(ObjCTypes.IvarListnfABIPtrTy); 6414 values.add(GetIvarLayoutName(nullptr, ObjCTypes)); 6415 values.add(EmitPropertyList( 6416 "_OBJC_$_CLASS_PROP_LIST_" + ID->getObjCRuntimeNameAsString(), 6417 ID, ID->getClassInterface(), ObjCTypes, true)); 6418 } else { 6419 values.add(EmitIvarList(ID)); 6420 values.add(BuildWeakIvarLayout(ID, beginInstance, endInstance, hasMRCWeak)); 6421 values.add(EmitPropertyList( 6422 "_OBJC_$_PROP_LIST_" + ID->getObjCRuntimeNameAsString(), 6423 ID, ID->getClassInterface(), ObjCTypes, false)); 6424 } 6425 6426 llvm::SmallString<64> roLabel; 6427 llvm::raw_svector_ostream(roLabel) 6428 << ((flags & NonFragileABI_Class_Meta) ? "_OBJC_METACLASS_RO_$_" 6429 : "_OBJC_CLASS_RO_$_") 6430 << ClassName; 6431 6432 return finishAndCreateGlobal(values, roLabel, CGM); 6433 } 6434 6435 /// Build the metaclass object for a class. 6436 /// 6437 /// struct _class_t { 6438 /// struct _class_t *isa; 6439 /// struct _class_t * const superclass; 6440 /// void *cache; 6441 /// IMP *vtable; 6442 /// struct class_ro_t *ro; 6443 /// } 6444 /// 6445 llvm::GlobalVariable * 6446 CGObjCNonFragileABIMac::BuildClassObject(const ObjCInterfaceDecl *CI, 6447 bool isMetaclass, 6448 llvm::Constant *IsAGV, 6449 llvm::Constant *SuperClassGV, 6450 llvm::Constant *ClassRoGV, 6451 bool HiddenVisibility) { 6452 ConstantInitBuilder builder(CGM); 6453 auto values = builder.beginStruct(ObjCTypes.ClassnfABITy); 6454 values.add(IsAGV); 6455 if (SuperClassGV) { 6456 values.add(SuperClassGV); 6457 } else { 6458 values.addNullPointer(ObjCTypes.ClassnfABIPtrTy); 6459 } 6460 values.add(ObjCEmptyCacheVar); 6461 values.add(ObjCEmptyVtableVar); 6462 values.add(ClassRoGV); 6463 6464 llvm::GlobalVariable *GV = 6465 cast<llvm::GlobalVariable>(GetClassGlobal(CI, isMetaclass, ForDefinition)); 6466 values.finishAndSetAsInitializer(GV); 6467 6468 if (CGM.getTriple().isOSBinFormatMachO()) 6469 GV->setSection("__DATA, __objc_data"); 6470 GV->setAlignment(llvm::Align( 6471 CGM.getDataLayout().getABITypeAlignment(ObjCTypes.ClassnfABITy))); 6472 if (!CGM.getTriple().isOSBinFormatCOFF()) 6473 if (HiddenVisibility) 6474 GV->setVisibility(llvm::GlobalValue::HiddenVisibility); 6475 return GV; 6476 } 6477 6478 bool CGObjCNonFragileABIMac::ImplementationIsNonLazy( 6479 const ObjCImplDecl *OD) const { 6480 return OD->getClassMethod(GetNullarySelector("load")) != nullptr || 6481 OD->getClassInterface()->hasAttr<ObjCNonLazyClassAttr>() || 6482 OD->hasAttr<ObjCNonLazyClassAttr>(); 6483 } 6484 6485 void CGObjCNonFragileABIMac::GetClassSizeInfo(const ObjCImplementationDecl *OID, 6486 uint32_t &InstanceStart, 6487 uint32_t &InstanceSize) { 6488 const ASTRecordLayout &RL = 6489 CGM.getContext().getASTObjCImplementationLayout(OID); 6490 6491 // InstanceSize is really instance end. 6492 InstanceSize = RL.getDataSize().getQuantity(); 6493 6494 // If there are no fields, the start is the same as the end. 6495 if (!RL.getFieldCount()) 6496 InstanceStart = InstanceSize; 6497 else 6498 InstanceStart = RL.getFieldOffset(0) / CGM.getContext().getCharWidth(); 6499 } 6500 6501 static llvm::GlobalValue::DLLStorageClassTypes getStorage(CodeGenModule &CGM, 6502 StringRef Name) { 6503 IdentifierInfo &II = CGM.getContext().Idents.get(Name); 6504 TranslationUnitDecl *TUDecl = CGM.getContext().getTranslationUnitDecl(); 6505 DeclContext *DC = TranslationUnitDecl::castToDeclContext(TUDecl); 6506 6507 const VarDecl *VD = nullptr; 6508 for (const auto &Result : DC->lookup(&II)) 6509 if ((VD = dyn_cast<VarDecl>(Result))) 6510 break; 6511 6512 if (!VD) 6513 return llvm::GlobalValue::DLLImportStorageClass; 6514 if (VD->hasAttr<DLLExportAttr>()) 6515 return llvm::GlobalValue::DLLExportStorageClass; 6516 if (VD->hasAttr<DLLImportAttr>()) 6517 return llvm::GlobalValue::DLLImportStorageClass; 6518 return llvm::GlobalValue::DefaultStorageClass; 6519 } 6520 6521 void CGObjCNonFragileABIMac::GenerateClass(const ObjCImplementationDecl *ID) { 6522 if (!ObjCEmptyCacheVar) { 6523 ObjCEmptyCacheVar = 6524 new llvm::GlobalVariable(CGM.getModule(), ObjCTypes.CacheTy, false, 6525 llvm::GlobalValue::ExternalLinkage, nullptr, 6526 "_objc_empty_cache"); 6527 if (CGM.getTriple().isOSBinFormatCOFF()) 6528 ObjCEmptyCacheVar->setDLLStorageClass(getStorage(CGM, "_objc_empty_cache")); 6529 6530 // Only OS X with deployment version <10.9 use the empty vtable symbol 6531 const llvm::Triple &Triple = CGM.getTarget().getTriple(); 6532 if (Triple.isMacOSX() && Triple.isMacOSXVersionLT(10, 9)) 6533 ObjCEmptyVtableVar = 6534 new llvm::GlobalVariable(CGM.getModule(), ObjCTypes.ImpnfABITy, false, 6535 llvm::GlobalValue::ExternalLinkage, nullptr, 6536 "_objc_empty_vtable"); 6537 else 6538 ObjCEmptyVtableVar = 6539 llvm::ConstantPointerNull::get(ObjCTypes.ImpnfABITy->getPointerTo()); 6540 } 6541 6542 // FIXME: Is this correct (that meta class size is never computed)? 6543 uint32_t InstanceStart = 6544 CGM.getDataLayout().getTypeAllocSize(ObjCTypes.ClassnfABITy); 6545 uint32_t InstanceSize = InstanceStart; 6546 uint32_t flags = NonFragileABI_Class_Meta; 6547 6548 llvm::Constant *SuperClassGV, *IsAGV; 6549 6550 const auto *CI = ID->getClassInterface(); 6551 assert(CI && "CGObjCNonFragileABIMac::GenerateClass - class is 0"); 6552 6553 // Build the flags for the metaclass. 6554 bool classIsHidden = (CGM.getTriple().isOSBinFormatCOFF()) 6555 ? !CI->hasAttr<DLLExportAttr>() 6556 : CI->getVisibility() == HiddenVisibility; 6557 if (classIsHidden) 6558 flags |= NonFragileABI_Class_Hidden; 6559 6560 // FIXME: why is this flag set on the metaclass? 6561 // ObjC metaclasses have no fields and don't really get constructed. 6562 if (ID->hasNonZeroConstructors() || ID->hasDestructors()) { 6563 flags |= NonFragileABI_Class_HasCXXStructors; 6564 if (!ID->hasNonZeroConstructors()) 6565 flags |= NonFragileABI_Class_HasCXXDestructorOnly; 6566 } 6567 6568 if (!CI->getSuperClass()) { 6569 // class is root 6570 flags |= NonFragileABI_Class_Root; 6571 6572 SuperClassGV = GetClassGlobal(CI, /*metaclass*/ false, NotForDefinition); 6573 IsAGV = GetClassGlobal(CI, /*metaclass*/ true, NotForDefinition); 6574 } else { 6575 // Has a root. Current class is not a root. 6576 const ObjCInterfaceDecl *Root = ID->getClassInterface(); 6577 while (const ObjCInterfaceDecl *Super = Root->getSuperClass()) 6578 Root = Super; 6579 6580 const auto *Super = CI->getSuperClass(); 6581 IsAGV = GetClassGlobal(Root, /*metaclass*/ true, NotForDefinition); 6582 SuperClassGV = GetClassGlobal(Super, /*metaclass*/ true, NotForDefinition); 6583 } 6584 6585 llvm::GlobalVariable *CLASS_RO_GV = 6586 BuildClassRoTInitializer(flags, InstanceStart, InstanceSize, ID); 6587 6588 llvm::GlobalVariable *MetaTClass = 6589 BuildClassObject(CI, /*metaclass*/ true, 6590 IsAGV, SuperClassGV, CLASS_RO_GV, classIsHidden); 6591 CGM.setGVProperties(MetaTClass, CI); 6592 DefinedMetaClasses.push_back(MetaTClass); 6593 6594 // Metadata for the class 6595 flags = 0; 6596 if (classIsHidden) 6597 flags |= NonFragileABI_Class_Hidden; 6598 6599 if (ID->hasNonZeroConstructors() || ID->hasDestructors()) { 6600 flags |= NonFragileABI_Class_HasCXXStructors; 6601 6602 // Set a flag to enable a runtime optimization when a class has 6603 // fields that require destruction but which don't require 6604 // anything except zero-initialization during construction. This 6605 // is most notably true of __strong and __weak types, but you can 6606 // also imagine there being C++ types with non-trivial default 6607 // constructors that merely set all fields to null. 6608 if (!ID->hasNonZeroConstructors()) 6609 flags |= NonFragileABI_Class_HasCXXDestructorOnly; 6610 } 6611 6612 if (hasObjCExceptionAttribute(CGM.getContext(), CI)) 6613 flags |= NonFragileABI_Class_Exception; 6614 6615 if (!CI->getSuperClass()) { 6616 flags |= NonFragileABI_Class_Root; 6617 SuperClassGV = nullptr; 6618 } else { 6619 // Has a root. Current class is not a root. 6620 const auto *Super = CI->getSuperClass(); 6621 SuperClassGV = GetClassGlobal(Super, /*metaclass*/ false, NotForDefinition); 6622 } 6623 6624 GetClassSizeInfo(ID, InstanceStart, InstanceSize); 6625 CLASS_RO_GV = 6626 BuildClassRoTInitializer(flags, InstanceStart, InstanceSize, ID); 6627 6628 llvm::GlobalVariable *ClassMD = 6629 BuildClassObject(CI, /*metaclass*/ false, 6630 MetaTClass, SuperClassGV, CLASS_RO_GV, classIsHidden); 6631 CGM.setGVProperties(ClassMD, CI); 6632 DefinedClasses.push_back(ClassMD); 6633 ImplementedClasses.push_back(CI); 6634 6635 // Determine if this class is also "non-lazy". 6636 if (ImplementationIsNonLazy(ID)) 6637 DefinedNonLazyClasses.push_back(ClassMD); 6638 6639 // Force the definition of the EHType if necessary. 6640 if (flags & NonFragileABI_Class_Exception) 6641 (void) GetInterfaceEHType(CI, ForDefinition); 6642 // Make sure method definition entries are all clear for next implementation. 6643 MethodDefinitions.clear(); 6644 } 6645 6646 /// GenerateProtocolRef - This routine is called to generate code for 6647 /// a protocol reference expression; as in: 6648 /// @code 6649 /// @protocol(Proto1); 6650 /// @endcode 6651 /// It generates a weak reference to l_OBJC_PROTOCOL_REFERENCE_$_Proto1 6652 /// which will hold address of the protocol meta-data. 6653 /// 6654 llvm::Value *CGObjCNonFragileABIMac::GenerateProtocolRef(CodeGenFunction &CGF, 6655 const ObjCProtocolDecl *PD) { 6656 6657 // This routine is called for @protocol only. So, we must build definition 6658 // of protocol's meta-data (not a reference to it!) 6659 // 6660 llvm::Constant *Init = 6661 llvm::ConstantExpr::getBitCast(GetOrEmitProtocol(PD), 6662 ObjCTypes.getExternalProtocolPtrTy()); 6663 6664 std::string ProtocolName("_OBJC_PROTOCOL_REFERENCE_$_"); 6665 ProtocolName += PD->getObjCRuntimeNameAsString(); 6666 6667 CharUnits Align = CGF.getPointerAlign(); 6668 6669 llvm::GlobalVariable *PTGV = CGM.getModule().getGlobalVariable(ProtocolName); 6670 if (PTGV) 6671 return CGF.Builder.CreateAlignedLoad(PTGV, Align); 6672 PTGV = new llvm::GlobalVariable(CGM.getModule(), Init->getType(), false, 6673 llvm::GlobalValue::WeakAnyLinkage, Init, 6674 ProtocolName); 6675 PTGV->setSection(GetSectionName("__objc_protorefs", 6676 "coalesced,no_dead_strip")); 6677 PTGV->setVisibility(llvm::GlobalValue::HiddenVisibility); 6678 PTGV->setAlignment(Align.getAsAlign()); 6679 if (!CGM.getTriple().isOSBinFormatMachO()) 6680 PTGV->setComdat(CGM.getModule().getOrInsertComdat(ProtocolName)); 6681 CGM.addUsedGlobal(PTGV); 6682 return CGF.Builder.CreateAlignedLoad(PTGV, Align); 6683 } 6684 6685 /// GenerateCategory - Build metadata for a category implementation. 6686 /// struct _category_t { 6687 /// const char * const name; 6688 /// struct _class_t *const cls; 6689 /// const struct _method_list_t * const instance_methods; 6690 /// const struct _method_list_t * const class_methods; 6691 /// const struct _protocol_list_t * const protocols; 6692 /// const struct _prop_list_t * const properties; 6693 /// const struct _prop_list_t * const class_properties; 6694 /// const uint32_t size; 6695 /// } 6696 /// 6697 void CGObjCNonFragileABIMac::GenerateCategory(const ObjCCategoryImplDecl *OCD) { 6698 const ObjCInterfaceDecl *Interface = OCD->getClassInterface(); 6699 const char *Prefix = "_OBJC_$_CATEGORY_"; 6700 6701 llvm::SmallString<64> ExtCatName(Prefix); 6702 ExtCatName += Interface->getObjCRuntimeNameAsString(); 6703 ExtCatName += "_$_"; 6704 ExtCatName += OCD->getNameAsString(); 6705 6706 ConstantInitBuilder builder(CGM); 6707 auto values = builder.beginStruct(ObjCTypes.CategorynfABITy); 6708 values.add(GetClassName(OCD->getIdentifier()->getName())); 6709 // meta-class entry symbol 6710 values.add(GetClassGlobal(Interface, /*metaclass*/ false, NotForDefinition)); 6711 std::string listName = 6712 (Interface->getObjCRuntimeNameAsString() + "_$_" + OCD->getName()).str(); 6713 6714 SmallVector<const ObjCMethodDecl *, 16> instanceMethods; 6715 SmallVector<const ObjCMethodDecl *, 8> classMethods; 6716 for (const auto *MD : OCD->methods()) { 6717 if (MD->isDirectMethod()) 6718 continue; 6719 if (MD->isInstanceMethod()) { 6720 instanceMethods.push_back(MD); 6721 } else { 6722 classMethods.push_back(MD); 6723 } 6724 } 6725 6726 values.add(emitMethodList(listName, MethodListType::CategoryInstanceMethods, 6727 instanceMethods)); 6728 values.add(emitMethodList(listName, MethodListType::CategoryClassMethods, 6729 classMethods)); 6730 6731 const ObjCCategoryDecl *Category = 6732 Interface->FindCategoryDeclaration(OCD->getIdentifier()); 6733 if (Category) { 6734 SmallString<256> ExtName; 6735 llvm::raw_svector_ostream(ExtName) << Interface->getObjCRuntimeNameAsString() << "_$_" 6736 << OCD->getName(); 6737 values.add(EmitProtocolList("_OBJC_CATEGORY_PROTOCOLS_$_" 6738 + Interface->getObjCRuntimeNameAsString() + "_$_" 6739 + Category->getName(), 6740 Category->protocol_begin(), 6741 Category->protocol_end())); 6742 values.add(EmitPropertyList("_OBJC_$_PROP_LIST_" + ExtName.str(), 6743 OCD, Category, ObjCTypes, false)); 6744 values.add(EmitPropertyList("_OBJC_$_CLASS_PROP_LIST_" + ExtName.str(), 6745 OCD, Category, ObjCTypes, true)); 6746 } else { 6747 values.addNullPointer(ObjCTypes.ProtocolListnfABIPtrTy); 6748 values.addNullPointer(ObjCTypes.PropertyListPtrTy); 6749 values.addNullPointer(ObjCTypes.PropertyListPtrTy); 6750 } 6751 6752 unsigned Size = CGM.getDataLayout().getTypeAllocSize(ObjCTypes.CategorynfABITy); 6753 values.addInt(ObjCTypes.IntTy, Size); 6754 6755 llvm::GlobalVariable *GCATV = 6756 finishAndCreateGlobal(values, ExtCatName.str(), CGM); 6757 CGM.addCompilerUsedGlobal(GCATV); 6758 if (Interface->hasAttr<ObjCClassStubAttr>()) 6759 DefinedStubCategories.push_back(GCATV); 6760 else 6761 DefinedCategories.push_back(GCATV); 6762 6763 // Determine if this category is also "non-lazy". 6764 if (ImplementationIsNonLazy(OCD)) 6765 DefinedNonLazyCategories.push_back(GCATV); 6766 // method definition entries must be clear for next implementation. 6767 MethodDefinitions.clear(); 6768 } 6769 6770 /// emitMethodConstant - Return a struct objc_method constant. If 6771 /// forProtocol is true, the implementation will be null; otherwise, 6772 /// the method must have a definition registered with the runtime. 6773 /// 6774 /// struct _objc_method { 6775 /// SEL _cmd; 6776 /// char *method_type; 6777 /// char *_imp; 6778 /// } 6779 void CGObjCNonFragileABIMac::emitMethodConstant(ConstantArrayBuilder &builder, 6780 const ObjCMethodDecl *MD, 6781 bool forProtocol) { 6782 auto method = builder.beginStruct(ObjCTypes.MethodTy); 6783 method.addBitCast(GetMethodVarName(MD->getSelector()), 6784 ObjCTypes.SelectorPtrTy); 6785 method.add(GetMethodVarType(MD)); 6786 6787 if (forProtocol) { 6788 // Protocol methods have no implementation. So, this entry is always NULL. 6789 method.addNullPointer(ObjCTypes.Int8PtrTy); 6790 } else { 6791 llvm::Function *fn = GetMethodDefinition(MD); 6792 assert(fn && "no definition for method?"); 6793 method.addBitCast(fn, ObjCTypes.Int8PtrTy); 6794 } 6795 6796 method.finishAndAddTo(builder); 6797 } 6798 6799 /// Build meta-data for method declarations. 6800 /// 6801 /// struct _method_list_t { 6802 /// uint32_t entsize; // sizeof(struct _objc_method) 6803 /// uint32_t method_count; 6804 /// struct _objc_method method_list[method_count]; 6805 /// } 6806 /// 6807 llvm::Constant * 6808 CGObjCNonFragileABIMac::emitMethodList(Twine name, MethodListType kind, 6809 ArrayRef<const ObjCMethodDecl *> methods) { 6810 // Return null for empty list. 6811 if (methods.empty()) 6812 return llvm::Constant::getNullValue(ObjCTypes.MethodListnfABIPtrTy); 6813 6814 StringRef prefix; 6815 bool forProtocol; 6816 switch (kind) { 6817 case MethodListType::CategoryInstanceMethods: 6818 prefix = "_OBJC_$_CATEGORY_INSTANCE_METHODS_"; 6819 forProtocol = false; 6820 break; 6821 case MethodListType::CategoryClassMethods: 6822 prefix = "_OBJC_$_CATEGORY_CLASS_METHODS_"; 6823 forProtocol = false; 6824 break; 6825 case MethodListType::InstanceMethods: 6826 prefix = "_OBJC_$_INSTANCE_METHODS_"; 6827 forProtocol = false; 6828 break; 6829 case MethodListType::ClassMethods: 6830 prefix = "_OBJC_$_CLASS_METHODS_"; 6831 forProtocol = false; 6832 break; 6833 6834 case MethodListType::ProtocolInstanceMethods: 6835 prefix = "_OBJC_$_PROTOCOL_INSTANCE_METHODS_"; 6836 forProtocol = true; 6837 break; 6838 case MethodListType::ProtocolClassMethods: 6839 prefix = "_OBJC_$_PROTOCOL_CLASS_METHODS_"; 6840 forProtocol = true; 6841 break; 6842 case MethodListType::OptionalProtocolInstanceMethods: 6843 prefix = "_OBJC_$_PROTOCOL_INSTANCE_METHODS_OPT_"; 6844 forProtocol = true; 6845 break; 6846 case MethodListType::OptionalProtocolClassMethods: 6847 prefix = "_OBJC_$_PROTOCOL_CLASS_METHODS_OPT_"; 6848 forProtocol = true; 6849 break; 6850 } 6851 6852 ConstantInitBuilder builder(CGM); 6853 auto values = builder.beginStruct(); 6854 6855 // sizeof(struct _objc_method) 6856 unsigned Size = CGM.getDataLayout().getTypeAllocSize(ObjCTypes.MethodTy); 6857 values.addInt(ObjCTypes.IntTy, Size); 6858 // method_count 6859 values.addInt(ObjCTypes.IntTy, methods.size()); 6860 auto methodArray = values.beginArray(ObjCTypes.MethodTy); 6861 for (auto MD : methods) 6862 emitMethodConstant(methodArray, MD, forProtocol); 6863 methodArray.finishAndAddTo(values); 6864 6865 llvm::GlobalVariable *GV = finishAndCreateGlobal(values, prefix + name, CGM); 6866 CGM.addCompilerUsedGlobal(GV); 6867 return llvm::ConstantExpr::getBitCast(GV, ObjCTypes.MethodListnfABIPtrTy); 6868 } 6869 6870 /// ObjCIvarOffsetVariable - Returns the ivar offset variable for 6871 /// the given ivar. 6872 llvm::GlobalVariable * 6873 CGObjCNonFragileABIMac::ObjCIvarOffsetVariable(const ObjCInterfaceDecl *ID, 6874 const ObjCIvarDecl *Ivar) { 6875 const ObjCInterfaceDecl *Container = Ivar->getContainingInterface(); 6876 llvm::SmallString<64> Name("OBJC_IVAR_$_"); 6877 Name += Container->getObjCRuntimeNameAsString(); 6878 Name += "."; 6879 Name += Ivar->getName(); 6880 llvm::GlobalVariable *IvarOffsetGV = CGM.getModule().getGlobalVariable(Name); 6881 if (!IvarOffsetGV) { 6882 IvarOffsetGV = 6883 new llvm::GlobalVariable(CGM.getModule(), ObjCTypes.IvarOffsetVarTy, 6884 false, llvm::GlobalValue::ExternalLinkage, 6885 nullptr, Name.str()); 6886 if (CGM.getTriple().isOSBinFormatCOFF()) { 6887 bool IsPrivateOrPackage = 6888 Ivar->getAccessControl() == ObjCIvarDecl::Private || 6889 Ivar->getAccessControl() == ObjCIvarDecl::Package; 6890 6891 const ObjCInterfaceDecl *ContainingID = Ivar->getContainingInterface(); 6892 6893 if (ContainingID->hasAttr<DLLImportAttr>()) 6894 IvarOffsetGV 6895 ->setDLLStorageClass(llvm::GlobalValue::DLLImportStorageClass); 6896 else if (ContainingID->hasAttr<DLLExportAttr>() && !IsPrivateOrPackage) 6897 IvarOffsetGV 6898 ->setDLLStorageClass(llvm::GlobalValue::DLLExportStorageClass); 6899 } 6900 } 6901 return IvarOffsetGV; 6902 } 6903 6904 llvm::Constant * 6905 CGObjCNonFragileABIMac::EmitIvarOffsetVar(const ObjCInterfaceDecl *ID, 6906 const ObjCIvarDecl *Ivar, 6907 unsigned long int Offset) { 6908 llvm::GlobalVariable *IvarOffsetGV = ObjCIvarOffsetVariable(ID, Ivar); 6909 IvarOffsetGV->setInitializer( 6910 llvm::ConstantInt::get(ObjCTypes.IvarOffsetVarTy, Offset)); 6911 IvarOffsetGV->setAlignment(llvm::Align( 6912 CGM.getDataLayout().getABITypeAlignment(ObjCTypes.IvarOffsetVarTy))); 6913 6914 if (!CGM.getTriple().isOSBinFormatCOFF()) { 6915 // FIXME: This matches gcc, but shouldn't the visibility be set on the use 6916 // as well (i.e., in ObjCIvarOffsetVariable). 6917 if (Ivar->getAccessControl() == ObjCIvarDecl::Private || 6918 Ivar->getAccessControl() == ObjCIvarDecl::Package || 6919 ID->getVisibility() == HiddenVisibility) 6920 IvarOffsetGV->setVisibility(llvm::GlobalValue::HiddenVisibility); 6921 else 6922 IvarOffsetGV->setVisibility(llvm::GlobalValue::DefaultVisibility); 6923 } 6924 6925 // If ID's layout is known, then make the global constant. This serves as a 6926 // useful assertion: we'll never use this variable to calculate ivar offsets, 6927 // so if the runtime tries to patch it then we should crash. 6928 if (isClassLayoutKnownStatically(ID)) 6929 IvarOffsetGV->setConstant(true); 6930 6931 if (CGM.getTriple().isOSBinFormatMachO()) 6932 IvarOffsetGV->setSection("__DATA, __objc_ivar"); 6933 return IvarOffsetGV; 6934 } 6935 6936 /// EmitIvarList - Emit the ivar list for the given 6937 /// implementation. The return value has type 6938 /// IvarListnfABIPtrTy. 6939 /// struct _ivar_t { 6940 /// unsigned [long] int *offset; // pointer to ivar offset location 6941 /// char *name; 6942 /// char *type; 6943 /// uint32_t alignment; 6944 /// uint32_t size; 6945 /// } 6946 /// struct _ivar_list_t { 6947 /// uint32 entsize; // sizeof(struct _ivar_t) 6948 /// uint32 count; 6949 /// struct _iver_t list[count]; 6950 /// } 6951 /// 6952 6953 llvm::Constant *CGObjCNonFragileABIMac::EmitIvarList( 6954 const ObjCImplementationDecl *ID) { 6955 6956 ConstantInitBuilder builder(CGM); 6957 auto ivarList = builder.beginStruct(); 6958 ivarList.addInt(ObjCTypes.IntTy, 6959 CGM.getDataLayout().getTypeAllocSize(ObjCTypes.IvarnfABITy)); 6960 auto ivarCountSlot = ivarList.addPlaceholder(); 6961 auto ivars = ivarList.beginArray(ObjCTypes.IvarnfABITy); 6962 6963 const ObjCInterfaceDecl *OID = ID->getClassInterface(); 6964 assert(OID && "CGObjCNonFragileABIMac::EmitIvarList - null interface"); 6965 6966 // FIXME. Consolidate this with similar code in GenerateClass. 6967 6968 for (const ObjCIvarDecl *IVD = OID->all_declared_ivar_begin(); 6969 IVD; IVD = IVD->getNextIvar()) { 6970 // Ignore unnamed bit-fields. 6971 if (!IVD->getDeclName()) 6972 continue; 6973 6974 auto ivar = ivars.beginStruct(ObjCTypes.IvarnfABITy); 6975 ivar.add(EmitIvarOffsetVar(ID->getClassInterface(), IVD, 6976 ComputeIvarBaseOffset(CGM, ID, IVD))); 6977 ivar.add(GetMethodVarName(IVD->getIdentifier())); 6978 ivar.add(GetMethodVarType(IVD)); 6979 llvm::Type *FieldTy = 6980 CGM.getTypes().ConvertTypeForMem(IVD->getType()); 6981 unsigned Size = CGM.getDataLayout().getTypeAllocSize(FieldTy); 6982 unsigned Align = CGM.getContext().getPreferredTypeAlign( 6983 IVD->getType().getTypePtr()) >> 3; 6984 Align = llvm::Log2_32(Align); 6985 ivar.addInt(ObjCTypes.IntTy, Align); 6986 // NOTE. Size of a bitfield does not match gcc's, because of the 6987 // way bitfields are treated special in each. But I am told that 6988 // 'size' for bitfield ivars is ignored by the runtime so it does 6989 // not matter. If it matters, there is enough info to get the 6990 // bitfield right! 6991 ivar.addInt(ObjCTypes.IntTy, Size); 6992 ivar.finishAndAddTo(ivars); 6993 } 6994 // Return null for empty list. 6995 if (ivars.empty()) { 6996 ivars.abandon(); 6997 ivarList.abandon(); 6998 return llvm::Constant::getNullValue(ObjCTypes.IvarListnfABIPtrTy); 6999 } 7000 7001 auto ivarCount = ivars.size(); 7002 ivars.finishAndAddTo(ivarList); 7003 ivarList.fillPlaceholderWithInt(ivarCountSlot, ObjCTypes.IntTy, ivarCount); 7004 7005 const char *Prefix = "_OBJC_$_INSTANCE_VARIABLES_"; 7006 llvm::GlobalVariable *GV = finishAndCreateGlobal( 7007 ivarList, Prefix + OID->getObjCRuntimeNameAsString(), CGM); 7008 CGM.addCompilerUsedGlobal(GV); 7009 return llvm::ConstantExpr::getBitCast(GV, ObjCTypes.IvarListnfABIPtrTy); 7010 } 7011 7012 llvm::Constant *CGObjCNonFragileABIMac::GetOrEmitProtocolRef( 7013 const ObjCProtocolDecl *PD) { 7014 llvm::GlobalVariable *&Entry = Protocols[PD->getIdentifier()]; 7015 7016 if (!Entry) { 7017 // We use the initializer as a marker of whether this is a forward 7018 // reference or not. At module finalization we add the empty 7019 // contents for protocols which were referenced but never defined. 7020 llvm::SmallString<64> Protocol; 7021 llvm::raw_svector_ostream(Protocol) << "_OBJC_PROTOCOL_$_" 7022 << PD->getObjCRuntimeNameAsString(); 7023 7024 Entry = new llvm::GlobalVariable(CGM.getModule(), ObjCTypes.ProtocolnfABITy, 7025 false, llvm::GlobalValue::ExternalLinkage, 7026 nullptr, Protocol); 7027 if (!CGM.getTriple().isOSBinFormatMachO()) 7028 Entry->setComdat(CGM.getModule().getOrInsertComdat(Protocol)); 7029 } 7030 7031 return Entry; 7032 } 7033 7034 /// GetOrEmitProtocol - Generate the protocol meta-data: 7035 /// @code 7036 /// struct _protocol_t { 7037 /// id isa; // NULL 7038 /// const char * const protocol_name; 7039 /// const struct _protocol_list_t * protocol_list; // super protocols 7040 /// const struct method_list_t * const instance_methods; 7041 /// const struct method_list_t * const class_methods; 7042 /// const struct method_list_t *optionalInstanceMethods; 7043 /// const struct method_list_t *optionalClassMethods; 7044 /// const struct _prop_list_t * properties; 7045 /// const uint32_t size; // sizeof(struct _protocol_t) 7046 /// const uint32_t flags; // = 0 7047 /// const char ** extendedMethodTypes; 7048 /// const char *demangledName; 7049 /// const struct _prop_list_t * class_properties; 7050 /// } 7051 /// @endcode 7052 /// 7053 7054 llvm::Constant *CGObjCNonFragileABIMac::GetOrEmitProtocol( 7055 const ObjCProtocolDecl *PD) { 7056 llvm::GlobalVariable *Entry = Protocols[PD->getIdentifier()]; 7057 7058 // Early exit if a defining object has already been generated. 7059 if (Entry && Entry->hasInitializer()) 7060 return Entry; 7061 7062 // Use the protocol definition, if there is one. 7063 assert(PD->hasDefinition() && 7064 "emitting protocol metadata without definition"); 7065 PD = PD->getDefinition(); 7066 7067 auto methodLists = ProtocolMethodLists::get(PD); 7068 7069 ConstantInitBuilder builder(CGM); 7070 auto values = builder.beginStruct(ObjCTypes.ProtocolnfABITy); 7071 7072 // isa is NULL 7073 values.addNullPointer(ObjCTypes.ObjectPtrTy); 7074 values.add(GetClassName(PD->getObjCRuntimeNameAsString())); 7075 values.add(EmitProtocolList("_OBJC_$_PROTOCOL_REFS_" 7076 + PD->getObjCRuntimeNameAsString(), 7077 PD->protocol_begin(), 7078 PD->protocol_end())); 7079 values.add(methodLists.emitMethodList(this, PD, 7080 ProtocolMethodLists::RequiredInstanceMethods)); 7081 values.add(methodLists.emitMethodList(this, PD, 7082 ProtocolMethodLists::RequiredClassMethods)); 7083 values.add(methodLists.emitMethodList(this, PD, 7084 ProtocolMethodLists::OptionalInstanceMethods)); 7085 values.add(methodLists.emitMethodList(this, PD, 7086 ProtocolMethodLists::OptionalClassMethods)); 7087 values.add(EmitPropertyList( 7088 "_OBJC_$_PROP_LIST_" + PD->getObjCRuntimeNameAsString(), 7089 nullptr, PD, ObjCTypes, false)); 7090 uint32_t Size = 7091 CGM.getDataLayout().getTypeAllocSize(ObjCTypes.ProtocolnfABITy); 7092 values.addInt(ObjCTypes.IntTy, Size); 7093 values.addInt(ObjCTypes.IntTy, 0); 7094 values.add(EmitProtocolMethodTypes("_OBJC_$_PROTOCOL_METHOD_TYPES_" 7095 + PD->getObjCRuntimeNameAsString(), 7096 methodLists.emitExtendedTypesArray(this), 7097 ObjCTypes)); 7098 7099 // const char *demangledName; 7100 values.addNullPointer(ObjCTypes.Int8PtrTy); 7101 7102 values.add(EmitPropertyList( 7103 "_OBJC_$_CLASS_PROP_LIST_" + PD->getObjCRuntimeNameAsString(), 7104 nullptr, PD, ObjCTypes, true)); 7105 7106 if (Entry) { 7107 // Already created, fix the linkage and update the initializer. 7108 Entry->setLinkage(llvm::GlobalValue::WeakAnyLinkage); 7109 values.finishAndSetAsInitializer(Entry); 7110 } else { 7111 llvm::SmallString<64> symbolName; 7112 llvm::raw_svector_ostream(symbolName) 7113 << "_OBJC_PROTOCOL_$_" << PD->getObjCRuntimeNameAsString(); 7114 7115 Entry = values.finishAndCreateGlobal(symbolName, CGM.getPointerAlign(), 7116 /*constant*/ false, 7117 llvm::GlobalValue::WeakAnyLinkage); 7118 if (!CGM.getTriple().isOSBinFormatMachO()) 7119 Entry->setComdat(CGM.getModule().getOrInsertComdat(symbolName)); 7120 7121 Protocols[PD->getIdentifier()] = Entry; 7122 } 7123 Entry->setVisibility(llvm::GlobalValue::HiddenVisibility); 7124 CGM.addUsedGlobal(Entry); 7125 7126 // Use this protocol meta-data to build protocol list table in section 7127 // __DATA, __objc_protolist 7128 llvm::SmallString<64> ProtocolRef; 7129 llvm::raw_svector_ostream(ProtocolRef) << "_OBJC_LABEL_PROTOCOL_$_" 7130 << PD->getObjCRuntimeNameAsString(); 7131 7132 llvm::GlobalVariable *PTGV = 7133 new llvm::GlobalVariable(CGM.getModule(), ObjCTypes.ProtocolnfABIPtrTy, 7134 false, llvm::GlobalValue::WeakAnyLinkage, Entry, 7135 ProtocolRef); 7136 if (!CGM.getTriple().isOSBinFormatMachO()) 7137 PTGV->setComdat(CGM.getModule().getOrInsertComdat(ProtocolRef)); 7138 PTGV->setAlignment(llvm::Align( 7139 CGM.getDataLayout().getABITypeAlignment(ObjCTypes.ProtocolnfABIPtrTy))); 7140 PTGV->setSection(GetSectionName("__objc_protolist", 7141 "coalesced,no_dead_strip")); 7142 PTGV->setVisibility(llvm::GlobalValue::HiddenVisibility); 7143 CGM.addUsedGlobal(PTGV); 7144 return Entry; 7145 } 7146 7147 /// EmitProtocolList - Generate protocol list meta-data: 7148 /// @code 7149 /// struct _protocol_list_t { 7150 /// long protocol_count; // Note, this is 32/64 bit 7151 /// struct _protocol_t[protocol_count]; 7152 /// } 7153 /// @endcode 7154 /// 7155 llvm::Constant * 7156 CGObjCNonFragileABIMac::EmitProtocolList(Twine Name, 7157 ObjCProtocolDecl::protocol_iterator begin, 7158 ObjCProtocolDecl::protocol_iterator end) { 7159 SmallVector<llvm::Constant *, 16> ProtocolRefs; 7160 7161 // Just return null for empty protocol lists 7162 if (begin == end) 7163 return llvm::Constant::getNullValue(ObjCTypes.ProtocolListnfABIPtrTy); 7164 7165 // FIXME: We shouldn't need to do this lookup here, should we? 7166 SmallString<256> TmpName; 7167 Name.toVector(TmpName); 7168 llvm::GlobalVariable *GV = 7169 CGM.getModule().getGlobalVariable(TmpName.str(), true); 7170 if (GV) 7171 return llvm::ConstantExpr::getBitCast(GV, ObjCTypes.ProtocolListnfABIPtrTy); 7172 7173 ConstantInitBuilder builder(CGM); 7174 auto values = builder.beginStruct(); 7175 auto countSlot = values.addPlaceholder(); 7176 7177 // A null-terminated array of protocols. 7178 auto array = values.beginArray(ObjCTypes.ProtocolnfABIPtrTy); 7179 for (; begin != end; ++begin) 7180 array.add(GetProtocolRef(*begin)); // Implemented??? 7181 auto count = array.size(); 7182 array.addNullPointer(ObjCTypes.ProtocolnfABIPtrTy); 7183 7184 array.finishAndAddTo(values); 7185 values.fillPlaceholderWithInt(countSlot, ObjCTypes.LongTy, count); 7186 7187 GV = finishAndCreateGlobal(values, Name, CGM); 7188 CGM.addCompilerUsedGlobal(GV); 7189 return llvm::ConstantExpr::getBitCast(GV, 7190 ObjCTypes.ProtocolListnfABIPtrTy); 7191 } 7192 7193 /// EmitObjCValueForIvar - Code Gen for nonfragile ivar reference. 7194 /// This code gen. amounts to generating code for: 7195 /// @code 7196 /// (type *)((char *)base + _OBJC_IVAR_$_.ivar; 7197 /// @encode 7198 /// 7199 LValue CGObjCNonFragileABIMac::EmitObjCValueForIvar( 7200 CodeGen::CodeGenFunction &CGF, 7201 QualType ObjectTy, 7202 llvm::Value *BaseValue, 7203 const ObjCIvarDecl *Ivar, 7204 unsigned CVRQualifiers) { 7205 ObjCInterfaceDecl *ID = ObjectTy->castAs<ObjCObjectType>()->getInterface(); 7206 llvm::Value *Offset = EmitIvarOffset(CGF, ID, Ivar); 7207 return EmitValueForIvarAtOffset(CGF, ID, BaseValue, Ivar, CVRQualifiers, 7208 Offset); 7209 } 7210 7211 llvm::Value * 7212 CGObjCNonFragileABIMac::EmitIvarOffset(CodeGen::CodeGenFunction &CGF, 7213 const ObjCInterfaceDecl *Interface, 7214 const ObjCIvarDecl *Ivar) { 7215 llvm::Value *IvarOffsetValue; 7216 if (isClassLayoutKnownStatically(Interface)) { 7217 IvarOffsetValue = llvm::ConstantInt::get( 7218 ObjCTypes.IvarOffsetVarTy, 7219 ComputeIvarBaseOffset(CGM, Interface->getImplementation(), Ivar)); 7220 } else { 7221 llvm::GlobalVariable *GV = ObjCIvarOffsetVariable(Interface, Ivar); 7222 IvarOffsetValue = 7223 CGF.Builder.CreateAlignedLoad(GV, CGF.getSizeAlign(), "ivar"); 7224 if (IsIvarOffsetKnownIdempotent(CGF, Ivar)) 7225 cast<llvm::LoadInst>(IvarOffsetValue) 7226 ->setMetadata(CGM.getModule().getMDKindID("invariant.load"), 7227 llvm::MDNode::get(VMContext, None)); 7228 } 7229 7230 // This could be 32bit int or 64bit integer depending on the architecture. 7231 // Cast it to 64bit integer value, if it is a 32bit integer ivar offset value 7232 // as this is what caller always expects. 7233 if (ObjCTypes.IvarOffsetVarTy == ObjCTypes.IntTy) 7234 IvarOffsetValue = CGF.Builder.CreateIntCast( 7235 IvarOffsetValue, ObjCTypes.LongTy, true, "ivar.conv"); 7236 return IvarOffsetValue; 7237 } 7238 7239 static void appendSelectorForMessageRefTable(std::string &buffer, 7240 Selector selector) { 7241 if (selector.isUnarySelector()) { 7242 buffer += selector.getNameForSlot(0); 7243 return; 7244 } 7245 7246 for (unsigned i = 0, e = selector.getNumArgs(); i != e; ++i) { 7247 buffer += selector.getNameForSlot(i); 7248 buffer += '_'; 7249 } 7250 } 7251 7252 /// Emit a "vtable" message send. We emit a weak hidden-visibility 7253 /// struct, initially containing the selector pointer and a pointer to 7254 /// a "fixup" variant of the appropriate objc_msgSend. To call, we 7255 /// load and call the function pointer, passing the address of the 7256 /// struct as the second parameter. The runtime determines whether 7257 /// the selector is currently emitted using vtable dispatch; if so, it 7258 /// substitutes a stub function which simply tail-calls through the 7259 /// appropriate vtable slot, and if not, it substitues a stub function 7260 /// which tail-calls objc_msgSend. Both stubs adjust the selector 7261 /// argument to correctly point to the selector. 7262 RValue 7263 CGObjCNonFragileABIMac::EmitVTableMessageSend(CodeGenFunction &CGF, 7264 ReturnValueSlot returnSlot, 7265 QualType resultType, 7266 Selector selector, 7267 llvm::Value *arg0, 7268 QualType arg0Type, 7269 bool isSuper, 7270 const CallArgList &formalArgs, 7271 const ObjCMethodDecl *method) { 7272 // Compute the actual arguments. 7273 CallArgList args; 7274 7275 // First argument: the receiver / super-call structure. 7276 if (!isSuper) 7277 arg0 = CGF.Builder.CreateBitCast(arg0, ObjCTypes.ObjectPtrTy); 7278 args.add(RValue::get(arg0), arg0Type); 7279 7280 // Second argument: a pointer to the message ref structure. Leave 7281 // the actual argument value blank for now. 7282 args.add(RValue::get(nullptr), ObjCTypes.MessageRefCPtrTy); 7283 7284 args.insert(args.end(), formalArgs.begin(), formalArgs.end()); 7285 7286 MessageSendInfo MSI = getMessageSendInfo(method, resultType, args); 7287 7288 NullReturnState nullReturn; 7289 7290 // Find the function to call and the mangled name for the message 7291 // ref structure. Using a different mangled name wouldn't actually 7292 // be a problem; it would just be a waste. 7293 // 7294 // The runtime currently never uses vtable dispatch for anything 7295 // except normal, non-super message-sends. 7296 // FIXME: don't use this for that. 7297 llvm::FunctionCallee fn = nullptr; 7298 std::string messageRefName("_"); 7299 if (CGM.ReturnSlotInterferesWithArgs(MSI.CallInfo)) { 7300 if (isSuper) { 7301 fn = ObjCTypes.getMessageSendSuper2StretFixupFn(); 7302 messageRefName += "objc_msgSendSuper2_stret_fixup"; 7303 } else { 7304 nullReturn.init(CGF, arg0); 7305 fn = ObjCTypes.getMessageSendStretFixupFn(); 7306 messageRefName += "objc_msgSend_stret_fixup"; 7307 } 7308 } else if (!isSuper && CGM.ReturnTypeUsesFPRet(resultType)) { 7309 fn = ObjCTypes.getMessageSendFpretFixupFn(); 7310 messageRefName += "objc_msgSend_fpret_fixup"; 7311 } else { 7312 if (isSuper) { 7313 fn = ObjCTypes.getMessageSendSuper2FixupFn(); 7314 messageRefName += "objc_msgSendSuper2_fixup"; 7315 } else { 7316 fn = ObjCTypes.getMessageSendFixupFn(); 7317 messageRefName += "objc_msgSend_fixup"; 7318 } 7319 } 7320 assert(fn && "CGObjCNonFragileABIMac::EmitMessageSend"); 7321 messageRefName += '_'; 7322 7323 // Append the selector name, except use underscores anywhere we 7324 // would have used colons. 7325 appendSelectorForMessageRefTable(messageRefName, selector); 7326 7327 llvm::GlobalVariable *messageRef 7328 = CGM.getModule().getGlobalVariable(messageRefName); 7329 if (!messageRef) { 7330 // Build the message ref structure. 7331 ConstantInitBuilder builder(CGM); 7332 auto values = builder.beginStruct(); 7333 values.add(cast<llvm::Constant>(fn.getCallee())); 7334 values.add(GetMethodVarName(selector)); 7335 messageRef = values.finishAndCreateGlobal(messageRefName, 7336 CharUnits::fromQuantity(16), 7337 /*constant*/ false, 7338 llvm::GlobalValue::WeakAnyLinkage); 7339 messageRef->setVisibility(llvm::GlobalValue::HiddenVisibility); 7340 messageRef->setSection(GetSectionName("__objc_msgrefs", "coalesced")); 7341 } 7342 7343 bool requiresnullCheck = false; 7344 if (CGM.getLangOpts().ObjCAutoRefCount && method) 7345 for (const auto *ParamDecl : method->parameters()) { 7346 if (ParamDecl->hasAttr<NSConsumedAttr>()) { 7347 if (!nullReturn.NullBB) 7348 nullReturn.init(CGF, arg0); 7349 requiresnullCheck = true; 7350 break; 7351 } 7352 } 7353 7354 Address mref = 7355 Address(CGF.Builder.CreateBitCast(messageRef, ObjCTypes.MessageRefPtrTy), 7356 CGF.getPointerAlign()); 7357 7358 // Update the message ref argument. 7359 args[1].setRValue(RValue::get(mref.getPointer())); 7360 7361 // Load the function to call from the message ref table. 7362 Address calleeAddr = CGF.Builder.CreateStructGEP(mref, 0); 7363 llvm::Value *calleePtr = CGF.Builder.CreateLoad(calleeAddr, "msgSend_fn"); 7364 7365 calleePtr = CGF.Builder.CreateBitCast(calleePtr, MSI.MessengerType); 7366 CGCallee callee(CGCalleeInfo(), calleePtr); 7367 7368 RValue result = CGF.EmitCall(MSI.CallInfo, callee, returnSlot, args); 7369 return nullReturn.complete(CGF, returnSlot, result, resultType, formalArgs, 7370 requiresnullCheck ? method : nullptr); 7371 } 7372 7373 /// Generate code for a message send expression in the nonfragile abi. 7374 CodeGen::RValue 7375 CGObjCNonFragileABIMac::GenerateMessageSend(CodeGen::CodeGenFunction &CGF, 7376 ReturnValueSlot Return, 7377 QualType ResultType, 7378 Selector Sel, 7379 llvm::Value *Receiver, 7380 const CallArgList &CallArgs, 7381 const ObjCInterfaceDecl *Class, 7382 const ObjCMethodDecl *Method) { 7383 return isVTableDispatchedSelector(Sel) 7384 ? EmitVTableMessageSend(CGF, Return, ResultType, Sel, 7385 Receiver, CGF.getContext().getObjCIdType(), 7386 false, CallArgs, Method) 7387 : EmitMessageSend(CGF, Return, ResultType, Sel, 7388 Receiver, CGF.getContext().getObjCIdType(), 7389 false, CallArgs, Method, Class, ObjCTypes); 7390 } 7391 7392 llvm::Constant * 7393 CGObjCNonFragileABIMac::GetClassGlobal(const ObjCInterfaceDecl *ID, 7394 bool metaclass, 7395 ForDefinition_t isForDefinition) { 7396 auto prefix = 7397 (metaclass ? getMetaclassSymbolPrefix() : getClassSymbolPrefix()); 7398 return GetClassGlobal((prefix + ID->getObjCRuntimeNameAsString()).str(), 7399 isForDefinition, 7400 ID->isWeakImported(), 7401 !isForDefinition 7402 && CGM.getTriple().isOSBinFormatCOFF() 7403 && ID->hasAttr<DLLImportAttr>()); 7404 } 7405 7406 llvm::Constant * 7407 CGObjCNonFragileABIMac::GetClassGlobal(StringRef Name, 7408 ForDefinition_t IsForDefinition, 7409 bool Weak, bool DLLImport) { 7410 llvm::GlobalValue::LinkageTypes L = 7411 Weak ? llvm::GlobalValue::ExternalWeakLinkage 7412 : llvm::GlobalValue::ExternalLinkage; 7413 7414 llvm::GlobalVariable *GV = CGM.getModule().getGlobalVariable(Name); 7415 if (!GV || GV->getType() != ObjCTypes.ClassnfABITy->getPointerTo()) { 7416 auto *NewGV = new llvm::GlobalVariable(ObjCTypes.ClassnfABITy, false, L, 7417 nullptr, Name); 7418 7419 if (DLLImport) 7420 NewGV->setDLLStorageClass(llvm::GlobalValue::DLLImportStorageClass); 7421 7422 if (GV) { 7423 GV->replaceAllUsesWith( 7424 llvm::ConstantExpr::getBitCast(NewGV, GV->getType())); 7425 GV->eraseFromParent(); 7426 } 7427 GV = NewGV; 7428 CGM.getModule().getGlobalList().push_back(GV); 7429 } 7430 7431 assert(GV->getLinkage() == L); 7432 return GV; 7433 } 7434 7435 llvm::Constant * 7436 CGObjCNonFragileABIMac::GetClassGlobalForClassRef(const ObjCInterfaceDecl *ID) { 7437 llvm::Constant *ClassGV = GetClassGlobal(ID, /*metaclass*/ false, 7438 NotForDefinition); 7439 7440 if (!ID->hasAttr<ObjCClassStubAttr>()) 7441 return ClassGV; 7442 7443 ClassGV = llvm::ConstantExpr::getPointerCast(ClassGV, ObjCTypes.Int8PtrTy); 7444 7445 // Stub classes are pointer-aligned. Classrefs pointing at stub classes 7446 // must set the least significant bit set to 1. 7447 auto *Idx = llvm::ConstantInt::get(CGM.Int32Ty, 1); 7448 return llvm::ConstantExpr::getGetElementPtr(CGM.Int8Ty, ClassGV, Idx); 7449 } 7450 7451 llvm::Value * 7452 CGObjCNonFragileABIMac::EmitLoadOfClassRef(CodeGenFunction &CGF, 7453 const ObjCInterfaceDecl *ID, 7454 llvm::GlobalVariable *Entry) { 7455 if (ID && ID->hasAttr<ObjCClassStubAttr>()) { 7456 // Classrefs pointing at Objective-C stub classes must be loaded by calling 7457 // a special runtime function. 7458 return CGF.EmitRuntimeCall( 7459 ObjCTypes.getLoadClassrefFn(), Entry, "load_classref_result"); 7460 } 7461 7462 CharUnits Align = CGF.getPointerAlign(); 7463 return CGF.Builder.CreateAlignedLoad(Entry, Align); 7464 } 7465 7466 llvm::Value * 7467 CGObjCNonFragileABIMac::EmitClassRefFromId(CodeGenFunction &CGF, 7468 IdentifierInfo *II, 7469 const ObjCInterfaceDecl *ID) { 7470 llvm::GlobalVariable *&Entry = ClassReferences[II]; 7471 7472 if (!Entry) { 7473 llvm::Constant *ClassGV; 7474 if (ID) { 7475 ClassGV = GetClassGlobalForClassRef(ID); 7476 } else { 7477 ClassGV = GetClassGlobal((getClassSymbolPrefix() + II->getName()).str(), 7478 NotForDefinition); 7479 assert(ClassGV->getType() == ObjCTypes.ClassnfABIPtrTy && 7480 "classref was emitted with the wrong type?"); 7481 } 7482 7483 std::string SectionName = 7484 GetSectionName("__objc_classrefs", "regular,no_dead_strip"); 7485 Entry = new llvm::GlobalVariable( 7486 CGM.getModule(), ClassGV->getType(), false, 7487 getLinkageTypeForObjCMetadata(CGM, SectionName), ClassGV, 7488 "OBJC_CLASSLIST_REFERENCES_$_"); 7489 Entry->setAlignment(CGF.getPointerAlign().getAsAlign()); 7490 if (!ID || !ID->hasAttr<ObjCClassStubAttr>()) 7491 Entry->setSection(SectionName); 7492 7493 CGM.addCompilerUsedGlobal(Entry); 7494 } 7495 7496 return EmitLoadOfClassRef(CGF, ID, Entry); 7497 } 7498 7499 llvm::Value *CGObjCNonFragileABIMac::EmitClassRef(CodeGenFunction &CGF, 7500 const ObjCInterfaceDecl *ID) { 7501 // If the class has the objc_runtime_visible attribute, we need to 7502 // use the Objective-C runtime to get the class. 7503 if (ID->hasAttr<ObjCRuntimeVisibleAttr>()) 7504 return EmitClassRefViaRuntime(CGF, ID, ObjCTypes); 7505 7506 return EmitClassRefFromId(CGF, ID->getIdentifier(), ID); 7507 } 7508 7509 llvm::Value *CGObjCNonFragileABIMac::EmitNSAutoreleasePoolClassRef( 7510 CodeGenFunction &CGF) { 7511 IdentifierInfo *II = &CGM.getContext().Idents.get("NSAutoreleasePool"); 7512 return EmitClassRefFromId(CGF, II, nullptr); 7513 } 7514 7515 llvm::Value * 7516 CGObjCNonFragileABIMac::EmitSuperClassRef(CodeGenFunction &CGF, 7517 const ObjCInterfaceDecl *ID) { 7518 llvm::GlobalVariable *&Entry = SuperClassReferences[ID->getIdentifier()]; 7519 7520 if (!Entry) { 7521 llvm::Constant *ClassGV = GetClassGlobalForClassRef(ID); 7522 std::string SectionName = 7523 GetSectionName("__objc_superrefs", "regular,no_dead_strip"); 7524 Entry = new llvm::GlobalVariable(CGM.getModule(), ClassGV->getType(), false, 7525 llvm::GlobalValue::PrivateLinkage, ClassGV, 7526 "OBJC_CLASSLIST_SUP_REFS_$_"); 7527 Entry->setAlignment(CGF.getPointerAlign().getAsAlign()); 7528 Entry->setSection(SectionName); 7529 CGM.addCompilerUsedGlobal(Entry); 7530 } 7531 7532 return EmitLoadOfClassRef(CGF, ID, Entry); 7533 } 7534 7535 /// EmitMetaClassRef - Return a Value * of the address of _class_t 7536 /// meta-data 7537 /// 7538 llvm::Value *CGObjCNonFragileABIMac::EmitMetaClassRef(CodeGenFunction &CGF, 7539 const ObjCInterfaceDecl *ID, 7540 bool Weak) { 7541 CharUnits Align = CGF.getPointerAlign(); 7542 llvm::GlobalVariable * &Entry = MetaClassReferences[ID->getIdentifier()]; 7543 if (!Entry) { 7544 auto MetaClassGV = GetClassGlobal(ID, /*metaclass*/ true, NotForDefinition); 7545 std::string SectionName = 7546 GetSectionName("__objc_superrefs", "regular,no_dead_strip"); 7547 Entry = new llvm::GlobalVariable(CGM.getModule(), ObjCTypes.ClassnfABIPtrTy, 7548 false, llvm::GlobalValue::PrivateLinkage, 7549 MetaClassGV, "OBJC_CLASSLIST_SUP_REFS_$_"); 7550 Entry->setAlignment(Align.getAsAlign()); 7551 Entry->setSection(SectionName); 7552 CGM.addCompilerUsedGlobal(Entry); 7553 } 7554 7555 return CGF.Builder.CreateAlignedLoad(Entry, Align); 7556 } 7557 7558 /// GetClass - Return a reference to the class for the given interface 7559 /// decl. 7560 llvm::Value *CGObjCNonFragileABIMac::GetClass(CodeGenFunction &CGF, 7561 const ObjCInterfaceDecl *ID) { 7562 if (ID->isWeakImported()) { 7563 auto ClassGV = GetClassGlobal(ID, /*metaclass*/ false, NotForDefinition); 7564 (void)ClassGV; 7565 assert(!isa<llvm::GlobalVariable>(ClassGV) || 7566 cast<llvm::GlobalVariable>(ClassGV)->hasExternalWeakLinkage()); 7567 } 7568 7569 return EmitClassRef(CGF, ID); 7570 } 7571 7572 /// Generates a message send where the super is the receiver. This is 7573 /// a message send to self with special delivery semantics indicating 7574 /// which class's method should be called. 7575 CodeGen::RValue 7576 CGObjCNonFragileABIMac::GenerateMessageSendSuper(CodeGen::CodeGenFunction &CGF, 7577 ReturnValueSlot Return, 7578 QualType ResultType, 7579 Selector Sel, 7580 const ObjCInterfaceDecl *Class, 7581 bool isCategoryImpl, 7582 llvm::Value *Receiver, 7583 bool IsClassMessage, 7584 const CodeGen::CallArgList &CallArgs, 7585 const ObjCMethodDecl *Method) { 7586 // ... 7587 // Create and init a super structure; this is a (receiver, class) 7588 // pair we will pass to objc_msgSendSuper. 7589 Address ObjCSuper = 7590 CGF.CreateTempAlloca(ObjCTypes.SuperTy, CGF.getPointerAlign(), 7591 "objc_super"); 7592 7593 llvm::Value *ReceiverAsObject = 7594 CGF.Builder.CreateBitCast(Receiver, ObjCTypes.ObjectPtrTy); 7595 CGF.Builder.CreateStore(ReceiverAsObject, 7596 CGF.Builder.CreateStructGEP(ObjCSuper, 0)); 7597 7598 // If this is a class message the metaclass is passed as the target. 7599 llvm::Value *Target; 7600 if (IsClassMessage) 7601 Target = EmitMetaClassRef(CGF, Class, Class->isWeakImported()); 7602 else 7603 Target = EmitSuperClassRef(CGF, Class); 7604 7605 // FIXME: We shouldn't need to do this cast, rectify the ASTContext and 7606 // ObjCTypes types. 7607 llvm::Type *ClassTy = 7608 CGM.getTypes().ConvertType(CGF.getContext().getObjCClassType()); 7609 Target = CGF.Builder.CreateBitCast(Target, ClassTy); 7610 CGF.Builder.CreateStore(Target, CGF.Builder.CreateStructGEP(ObjCSuper, 1)); 7611 7612 return (isVTableDispatchedSelector(Sel)) 7613 ? EmitVTableMessageSend(CGF, Return, ResultType, Sel, 7614 ObjCSuper.getPointer(), ObjCTypes.SuperPtrCTy, 7615 true, CallArgs, Method) 7616 : EmitMessageSend(CGF, Return, ResultType, Sel, 7617 ObjCSuper.getPointer(), ObjCTypes.SuperPtrCTy, 7618 true, CallArgs, Method, Class, ObjCTypes); 7619 } 7620 7621 llvm::Value *CGObjCNonFragileABIMac::EmitSelector(CodeGenFunction &CGF, 7622 Selector Sel) { 7623 Address Addr = EmitSelectorAddr(Sel); 7624 7625 llvm::LoadInst* LI = CGF.Builder.CreateLoad(Addr); 7626 LI->setMetadata(CGM.getModule().getMDKindID("invariant.load"), 7627 llvm::MDNode::get(VMContext, None)); 7628 return LI; 7629 } 7630 7631 Address CGObjCNonFragileABIMac::EmitSelectorAddr(Selector Sel) { 7632 llvm::GlobalVariable *&Entry = SelectorReferences[Sel]; 7633 CharUnits Align = CGM.getPointerAlign(); 7634 if (!Entry) { 7635 llvm::Constant *Casted = 7636 llvm::ConstantExpr::getBitCast(GetMethodVarName(Sel), 7637 ObjCTypes.SelectorPtrTy); 7638 std::string SectionName = 7639 GetSectionName("__objc_selrefs", "literal_pointers,no_dead_strip"); 7640 Entry = new llvm::GlobalVariable( 7641 CGM.getModule(), ObjCTypes.SelectorPtrTy, false, 7642 getLinkageTypeForObjCMetadata(CGM, SectionName), Casted, 7643 "OBJC_SELECTOR_REFERENCES_"); 7644 Entry->setExternallyInitialized(true); 7645 Entry->setSection(SectionName); 7646 Entry->setAlignment(Align.getAsAlign()); 7647 CGM.addCompilerUsedGlobal(Entry); 7648 } 7649 7650 return Address(Entry, Align); 7651 } 7652 7653 /// EmitObjCIvarAssign - Code gen for assigning to a __strong object. 7654 /// objc_assign_ivar (id src, id *dst, ptrdiff_t) 7655 /// 7656 void CGObjCNonFragileABIMac::EmitObjCIvarAssign(CodeGen::CodeGenFunction &CGF, 7657 llvm::Value *src, 7658 Address dst, 7659 llvm::Value *ivarOffset) { 7660 llvm::Type * SrcTy = src->getType(); 7661 if (!isa<llvm::PointerType>(SrcTy)) { 7662 unsigned Size = CGM.getDataLayout().getTypeAllocSize(SrcTy); 7663 assert(Size <= 8 && "does not support size > 8"); 7664 src = (Size == 4 ? CGF.Builder.CreateBitCast(src, ObjCTypes.IntTy) 7665 : CGF.Builder.CreateBitCast(src, ObjCTypes.LongTy)); 7666 src = CGF.Builder.CreateIntToPtr(src, ObjCTypes.Int8PtrTy); 7667 } 7668 src = CGF.Builder.CreateBitCast(src, ObjCTypes.ObjectPtrTy); 7669 dst = CGF.Builder.CreateBitCast(dst, ObjCTypes.PtrObjectPtrTy); 7670 llvm::Value *args[] = { src, dst.getPointer(), ivarOffset }; 7671 CGF.EmitNounwindRuntimeCall(ObjCTypes.getGcAssignIvarFn(), args); 7672 } 7673 7674 /// EmitObjCStrongCastAssign - Code gen for assigning to a __strong cast object. 7675 /// objc_assign_strongCast (id src, id *dst) 7676 /// 7677 void CGObjCNonFragileABIMac::EmitObjCStrongCastAssign( 7678 CodeGen::CodeGenFunction &CGF, 7679 llvm::Value *src, Address dst) { 7680 llvm::Type * SrcTy = src->getType(); 7681 if (!isa<llvm::PointerType>(SrcTy)) { 7682 unsigned Size = CGM.getDataLayout().getTypeAllocSize(SrcTy); 7683 assert(Size <= 8 && "does not support size > 8"); 7684 src = (Size == 4 ? CGF.Builder.CreateBitCast(src, ObjCTypes.IntTy) 7685 : CGF.Builder.CreateBitCast(src, ObjCTypes.LongTy)); 7686 src = CGF.Builder.CreateIntToPtr(src, ObjCTypes.Int8PtrTy); 7687 } 7688 src = CGF.Builder.CreateBitCast(src, ObjCTypes.ObjectPtrTy); 7689 dst = CGF.Builder.CreateBitCast(dst, ObjCTypes.PtrObjectPtrTy); 7690 llvm::Value *args[] = { src, dst.getPointer() }; 7691 CGF.EmitNounwindRuntimeCall(ObjCTypes.getGcAssignStrongCastFn(), 7692 args, "weakassign"); 7693 } 7694 7695 void CGObjCNonFragileABIMac::EmitGCMemmoveCollectable( 7696 CodeGen::CodeGenFunction &CGF, 7697 Address DestPtr, 7698 Address SrcPtr, 7699 llvm::Value *Size) { 7700 SrcPtr = CGF.Builder.CreateBitCast(SrcPtr, ObjCTypes.Int8PtrTy); 7701 DestPtr = CGF.Builder.CreateBitCast(DestPtr, ObjCTypes.Int8PtrTy); 7702 llvm::Value *args[] = { DestPtr.getPointer(), SrcPtr.getPointer(), Size }; 7703 CGF.EmitNounwindRuntimeCall(ObjCTypes.GcMemmoveCollectableFn(), args); 7704 } 7705 7706 /// EmitObjCWeakRead - Code gen for loading value of a __weak 7707 /// object: objc_read_weak (id *src) 7708 /// 7709 llvm::Value * CGObjCNonFragileABIMac::EmitObjCWeakRead( 7710 CodeGen::CodeGenFunction &CGF, 7711 Address AddrWeakObj) { 7712 llvm::Type *DestTy = AddrWeakObj.getElementType(); 7713 AddrWeakObj = CGF.Builder.CreateBitCast(AddrWeakObj, ObjCTypes.PtrObjectPtrTy); 7714 llvm::Value *read_weak = 7715 CGF.EmitNounwindRuntimeCall(ObjCTypes.getGcReadWeakFn(), 7716 AddrWeakObj.getPointer(), "weakread"); 7717 read_weak = CGF.Builder.CreateBitCast(read_weak, DestTy); 7718 return read_weak; 7719 } 7720 7721 /// EmitObjCWeakAssign - Code gen for assigning to a __weak object. 7722 /// objc_assign_weak (id src, id *dst) 7723 /// 7724 void CGObjCNonFragileABIMac::EmitObjCWeakAssign(CodeGen::CodeGenFunction &CGF, 7725 llvm::Value *src, Address dst) { 7726 llvm::Type * SrcTy = src->getType(); 7727 if (!isa<llvm::PointerType>(SrcTy)) { 7728 unsigned Size = CGM.getDataLayout().getTypeAllocSize(SrcTy); 7729 assert(Size <= 8 && "does not support size > 8"); 7730 src = (Size == 4 ? CGF.Builder.CreateBitCast(src, ObjCTypes.IntTy) 7731 : CGF.Builder.CreateBitCast(src, ObjCTypes.LongTy)); 7732 src = CGF.Builder.CreateIntToPtr(src, ObjCTypes.Int8PtrTy); 7733 } 7734 src = CGF.Builder.CreateBitCast(src, ObjCTypes.ObjectPtrTy); 7735 dst = CGF.Builder.CreateBitCast(dst, ObjCTypes.PtrObjectPtrTy); 7736 llvm::Value *args[] = { src, dst.getPointer() }; 7737 CGF.EmitNounwindRuntimeCall(ObjCTypes.getGcAssignWeakFn(), 7738 args, "weakassign"); 7739 } 7740 7741 /// EmitObjCGlobalAssign - Code gen for assigning to a __strong object. 7742 /// objc_assign_global (id src, id *dst) 7743 /// 7744 void CGObjCNonFragileABIMac::EmitObjCGlobalAssign(CodeGen::CodeGenFunction &CGF, 7745 llvm::Value *src, Address dst, 7746 bool threadlocal) { 7747 llvm::Type * SrcTy = src->getType(); 7748 if (!isa<llvm::PointerType>(SrcTy)) { 7749 unsigned Size = CGM.getDataLayout().getTypeAllocSize(SrcTy); 7750 assert(Size <= 8 && "does not support size > 8"); 7751 src = (Size == 4 ? CGF.Builder.CreateBitCast(src, ObjCTypes.IntTy) 7752 : CGF.Builder.CreateBitCast(src, ObjCTypes.LongTy)); 7753 src = CGF.Builder.CreateIntToPtr(src, ObjCTypes.Int8PtrTy); 7754 } 7755 src = CGF.Builder.CreateBitCast(src, ObjCTypes.ObjectPtrTy); 7756 dst = CGF.Builder.CreateBitCast(dst, ObjCTypes.PtrObjectPtrTy); 7757 llvm::Value *args[] = { src, dst.getPointer() }; 7758 if (!threadlocal) 7759 CGF.EmitNounwindRuntimeCall(ObjCTypes.getGcAssignGlobalFn(), 7760 args, "globalassign"); 7761 else 7762 CGF.EmitNounwindRuntimeCall(ObjCTypes.getGcAssignThreadLocalFn(), 7763 args, "threadlocalassign"); 7764 } 7765 7766 void 7767 CGObjCNonFragileABIMac::EmitSynchronizedStmt(CodeGen::CodeGenFunction &CGF, 7768 const ObjCAtSynchronizedStmt &S) { 7769 EmitAtSynchronizedStmt(CGF, S, ObjCTypes.getSyncEnterFn(), 7770 ObjCTypes.getSyncExitFn()); 7771 } 7772 7773 llvm::Constant * 7774 CGObjCNonFragileABIMac::GetEHType(QualType T) { 7775 // There's a particular fixed type info for 'id'. 7776 if (T->isObjCIdType() || T->isObjCQualifiedIdType()) { 7777 auto *IDEHType = CGM.getModule().getGlobalVariable("OBJC_EHTYPE_id"); 7778 if (!IDEHType) { 7779 IDEHType = 7780 new llvm::GlobalVariable(CGM.getModule(), ObjCTypes.EHTypeTy, false, 7781 llvm::GlobalValue::ExternalLinkage, nullptr, 7782 "OBJC_EHTYPE_id"); 7783 if (CGM.getTriple().isOSBinFormatCOFF()) 7784 IDEHType->setDLLStorageClass(getStorage(CGM, "OBJC_EHTYPE_id")); 7785 } 7786 return IDEHType; 7787 } 7788 7789 // All other types should be Objective-C interface pointer types. 7790 const ObjCObjectPointerType *PT = T->getAs<ObjCObjectPointerType>(); 7791 assert(PT && "Invalid @catch type."); 7792 7793 const ObjCInterfaceType *IT = PT->getInterfaceType(); 7794 assert(IT && "Invalid @catch type."); 7795 7796 return GetInterfaceEHType(IT->getDecl(), NotForDefinition); 7797 } 7798 7799 void CGObjCNonFragileABIMac::EmitTryStmt(CodeGen::CodeGenFunction &CGF, 7800 const ObjCAtTryStmt &S) { 7801 EmitTryCatchStmt(CGF, S, ObjCTypes.getObjCBeginCatchFn(), 7802 ObjCTypes.getObjCEndCatchFn(), 7803 ObjCTypes.getExceptionRethrowFn()); 7804 } 7805 7806 /// EmitThrowStmt - Generate code for a throw statement. 7807 void CGObjCNonFragileABIMac::EmitThrowStmt(CodeGen::CodeGenFunction &CGF, 7808 const ObjCAtThrowStmt &S, 7809 bool ClearInsertionPoint) { 7810 if (const Expr *ThrowExpr = S.getThrowExpr()) { 7811 llvm::Value *Exception = CGF.EmitObjCThrowOperand(ThrowExpr); 7812 Exception = CGF.Builder.CreateBitCast(Exception, ObjCTypes.ObjectPtrTy); 7813 llvm::CallBase *Call = 7814 CGF.EmitRuntimeCallOrInvoke(ObjCTypes.getExceptionThrowFn(), Exception); 7815 Call->setDoesNotReturn(); 7816 } else { 7817 llvm::CallBase *Call = 7818 CGF.EmitRuntimeCallOrInvoke(ObjCTypes.getExceptionRethrowFn()); 7819 Call->setDoesNotReturn(); 7820 } 7821 7822 CGF.Builder.CreateUnreachable(); 7823 if (ClearInsertionPoint) 7824 CGF.Builder.ClearInsertionPoint(); 7825 } 7826 7827 llvm::Constant * 7828 CGObjCNonFragileABIMac::GetInterfaceEHType(const ObjCInterfaceDecl *ID, 7829 ForDefinition_t IsForDefinition) { 7830 llvm::GlobalVariable * &Entry = EHTypeReferences[ID->getIdentifier()]; 7831 StringRef ClassName = ID->getObjCRuntimeNameAsString(); 7832 7833 // If we don't need a definition, return the entry if found or check 7834 // if we use an external reference. 7835 if (!IsForDefinition) { 7836 if (Entry) 7837 return Entry; 7838 7839 // If this type (or a super class) has the __objc_exception__ 7840 // attribute, emit an external reference. 7841 if (hasObjCExceptionAttribute(CGM.getContext(), ID)) { 7842 std::string EHTypeName = ("OBJC_EHTYPE_$_" + ClassName).str(); 7843 Entry = new llvm::GlobalVariable(CGM.getModule(), ObjCTypes.EHTypeTy, 7844 false, llvm::GlobalValue::ExternalLinkage, 7845 nullptr, EHTypeName); 7846 CGM.setGVProperties(Entry, ID); 7847 return Entry; 7848 } 7849 } 7850 7851 // Otherwise we need to either make a new entry or fill in the initializer. 7852 assert((!Entry || !Entry->hasInitializer()) && "Duplicate EHType definition"); 7853 7854 std::string VTableName = "objc_ehtype_vtable"; 7855 auto *VTableGV = CGM.getModule().getGlobalVariable(VTableName); 7856 if (!VTableGV) { 7857 VTableGV = 7858 new llvm::GlobalVariable(CGM.getModule(), ObjCTypes.Int8PtrTy, false, 7859 llvm::GlobalValue::ExternalLinkage, nullptr, 7860 VTableName); 7861 if (CGM.getTriple().isOSBinFormatCOFF()) 7862 VTableGV->setDLLStorageClass(getStorage(CGM, VTableName)); 7863 } 7864 7865 llvm::Value *VTableIdx = llvm::ConstantInt::get(CGM.Int32Ty, 2); 7866 ConstantInitBuilder builder(CGM); 7867 auto values = builder.beginStruct(ObjCTypes.EHTypeTy); 7868 values.add( 7869 llvm::ConstantExpr::getInBoundsGetElementPtr(VTableGV->getValueType(), 7870 VTableGV, VTableIdx)); 7871 values.add(GetClassName(ClassName)); 7872 values.add(GetClassGlobal(ID, /*metaclass*/ false, NotForDefinition)); 7873 7874 llvm::GlobalValue::LinkageTypes L = IsForDefinition 7875 ? llvm::GlobalValue::ExternalLinkage 7876 : llvm::GlobalValue::WeakAnyLinkage; 7877 if (Entry) { 7878 values.finishAndSetAsInitializer(Entry); 7879 Entry->setAlignment(CGM.getPointerAlign().getAsAlign()); 7880 } else { 7881 Entry = values.finishAndCreateGlobal("OBJC_EHTYPE_$_" + ClassName, 7882 CGM.getPointerAlign(), 7883 /*constant*/ false, 7884 L); 7885 if (hasObjCExceptionAttribute(CGM.getContext(), ID)) 7886 CGM.setGVProperties(Entry, ID); 7887 } 7888 assert(Entry->getLinkage() == L); 7889 7890 if (!CGM.getTriple().isOSBinFormatCOFF()) 7891 if (ID->getVisibility() == HiddenVisibility) 7892 Entry->setVisibility(llvm::GlobalValue::HiddenVisibility); 7893 7894 if (IsForDefinition) 7895 if (CGM.getTriple().isOSBinFormatMachO()) 7896 Entry->setSection("__DATA,__objc_const"); 7897 7898 return Entry; 7899 } 7900 7901 /* *** */ 7902 7903 CodeGen::CGObjCRuntime * 7904 CodeGen::CreateMacObjCRuntime(CodeGen::CodeGenModule &CGM) { 7905 switch (CGM.getLangOpts().ObjCRuntime.getKind()) { 7906 case ObjCRuntime::FragileMacOSX: 7907 return new CGObjCMac(CGM); 7908 7909 case ObjCRuntime::MacOSX: 7910 case ObjCRuntime::iOS: 7911 case ObjCRuntime::WatchOS: 7912 return new CGObjCNonFragileABIMac(CGM); 7913 7914 case ObjCRuntime::GNUstep: 7915 case ObjCRuntime::GCC: 7916 case ObjCRuntime::ObjFW: 7917 llvm_unreachable("these runtimes are not Mac runtimes"); 7918 } 7919 llvm_unreachable("bad runtime"); 7920 } 7921