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