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