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