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