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