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