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::Metadata *Ops[2] = { 4282 llvm::MDString::get(VMContext, "Objective-C Garbage Collection"), 4283 llvm::ConstantAsMetadata::get(llvm::ConstantInt::get( 4284 llvm::Type::getInt32Ty(VMContext), eImageInfo_GarbageCollected))}; 4285 Mod.addModuleFlag(llvm::Module::Require, "Objective-C GC Only", 4286 llvm::MDNode::get(VMContext, Ops)); 4287 } 4288 } 4289 4290 // Indicate whether we're compiling this to run on a simulator. 4291 const llvm::Triple &Triple = CGM.getTarget().getTriple(); 4292 if (Triple.isiOS() && 4293 (Triple.getArch() == llvm::Triple::x86 || 4294 Triple.getArch() == llvm::Triple::x86_64)) 4295 Mod.addModuleFlag(llvm::Module::Error, "Objective-C Is Simulated", 4296 eImageInfo_ImageIsSimulated); 4297 } 4298 4299 // struct objc_module { 4300 // unsigned long version; 4301 // unsigned long size; 4302 // const char *name; 4303 // Symtab symtab; 4304 // }; 4305 4306 // FIXME: Get from somewhere 4307 static const int ModuleVersion = 7; 4308 4309 void CGObjCMac::EmitModuleInfo() { 4310 uint64_t Size = CGM.getDataLayout().getTypeAllocSize(ObjCTypes.ModuleTy); 4311 4312 llvm::Constant *Values[] = { 4313 llvm::ConstantInt::get(ObjCTypes.LongTy, ModuleVersion), 4314 llvm::ConstantInt::get(ObjCTypes.LongTy, Size), 4315 // This used to be the filename, now it is unused. <rdr://4327263> 4316 GetClassName(StringRef("")), 4317 EmitModuleSymbols() 4318 }; 4319 CreateMetadataVar("OBJC_MODULES", 4320 llvm::ConstantStruct::get(ObjCTypes.ModuleTy, Values), 4321 "__OBJC,__module_info,regular,no_dead_strip", 4, true); 4322 } 4323 4324 llvm::Constant *CGObjCMac::EmitModuleSymbols() { 4325 unsigned NumClasses = DefinedClasses.size(); 4326 unsigned NumCategories = DefinedCategories.size(); 4327 4328 // Return null if no symbols were defined. 4329 if (!NumClasses && !NumCategories) 4330 return llvm::Constant::getNullValue(ObjCTypes.SymtabPtrTy); 4331 4332 llvm::Constant *Values[5]; 4333 Values[0] = llvm::ConstantInt::get(ObjCTypes.LongTy, 0); 4334 Values[1] = llvm::Constant::getNullValue(ObjCTypes.SelectorPtrTy); 4335 Values[2] = llvm::ConstantInt::get(ObjCTypes.ShortTy, NumClasses); 4336 Values[3] = llvm::ConstantInt::get(ObjCTypes.ShortTy, NumCategories); 4337 4338 // The runtime expects exactly the list of defined classes followed 4339 // by the list of defined categories, in a single array. 4340 SmallVector<llvm::Constant*, 8> Symbols(NumClasses + NumCategories); 4341 for (unsigned i=0; i<NumClasses; i++) { 4342 const ObjCInterfaceDecl *ID = ImplementedClasses[i]; 4343 assert(ID); 4344 if (ObjCImplementationDecl *IMP = ID->getImplementation()) 4345 // We are implementing a weak imported interface. Give it external linkage 4346 if (ID->isWeakImported() && !IMP->isWeakImported()) 4347 DefinedClasses[i]->setLinkage(llvm::GlobalVariable::ExternalLinkage); 4348 4349 Symbols[i] = llvm::ConstantExpr::getBitCast(DefinedClasses[i], 4350 ObjCTypes.Int8PtrTy); 4351 } 4352 for (unsigned i=0; i<NumCategories; i++) 4353 Symbols[NumClasses + i] = 4354 llvm::ConstantExpr::getBitCast(DefinedCategories[i], 4355 ObjCTypes.Int8PtrTy); 4356 4357 Values[4] = 4358 llvm::ConstantArray::get(llvm::ArrayType::get(ObjCTypes.Int8PtrTy, 4359 Symbols.size()), 4360 Symbols); 4361 4362 llvm::Constant *Init = llvm::ConstantStruct::getAnon(Values); 4363 4364 llvm::GlobalVariable *GV = CreateMetadataVar( 4365 "OBJC_SYMBOLS", Init, "__OBJC,__symbols,regular,no_dead_strip", 4, true); 4366 return llvm::ConstantExpr::getBitCast(GV, ObjCTypes.SymtabPtrTy); 4367 } 4368 4369 llvm::Value *CGObjCMac::EmitClassRefFromId(CodeGenFunction &CGF, 4370 IdentifierInfo *II) { 4371 LazySymbols.insert(II); 4372 4373 llvm::GlobalVariable *&Entry = ClassReferences[II]; 4374 4375 if (!Entry) { 4376 llvm::Constant *Casted = 4377 llvm::ConstantExpr::getBitCast(GetClassName(II->getName()), 4378 ObjCTypes.ClassPtrTy); 4379 Entry = CreateMetadataVar( 4380 "OBJC_CLASS_REFERENCES_", Casted, 4381 "__OBJC,__cls_refs,literal_pointers,no_dead_strip", 4, true); 4382 } 4383 4384 return CGF.Builder.CreateLoad(Entry); 4385 } 4386 4387 llvm::Value *CGObjCMac::EmitClassRef(CodeGenFunction &CGF, 4388 const ObjCInterfaceDecl *ID) { 4389 return EmitClassRefFromId(CGF, ID->getIdentifier()); 4390 } 4391 4392 llvm::Value *CGObjCMac::EmitNSAutoreleasePoolClassRef(CodeGenFunction &CGF) { 4393 IdentifierInfo *II = &CGM.getContext().Idents.get("NSAutoreleasePool"); 4394 return EmitClassRefFromId(CGF, II); 4395 } 4396 4397 llvm::Value *CGObjCMac::EmitSelector(CodeGenFunction &CGF, Selector Sel, 4398 bool lvalue) { 4399 llvm::GlobalVariable *&Entry = SelectorReferences[Sel]; 4400 4401 if (!Entry) { 4402 llvm::Constant *Casted = 4403 llvm::ConstantExpr::getBitCast(GetMethodVarName(Sel), 4404 ObjCTypes.SelectorPtrTy); 4405 Entry = CreateMetadataVar( 4406 "OBJC_SELECTOR_REFERENCES_", Casted, 4407 "__OBJC,__message_refs,literal_pointers,no_dead_strip", 4, true); 4408 Entry->setExternallyInitialized(true); 4409 } 4410 4411 if (lvalue) 4412 return Entry; 4413 return CGF.Builder.CreateLoad(Entry); 4414 } 4415 4416 llvm::Constant *CGObjCCommonMac::GetClassName(StringRef RuntimeName) { 4417 llvm::GlobalVariable *&Entry = ClassNames[RuntimeName]; 4418 if (!Entry) 4419 Entry = CreateMetadataVar( 4420 "OBJC_CLASS_NAME_", 4421 llvm::ConstantDataArray::getString(VMContext, RuntimeName), 4422 ((ObjCABI == 2) ? "__TEXT,__objc_classname,cstring_literals" 4423 : "__TEXT,__cstring,cstring_literals"), 4424 1, true); 4425 return getConstantGEP(VMContext, Entry, 0, 0); 4426 } 4427 4428 llvm::Function *CGObjCCommonMac::GetMethodDefinition(const ObjCMethodDecl *MD) { 4429 llvm::DenseMap<const ObjCMethodDecl*, llvm::Function*>::iterator 4430 I = MethodDefinitions.find(MD); 4431 if (I != MethodDefinitions.end()) 4432 return I->second; 4433 4434 return nullptr; 4435 } 4436 4437 /// GetIvarLayoutName - Returns a unique constant for the given 4438 /// ivar layout bitmap. 4439 llvm::Constant *CGObjCCommonMac::GetIvarLayoutName(IdentifierInfo *Ident, 4440 const ObjCCommonTypesHelper &ObjCTypes) { 4441 return llvm::Constant::getNullValue(ObjCTypes.Int8PtrTy); 4442 } 4443 4444 void CGObjCCommonMac::BuildAggrIvarRecordLayout(const RecordType *RT, 4445 unsigned int BytePos, 4446 bool ForStrongLayout, 4447 bool &HasUnion) { 4448 const RecordDecl *RD = RT->getDecl(); 4449 // FIXME - Use iterator. 4450 SmallVector<const FieldDecl*, 16> Fields(RD->fields()); 4451 llvm::Type *Ty = CGM.getTypes().ConvertType(QualType(RT, 0)); 4452 const llvm::StructLayout *RecLayout = 4453 CGM.getDataLayout().getStructLayout(cast<llvm::StructType>(Ty)); 4454 4455 BuildAggrIvarLayout(nullptr, RecLayout, RD, Fields, BytePos, ForStrongLayout, 4456 HasUnion); 4457 } 4458 4459 void CGObjCCommonMac::BuildAggrIvarLayout(const ObjCImplementationDecl *OI, 4460 const llvm::StructLayout *Layout, 4461 const RecordDecl *RD, 4462 ArrayRef<const FieldDecl*> RecFields, 4463 unsigned int BytePos, bool ForStrongLayout, 4464 bool &HasUnion) { 4465 bool IsUnion = (RD && RD->isUnion()); 4466 uint64_t MaxUnionIvarSize = 0; 4467 uint64_t MaxSkippedUnionIvarSize = 0; 4468 const FieldDecl *MaxField = nullptr; 4469 const FieldDecl *MaxSkippedField = nullptr; 4470 const FieldDecl *LastFieldBitfieldOrUnnamed = nullptr; 4471 uint64_t MaxFieldOffset = 0; 4472 uint64_t MaxSkippedFieldOffset = 0; 4473 uint64_t LastBitfieldOrUnnamedOffset = 0; 4474 uint64_t FirstFieldDelta = 0; 4475 4476 if (RecFields.empty()) 4477 return; 4478 unsigned WordSizeInBits = CGM.getTarget().getPointerWidth(0); 4479 unsigned ByteSizeInBits = CGM.getTarget().getCharWidth(); 4480 if (!RD && CGM.getLangOpts().ObjCAutoRefCount) { 4481 const FieldDecl *FirstField = RecFields[0]; 4482 FirstFieldDelta = 4483 ComputeIvarBaseOffset(CGM, OI, cast<ObjCIvarDecl>(FirstField)); 4484 } 4485 4486 for (unsigned i = 0, e = RecFields.size(); i != e; ++i) { 4487 const FieldDecl *Field = RecFields[i]; 4488 uint64_t FieldOffset; 4489 if (RD) { 4490 // Note that 'i' here is actually the field index inside RD of Field, 4491 // although this dependency is hidden. 4492 const ASTRecordLayout &RL = CGM.getContext().getASTRecordLayout(RD); 4493 FieldOffset = (RL.getFieldOffset(i) / ByteSizeInBits) - FirstFieldDelta; 4494 } else 4495 FieldOffset = 4496 ComputeIvarBaseOffset(CGM, OI, cast<ObjCIvarDecl>(Field)) - FirstFieldDelta; 4497 4498 // Skip over unnamed or bitfields 4499 if (!Field->getIdentifier() || Field->isBitField()) { 4500 LastFieldBitfieldOrUnnamed = Field; 4501 LastBitfieldOrUnnamedOffset = FieldOffset; 4502 continue; 4503 } 4504 4505 LastFieldBitfieldOrUnnamed = nullptr; 4506 QualType FQT = Field->getType(); 4507 if (FQT->isRecordType() || FQT->isUnionType()) { 4508 if (FQT->isUnionType()) 4509 HasUnion = true; 4510 4511 BuildAggrIvarRecordLayout(FQT->getAs<RecordType>(), 4512 BytePos + FieldOffset, 4513 ForStrongLayout, HasUnion); 4514 continue; 4515 } 4516 4517 if (const ArrayType *Array = CGM.getContext().getAsArrayType(FQT)) { 4518 const ConstantArrayType *CArray = 4519 dyn_cast_or_null<ConstantArrayType>(Array); 4520 uint64_t ElCount = CArray->getSize().getZExtValue(); 4521 assert(CArray && "only array with known element size is supported"); 4522 FQT = CArray->getElementType(); 4523 while (const ArrayType *Array = CGM.getContext().getAsArrayType(FQT)) { 4524 const ConstantArrayType *CArray = 4525 dyn_cast_or_null<ConstantArrayType>(Array); 4526 ElCount *= CArray->getSize().getZExtValue(); 4527 FQT = CArray->getElementType(); 4528 } 4529 if (FQT->isRecordType() && ElCount) { 4530 int OldIndex = IvarsInfo.size() - 1; 4531 int OldSkIndex = SkipIvars.size() -1; 4532 4533 const RecordType *RT = FQT->getAs<RecordType>(); 4534 BuildAggrIvarRecordLayout(RT, BytePos + FieldOffset, 4535 ForStrongLayout, HasUnion); 4536 4537 // Replicate layout information for each array element. Note that 4538 // one element is already done. 4539 uint64_t ElIx = 1; 4540 for (int FirstIndex = IvarsInfo.size() - 1, 4541 FirstSkIndex = SkipIvars.size() - 1 ;ElIx < ElCount; ElIx++) { 4542 uint64_t Size = CGM.getContext().getTypeSize(RT)/ByteSizeInBits; 4543 for (int i = OldIndex+1; i <= FirstIndex; ++i) 4544 IvarsInfo.push_back(GC_IVAR(IvarsInfo[i].ivar_bytepos + Size*ElIx, 4545 IvarsInfo[i].ivar_size)); 4546 for (int i = OldSkIndex+1; i <= FirstSkIndex; ++i) 4547 SkipIvars.push_back(GC_IVAR(SkipIvars[i].ivar_bytepos + Size*ElIx, 4548 SkipIvars[i].ivar_size)); 4549 } 4550 continue; 4551 } 4552 } 4553 // At this point, we are done with Record/Union and array there of. 4554 // For other arrays we are down to its element type. 4555 Qualifiers::GC GCAttr = GetGCAttrTypeForType(CGM.getContext(), FQT); 4556 4557 unsigned FieldSize = CGM.getContext().getTypeSize(Field->getType()); 4558 if ((ForStrongLayout && GCAttr == Qualifiers::Strong) 4559 || (!ForStrongLayout && GCAttr == Qualifiers::Weak)) { 4560 if (IsUnion) { 4561 uint64_t UnionIvarSize = FieldSize / WordSizeInBits; 4562 if (UnionIvarSize > MaxUnionIvarSize) { 4563 MaxUnionIvarSize = UnionIvarSize; 4564 MaxField = Field; 4565 MaxFieldOffset = FieldOffset; 4566 } 4567 } else { 4568 IvarsInfo.push_back(GC_IVAR(BytePos + FieldOffset, 4569 FieldSize / WordSizeInBits)); 4570 } 4571 } else if ((ForStrongLayout && 4572 (GCAttr == Qualifiers::GCNone || GCAttr == Qualifiers::Weak)) 4573 || (!ForStrongLayout && GCAttr != Qualifiers::Weak)) { 4574 if (IsUnion) { 4575 // FIXME: Why the asymmetry? We divide by word size in bits on other 4576 // side. 4577 uint64_t UnionIvarSize = FieldSize / ByteSizeInBits; 4578 if (UnionIvarSize > MaxSkippedUnionIvarSize) { 4579 MaxSkippedUnionIvarSize = UnionIvarSize; 4580 MaxSkippedField = Field; 4581 MaxSkippedFieldOffset = FieldOffset; 4582 } 4583 } else { 4584 // FIXME: Why the asymmetry, we divide by byte size in bits here? 4585 SkipIvars.push_back(GC_IVAR(BytePos + FieldOffset, 4586 FieldSize / ByteSizeInBits)); 4587 } 4588 } 4589 } 4590 4591 if (LastFieldBitfieldOrUnnamed) { 4592 if (LastFieldBitfieldOrUnnamed->isBitField()) { 4593 // Last field was a bitfield. Must update skip info. 4594 uint64_t BitFieldSize 4595 = LastFieldBitfieldOrUnnamed->getBitWidthValue(CGM.getContext()); 4596 GC_IVAR skivar; 4597 skivar.ivar_bytepos = BytePos + LastBitfieldOrUnnamedOffset; 4598 skivar.ivar_size = (BitFieldSize / ByteSizeInBits) 4599 + ((BitFieldSize % ByteSizeInBits) != 0); 4600 SkipIvars.push_back(skivar); 4601 } else { 4602 assert(!LastFieldBitfieldOrUnnamed->getIdentifier() &&"Expected unnamed"); 4603 // Last field was unnamed. Must update skip info. 4604 unsigned FieldSize 4605 = CGM.getContext().getTypeSize(LastFieldBitfieldOrUnnamed->getType()); 4606 SkipIvars.push_back(GC_IVAR(BytePos + LastBitfieldOrUnnamedOffset, 4607 FieldSize / ByteSizeInBits)); 4608 } 4609 } 4610 4611 if (MaxField) 4612 IvarsInfo.push_back(GC_IVAR(BytePos + MaxFieldOffset, 4613 MaxUnionIvarSize)); 4614 if (MaxSkippedField) 4615 SkipIvars.push_back(GC_IVAR(BytePos + MaxSkippedFieldOffset, 4616 MaxSkippedUnionIvarSize)); 4617 } 4618 4619 /// BuildIvarLayoutBitmap - This routine is the horsework for doing all 4620 /// the computations and returning the layout bitmap (for ivar or blocks) in 4621 /// the given argument BitMap string container. Routine reads 4622 /// two containers, IvarsInfo and SkipIvars which are assumed to be 4623 /// filled already by the caller. 4624 llvm::Constant *CGObjCCommonMac::BuildIvarLayoutBitmap(std::string &BitMap) { 4625 unsigned int WordsToScan, WordsToSkip; 4626 llvm::Type *PtrTy = CGM.Int8PtrTy; 4627 4628 // Build the string of skip/scan nibbles 4629 SmallVector<SKIP_SCAN, 32> SkipScanIvars; 4630 unsigned int WordSize = 4631 CGM.getTypes().getDataLayout().getTypeAllocSize(PtrTy); 4632 if (IvarsInfo[0].ivar_bytepos == 0) { 4633 WordsToSkip = 0; 4634 WordsToScan = IvarsInfo[0].ivar_size; 4635 } else { 4636 WordsToSkip = IvarsInfo[0].ivar_bytepos/WordSize; 4637 WordsToScan = IvarsInfo[0].ivar_size; 4638 } 4639 for (unsigned int i=1, Last=IvarsInfo.size(); i != Last; i++) { 4640 unsigned int TailPrevGCObjC = 4641 IvarsInfo[i-1].ivar_bytepos + IvarsInfo[i-1].ivar_size * WordSize; 4642 if (IvarsInfo[i].ivar_bytepos == TailPrevGCObjC) { 4643 // consecutive 'scanned' object pointers. 4644 WordsToScan += IvarsInfo[i].ivar_size; 4645 } else { 4646 // Skip over 'gc'able object pointer which lay over each other. 4647 if (TailPrevGCObjC > IvarsInfo[i].ivar_bytepos) 4648 continue; 4649 // Must skip over 1 or more words. We save current skip/scan values 4650 // and start a new pair. 4651 SKIP_SCAN SkScan; 4652 SkScan.skip = WordsToSkip; 4653 SkScan.scan = WordsToScan; 4654 SkipScanIvars.push_back(SkScan); 4655 4656 // Skip the hole. 4657 SkScan.skip = (IvarsInfo[i].ivar_bytepos - TailPrevGCObjC) / WordSize; 4658 SkScan.scan = 0; 4659 SkipScanIvars.push_back(SkScan); 4660 WordsToSkip = 0; 4661 WordsToScan = IvarsInfo[i].ivar_size; 4662 } 4663 } 4664 if (WordsToScan > 0) { 4665 SKIP_SCAN SkScan; 4666 SkScan.skip = WordsToSkip; 4667 SkScan.scan = WordsToScan; 4668 SkipScanIvars.push_back(SkScan); 4669 } 4670 4671 if (!SkipIvars.empty()) { 4672 unsigned int LastIndex = SkipIvars.size()-1; 4673 int LastByteSkipped = 4674 SkipIvars[LastIndex].ivar_bytepos + SkipIvars[LastIndex].ivar_size; 4675 LastIndex = IvarsInfo.size()-1; 4676 int LastByteScanned = 4677 IvarsInfo[LastIndex].ivar_bytepos + 4678 IvarsInfo[LastIndex].ivar_size * WordSize; 4679 // Compute number of bytes to skip at the tail end of the last ivar scanned. 4680 if (LastByteSkipped > LastByteScanned) { 4681 unsigned int TotalWords = (LastByteSkipped + (WordSize -1)) / WordSize; 4682 SKIP_SCAN SkScan; 4683 SkScan.skip = TotalWords - (LastByteScanned/WordSize); 4684 SkScan.scan = 0; 4685 SkipScanIvars.push_back(SkScan); 4686 } 4687 } 4688 // Mini optimization of nibbles such that an 0xM0 followed by 0x0N is produced 4689 // as 0xMN. 4690 int SkipScan = SkipScanIvars.size()-1; 4691 for (int i = 0; i <= SkipScan; i++) { 4692 if ((i < SkipScan) && SkipScanIvars[i].skip && SkipScanIvars[i].scan == 0 4693 && SkipScanIvars[i+1].skip == 0 && SkipScanIvars[i+1].scan) { 4694 // 0xM0 followed by 0x0N detected. 4695 SkipScanIvars[i].scan = SkipScanIvars[i+1].scan; 4696 for (int j = i+1; j < SkipScan; j++) 4697 SkipScanIvars[j] = SkipScanIvars[j+1]; 4698 --SkipScan; 4699 } 4700 } 4701 4702 // Generate the string. 4703 for (int i = 0; i <= SkipScan; i++) { 4704 unsigned char byte; 4705 unsigned int skip_small = SkipScanIvars[i].skip % 0xf; 4706 unsigned int scan_small = SkipScanIvars[i].scan % 0xf; 4707 unsigned int skip_big = SkipScanIvars[i].skip / 0xf; 4708 unsigned int scan_big = SkipScanIvars[i].scan / 0xf; 4709 4710 // first skip big. 4711 for (unsigned int ix = 0; ix < skip_big; ix++) 4712 BitMap += (unsigned char)(0xf0); 4713 4714 // next (skip small, scan) 4715 if (skip_small) { 4716 byte = skip_small << 4; 4717 if (scan_big > 0) { 4718 byte |= 0xf; 4719 --scan_big; 4720 } else if (scan_small) { 4721 byte |= scan_small; 4722 scan_small = 0; 4723 } 4724 BitMap += byte; 4725 } 4726 // next scan big 4727 for (unsigned int ix = 0; ix < scan_big; ix++) 4728 BitMap += (unsigned char)(0x0f); 4729 // last scan small 4730 if (scan_small) { 4731 byte = scan_small; 4732 BitMap += byte; 4733 } 4734 } 4735 // null terminate string. 4736 unsigned char zero = 0; 4737 BitMap += zero; 4738 4739 llvm::GlobalVariable *Entry = CreateMetadataVar( 4740 "OBJC_CLASS_NAME_", 4741 llvm::ConstantDataArray::getString(VMContext, BitMap, false), 4742 ((ObjCABI == 2) ? "__TEXT,__objc_classname,cstring_literals" 4743 : "__TEXT,__cstring,cstring_literals"), 4744 1, true); 4745 return getConstantGEP(VMContext, Entry, 0, 0); 4746 } 4747 4748 /// BuildIvarLayout - Builds ivar layout bitmap for the class 4749 /// implementation for the __strong or __weak case. 4750 /// The layout map displays which words in ivar list must be skipped 4751 /// and which must be scanned by GC (see below). String is built of bytes. 4752 /// Each byte is divided up in two nibbles (4-bit each). Left nibble is count 4753 /// of words to skip and right nibble is count of words to scan. So, each 4754 /// nibble represents up to 15 workds to skip or scan. Skipping the rest is 4755 /// represented by a 0x00 byte which also ends the string. 4756 /// 1. when ForStrongLayout is true, following ivars are scanned: 4757 /// - id, Class 4758 /// - object * 4759 /// - __strong anything 4760 /// 4761 /// 2. When ForStrongLayout is false, following ivars are scanned: 4762 /// - __weak anything 4763 /// 4764 llvm::Constant *CGObjCCommonMac::BuildIvarLayout( 4765 const ObjCImplementationDecl *OMD, 4766 bool ForStrongLayout) { 4767 bool hasUnion = false; 4768 4769 llvm::Type *PtrTy = CGM.Int8PtrTy; 4770 if (CGM.getLangOpts().getGC() == LangOptions::NonGC && 4771 !CGM.getLangOpts().ObjCAutoRefCount) 4772 return llvm::Constant::getNullValue(PtrTy); 4773 4774 const ObjCInterfaceDecl *OI = OMD->getClassInterface(); 4775 SmallVector<const FieldDecl*, 32> RecFields; 4776 if (CGM.getLangOpts().ObjCAutoRefCount) { 4777 for (const ObjCIvarDecl *IVD = OI->all_declared_ivar_begin(); 4778 IVD; IVD = IVD->getNextIvar()) 4779 RecFields.push_back(cast<FieldDecl>(IVD)); 4780 } 4781 else { 4782 SmallVector<const ObjCIvarDecl*, 32> Ivars; 4783 CGM.getContext().DeepCollectObjCIvars(OI, true, Ivars); 4784 4785 // FIXME: This is not ideal; we shouldn't have to do this copy. 4786 RecFields.append(Ivars.begin(), Ivars.end()); 4787 } 4788 4789 if (RecFields.empty()) 4790 return llvm::Constant::getNullValue(PtrTy); 4791 4792 SkipIvars.clear(); 4793 IvarsInfo.clear(); 4794 4795 BuildAggrIvarLayout(OMD, nullptr, nullptr, RecFields, 0, ForStrongLayout, 4796 hasUnion); 4797 if (IvarsInfo.empty()) 4798 return llvm::Constant::getNullValue(PtrTy); 4799 // Sort on byte position in case we encounterred a union nested in 4800 // the ivar list. 4801 if (hasUnion && !IvarsInfo.empty()) 4802 std::sort(IvarsInfo.begin(), IvarsInfo.end()); 4803 if (hasUnion && !SkipIvars.empty()) 4804 std::sort(SkipIvars.begin(), SkipIvars.end()); 4805 4806 std::string BitMap; 4807 llvm::Constant *C = BuildIvarLayoutBitmap(BitMap); 4808 4809 if (CGM.getLangOpts().ObjCGCBitmapPrint) { 4810 printf("\n%s ivar layout for class '%s': ", 4811 ForStrongLayout ? "strong" : "weak", 4812 OMD->getClassInterface()->getName().str().c_str()); 4813 const unsigned char *s = (const unsigned char*)BitMap.c_str(); 4814 for (unsigned i = 0, e = BitMap.size(); i < e; i++) 4815 if (!(s[i] & 0xf0)) 4816 printf("0x0%x%s", s[i], s[i] != 0 ? ", " : ""); 4817 else 4818 printf("0x%x%s", s[i], s[i] != 0 ? ", " : ""); 4819 printf("\n"); 4820 } 4821 return C; 4822 } 4823 4824 llvm::Constant *CGObjCCommonMac::GetMethodVarName(Selector Sel) { 4825 llvm::GlobalVariable *&Entry = MethodVarNames[Sel]; 4826 4827 // FIXME: Avoid std::string in "Sel.getAsString()" 4828 if (!Entry) 4829 Entry = CreateMetadataVar( 4830 "OBJC_METH_VAR_NAME_", 4831 llvm::ConstantDataArray::getString(VMContext, Sel.getAsString()), 4832 ((ObjCABI == 2) ? "__TEXT,__objc_methname,cstring_literals" 4833 : "__TEXT,__cstring,cstring_literals"), 4834 1, true); 4835 4836 return getConstantGEP(VMContext, Entry, 0, 0); 4837 } 4838 4839 // FIXME: Merge into a single cstring creation function. 4840 llvm::Constant *CGObjCCommonMac::GetMethodVarName(IdentifierInfo *ID) { 4841 return GetMethodVarName(CGM.getContext().Selectors.getNullarySelector(ID)); 4842 } 4843 4844 llvm::Constant *CGObjCCommonMac::GetMethodVarType(const FieldDecl *Field) { 4845 std::string TypeStr; 4846 CGM.getContext().getObjCEncodingForType(Field->getType(), TypeStr, Field); 4847 4848 llvm::GlobalVariable *&Entry = MethodVarTypes[TypeStr]; 4849 4850 if (!Entry) 4851 Entry = CreateMetadataVar( 4852 "OBJC_METH_VAR_TYPE_", 4853 llvm::ConstantDataArray::getString(VMContext, TypeStr), 4854 ((ObjCABI == 2) ? "__TEXT,__objc_methtype,cstring_literals" 4855 : "__TEXT,__cstring,cstring_literals"), 4856 1, true); 4857 4858 return getConstantGEP(VMContext, Entry, 0, 0); 4859 } 4860 4861 llvm::Constant *CGObjCCommonMac::GetMethodVarType(const ObjCMethodDecl *D, 4862 bool Extended) { 4863 std::string TypeStr; 4864 if (CGM.getContext().getObjCEncodingForMethodDecl(D, TypeStr, Extended)) 4865 return nullptr; 4866 4867 llvm::GlobalVariable *&Entry = MethodVarTypes[TypeStr]; 4868 4869 if (!Entry) 4870 Entry = CreateMetadataVar( 4871 "OBJC_METH_VAR_TYPE_", 4872 llvm::ConstantDataArray::getString(VMContext, TypeStr), 4873 ((ObjCABI == 2) ? "__TEXT,__objc_methtype,cstring_literals" 4874 : "__TEXT,__cstring,cstring_literals"), 4875 1, true); 4876 4877 return getConstantGEP(VMContext, Entry, 0, 0); 4878 } 4879 4880 // FIXME: Merge into a single cstring creation function. 4881 llvm::Constant *CGObjCCommonMac::GetPropertyName(IdentifierInfo *Ident) { 4882 llvm::GlobalVariable *&Entry = PropertyNames[Ident]; 4883 4884 if (!Entry) 4885 Entry = CreateMetadataVar( 4886 "OBJC_PROP_NAME_ATTR_", 4887 llvm::ConstantDataArray::getString(VMContext, Ident->getName()), 4888 "__TEXT,__cstring,cstring_literals", 1, true); 4889 4890 return getConstantGEP(VMContext, Entry, 0, 0); 4891 } 4892 4893 // FIXME: Merge into a single cstring creation function. 4894 // FIXME: This Decl should be more precise. 4895 llvm::Constant * 4896 CGObjCCommonMac::GetPropertyTypeString(const ObjCPropertyDecl *PD, 4897 const Decl *Container) { 4898 std::string TypeStr; 4899 CGM.getContext().getObjCEncodingForPropertyDecl(PD, Container, TypeStr); 4900 return GetPropertyName(&CGM.getContext().Idents.get(TypeStr)); 4901 } 4902 4903 void CGObjCCommonMac::GetNameForMethod(const ObjCMethodDecl *D, 4904 const ObjCContainerDecl *CD, 4905 SmallVectorImpl<char> &Name) { 4906 llvm::raw_svector_ostream OS(Name); 4907 assert (CD && "Missing container decl in GetNameForMethod"); 4908 OS << '\01' << (D->isInstanceMethod() ? '-' : '+') 4909 << '[' << CD->getName(); 4910 if (const ObjCCategoryImplDecl *CID = 4911 dyn_cast<ObjCCategoryImplDecl>(D->getDeclContext())) 4912 OS << '(' << *CID << ')'; 4913 OS << ' ' << D->getSelector().getAsString() << ']'; 4914 } 4915 4916 void CGObjCMac::FinishModule() { 4917 EmitModuleInfo(); 4918 4919 // Emit the dummy bodies for any protocols which were referenced but 4920 // never defined. 4921 for (llvm::DenseMap<IdentifierInfo*, llvm::GlobalVariable*>::iterator 4922 I = Protocols.begin(), e = Protocols.end(); I != e; ++I) { 4923 if (I->second->hasInitializer()) 4924 continue; 4925 4926 llvm::Constant *Values[5]; 4927 Values[0] = llvm::Constant::getNullValue(ObjCTypes.ProtocolExtensionPtrTy); 4928 Values[1] = GetClassName(I->first->getName()); 4929 Values[2] = llvm::Constant::getNullValue(ObjCTypes.ProtocolListPtrTy); 4930 Values[3] = Values[4] = 4931 llvm::Constant::getNullValue(ObjCTypes.MethodDescriptionListPtrTy); 4932 I->second->setInitializer(llvm::ConstantStruct::get(ObjCTypes.ProtocolTy, 4933 Values)); 4934 CGM.addCompilerUsedGlobal(I->second); 4935 } 4936 4937 // Add assembler directives to add lazy undefined symbol references 4938 // for classes which are referenced but not defined. This is 4939 // important for correct linker interaction. 4940 // 4941 // FIXME: It would be nice if we had an LLVM construct for this. 4942 if (!LazySymbols.empty() || !DefinedSymbols.empty()) { 4943 SmallString<256> Asm; 4944 Asm += CGM.getModule().getModuleInlineAsm(); 4945 if (!Asm.empty() && Asm.back() != '\n') 4946 Asm += '\n'; 4947 4948 llvm::raw_svector_ostream OS(Asm); 4949 for (llvm::SetVector<IdentifierInfo*>::iterator I = DefinedSymbols.begin(), 4950 e = DefinedSymbols.end(); I != e; ++I) 4951 OS << "\t.objc_class_name_" << (*I)->getName() << "=0\n" 4952 << "\t.globl .objc_class_name_" << (*I)->getName() << "\n"; 4953 for (llvm::SetVector<IdentifierInfo*>::iterator I = LazySymbols.begin(), 4954 e = LazySymbols.end(); I != e; ++I) { 4955 OS << "\t.lazy_reference .objc_class_name_" << (*I)->getName() << "\n"; 4956 } 4957 4958 for (size_t i = 0, e = DefinedCategoryNames.size(); i < e; ++i) { 4959 OS << "\t.objc_category_name_" << DefinedCategoryNames[i] << "=0\n" 4960 << "\t.globl .objc_category_name_" << DefinedCategoryNames[i] << "\n"; 4961 } 4962 4963 CGM.getModule().setModuleInlineAsm(OS.str()); 4964 } 4965 } 4966 4967 CGObjCNonFragileABIMac::CGObjCNonFragileABIMac(CodeGen::CodeGenModule &cgm) 4968 : CGObjCCommonMac(cgm), 4969 ObjCTypes(cgm) { 4970 ObjCEmptyCacheVar = ObjCEmptyVtableVar = nullptr; 4971 ObjCABI = 2; 4972 } 4973 4974 /* *** */ 4975 4976 ObjCCommonTypesHelper::ObjCCommonTypesHelper(CodeGen::CodeGenModule &cgm) 4977 : VMContext(cgm.getLLVMContext()), CGM(cgm), ExternalProtocolPtrTy(nullptr) 4978 { 4979 CodeGen::CodeGenTypes &Types = CGM.getTypes(); 4980 ASTContext &Ctx = CGM.getContext(); 4981 4982 ShortTy = Types.ConvertType(Ctx.ShortTy); 4983 IntTy = Types.ConvertType(Ctx.IntTy); 4984 LongTy = Types.ConvertType(Ctx.LongTy); 4985 LongLongTy = Types.ConvertType(Ctx.LongLongTy); 4986 Int8PtrTy = CGM.Int8PtrTy; 4987 Int8PtrPtrTy = CGM.Int8PtrPtrTy; 4988 4989 // arm64 targets use "int" ivar offset variables. All others, 4990 // including OS X x86_64 and Windows x86_64, use "long" ivar offsets. 4991 if (CGM.getTarget().getTriple().getArch() == llvm::Triple::aarch64) 4992 IvarOffsetVarTy = IntTy; 4993 else 4994 IvarOffsetVarTy = LongTy; 4995 4996 ObjectPtrTy = Types.ConvertType(Ctx.getObjCIdType()); 4997 PtrObjectPtrTy = llvm::PointerType::getUnqual(ObjectPtrTy); 4998 SelectorPtrTy = Types.ConvertType(Ctx.getObjCSelType()); 4999 5000 // I'm not sure I like this. The implicit coordination is a bit 5001 // gross. We should solve this in a reasonable fashion because this 5002 // is a pretty common task (match some runtime data structure with 5003 // an LLVM data structure). 5004 5005 // FIXME: This is leaked. 5006 // FIXME: Merge with rewriter code? 5007 5008 // struct _objc_super { 5009 // id self; 5010 // Class cls; 5011 // } 5012 RecordDecl *RD = RecordDecl::Create(Ctx, TTK_Struct, 5013 Ctx.getTranslationUnitDecl(), 5014 SourceLocation(), SourceLocation(), 5015 &Ctx.Idents.get("_objc_super")); 5016 RD->addDecl(FieldDecl::Create(Ctx, RD, SourceLocation(), SourceLocation(), 5017 nullptr, Ctx.getObjCIdType(), nullptr, nullptr, 5018 false, ICIS_NoInit)); 5019 RD->addDecl(FieldDecl::Create(Ctx, RD, SourceLocation(), SourceLocation(), 5020 nullptr, Ctx.getObjCClassType(), nullptr, 5021 nullptr, false, ICIS_NoInit)); 5022 RD->completeDefinition(); 5023 5024 SuperCTy = Ctx.getTagDeclType(RD); 5025 SuperPtrCTy = Ctx.getPointerType(SuperCTy); 5026 5027 SuperTy = cast<llvm::StructType>(Types.ConvertType(SuperCTy)); 5028 SuperPtrTy = llvm::PointerType::getUnqual(SuperTy); 5029 5030 // struct _prop_t { 5031 // char *name; 5032 // char *attributes; 5033 // } 5034 PropertyTy = llvm::StructType::create("struct._prop_t", 5035 Int8PtrTy, Int8PtrTy, nullptr); 5036 5037 // struct _prop_list_t { 5038 // uint32_t entsize; // sizeof(struct _prop_t) 5039 // uint32_t count_of_properties; 5040 // struct _prop_t prop_list[count_of_properties]; 5041 // } 5042 PropertyListTy = 5043 llvm::StructType::create("struct._prop_list_t", IntTy, IntTy, 5044 llvm::ArrayType::get(PropertyTy, 0), nullptr); 5045 // struct _prop_list_t * 5046 PropertyListPtrTy = llvm::PointerType::getUnqual(PropertyListTy); 5047 5048 // struct _objc_method { 5049 // SEL _cmd; 5050 // char *method_type; 5051 // char *_imp; 5052 // } 5053 MethodTy = llvm::StructType::create("struct._objc_method", 5054 SelectorPtrTy, Int8PtrTy, Int8PtrTy, 5055 nullptr); 5056 5057 // struct _objc_cache * 5058 CacheTy = llvm::StructType::create(VMContext, "struct._objc_cache"); 5059 CachePtrTy = llvm::PointerType::getUnqual(CacheTy); 5060 5061 } 5062 5063 ObjCTypesHelper::ObjCTypesHelper(CodeGen::CodeGenModule &cgm) 5064 : ObjCCommonTypesHelper(cgm) { 5065 // struct _objc_method_description { 5066 // SEL name; 5067 // char *types; 5068 // } 5069 MethodDescriptionTy = 5070 llvm::StructType::create("struct._objc_method_description", 5071 SelectorPtrTy, Int8PtrTy, nullptr); 5072 5073 // struct _objc_method_description_list { 5074 // int count; 5075 // struct _objc_method_description[1]; 5076 // } 5077 MethodDescriptionListTy = llvm::StructType::create( 5078 "struct._objc_method_description_list", IntTy, 5079 llvm::ArrayType::get(MethodDescriptionTy, 0), nullptr); 5080 5081 // struct _objc_method_description_list * 5082 MethodDescriptionListPtrTy = 5083 llvm::PointerType::getUnqual(MethodDescriptionListTy); 5084 5085 // Protocol description structures 5086 5087 // struct _objc_protocol_extension { 5088 // uint32_t size; // sizeof(struct _objc_protocol_extension) 5089 // struct _objc_method_description_list *optional_instance_methods; 5090 // struct _objc_method_description_list *optional_class_methods; 5091 // struct _objc_property_list *instance_properties; 5092 // const char ** extendedMethodTypes; 5093 // } 5094 ProtocolExtensionTy = 5095 llvm::StructType::create("struct._objc_protocol_extension", 5096 IntTy, MethodDescriptionListPtrTy, 5097 MethodDescriptionListPtrTy, PropertyListPtrTy, 5098 Int8PtrPtrTy, nullptr); 5099 5100 // struct _objc_protocol_extension * 5101 ProtocolExtensionPtrTy = llvm::PointerType::getUnqual(ProtocolExtensionTy); 5102 5103 // Handle recursive construction of Protocol and ProtocolList types 5104 5105 ProtocolTy = 5106 llvm::StructType::create(VMContext, "struct._objc_protocol"); 5107 5108 ProtocolListTy = 5109 llvm::StructType::create(VMContext, "struct._objc_protocol_list"); 5110 ProtocolListTy->setBody(llvm::PointerType::getUnqual(ProtocolListTy), 5111 LongTy, 5112 llvm::ArrayType::get(ProtocolTy, 0), 5113 nullptr); 5114 5115 // struct _objc_protocol { 5116 // struct _objc_protocol_extension *isa; 5117 // char *protocol_name; 5118 // struct _objc_protocol **_objc_protocol_list; 5119 // struct _objc_method_description_list *instance_methods; 5120 // struct _objc_method_description_list *class_methods; 5121 // } 5122 ProtocolTy->setBody(ProtocolExtensionPtrTy, Int8PtrTy, 5123 llvm::PointerType::getUnqual(ProtocolListTy), 5124 MethodDescriptionListPtrTy, 5125 MethodDescriptionListPtrTy, 5126 nullptr); 5127 5128 // struct _objc_protocol_list * 5129 ProtocolListPtrTy = llvm::PointerType::getUnqual(ProtocolListTy); 5130 5131 ProtocolPtrTy = llvm::PointerType::getUnqual(ProtocolTy); 5132 5133 // Class description structures 5134 5135 // struct _objc_ivar { 5136 // char *ivar_name; 5137 // char *ivar_type; 5138 // int ivar_offset; 5139 // } 5140 IvarTy = llvm::StructType::create("struct._objc_ivar", 5141 Int8PtrTy, Int8PtrTy, IntTy, nullptr); 5142 5143 // struct _objc_ivar_list * 5144 IvarListTy = 5145 llvm::StructType::create(VMContext, "struct._objc_ivar_list"); 5146 IvarListPtrTy = llvm::PointerType::getUnqual(IvarListTy); 5147 5148 // struct _objc_method_list * 5149 MethodListTy = 5150 llvm::StructType::create(VMContext, "struct._objc_method_list"); 5151 MethodListPtrTy = llvm::PointerType::getUnqual(MethodListTy); 5152 5153 // struct _objc_class_extension * 5154 ClassExtensionTy = 5155 llvm::StructType::create("struct._objc_class_extension", 5156 IntTy, Int8PtrTy, PropertyListPtrTy, nullptr); 5157 ClassExtensionPtrTy = llvm::PointerType::getUnqual(ClassExtensionTy); 5158 5159 ClassTy = llvm::StructType::create(VMContext, "struct._objc_class"); 5160 5161 // struct _objc_class { 5162 // Class isa; 5163 // Class super_class; 5164 // char *name; 5165 // long version; 5166 // long info; 5167 // long instance_size; 5168 // struct _objc_ivar_list *ivars; 5169 // struct _objc_method_list *methods; 5170 // struct _objc_cache *cache; 5171 // struct _objc_protocol_list *protocols; 5172 // char *ivar_layout; 5173 // struct _objc_class_ext *ext; 5174 // }; 5175 ClassTy->setBody(llvm::PointerType::getUnqual(ClassTy), 5176 llvm::PointerType::getUnqual(ClassTy), 5177 Int8PtrTy, 5178 LongTy, 5179 LongTy, 5180 LongTy, 5181 IvarListPtrTy, 5182 MethodListPtrTy, 5183 CachePtrTy, 5184 ProtocolListPtrTy, 5185 Int8PtrTy, 5186 ClassExtensionPtrTy, 5187 nullptr); 5188 5189 ClassPtrTy = llvm::PointerType::getUnqual(ClassTy); 5190 5191 // struct _objc_category { 5192 // char *category_name; 5193 // char *class_name; 5194 // struct _objc_method_list *instance_method; 5195 // struct _objc_method_list *class_method; 5196 // uint32_t size; // sizeof(struct _objc_category) 5197 // struct _objc_property_list *instance_properties;// category's @property 5198 // } 5199 CategoryTy = 5200 llvm::StructType::create("struct._objc_category", 5201 Int8PtrTy, Int8PtrTy, MethodListPtrTy, 5202 MethodListPtrTy, ProtocolListPtrTy, 5203 IntTy, PropertyListPtrTy, nullptr); 5204 5205 // Global metadata structures 5206 5207 // struct _objc_symtab { 5208 // long sel_ref_cnt; 5209 // SEL *refs; 5210 // short cls_def_cnt; 5211 // short cat_def_cnt; 5212 // char *defs[cls_def_cnt + cat_def_cnt]; 5213 // } 5214 SymtabTy = 5215 llvm::StructType::create("struct._objc_symtab", 5216 LongTy, SelectorPtrTy, ShortTy, ShortTy, 5217 llvm::ArrayType::get(Int8PtrTy, 0), nullptr); 5218 SymtabPtrTy = llvm::PointerType::getUnqual(SymtabTy); 5219 5220 // struct _objc_module { 5221 // long version; 5222 // long size; // sizeof(struct _objc_module) 5223 // char *name; 5224 // struct _objc_symtab* symtab; 5225 // } 5226 ModuleTy = 5227 llvm::StructType::create("struct._objc_module", 5228 LongTy, LongTy, Int8PtrTy, SymtabPtrTy, nullptr); 5229 5230 5231 // FIXME: This is the size of the setjmp buffer and should be target 5232 // specific. 18 is what's used on 32-bit X86. 5233 uint64_t SetJmpBufferSize = 18; 5234 5235 // Exceptions 5236 llvm::Type *StackPtrTy = llvm::ArrayType::get(CGM.Int8PtrTy, 4); 5237 5238 ExceptionDataTy = 5239 llvm::StructType::create("struct._objc_exception_data", 5240 llvm::ArrayType::get(CGM.Int32Ty,SetJmpBufferSize), 5241 StackPtrTy, nullptr); 5242 5243 } 5244 5245 ObjCNonFragileABITypesHelper::ObjCNonFragileABITypesHelper(CodeGen::CodeGenModule &cgm) 5246 : ObjCCommonTypesHelper(cgm) { 5247 // struct _method_list_t { 5248 // uint32_t entsize; // sizeof(struct _objc_method) 5249 // uint32_t method_count; 5250 // struct _objc_method method_list[method_count]; 5251 // } 5252 MethodListnfABITy = 5253 llvm::StructType::create("struct.__method_list_t", IntTy, IntTy, 5254 llvm::ArrayType::get(MethodTy, 0), nullptr); 5255 // struct method_list_t * 5256 MethodListnfABIPtrTy = llvm::PointerType::getUnqual(MethodListnfABITy); 5257 5258 // struct _protocol_t { 5259 // id isa; // NULL 5260 // const char * const protocol_name; 5261 // const struct _protocol_list_t * protocol_list; // super protocols 5262 // const struct method_list_t * const instance_methods; 5263 // const struct method_list_t * const class_methods; 5264 // const struct method_list_t *optionalInstanceMethods; 5265 // const struct method_list_t *optionalClassMethods; 5266 // const struct _prop_list_t * properties; 5267 // const uint32_t size; // sizeof(struct _protocol_t) 5268 // const uint32_t flags; // = 0 5269 // const char ** extendedMethodTypes; 5270 // } 5271 5272 // Holder for struct _protocol_list_t * 5273 ProtocolListnfABITy = 5274 llvm::StructType::create(VMContext, "struct._objc_protocol_list"); 5275 5276 ProtocolnfABITy = 5277 llvm::StructType::create("struct._protocol_t", ObjectPtrTy, Int8PtrTy, 5278 llvm::PointerType::getUnqual(ProtocolListnfABITy), 5279 MethodListnfABIPtrTy, MethodListnfABIPtrTy, 5280 MethodListnfABIPtrTy, MethodListnfABIPtrTy, 5281 PropertyListPtrTy, IntTy, IntTy, Int8PtrPtrTy, 5282 nullptr); 5283 5284 // struct _protocol_t* 5285 ProtocolnfABIPtrTy = llvm::PointerType::getUnqual(ProtocolnfABITy); 5286 5287 // struct _protocol_list_t { 5288 // long protocol_count; // Note, this is 32/64 bit 5289 // struct _protocol_t *[protocol_count]; 5290 // } 5291 ProtocolListnfABITy->setBody(LongTy, 5292 llvm::ArrayType::get(ProtocolnfABIPtrTy, 0), 5293 nullptr); 5294 5295 // struct _objc_protocol_list* 5296 ProtocolListnfABIPtrTy = llvm::PointerType::getUnqual(ProtocolListnfABITy); 5297 5298 // struct _ivar_t { 5299 // unsigned [long] int *offset; // pointer to ivar offset location 5300 // char *name; 5301 // char *type; 5302 // uint32_t alignment; 5303 // uint32_t size; 5304 // } 5305 IvarnfABITy = llvm::StructType::create( 5306 "struct._ivar_t", llvm::PointerType::getUnqual(IvarOffsetVarTy), 5307 Int8PtrTy, Int8PtrTy, IntTy, IntTy, nullptr); 5308 5309 // struct _ivar_list_t { 5310 // uint32 entsize; // sizeof(struct _ivar_t) 5311 // uint32 count; 5312 // struct _iver_t list[count]; 5313 // } 5314 IvarListnfABITy = 5315 llvm::StructType::create("struct._ivar_list_t", IntTy, IntTy, 5316 llvm::ArrayType::get(IvarnfABITy, 0), nullptr); 5317 5318 IvarListnfABIPtrTy = llvm::PointerType::getUnqual(IvarListnfABITy); 5319 5320 // struct _class_ro_t { 5321 // uint32_t const flags; 5322 // uint32_t const instanceStart; 5323 // uint32_t const instanceSize; 5324 // uint32_t const reserved; // only when building for 64bit targets 5325 // const uint8_t * const ivarLayout; 5326 // const char *const name; 5327 // const struct _method_list_t * const baseMethods; 5328 // const struct _objc_protocol_list *const baseProtocols; 5329 // const struct _ivar_list_t *const ivars; 5330 // const uint8_t * const weakIvarLayout; 5331 // const struct _prop_list_t * const properties; 5332 // } 5333 5334 // FIXME. Add 'reserved' field in 64bit abi mode! 5335 ClassRonfABITy = llvm::StructType::create("struct._class_ro_t", 5336 IntTy, IntTy, IntTy, Int8PtrTy, 5337 Int8PtrTy, MethodListnfABIPtrTy, 5338 ProtocolListnfABIPtrTy, 5339 IvarListnfABIPtrTy, 5340 Int8PtrTy, PropertyListPtrTy, 5341 nullptr); 5342 5343 // ImpnfABITy - LLVM for id (*)(id, SEL, ...) 5344 llvm::Type *params[] = { ObjectPtrTy, SelectorPtrTy }; 5345 ImpnfABITy = llvm::FunctionType::get(ObjectPtrTy, params, false) 5346 ->getPointerTo(); 5347 5348 // struct _class_t { 5349 // struct _class_t *isa; 5350 // struct _class_t * const superclass; 5351 // void *cache; 5352 // IMP *vtable; 5353 // struct class_ro_t *ro; 5354 // } 5355 5356 ClassnfABITy = llvm::StructType::create(VMContext, "struct._class_t"); 5357 ClassnfABITy->setBody(llvm::PointerType::getUnqual(ClassnfABITy), 5358 llvm::PointerType::getUnqual(ClassnfABITy), 5359 CachePtrTy, 5360 llvm::PointerType::getUnqual(ImpnfABITy), 5361 llvm::PointerType::getUnqual(ClassRonfABITy), 5362 nullptr); 5363 5364 // LLVM for struct _class_t * 5365 ClassnfABIPtrTy = llvm::PointerType::getUnqual(ClassnfABITy); 5366 5367 // struct _category_t { 5368 // const char * const name; 5369 // struct _class_t *const cls; 5370 // const struct _method_list_t * const instance_methods; 5371 // const struct _method_list_t * const class_methods; 5372 // const struct _protocol_list_t * const protocols; 5373 // const struct _prop_list_t * const properties; 5374 // } 5375 CategorynfABITy = llvm::StructType::create("struct._category_t", 5376 Int8PtrTy, ClassnfABIPtrTy, 5377 MethodListnfABIPtrTy, 5378 MethodListnfABIPtrTy, 5379 ProtocolListnfABIPtrTy, 5380 PropertyListPtrTy, 5381 nullptr); 5382 5383 // New types for nonfragile abi messaging. 5384 CodeGen::CodeGenTypes &Types = CGM.getTypes(); 5385 ASTContext &Ctx = CGM.getContext(); 5386 5387 // MessageRefTy - LLVM for: 5388 // struct _message_ref_t { 5389 // IMP messenger; 5390 // SEL name; 5391 // }; 5392 5393 // First the clang type for struct _message_ref_t 5394 RecordDecl *RD = RecordDecl::Create(Ctx, TTK_Struct, 5395 Ctx.getTranslationUnitDecl(), 5396 SourceLocation(), SourceLocation(), 5397 &Ctx.Idents.get("_message_ref_t")); 5398 RD->addDecl(FieldDecl::Create(Ctx, RD, SourceLocation(), SourceLocation(), 5399 nullptr, Ctx.VoidPtrTy, nullptr, nullptr, false, 5400 ICIS_NoInit)); 5401 RD->addDecl(FieldDecl::Create(Ctx, RD, SourceLocation(), SourceLocation(), 5402 nullptr, Ctx.getObjCSelType(), nullptr, nullptr, 5403 false, ICIS_NoInit)); 5404 RD->completeDefinition(); 5405 5406 MessageRefCTy = Ctx.getTagDeclType(RD); 5407 MessageRefCPtrTy = Ctx.getPointerType(MessageRefCTy); 5408 MessageRefTy = cast<llvm::StructType>(Types.ConvertType(MessageRefCTy)); 5409 5410 // MessageRefPtrTy - LLVM for struct _message_ref_t* 5411 MessageRefPtrTy = llvm::PointerType::getUnqual(MessageRefTy); 5412 5413 // SuperMessageRefTy - LLVM for: 5414 // struct _super_message_ref_t { 5415 // SUPER_IMP messenger; 5416 // SEL name; 5417 // }; 5418 SuperMessageRefTy = 5419 llvm::StructType::create("struct._super_message_ref_t", 5420 ImpnfABITy, SelectorPtrTy, nullptr); 5421 5422 // SuperMessageRefPtrTy - LLVM for struct _super_message_ref_t* 5423 SuperMessageRefPtrTy = llvm::PointerType::getUnqual(SuperMessageRefTy); 5424 5425 5426 // struct objc_typeinfo { 5427 // const void** vtable; // objc_ehtype_vtable + 2 5428 // const char* name; // c++ typeinfo string 5429 // Class cls; 5430 // }; 5431 EHTypeTy = 5432 llvm::StructType::create("struct._objc_typeinfo", 5433 llvm::PointerType::getUnqual(Int8PtrTy), 5434 Int8PtrTy, ClassnfABIPtrTy, nullptr); 5435 EHTypePtrTy = llvm::PointerType::getUnqual(EHTypeTy); 5436 } 5437 5438 llvm::Function *CGObjCNonFragileABIMac::ModuleInitFunction() { 5439 FinishNonFragileABIModule(); 5440 5441 return nullptr; 5442 } 5443 5444 void CGObjCNonFragileABIMac:: 5445 AddModuleClassList(ArrayRef<llvm::GlobalValue*> Container, 5446 const char *SymbolName, 5447 const char *SectionName) { 5448 unsigned NumClasses = Container.size(); 5449 5450 if (!NumClasses) 5451 return; 5452 5453 SmallVector<llvm::Constant*, 8> Symbols(NumClasses); 5454 for (unsigned i=0; i<NumClasses; i++) 5455 Symbols[i] = llvm::ConstantExpr::getBitCast(Container[i], 5456 ObjCTypes.Int8PtrTy); 5457 llvm::Constant *Init = 5458 llvm::ConstantArray::get(llvm::ArrayType::get(ObjCTypes.Int8PtrTy, 5459 Symbols.size()), 5460 Symbols); 5461 5462 llvm::GlobalVariable *GV = 5463 new llvm::GlobalVariable(CGM.getModule(), Init->getType(), false, 5464 llvm::GlobalValue::PrivateLinkage, 5465 Init, 5466 SymbolName); 5467 GV->setAlignment(CGM.getDataLayout().getABITypeAlignment(Init->getType())); 5468 GV->setSection(SectionName); 5469 CGM.addCompilerUsedGlobal(GV); 5470 } 5471 5472 void CGObjCNonFragileABIMac::FinishNonFragileABIModule() { 5473 // nonfragile abi has no module definition. 5474 5475 // Build list of all implemented class addresses in array 5476 // L_OBJC_LABEL_CLASS_$. 5477 5478 for (unsigned i=0, NumClasses=ImplementedClasses.size(); i<NumClasses; i++) { 5479 const ObjCInterfaceDecl *ID = ImplementedClasses[i]; 5480 assert(ID); 5481 if (ObjCImplementationDecl *IMP = ID->getImplementation()) 5482 // We are implementing a weak imported interface. Give it external linkage 5483 if (ID->isWeakImported() && !IMP->isWeakImported()) { 5484 DefinedClasses[i]->setLinkage(llvm::GlobalVariable::ExternalLinkage); 5485 DefinedMetaClasses[i]->setLinkage(llvm::GlobalVariable::ExternalLinkage); 5486 } 5487 } 5488 5489 AddModuleClassList(DefinedClasses, "OBJC_LABEL_CLASS_$", 5490 "__DATA, __objc_classlist, regular, no_dead_strip"); 5491 5492 AddModuleClassList(DefinedNonLazyClasses, "OBJC_LABEL_NONLAZY_CLASS_$", 5493 "__DATA, __objc_nlclslist, regular, no_dead_strip"); 5494 5495 // Build list of all implemented category addresses in array 5496 // L_OBJC_LABEL_CATEGORY_$. 5497 AddModuleClassList(DefinedCategories, "OBJC_LABEL_CATEGORY_$", 5498 "__DATA, __objc_catlist, regular, no_dead_strip"); 5499 AddModuleClassList(DefinedNonLazyCategories, "OBJC_LABEL_NONLAZY_CATEGORY_$", 5500 "__DATA, __objc_nlcatlist, regular, no_dead_strip"); 5501 5502 EmitImageInfo(); 5503 } 5504 5505 /// isVTableDispatchedSelector - Returns true if SEL is not in the list of 5506 /// VTableDispatchMethods; false otherwise. What this means is that 5507 /// except for the 19 selectors in the list, we generate 32bit-style 5508 /// message dispatch call for all the rest. 5509 bool CGObjCNonFragileABIMac::isVTableDispatchedSelector(Selector Sel) { 5510 // At various points we've experimented with using vtable-based 5511 // dispatch for all methods. 5512 switch (CGM.getCodeGenOpts().getObjCDispatchMethod()) { 5513 case CodeGenOptions::Legacy: 5514 return false; 5515 case CodeGenOptions::NonLegacy: 5516 return true; 5517 case CodeGenOptions::Mixed: 5518 break; 5519 } 5520 5521 // If so, see whether this selector is in the white-list of things which must 5522 // use the new dispatch convention. We lazily build a dense set for this. 5523 if (VTableDispatchMethods.empty()) { 5524 VTableDispatchMethods.insert(GetNullarySelector("alloc")); 5525 VTableDispatchMethods.insert(GetNullarySelector("class")); 5526 VTableDispatchMethods.insert(GetNullarySelector("self")); 5527 VTableDispatchMethods.insert(GetNullarySelector("isFlipped")); 5528 VTableDispatchMethods.insert(GetNullarySelector("length")); 5529 VTableDispatchMethods.insert(GetNullarySelector("count")); 5530 5531 // These are vtable-based if GC is disabled. 5532 // Optimistically use vtable dispatch for hybrid compiles. 5533 if (CGM.getLangOpts().getGC() != LangOptions::GCOnly) { 5534 VTableDispatchMethods.insert(GetNullarySelector("retain")); 5535 VTableDispatchMethods.insert(GetNullarySelector("release")); 5536 VTableDispatchMethods.insert(GetNullarySelector("autorelease")); 5537 } 5538 5539 VTableDispatchMethods.insert(GetUnarySelector("allocWithZone")); 5540 VTableDispatchMethods.insert(GetUnarySelector("isKindOfClass")); 5541 VTableDispatchMethods.insert(GetUnarySelector("respondsToSelector")); 5542 VTableDispatchMethods.insert(GetUnarySelector("objectForKey")); 5543 VTableDispatchMethods.insert(GetUnarySelector("objectAtIndex")); 5544 VTableDispatchMethods.insert(GetUnarySelector("isEqualToString")); 5545 VTableDispatchMethods.insert(GetUnarySelector("isEqual")); 5546 5547 // These are vtable-based if GC is enabled. 5548 // Optimistically use vtable dispatch for hybrid compiles. 5549 if (CGM.getLangOpts().getGC() != LangOptions::NonGC) { 5550 VTableDispatchMethods.insert(GetNullarySelector("hash")); 5551 VTableDispatchMethods.insert(GetUnarySelector("addObject")); 5552 5553 // "countByEnumeratingWithState:objects:count" 5554 IdentifierInfo *KeyIdents[] = { 5555 &CGM.getContext().Idents.get("countByEnumeratingWithState"), 5556 &CGM.getContext().Idents.get("objects"), 5557 &CGM.getContext().Idents.get("count") 5558 }; 5559 VTableDispatchMethods.insert( 5560 CGM.getContext().Selectors.getSelector(3, KeyIdents)); 5561 } 5562 } 5563 5564 return VTableDispatchMethods.count(Sel); 5565 } 5566 5567 /// BuildClassRoTInitializer - generate meta-data for: 5568 /// struct _class_ro_t { 5569 /// uint32_t const flags; 5570 /// uint32_t const instanceStart; 5571 /// uint32_t const instanceSize; 5572 /// uint32_t const reserved; // only when building for 64bit targets 5573 /// const uint8_t * const ivarLayout; 5574 /// const char *const name; 5575 /// const struct _method_list_t * const baseMethods; 5576 /// const struct _protocol_list_t *const baseProtocols; 5577 /// const struct _ivar_list_t *const ivars; 5578 /// const uint8_t * const weakIvarLayout; 5579 /// const struct _prop_list_t * const properties; 5580 /// } 5581 /// 5582 llvm::GlobalVariable * CGObjCNonFragileABIMac::BuildClassRoTInitializer( 5583 unsigned flags, 5584 unsigned InstanceStart, 5585 unsigned InstanceSize, 5586 const ObjCImplementationDecl *ID) { 5587 std::string ClassName = ID->getObjCRuntimeNameAsString(); 5588 llvm::Constant *Values[10]; // 11 for 64bit targets! 5589 5590 if (CGM.getLangOpts().ObjCAutoRefCount) 5591 flags |= NonFragileABI_Class_CompiledByARC; 5592 5593 Values[ 0] = llvm::ConstantInt::get(ObjCTypes.IntTy, flags); 5594 Values[ 1] = llvm::ConstantInt::get(ObjCTypes.IntTy, InstanceStart); 5595 Values[ 2] = llvm::ConstantInt::get(ObjCTypes.IntTy, InstanceSize); 5596 // FIXME. For 64bit targets add 0 here. 5597 Values[ 3] = (flags & NonFragileABI_Class_Meta) 5598 ? GetIvarLayoutName(nullptr, ObjCTypes) 5599 : BuildIvarLayout(ID, true); 5600 Values[ 4] = GetClassName(ID->getObjCRuntimeNameAsString()); 5601 // const struct _method_list_t * const baseMethods; 5602 std::vector<llvm::Constant*> Methods; 5603 std::string MethodListName("\01l_OBJC_$_"); 5604 if (flags & NonFragileABI_Class_Meta) { 5605 MethodListName += "CLASS_METHODS_"; 5606 MethodListName += ID->getObjCRuntimeNameAsString(); 5607 for (const auto *I : ID->class_methods()) 5608 // Class methods should always be defined. 5609 Methods.push_back(GetMethodConstant(I)); 5610 } else { 5611 MethodListName += "INSTANCE_METHODS_"; 5612 MethodListName += ID->getObjCRuntimeNameAsString(); 5613 for (const auto *I : ID->instance_methods()) 5614 // Instance methods should always be defined. 5615 Methods.push_back(GetMethodConstant(I)); 5616 5617 for (const auto *PID : ID->property_impls()) { 5618 if (PID->getPropertyImplementation() == ObjCPropertyImplDecl::Synthesize){ 5619 ObjCPropertyDecl *PD = PID->getPropertyDecl(); 5620 5621 if (ObjCMethodDecl *MD = PD->getGetterMethodDecl()) 5622 if (llvm::Constant *C = GetMethodConstant(MD)) 5623 Methods.push_back(C); 5624 if (ObjCMethodDecl *MD = PD->getSetterMethodDecl()) 5625 if (llvm::Constant *C = GetMethodConstant(MD)) 5626 Methods.push_back(C); 5627 } 5628 } 5629 } 5630 Values[ 5] = EmitMethodList(MethodListName, 5631 "__DATA, __objc_const", Methods); 5632 5633 const ObjCInterfaceDecl *OID = ID->getClassInterface(); 5634 assert(OID && "CGObjCNonFragileABIMac::BuildClassRoTInitializer"); 5635 Values[ 6] = EmitProtocolList("\01l_OBJC_CLASS_PROTOCOLS_$_" 5636 + OID->getObjCRuntimeNameAsString(), 5637 OID->all_referenced_protocol_begin(), 5638 OID->all_referenced_protocol_end()); 5639 5640 if (flags & NonFragileABI_Class_Meta) { 5641 Values[ 7] = llvm::Constant::getNullValue(ObjCTypes.IvarListnfABIPtrTy); 5642 Values[ 8] = GetIvarLayoutName(nullptr, ObjCTypes); 5643 Values[ 9] = llvm::Constant::getNullValue(ObjCTypes.PropertyListPtrTy); 5644 } else { 5645 Values[ 7] = EmitIvarList(ID); 5646 Values[ 8] = BuildIvarLayout(ID, false); 5647 Values[ 9] = EmitPropertyList("\01l_OBJC_$_PROP_LIST_" + ID->getObjCRuntimeNameAsString(), 5648 ID, ID->getClassInterface(), ObjCTypes); 5649 } 5650 llvm::Constant *Init = llvm::ConstantStruct::get(ObjCTypes.ClassRonfABITy, 5651 Values); 5652 llvm::GlobalVariable *CLASS_RO_GV = 5653 new llvm::GlobalVariable(CGM.getModule(), ObjCTypes.ClassRonfABITy, false, 5654 llvm::GlobalValue::PrivateLinkage, 5655 Init, 5656 (flags & NonFragileABI_Class_Meta) ? 5657 std::string("\01l_OBJC_METACLASS_RO_$_")+ClassName : 5658 std::string("\01l_OBJC_CLASS_RO_$_")+ClassName); 5659 CLASS_RO_GV->setAlignment( 5660 CGM.getDataLayout().getABITypeAlignment(ObjCTypes.ClassRonfABITy)); 5661 CLASS_RO_GV->setSection("__DATA, __objc_const"); 5662 return CLASS_RO_GV; 5663 5664 } 5665 5666 /// BuildClassMetaData - This routine defines that to-level meta-data 5667 /// for the given ClassName for: 5668 /// struct _class_t { 5669 /// struct _class_t *isa; 5670 /// struct _class_t * const superclass; 5671 /// void *cache; 5672 /// IMP *vtable; 5673 /// struct class_ro_t *ro; 5674 /// } 5675 /// 5676 llvm::GlobalVariable *CGObjCNonFragileABIMac::BuildClassMetaData( 5677 const std::string &ClassName, llvm::Constant *IsAGV, llvm::Constant *SuperClassGV, 5678 llvm::Constant *ClassRoGV, bool HiddenVisibility, bool Weak) { 5679 llvm::Constant *Values[] = { 5680 IsAGV, 5681 SuperClassGV, 5682 ObjCEmptyCacheVar, // &ObjCEmptyCacheVar 5683 ObjCEmptyVtableVar, // &ObjCEmptyVtableVar 5684 ClassRoGV // &CLASS_RO_GV 5685 }; 5686 if (!Values[1]) 5687 Values[1] = llvm::Constant::getNullValue(ObjCTypes.ClassnfABIPtrTy); 5688 if (!Values[3]) 5689 Values[3] = llvm::Constant::getNullValue( 5690 llvm::PointerType::getUnqual(ObjCTypes.ImpnfABITy)); 5691 llvm::Constant *Init = llvm::ConstantStruct::get(ObjCTypes.ClassnfABITy, 5692 Values); 5693 llvm::GlobalVariable *GV = GetClassGlobal(ClassName, Weak); 5694 GV->setInitializer(Init); 5695 GV->setSection("__DATA, __objc_data"); 5696 GV->setAlignment( 5697 CGM.getDataLayout().getABITypeAlignment(ObjCTypes.ClassnfABITy)); 5698 if (HiddenVisibility) 5699 GV->setVisibility(llvm::GlobalValue::HiddenVisibility); 5700 return GV; 5701 } 5702 5703 bool 5704 CGObjCNonFragileABIMac::ImplementationIsNonLazy(const ObjCImplDecl *OD) const { 5705 return OD->getClassMethod(GetNullarySelector("load")) != nullptr; 5706 } 5707 5708 void CGObjCNonFragileABIMac::GetClassSizeInfo(const ObjCImplementationDecl *OID, 5709 uint32_t &InstanceStart, 5710 uint32_t &InstanceSize) { 5711 const ASTRecordLayout &RL = 5712 CGM.getContext().getASTObjCImplementationLayout(OID); 5713 5714 // InstanceSize is really instance end. 5715 InstanceSize = RL.getDataSize().getQuantity(); 5716 5717 // If there are no fields, the start is the same as the end. 5718 if (!RL.getFieldCount()) 5719 InstanceStart = InstanceSize; 5720 else 5721 InstanceStart = RL.getFieldOffset(0) / CGM.getContext().getCharWidth(); 5722 } 5723 5724 void CGObjCNonFragileABIMac::GenerateClass(const ObjCImplementationDecl *ID) { 5725 std::string ClassName = ID->getObjCRuntimeNameAsString(); 5726 if (!ObjCEmptyCacheVar) { 5727 ObjCEmptyCacheVar = new llvm::GlobalVariable( 5728 CGM.getModule(), 5729 ObjCTypes.CacheTy, 5730 false, 5731 llvm::GlobalValue::ExternalLinkage, 5732 nullptr, 5733 "_objc_empty_cache"); 5734 5735 // Make this entry NULL for any iOS device target, any iOS simulator target, 5736 // OS X with deployment target 10.9 or later. 5737 const llvm::Triple &Triple = CGM.getTarget().getTriple(); 5738 if (Triple.isiOS() || (Triple.isMacOSX() && !Triple.isMacOSXVersionLT(10, 9))) 5739 // This entry will be null. 5740 ObjCEmptyVtableVar = nullptr; 5741 else 5742 ObjCEmptyVtableVar = new llvm::GlobalVariable( 5743 CGM.getModule(), 5744 ObjCTypes.ImpnfABITy, 5745 false, 5746 llvm::GlobalValue::ExternalLinkage, 5747 nullptr, 5748 "_objc_empty_vtable"); 5749 } 5750 assert(ID->getClassInterface() && 5751 "CGObjCNonFragileABIMac::GenerateClass - class is 0"); 5752 // FIXME: Is this correct (that meta class size is never computed)? 5753 uint32_t InstanceStart = 5754 CGM.getDataLayout().getTypeAllocSize(ObjCTypes.ClassnfABITy); 5755 uint32_t InstanceSize = InstanceStart; 5756 uint32_t flags = NonFragileABI_Class_Meta; 5757 llvm::SmallString<64> ObjCMetaClassName(getMetaclassSymbolPrefix()); 5758 llvm::SmallString<64> ObjCClassName(getClassSymbolPrefix()); 5759 llvm::SmallString<64> TClassName; 5760 5761 llvm::GlobalVariable *SuperClassGV, *IsAGV; 5762 5763 // Build the flags for the metaclass. 5764 bool classIsHidden = 5765 ID->getClassInterface()->getVisibility() == HiddenVisibility; 5766 if (classIsHidden) 5767 flags |= NonFragileABI_Class_Hidden; 5768 5769 // FIXME: why is this flag set on the metaclass? 5770 // ObjC metaclasses have no fields and don't really get constructed. 5771 if (ID->hasNonZeroConstructors() || ID->hasDestructors()) { 5772 flags |= NonFragileABI_Class_HasCXXStructors; 5773 if (!ID->hasNonZeroConstructors()) 5774 flags |= NonFragileABI_Class_HasCXXDestructorOnly; 5775 } 5776 5777 if (!ID->getClassInterface()->getSuperClass()) { 5778 // class is root 5779 flags |= NonFragileABI_Class_Root; 5780 TClassName = ObjCClassName; 5781 TClassName += ClassName; 5782 SuperClassGV = GetClassGlobal(TClassName.str(), 5783 ID->getClassInterface()->isWeakImported()); 5784 TClassName = ObjCMetaClassName; 5785 TClassName += ClassName; 5786 IsAGV = GetClassGlobal(TClassName.str(), 5787 ID->getClassInterface()->isWeakImported()); 5788 } else { 5789 // Has a root. Current class is not a root. 5790 const ObjCInterfaceDecl *Root = ID->getClassInterface(); 5791 while (const ObjCInterfaceDecl *Super = Root->getSuperClass()) 5792 Root = Super; 5793 TClassName = ObjCMetaClassName ; 5794 TClassName += Root->getObjCRuntimeNameAsString(); 5795 IsAGV = GetClassGlobal(TClassName.str(), 5796 Root->isWeakImported()); 5797 5798 // work on super class metadata symbol. 5799 TClassName = ObjCMetaClassName; 5800 TClassName += ID->getClassInterface()->getSuperClass()->getObjCRuntimeNameAsString(); 5801 SuperClassGV = GetClassGlobal( 5802 TClassName.str(), 5803 ID->getClassInterface()->getSuperClass()->isWeakImported()); 5804 } 5805 llvm::GlobalVariable *CLASS_RO_GV = BuildClassRoTInitializer(flags, 5806 InstanceStart, 5807 InstanceSize,ID); 5808 TClassName = ObjCMetaClassName; 5809 TClassName += ClassName; 5810 llvm::GlobalVariable *MetaTClass = BuildClassMetaData( 5811 TClassName.str(), IsAGV, SuperClassGV, CLASS_RO_GV, classIsHidden, 5812 ID->getClassInterface()->isWeakImported()); 5813 DefinedMetaClasses.push_back(MetaTClass); 5814 5815 // Metadata for the class 5816 flags = 0; 5817 if (classIsHidden) 5818 flags |= NonFragileABI_Class_Hidden; 5819 5820 if (ID->hasNonZeroConstructors() || ID->hasDestructors()) { 5821 flags |= NonFragileABI_Class_HasCXXStructors; 5822 5823 // Set a flag to enable a runtime optimization when a class has 5824 // fields that require destruction but which don't require 5825 // anything except zero-initialization during construction. This 5826 // is most notably true of __strong and __weak types, but you can 5827 // also imagine there being C++ types with non-trivial default 5828 // constructors that merely set all fields to null. 5829 if (!ID->hasNonZeroConstructors()) 5830 flags |= NonFragileABI_Class_HasCXXDestructorOnly; 5831 } 5832 5833 if (hasObjCExceptionAttribute(CGM.getContext(), ID->getClassInterface())) 5834 flags |= NonFragileABI_Class_Exception; 5835 5836 if (!ID->getClassInterface()->getSuperClass()) { 5837 flags |= NonFragileABI_Class_Root; 5838 SuperClassGV = nullptr; 5839 } else { 5840 // Has a root. Current class is not a root. 5841 TClassName = ObjCClassName; 5842 TClassName += ID->getClassInterface()->getSuperClass()->getObjCRuntimeNameAsString(); 5843 SuperClassGV = GetClassGlobal( 5844 TClassName.str(), 5845 ID->getClassInterface()->getSuperClass()->isWeakImported()); 5846 } 5847 GetClassSizeInfo(ID, InstanceStart, InstanceSize); 5848 CLASS_RO_GV = BuildClassRoTInitializer(flags, 5849 InstanceStart, 5850 InstanceSize, 5851 ID); 5852 5853 TClassName = ObjCClassName; 5854 TClassName += ClassName; 5855 llvm::GlobalVariable *ClassMD = 5856 BuildClassMetaData(TClassName.str(), MetaTClass, SuperClassGV, CLASS_RO_GV, 5857 classIsHidden, 5858 ID->getClassInterface()->isWeakImported()); 5859 DefinedClasses.push_back(ClassMD); 5860 ImplementedClasses.push_back(ID->getClassInterface()); 5861 5862 // Determine if this class is also "non-lazy". 5863 if (ImplementationIsNonLazy(ID)) 5864 DefinedNonLazyClasses.push_back(ClassMD); 5865 5866 // Force the definition of the EHType if necessary. 5867 if (flags & NonFragileABI_Class_Exception) 5868 GetInterfaceEHType(ID->getClassInterface(), true); 5869 // Make sure method definition entries are all clear for next implementation. 5870 MethodDefinitions.clear(); 5871 } 5872 5873 /// GenerateProtocolRef - This routine is called to generate code for 5874 /// a protocol reference expression; as in: 5875 /// @code 5876 /// @protocol(Proto1); 5877 /// @endcode 5878 /// It generates a weak reference to l_OBJC_PROTOCOL_REFERENCE_$_Proto1 5879 /// which will hold address of the protocol meta-data. 5880 /// 5881 llvm::Value *CGObjCNonFragileABIMac::GenerateProtocolRef(CodeGenFunction &CGF, 5882 const ObjCProtocolDecl *PD) { 5883 5884 // This routine is called for @protocol only. So, we must build definition 5885 // of protocol's meta-data (not a reference to it!) 5886 // 5887 llvm::Constant *Init = 5888 llvm::ConstantExpr::getBitCast(GetOrEmitProtocol(PD), 5889 ObjCTypes.getExternalProtocolPtrTy()); 5890 5891 std::string ProtocolName("\01l_OBJC_PROTOCOL_REFERENCE_$_"); 5892 ProtocolName += PD->getObjCRuntimeNameAsString(); 5893 5894 llvm::GlobalVariable *PTGV = CGM.getModule().getGlobalVariable(ProtocolName); 5895 if (PTGV) 5896 return CGF.Builder.CreateLoad(PTGV); 5897 PTGV = new llvm::GlobalVariable( 5898 CGM.getModule(), 5899 Init->getType(), false, 5900 llvm::GlobalValue::WeakAnyLinkage, 5901 Init, 5902 ProtocolName); 5903 PTGV->setSection("__DATA, __objc_protorefs, coalesced, no_dead_strip"); 5904 PTGV->setVisibility(llvm::GlobalValue::HiddenVisibility); 5905 CGM.addCompilerUsedGlobal(PTGV); 5906 return CGF.Builder.CreateLoad(PTGV); 5907 } 5908 5909 /// GenerateCategory - Build metadata for a category implementation. 5910 /// struct _category_t { 5911 /// const char * const name; 5912 /// struct _class_t *const cls; 5913 /// const struct _method_list_t * const instance_methods; 5914 /// const struct _method_list_t * const class_methods; 5915 /// const struct _protocol_list_t * const protocols; 5916 /// const struct _prop_list_t * const properties; 5917 /// } 5918 /// 5919 void CGObjCNonFragileABIMac::GenerateCategory(const ObjCCategoryImplDecl *OCD) { 5920 const ObjCInterfaceDecl *Interface = OCD->getClassInterface(); 5921 const char *Prefix = "\01l_OBJC_$_CATEGORY_"; 5922 5923 llvm::SmallString<64> ExtCatName(Prefix); 5924 ExtCatName += Interface->getObjCRuntimeNameAsString(); 5925 ExtCatName += "_$_"; 5926 ExtCatName += OCD->getNameAsString(); 5927 5928 llvm::SmallString<64> ExtClassName(getClassSymbolPrefix()); 5929 ExtClassName += Interface->getObjCRuntimeNameAsString(); 5930 5931 llvm::Constant *Values[6]; 5932 Values[0] = GetClassName(OCD->getIdentifier()->getName()); 5933 // meta-class entry symbol 5934 llvm::GlobalVariable *ClassGV = 5935 GetClassGlobal(ExtClassName.str(), Interface->isWeakImported()); 5936 5937 Values[1] = ClassGV; 5938 std::vector<llvm::Constant*> Methods; 5939 llvm::SmallString<64> MethodListName(Prefix); 5940 5941 MethodListName += "INSTANCE_METHODS_"; 5942 MethodListName += Interface->getObjCRuntimeNameAsString(); 5943 MethodListName += "_$_"; 5944 MethodListName += OCD->getName(); 5945 5946 for (const auto *I : OCD->instance_methods()) 5947 // Instance methods should always be defined. 5948 Methods.push_back(GetMethodConstant(I)); 5949 5950 Values[2] = EmitMethodList(MethodListName.str(), 5951 "__DATA, __objc_const", 5952 Methods); 5953 5954 MethodListName = Prefix; 5955 MethodListName += "CLASS_METHODS_"; 5956 MethodListName += Interface->getObjCRuntimeNameAsString(); 5957 MethodListName += "_$_"; 5958 MethodListName += OCD->getNameAsString(); 5959 5960 Methods.clear(); 5961 for (const auto *I : OCD->class_methods()) 5962 // Class methods should always be defined. 5963 Methods.push_back(GetMethodConstant(I)); 5964 5965 Values[3] = EmitMethodList(MethodListName.str(), 5966 "__DATA, __objc_const", 5967 Methods); 5968 const ObjCCategoryDecl *Category = 5969 Interface->FindCategoryDeclaration(OCD->getIdentifier()); 5970 if (Category) { 5971 SmallString<256> ExtName; 5972 llvm::raw_svector_ostream(ExtName) << Interface->getObjCRuntimeNameAsString() << "_$_" 5973 << OCD->getName(); 5974 Values[4] = EmitProtocolList("\01l_OBJC_CATEGORY_PROTOCOLS_$_" 5975 + Interface->getObjCRuntimeNameAsString() + "_$_" 5976 + Category->getName(), 5977 Category->protocol_begin(), 5978 Category->protocol_end()); 5979 Values[5] = EmitPropertyList("\01l_OBJC_$_PROP_LIST_" + ExtName.str(), 5980 OCD, Category, ObjCTypes); 5981 } else { 5982 Values[4] = llvm::Constant::getNullValue(ObjCTypes.ProtocolListnfABIPtrTy); 5983 Values[5] = llvm::Constant::getNullValue(ObjCTypes.PropertyListPtrTy); 5984 } 5985 5986 llvm::Constant *Init = 5987 llvm::ConstantStruct::get(ObjCTypes.CategorynfABITy, 5988 Values); 5989 llvm::GlobalVariable *GCATV 5990 = new llvm::GlobalVariable(CGM.getModule(), ObjCTypes.CategorynfABITy, 5991 false, 5992 llvm::GlobalValue::PrivateLinkage, 5993 Init, 5994 ExtCatName.str()); 5995 GCATV->setAlignment( 5996 CGM.getDataLayout().getABITypeAlignment(ObjCTypes.CategorynfABITy)); 5997 GCATV->setSection("__DATA, __objc_const"); 5998 CGM.addCompilerUsedGlobal(GCATV); 5999 DefinedCategories.push_back(GCATV); 6000 6001 // Determine if this category is also "non-lazy". 6002 if (ImplementationIsNonLazy(OCD)) 6003 DefinedNonLazyCategories.push_back(GCATV); 6004 // method definition entries must be clear for next implementation. 6005 MethodDefinitions.clear(); 6006 } 6007 6008 /// GetMethodConstant - Return a struct objc_method constant for the 6009 /// given method if it has been defined. The result is null if the 6010 /// method has not been defined. The return value has type MethodPtrTy. 6011 llvm::Constant *CGObjCNonFragileABIMac::GetMethodConstant( 6012 const ObjCMethodDecl *MD) { 6013 llvm::Function *Fn = GetMethodDefinition(MD); 6014 if (!Fn) 6015 return nullptr; 6016 6017 llvm::Constant *Method[] = { 6018 llvm::ConstantExpr::getBitCast(GetMethodVarName(MD->getSelector()), 6019 ObjCTypes.SelectorPtrTy), 6020 GetMethodVarType(MD), 6021 llvm::ConstantExpr::getBitCast(Fn, ObjCTypes.Int8PtrTy) 6022 }; 6023 return llvm::ConstantStruct::get(ObjCTypes.MethodTy, Method); 6024 } 6025 6026 /// EmitMethodList - Build meta-data for method declarations 6027 /// struct _method_list_t { 6028 /// uint32_t entsize; // sizeof(struct _objc_method) 6029 /// uint32_t method_count; 6030 /// struct _objc_method method_list[method_count]; 6031 /// } 6032 /// 6033 llvm::Constant * 6034 CGObjCNonFragileABIMac::EmitMethodList(Twine Name, 6035 const char *Section, 6036 ArrayRef<llvm::Constant*> Methods) { 6037 // Return null for empty list. 6038 if (Methods.empty()) 6039 return llvm::Constant::getNullValue(ObjCTypes.MethodListnfABIPtrTy); 6040 6041 llvm::Constant *Values[3]; 6042 // sizeof(struct _objc_method) 6043 unsigned Size = CGM.getDataLayout().getTypeAllocSize(ObjCTypes.MethodTy); 6044 Values[0] = llvm::ConstantInt::get(ObjCTypes.IntTy, Size); 6045 // method_count 6046 Values[1] = llvm::ConstantInt::get(ObjCTypes.IntTy, Methods.size()); 6047 llvm::ArrayType *AT = llvm::ArrayType::get(ObjCTypes.MethodTy, 6048 Methods.size()); 6049 Values[2] = llvm::ConstantArray::get(AT, Methods); 6050 llvm::Constant *Init = llvm::ConstantStruct::getAnon(Values); 6051 6052 llvm::GlobalVariable *GV = 6053 new llvm::GlobalVariable(CGM.getModule(), Init->getType(), false, 6054 llvm::GlobalValue::PrivateLinkage, Init, Name); 6055 GV->setAlignment(CGM.getDataLayout().getABITypeAlignment(Init->getType())); 6056 GV->setSection(Section); 6057 CGM.addCompilerUsedGlobal(GV); 6058 return llvm::ConstantExpr::getBitCast(GV, ObjCTypes.MethodListnfABIPtrTy); 6059 } 6060 6061 /// ObjCIvarOffsetVariable - Returns the ivar offset variable for 6062 /// the given ivar. 6063 llvm::GlobalVariable * 6064 CGObjCNonFragileABIMac::ObjCIvarOffsetVariable(const ObjCInterfaceDecl *ID, 6065 const ObjCIvarDecl *Ivar) { 6066 6067 const ObjCInterfaceDecl *Container = Ivar->getContainingInterface(); 6068 llvm::SmallString<64> Name("OBJC_IVAR_$_"); 6069 Name += Container->getObjCRuntimeNameAsString(); 6070 Name += "."; 6071 Name += Ivar->getName(); 6072 llvm::GlobalVariable *IvarOffsetGV = 6073 CGM.getModule().getGlobalVariable(Name); 6074 if (!IvarOffsetGV) 6075 IvarOffsetGV = new llvm::GlobalVariable( 6076 CGM.getModule(), ObjCTypes.IvarOffsetVarTy, false, 6077 llvm::GlobalValue::ExternalLinkage, nullptr, Name.str()); 6078 return IvarOffsetGV; 6079 } 6080 6081 llvm::Constant * 6082 CGObjCNonFragileABIMac::EmitIvarOffsetVar(const ObjCInterfaceDecl *ID, 6083 const ObjCIvarDecl *Ivar, 6084 unsigned long int Offset) { 6085 llvm::GlobalVariable *IvarOffsetGV = ObjCIvarOffsetVariable(ID, Ivar); 6086 IvarOffsetGV->setInitializer( 6087 llvm::ConstantInt::get(ObjCTypes.IvarOffsetVarTy, Offset)); 6088 IvarOffsetGV->setAlignment( 6089 CGM.getDataLayout().getABITypeAlignment(ObjCTypes.IvarOffsetVarTy)); 6090 6091 // FIXME: This matches gcc, but shouldn't the visibility be set on the use as 6092 // well (i.e., in ObjCIvarOffsetVariable). 6093 if (Ivar->getAccessControl() == ObjCIvarDecl::Private || 6094 Ivar->getAccessControl() == ObjCIvarDecl::Package || 6095 ID->getVisibility() == HiddenVisibility) 6096 IvarOffsetGV->setVisibility(llvm::GlobalValue::HiddenVisibility); 6097 else 6098 IvarOffsetGV->setVisibility(llvm::GlobalValue::DefaultVisibility); 6099 IvarOffsetGV->setSection("__DATA, __objc_ivar"); 6100 return IvarOffsetGV; 6101 } 6102 6103 /// EmitIvarList - Emit the ivar list for the given 6104 /// implementation. The return value has type 6105 /// IvarListnfABIPtrTy. 6106 /// struct _ivar_t { 6107 /// unsigned [long] int *offset; // pointer to ivar offset location 6108 /// char *name; 6109 /// char *type; 6110 /// uint32_t alignment; 6111 /// uint32_t size; 6112 /// } 6113 /// struct _ivar_list_t { 6114 /// uint32 entsize; // sizeof(struct _ivar_t) 6115 /// uint32 count; 6116 /// struct _iver_t list[count]; 6117 /// } 6118 /// 6119 6120 llvm::Constant *CGObjCNonFragileABIMac::EmitIvarList( 6121 const ObjCImplementationDecl *ID) { 6122 6123 std::vector<llvm::Constant*> Ivars; 6124 6125 const ObjCInterfaceDecl *OID = ID->getClassInterface(); 6126 assert(OID && "CGObjCNonFragileABIMac::EmitIvarList - null interface"); 6127 6128 // FIXME. Consolidate this with similar code in GenerateClass. 6129 6130 for (const ObjCIvarDecl *IVD = OID->all_declared_ivar_begin(); 6131 IVD; IVD = IVD->getNextIvar()) { 6132 // Ignore unnamed bit-fields. 6133 if (!IVD->getDeclName()) 6134 continue; 6135 llvm::Constant *Ivar[5]; 6136 Ivar[0] = EmitIvarOffsetVar(ID->getClassInterface(), IVD, 6137 ComputeIvarBaseOffset(CGM, ID, IVD)); 6138 Ivar[1] = GetMethodVarName(IVD->getIdentifier()); 6139 Ivar[2] = GetMethodVarType(IVD); 6140 llvm::Type *FieldTy = 6141 CGM.getTypes().ConvertTypeForMem(IVD->getType()); 6142 unsigned Size = CGM.getDataLayout().getTypeAllocSize(FieldTy); 6143 unsigned Align = CGM.getContext().getPreferredTypeAlign( 6144 IVD->getType().getTypePtr()) >> 3; 6145 Align = llvm::Log2_32(Align); 6146 Ivar[3] = llvm::ConstantInt::get(ObjCTypes.IntTy, Align); 6147 // NOTE. Size of a bitfield does not match gcc's, because of the 6148 // way bitfields are treated special in each. But I am told that 6149 // 'size' for bitfield ivars is ignored by the runtime so it does 6150 // not matter. If it matters, there is enough info to get the 6151 // bitfield right! 6152 Ivar[4] = llvm::ConstantInt::get(ObjCTypes.IntTy, Size); 6153 Ivars.push_back(llvm::ConstantStruct::get(ObjCTypes.IvarnfABITy, Ivar)); 6154 } 6155 // Return null for empty list. 6156 if (Ivars.empty()) 6157 return llvm::Constant::getNullValue(ObjCTypes.IvarListnfABIPtrTy); 6158 6159 llvm::Constant *Values[3]; 6160 unsigned Size = CGM.getDataLayout().getTypeAllocSize(ObjCTypes.IvarnfABITy); 6161 Values[0] = llvm::ConstantInt::get(ObjCTypes.IntTy, Size); 6162 Values[1] = llvm::ConstantInt::get(ObjCTypes.IntTy, Ivars.size()); 6163 llvm::ArrayType *AT = llvm::ArrayType::get(ObjCTypes.IvarnfABITy, 6164 Ivars.size()); 6165 Values[2] = llvm::ConstantArray::get(AT, Ivars); 6166 llvm::Constant *Init = llvm::ConstantStruct::getAnon(Values); 6167 const char *Prefix = "\01l_OBJC_$_INSTANCE_VARIABLES_"; 6168 llvm::GlobalVariable *GV = 6169 new llvm::GlobalVariable(CGM.getModule(), Init->getType(), false, 6170 llvm::GlobalValue::PrivateLinkage, 6171 Init, 6172 Prefix + OID->getObjCRuntimeNameAsString()); 6173 GV->setAlignment( 6174 CGM.getDataLayout().getABITypeAlignment(Init->getType())); 6175 GV->setSection("__DATA, __objc_const"); 6176 6177 CGM.addCompilerUsedGlobal(GV); 6178 return llvm::ConstantExpr::getBitCast(GV, ObjCTypes.IvarListnfABIPtrTy); 6179 } 6180 6181 llvm::Constant *CGObjCNonFragileABIMac::GetOrEmitProtocolRef( 6182 const ObjCProtocolDecl *PD) { 6183 llvm::GlobalVariable *&Entry = Protocols[PD->getIdentifier()]; 6184 6185 if (!Entry) { 6186 // We use the initializer as a marker of whether this is a forward 6187 // reference or not. At module finalization we add the empty 6188 // contents for protocols which were referenced but never defined. 6189 Entry = 6190 new llvm::GlobalVariable(CGM.getModule(), ObjCTypes.ProtocolnfABITy, 6191 false, llvm::GlobalValue::ExternalLinkage, 6192 nullptr, 6193 "\01l_OBJC_PROTOCOL_$_" + PD->getObjCRuntimeNameAsString()); 6194 Entry->setSection("__DATA,__datacoal_nt,coalesced"); 6195 } 6196 6197 return Entry; 6198 } 6199 6200 /// GetOrEmitProtocol - Generate the protocol meta-data: 6201 /// @code 6202 /// struct _protocol_t { 6203 /// id isa; // NULL 6204 /// const char * const protocol_name; 6205 /// const struct _protocol_list_t * protocol_list; // super protocols 6206 /// const struct method_list_t * const instance_methods; 6207 /// const struct method_list_t * const class_methods; 6208 /// const struct method_list_t *optionalInstanceMethods; 6209 /// const struct method_list_t *optionalClassMethods; 6210 /// const struct _prop_list_t * properties; 6211 /// const uint32_t size; // sizeof(struct _protocol_t) 6212 /// const uint32_t flags; // = 0 6213 /// const char ** extendedMethodTypes; 6214 /// } 6215 /// @endcode 6216 /// 6217 6218 llvm::Constant *CGObjCNonFragileABIMac::GetOrEmitProtocol( 6219 const ObjCProtocolDecl *PD) { 6220 llvm::GlobalVariable *Entry = Protocols[PD->getIdentifier()]; 6221 6222 // Early exit if a defining object has already been generated. 6223 if (Entry && Entry->hasInitializer()) 6224 return Entry; 6225 6226 // Use the protocol definition, if there is one. 6227 if (const ObjCProtocolDecl *Def = PD->getDefinition()) 6228 PD = Def; 6229 6230 // Construct method lists. 6231 std::vector<llvm::Constant*> InstanceMethods, ClassMethods; 6232 std::vector<llvm::Constant*> OptInstanceMethods, OptClassMethods; 6233 std::vector<llvm::Constant*> MethodTypesExt, OptMethodTypesExt; 6234 for (const auto *MD : PD->instance_methods()) { 6235 llvm::Constant *C = GetMethodDescriptionConstant(MD); 6236 if (!C) 6237 return GetOrEmitProtocolRef(PD); 6238 6239 if (MD->getImplementationControl() == ObjCMethodDecl::Optional) { 6240 OptInstanceMethods.push_back(C); 6241 OptMethodTypesExt.push_back(GetMethodVarType(MD, true)); 6242 } else { 6243 InstanceMethods.push_back(C); 6244 MethodTypesExt.push_back(GetMethodVarType(MD, true)); 6245 } 6246 } 6247 6248 for (const auto *MD : PD->class_methods()) { 6249 llvm::Constant *C = GetMethodDescriptionConstant(MD); 6250 if (!C) 6251 return GetOrEmitProtocolRef(PD); 6252 6253 if (MD->getImplementationControl() == ObjCMethodDecl::Optional) { 6254 OptClassMethods.push_back(C); 6255 OptMethodTypesExt.push_back(GetMethodVarType(MD, true)); 6256 } else { 6257 ClassMethods.push_back(C); 6258 MethodTypesExt.push_back(GetMethodVarType(MD, true)); 6259 } 6260 } 6261 6262 MethodTypesExt.insert(MethodTypesExt.end(), 6263 OptMethodTypesExt.begin(), OptMethodTypesExt.end()); 6264 6265 llvm::Constant *Values[11]; 6266 // isa is NULL 6267 Values[0] = llvm::Constant::getNullValue(ObjCTypes.ObjectPtrTy); 6268 Values[1] = GetClassName(PD->getObjCRuntimeNameAsString()); 6269 Values[2] = EmitProtocolList("\01l_OBJC_$_PROTOCOL_REFS_" + PD->getObjCRuntimeNameAsString(), 6270 PD->protocol_begin(), 6271 PD->protocol_end()); 6272 6273 Values[3] = EmitMethodList("\01l_OBJC_$_PROTOCOL_INSTANCE_METHODS_" 6274 + PD->getObjCRuntimeNameAsString(), 6275 "__DATA, __objc_const", 6276 InstanceMethods); 6277 Values[4] = EmitMethodList("\01l_OBJC_$_PROTOCOL_CLASS_METHODS_" 6278 + PD->getObjCRuntimeNameAsString(), 6279 "__DATA, __objc_const", 6280 ClassMethods); 6281 Values[5] = EmitMethodList("\01l_OBJC_$_PROTOCOL_INSTANCE_METHODS_OPT_" 6282 + PD->getObjCRuntimeNameAsString(), 6283 "__DATA, __objc_const", 6284 OptInstanceMethods); 6285 Values[6] = EmitMethodList("\01l_OBJC_$_PROTOCOL_CLASS_METHODS_OPT_" 6286 + PD->getObjCRuntimeNameAsString(), 6287 "__DATA, __objc_const", 6288 OptClassMethods); 6289 Values[7] = EmitPropertyList("\01l_OBJC_$_PROP_LIST_" + PD->getObjCRuntimeNameAsString(), 6290 nullptr, PD, ObjCTypes); 6291 uint32_t Size = 6292 CGM.getDataLayout().getTypeAllocSize(ObjCTypes.ProtocolnfABITy); 6293 Values[8] = llvm::ConstantInt::get(ObjCTypes.IntTy, Size); 6294 Values[9] = llvm::Constant::getNullValue(ObjCTypes.IntTy); 6295 Values[10] = EmitProtocolMethodTypes("\01l_OBJC_$_PROTOCOL_METHOD_TYPES_" 6296 + PD->getObjCRuntimeNameAsString(), 6297 MethodTypesExt, ObjCTypes); 6298 llvm::Constant *Init = llvm::ConstantStruct::get(ObjCTypes.ProtocolnfABITy, 6299 Values); 6300 6301 if (Entry) { 6302 // Already created, fix the linkage and update the initializer. 6303 Entry->setLinkage(llvm::GlobalValue::WeakAnyLinkage); 6304 Entry->setInitializer(Init); 6305 } else { 6306 Entry = 6307 new llvm::GlobalVariable(CGM.getModule(), ObjCTypes.ProtocolnfABITy, 6308 false, llvm::GlobalValue::WeakAnyLinkage, Init, 6309 "\01l_OBJC_PROTOCOL_$_" + PD->getObjCRuntimeNameAsString()); 6310 Entry->setAlignment( 6311 CGM.getDataLayout().getABITypeAlignment(ObjCTypes.ProtocolnfABITy)); 6312 Entry->setSection("__DATA,__datacoal_nt,coalesced"); 6313 6314 Protocols[PD->getIdentifier()] = Entry; 6315 } 6316 Entry->setVisibility(llvm::GlobalValue::HiddenVisibility); 6317 CGM.addCompilerUsedGlobal(Entry); 6318 6319 // Use this protocol meta-data to build protocol list table in section 6320 // __DATA, __objc_protolist 6321 llvm::GlobalVariable *PTGV = 6322 new llvm::GlobalVariable(CGM.getModule(), ObjCTypes.ProtocolnfABIPtrTy, 6323 false, llvm::GlobalValue::WeakAnyLinkage, Entry, 6324 "\01l_OBJC_LABEL_PROTOCOL_$_" + PD->getObjCRuntimeNameAsString()); 6325 PTGV->setAlignment( 6326 CGM.getDataLayout().getABITypeAlignment(ObjCTypes.ProtocolnfABIPtrTy)); 6327 PTGV->setSection("__DATA, __objc_protolist, coalesced, no_dead_strip"); 6328 PTGV->setVisibility(llvm::GlobalValue::HiddenVisibility); 6329 CGM.addCompilerUsedGlobal(PTGV); 6330 return Entry; 6331 } 6332 6333 /// EmitProtocolList - Generate protocol list meta-data: 6334 /// @code 6335 /// struct _protocol_list_t { 6336 /// long protocol_count; // Note, this is 32/64 bit 6337 /// struct _protocol_t[protocol_count]; 6338 /// } 6339 /// @endcode 6340 /// 6341 llvm::Constant * 6342 CGObjCNonFragileABIMac::EmitProtocolList(Twine Name, 6343 ObjCProtocolDecl::protocol_iterator begin, 6344 ObjCProtocolDecl::protocol_iterator end) { 6345 SmallVector<llvm::Constant *, 16> ProtocolRefs; 6346 6347 // Just return null for empty protocol lists 6348 if (begin == end) 6349 return llvm::Constant::getNullValue(ObjCTypes.ProtocolListnfABIPtrTy); 6350 6351 // FIXME: We shouldn't need to do this lookup here, should we? 6352 SmallString<256> TmpName; 6353 Name.toVector(TmpName); 6354 llvm::GlobalVariable *GV = 6355 CGM.getModule().getGlobalVariable(TmpName.str(), true); 6356 if (GV) 6357 return llvm::ConstantExpr::getBitCast(GV, ObjCTypes.ProtocolListnfABIPtrTy); 6358 6359 for (; begin != end; ++begin) 6360 ProtocolRefs.push_back(GetProtocolRef(*begin)); // Implemented??? 6361 6362 // This list is null terminated. 6363 ProtocolRefs.push_back(llvm::Constant::getNullValue( 6364 ObjCTypes.ProtocolnfABIPtrTy)); 6365 6366 llvm::Constant *Values[2]; 6367 Values[0] = 6368 llvm::ConstantInt::get(ObjCTypes.LongTy, ProtocolRefs.size() - 1); 6369 Values[1] = 6370 llvm::ConstantArray::get(llvm::ArrayType::get(ObjCTypes.ProtocolnfABIPtrTy, 6371 ProtocolRefs.size()), 6372 ProtocolRefs); 6373 6374 llvm::Constant *Init = llvm::ConstantStruct::getAnon(Values); 6375 GV = new llvm::GlobalVariable(CGM.getModule(), Init->getType(), false, 6376 llvm::GlobalValue::PrivateLinkage, 6377 Init, Name); 6378 GV->setSection("__DATA, __objc_const"); 6379 GV->setAlignment( 6380 CGM.getDataLayout().getABITypeAlignment(Init->getType())); 6381 CGM.addCompilerUsedGlobal(GV); 6382 return llvm::ConstantExpr::getBitCast(GV, 6383 ObjCTypes.ProtocolListnfABIPtrTy); 6384 } 6385 6386 /// GetMethodDescriptionConstant - This routine build following meta-data: 6387 /// struct _objc_method { 6388 /// SEL _cmd; 6389 /// char *method_type; 6390 /// char *_imp; 6391 /// } 6392 6393 llvm::Constant * 6394 CGObjCNonFragileABIMac::GetMethodDescriptionConstant(const ObjCMethodDecl *MD) { 6395 llvm::Constant *Desc[3]; 6396 Desc[0] = 6397 llvm::ConstantExpr::getBitCast(GetMethodVarName(MD->getSelector()), 6398 ObjCTypes.SelectorPtrTy); 6399 Desc[1] = GetMethodVarType(MD); 6400 if (!Desc[1]) 6401 return nullptr; 6402 6403 // Protocol methods have no implementation. So, this entry is always NULL. 6404 Desc[2] = llvm::Constant::getNullValue(ObjCTypes.Int8PtrTy); 6405 return llvm::ConstantStruct::get(ObjCTypes.MethodTy, Desc); 6406 } 6407 6408 /// EmitObjCValueForIvar - Code Gen for nonfragile ivar reference. 6409 /// This code gen. amounts to generating code for: 6410 /// @code 6411 /// (type *)((char *)base + _OBJC_IVAR_$_.ivar; 6412 /// @encode 6413 /// 6414 LValue CGObjCNonFragileABIMac::EmitObjCValueForIvar( 6415 CodeGen::CodeGenFunction &CGF, 6416 QualType ObjectTy, 6417 llvm::Value *BaseValue, 6418 const ObjCIvarDecl *Ivar, 6419 unsigned CVRQualifiers) { 6420 ObjCInterfaceDecl *ID = ObjectTy->getAs<ObjCObjectType>()->getInterface(); 6421 llvm::Value *Offset = EmitIvarOffset(CGF, ID, Ivar); 6422 return EmitValueForIvarAtOffset(CGF, ID, BaseValue, Ivar, CVRQualifiers, 6423 Offset); 6424 } 6425 6426 llvm::Value *CGObjCNonFragileABIMac::EmitIvarOffset( 6427 CodeGen::CodeGenFunction &CGF, 6428 const ObjCInterfaceDecl *Interface, 6429 const ObjCIvarDecl *Ivar) { 6430 llvm::Value *IvarOffsetValue = ObjCIvarOffsetVariable(Interface, Ivar); 6431 IvarOffsetValue = CGF.Builder.CreateLoad(IvarOffsetValue, "ivar"); 6432 if (IsIvarOffsetKnownIdempotent(CGF, Ivar)) 6433 cast<llvm::LoadInst>(IvarOffsetValue) 6434 ->setMetadata(CGM.getModule().getMDKindID("invariant.load"), 6435 llvm::MDNode::get(VMContext, None)); 6436 6437 // This could be 32bit int or 64bit integer depending on the architecture. 6438 // Cast it to 64bit integer value, if it is a 32bit integer ivar offset value 6439 // as this is what caller always expectes. 6440 if (ObjCTypes.IvarOffsetVarTy == ObjCTypes.IntTy) 6441 IvarOffsetValue = CGF.Builder.CreateIntCast( 6442 IvarOffsetValue, ObjCTypes.LongTy, true, "ivar.conv"); 6443 return IvarOffsetValue; 6444 } 6445 6446 static void appendSelectorForMessageRefTable(std::string &buffer, 6447 Selector selector) { 6448 if (selector.isUnarySelector()) { 6449 buffer += selector.getNameForSlot(0); 6450 return; 6451 } 6452 6453 for (unsigned i = 0, e = selector.getNumArgs(); i != e; ++i) { 6454 buffer += selector.getNameForSlot(i); 6455 buffer += '_'; 6456 } 6457 } 6458 6459 /// Emit a "v-table" message send. We emit a weak hidden-visibility 6460 /// struct, initially containing the selector pointer and a pointer to 6461 /// a "fixup" variant of the appropriate objc_msgSend. To call, we 6462 /// load and call the function pointer, passing the address of the 6463 /// struct as the second parameter. The runtime determines whether 6464 /// the selector is currently emitted using vtable dispatch; if so, it 6465 /// substitutes a stub function which simply tail-calls through the 6466 /// appropriate vtable slot, and if not, it substitues a stub function 6467 /// which tail-calls objc_msgSend. Both stubs adjust the selector 6468 /// argument to correctly point to the selector. 6469 RValue 6470 CGObjCNonFragileABIMac::EmitVTableMessageSend(CodeGenFunction &CGF, 6471 ReturnValueSlot returnSlot, 6472 QualType resultType, 6473 Selector selector, 6474 llvm::Value *arg0, 6475 QualType arg0Type, 6476 bool isSuper, 6477 const CallArgList &formalArgs, 6478 const ObjCMethodDecl *method) { 6479 // Compute the actual arguments. 6480 CallArgList args; 6481 6482 // First argument: the receiver / super-call structure. 6483 if (!isSuper) 6484 arg0 = CGF.Builder.CreateBitCast(arg0, ObjCTypes.ObjectPtrTy); 6485 args.add(RValue::get(arg0), arg0Type); 6486 6487 // Second argument: a pointer to the message ref structure. Leave 6488 // the actual argument value blank for now. 6489 args.add(RValue::get(nullptr), ObjCTypes.MessageRefCPtrTy); 6490 6491 args.insert(args.end(), formalArgs.begin(), formalArgs.end()); 6492 6493 MessageSendInfo MSI = getMessageSendInfo(method, resultType, args); 6494 6495 NullReturnState nullReturn; 6496 6497 // Find the function to call and the mangled name for the message 6498 // ref structure. Using a different mangled name wouldn't actually 6499 // be a problem; it would just be a waste. 6500 // 6501 // The runtime currently never uses vtable dispatch for anything 6502 // except normal, non-super message-sends. 6503 // FIXME: don't use this for that. 6504 llvm::Constant *fn = nullptr; 6505 std::string messageRefName("\01l_"); 6506 if (CGM.ReturnSlotInterferesWithArgs(MSI.CallInfo)) { 6507 if (isSuper) { 6508 fn = ObjCTypes.getMessageSendSuper2StretFixupFn(); 6509 messageRefName += "objc_msgSendSuper2_stret_fixup"; 6510 } else { 6511 nullReturn.init(CGF, arg0); 6512 fn = ObjCTypes.getMessageSendStretFixupFn(); 6513 messageRefName += "objc_msgSend_stret_fixup"; 6514 } 6515 } else if (!isSuper && CGM.ReturnTypeUsesFPRet(resultType)) { 6516 fn = ObjCTypes.getMessageSendFpretFixupFn(); 6517 messageRefName += "objc_msgSend_fpret_fixup"; 6518 } else { 6519 if (isSuper) { 6520 fn = ObjCTypes.getMessageSendSuper2FixupFn(); 6521 messageRefName += "objc_msgSendSuper2_fixup"; 6522 } else { 6523 fn = ObjCTypes.getMessageSendFixupFn(); 6524 messageRefName += "objc_msgSend_fixup"; 6525 } 6526 } 6527 assert(fn && "CGObjCNonFragileABIMac::EmitMessageSend"); 6528 messageRefName += '_'; 6529 6530 // Append the selector name, except use underscores anywhere we 6531 // would have used colons. 6532 appendSelectorForMessageRefTable(messageRefName, selector); 6533 6534 llvm::GlobalVariable *messageRef 6535 = CGM.getModule().getGlobalVariable(messageRefName); 6536 if (!messageRef) { 6537 // Build the message ref structure. 6538 llvm::Constant *values[] = { fn, GetMethodVarName(selector) }; 6539 llvm::Constant *init = llvm::ConstantStruct::getAnon(values); 6540 messageRef = new llvm::GlobalVariable(CGM.getModule(), 6541 init->getType(), 6542 /*constant*/ false, 6543 llvm::GlobalValue::WeakAnyLinkage, 6544 init, 6545 messageRefName); 6546 messageRef->setVisibility(llvm::GlobalValue::HiddenVisibility); 6547 messageRef->setAlignment(16); 6548 messageRef->setSection("__DATA, __objc_msgrefs, coalesced"); 6549 } 6550 6551 bool requiresnullCheck = false; 6552 if (CGM.getLangOpts().ObjCAutoRefCount && method) 6553 for (const auto *ParamDecl : method->params()) { 6554 if (ParamDecl->hasAttr<NSConsumedAttr>()) { 6555 if (!nullReturn.NullBB) 6556 nullReturn.init(CGF, arg0); 6557 requiresnullCheck = true; 6558 break; 6559 } 6560 } 6561 6562 llvm::Value *mref = 6563 CGF.Builder.CreateBitCast(messageRef, ObjCTypes.MessageRefPtrTy); 6564 6565 // Update the message ref argument. 6566 args[1].RV = RValue::get(mref); 6567 6568 // Load the function to call from the message ref table. 6569 llvm::Value *callee = CGF.Builder.CreateStructGEP(mref, 0); 6570 callee = CGF.Builder.CreateLoad(callee, "msgSend_fn"); 6571 6572 callee = CGF.Builder.CreateBitCast(callee, MSI.MessengerType); 6573 6574 RValue result = CGF.EmitCall(MSI.CallInfo, callee, returnSlot, args); 6575 return nullReturn.complete(CGF, result, resultType, formalArgs, 6576 requiresnullCheck ? method : nullptr); 6577 } 6578 6579 /// Generate code for a message send expression in the nonfragile abi. 6580 CodeGen::RValue 6581 CGObjCNonFragileABIMac::GenerateMessageSend(CodeGen::CodeGenFunction &CGF, 6582 ReturnValueSlot Return, 6583 QualType ResultType, 6584 Selector Sel, 6585 llvm::Value *Receiver, 6586 const CallArgList &CallArgs, 6587 const ObjCInterfaceDecl *Class, 6588 const ObjCMethodDecl *Method) { 6589 return isVTableDispatchedSelector(Sel) 6590 ? EmitVTableMessageSend(CGF, Return, ResultType, Sel, 6591 Receiver, CGF.getContext().getObjCIdType(), 6592 false, CallArgs, Method) 6593 : EmitMessageSend(CGF, Return, ResultType, 6594 EmitSelector(CGF, Sel), 6595 Receiver, CGF.getContext().getObjCIdType(), 6596 false, CallArgs, Method, ObjCTypes); 6597 } 6598 6599 llvm::GlobalVariable * 6600 CGObjCNonFragileABIMac::GetClassGlobal(const std::string &Name, bool Weak) { 6601 llvm::GlobalValue::LinkageTypes L = 6602 Weak ? llvm::GlobalValue::ExternalWeakLinkage 6603 : llvm::GlobalValue::ExternalLinkage; 6604 6605 llvm::GlobalVariable *GV = CGM.getModule().getGlobalVariable(Name); 6606 6607 if (!GV) 6608 GV = new llvm::GlobalVariable(CGM.getModule(), ObjCTypes.ClassnfABITy, 6609 false, L, nullptr, Name); 6610 6611 assert(GV->getLinkage() == L); 6612 return GV; 6613 } 6614 6615 llvm::Value *CGObjCNonFragileABIMac::EmitClassRefFromId(CodeGenFunction &CGF, 6616 IdentifierInfo *II, 6617 bool Weak, 6618 const ObjCInterfaceDecl *ID) { 6619 llvm::GlobalVariable *&Entry = ClassReferences[II]; 6620 6621 if (!Entry) { 6622 std::string ClassName( 6623 getClassSymbolPrefix() + 6624 (ID ? ID->getObjCRuntimeNameAsString() : II->getName()).str()); 6625 llvm::GlobalVariable *ClassGV = GetClassGlobal(ClassName, Weak); 6626 Entry = new llvm::GlobalVariable(CGM.getModule(), ObjCTypes.ClassnfABIPtrTy, 6627 false, llvm::GlobalValue::PrivateLinkage, 6628 ClassGV, "OBJC_CLASSLIST_REFERENCES_$_"); 6629 Entry->setAlignment( 6630 CGM.getDataLayout().getABITypeAlignment( 6631 ObjCTypes.ClassnfABIPtrTy)); 6632 Entry->setSection("__DATA, __objc_classrefs, regular, no_dead_strip"); 6633 CGM.addCompilerUsedGlobal(Entry); 6634 } 6635 return CGF.Builder.CreateLoad(Entry); 6636 } 6637 6638 llvm::Value *CGObjCNonFragileABIMac::EmitClassRef(CodeGenFunction &CGF, 6639 const ObjCInterfaceDecl *ID) { 6640 return EmitClassRefFromId(CGF, ID->getIdentifier(), ID->isWeakImported(), ID); 6641 } 6642 6643 llvm::Value *CGObjCNonFragileABIMac::EmitNSAutoreleasePoolClassRef( 6644 CodeGenFunction &CGF) { 6645 IdentifierInfo *II = &CGM.getContext().Idents.get("NSAutoreleasePool"); 6646 return EmitClassRefFromId(CGF, II, false, 0); 6647 } 6648 6649 llvm::Value * 6650 CGObjCNonFragileABIMac::EmitSuperClassRef(CodeGenFunction &CGF, 6651 const ObjCInterfaceDecl *ID) { 6652 llvm::GlobalVariable *&Entry = SuperClassReferences[ID->getIdentifier()]; 6653 6654 if (!Entry) { 6655 llvm::SmallString<64> ClassName(getClassSymbolPrefix()); 6656 ClassName += ID->getObjCRuntimeNameAsString(); 6657 llvm::GlobalVariable *ClassGV = GetClassGlobal(ClassName.str(), 6658 ID->isWeakImported()); 6659 Entry = new llvm::GlobalVariable(CGM.getModule(), ObjCTypes.ClassnfABIPtrTy, 6660 false, llvm::GlobalValue::PrivateLinkage, 6661 ClassGV, "OBJC_CLASSLIST_SUP_REFS_$_"); 6662 Entry->setAlignment( 6663 CGM.getDataLayout().getABITypeAlignment( 6664 ObjCTypes.ClassnfABIPtrTy)); 6665 Entry->setSection("__DATA, __objc_superrefs, regular, no_dead_strip"); 6666 CGM.addCompilerUsedGlobal(Entry); 6667 } 6668 return CGF.Builder.CreateLoad(Entry); 6669 } 6670 6671 /// EmitMetaClassRef - Return a Value * of the address of _class_t 6672 /// meta-data 6673 /// 6674 llvm::Value *CGObjCNonFragileABIMac::EmitMetaClassRef(CodeGenFunction &CGF, 6675 const ObjCInterfaceDecl *ID, 6676 bool Weak) { 6677 llvm::GlobalVariable * &Entry = MetaClassReferences[ID->getIdentifier()]; 6678 if (!Entry) { 6679 llvm::SmallString<64> MetaClassName(getMetaclassSymbolPrefix()); 6680 MetaClassName += ID->getObjCRuntimeNameAsString(); 6681 llvm::GlobalVariable *MetaClassGV = 6682 GetClassGlobal(MetaClassName.str(), Weak); 6683 6684 Entry = new llvm::GlobalVariable(CGM.getModule(), ObjCTypes.ClassnfABIPtrTy, 6685 false, llvm::GlobalValue::PrivateLinkage, 6686 MetaClassGV, "OBJC_CLASSLIST_SUP_REFS_$_"); 6687 Entry->setAlignment( 6688 CGM.getDataLayout().getABITypeAlignment(ObjCTypes.ClassnfABIPtrTy)); 6689 6690 Entry->setSection("__DATA, __objc_superrefs, regular, no_dead_strip"); 6691 CGM.addCompilerUsedGlobal(Entry); 6692 } 6693 6694 return CGF.Builder.CreateLoad(Entry); 6695 } 6696 6697 /// GetClass - Return a reference to the class for the given interface 6698 /// decl. 6699 llvm::Value *CGObjCNonFragileABIMac::GetClass(CodeGenFunction &CGF, 6700 const ObjCInterfaceDecl *ID) { 6701 if (ID->isWeakImported()) { 6702 llvm::SmallString<64> ClassName(getClassSymbolPrefix()); 6703 ClassName += ID->getObjCRuntimeNameAsString(); 6704 llvm::GlobalVariable *ClassGV = GetClassGlobal(ClassName.str(), true); 6705 (void)ClassGV; 6706 assert(ClassGV->hasExternalWeakLinkage()); 6707 } 6708 6709 return EmitClassRef(CGF, ID); 6710 } 6711 6712 /// Generates a message send where the super is the receiver. This is 6713 /// a message send to self with special delivery semantics indicating 6714 /// which class's method should be called. 6715 CodeGen::RValue 6716 CGObjCNonFragileABIMac::GenerateMessageSendSuper(CodeGen::CodeGenFunction &CGF, 6717 ReturnValueSlot Return, 6718 QualType ResultType, 6719 Selector Sel, 6720 const ObjCInterfaceDecl *Class, 6721 bool isCategoryImpl, 6722 llvm::Value *Receiver, 6723 bool IsClassMessage, 6724 const CodeGen::CallArgList &CallArgs, 6725 const ObjCMethodDecl *Method) { 6726 // ... 6727 // Create and init a super structure; this is a (receiver, class) 6728 // pair we will pass to objc_msgSendSuper. 6729 llvm::Value *ObjCSuper = 6730 CGF.CreateTempAlloca(ObjCTypes.SuperTy, "objc_super"); 6731 6732 llvm::Value *ReceiverAsObject = 6733 CGF.Builder.CreateBitCast(Receiver, ObjCTypes.ObjectPtrTy); 6734 CGF.Builder.CreateStore(ReceiverAsObject, 6735 CGF.Builder.CreateStructGEP(ObjCSuper, 0)); 6736 6737 // If this is a class message the metaclass is passed as the target. 6738 llvm::Value *Target; 6739 if (IsClassMessage) 6740 Target = EmitMetaClassRef(CGF, Class, Class->isWeakImported()); 6741 else 6742 Target = EmitSuperClassRef(CGF, Class); 6743 6744 // FIXME: We shouldn't need to do this cast, rectify the ASTContext and 6745 // ObjCTypes types. 6746 llvm::Type *ClassTy = 6747 CGM.getTypes().ConvertType(CGF.getContext().getObjCClassType()); 6748 Target = CGF.Builder.CreateBitCast(Target, ClassTy); 6749 CGF.Builder.CreateStore(Target, 6750 CGF.Builder.CreateStructGEP(ObjCSuper, 1)); 6751 6752 return (isVTableDispatchedSelector(Sel)) 6753 ? EmitVTableMessageSend(CGF, Return, ResultType, Sel, 6754 ObjCSuper, ObjCTypes.SuperPtrCTy, 6755 true, CallArgs, Method) 6756 : EmitMessageSend(CGF, Return, ResultType, 6757 EmitSelector(CGF, Sel), 6758 ObjCSuper, ObjCTypes.SuperPtrCTy, 6759 true, CallArgs, Method, ObjCTypes); 6760 } 6761 6762 llvm::Value *CGObjCNonFragileABIMac::EmitSelector(CodeGenFunction &CGF, 6763 Selector Sel, bool lval) { 6764 llvm::GlobalVariable *&Entry = SelectorReferences[Sel]; 6765 6766 if (!Entry) { 6767 llvm::Constant *Casted = 6768 llvm::ConstantExpr::getBitCast(GetMethodVarName(Sel), 6769 ObjCTypes.SelectorPtrTy); 6770 Entry = new llvm::GlobalVariable(CGM.getModule(), ObjCTypes.SelectorPtrTy, 6771 false, llvm::GlobalValue::PrivateLinkage, 6772 Casted, "OBJC_SELECTOR_REFERENCES_"); 6773 Entry->setExternallyInitialized(true); 6774 Entry->setSection("__DATA, __objc_selrefs, literal_pointers, no_dead_strip"); 6775 CGM.addCompilerUsedGlobal(Entry); 6776 } 6777 6778 if (lval) 6779 return Entry; 6780 llvm::LoadInst* LI = CGF.Builder.CreateLoad(Entry); 6781 6782 LI->setMetadata(CGM.getModule().getMDKindID("invariant.load"), 6783 llvm::MDNode::get(VMContext, None)); 6784 return LI; 6785 } 6786 /// EmitObjCIvarAssign - Code gen for assigning to a __strong object. 6787 /// objc_assign_ivar (id src, id *dst, ptrdiff_t) 6788 /// 6789 void CGObjCNonFragileABIMac::EmitObjCIvarAssign(CodeGen::CodeGenFunction &CGF, 6790 llvm::Value *src, 6791 llvm::Value *dst, 6792 llvm::Value *ivarOffset) { 6793 llvm::Type * SrcTy = src->getType(); 6794 if (!isa<llvm::PointerType>(SrcTy)) { 6795 unsigned Size = CGM.getDataLayout().getTypeAllocSize(SrcTy); 6796 assert(Size <= 8 && "does not support size > 8"); 6797 src = (Size == 4 ? CGF.Builder.CreateBitCast(src, ObjCTypes.IntTy) 6798 : CGF.Builder.CreateBitCast(src, ObjCTypes.LongTy)); 6799 src = CGF.Builder.CreateIntToPtr(src, ObjCTypes.Int8PtrTy); 6800 } 6801 src = CGF.Builder.CreateBitCast(src, ObjCTypes.ObjectPtrTy); 6802 dst = CGF.Builder.CreateBitCast(dst, ObjCTypes.PtrObjectPtrTy); 6803 llvm::Value *args[] = { src, dst, ivarOffset }; 6804 CGF.EmitNounwindRuntimeCall(ObjCTypes.getGcAssignIvarFn(), args); 6805 } 6806 6807 /// EmitObjCStrongCastAssign - Code gen for assigning to a __strong cast object. 6808 /// objc_assign_strongCast (id src, id *dst) 6809 /// 6810 void CGObjCNonFragileABIMac::EmitObjCStrongCastAssign( 6811 CodeGen::CodeGenFunction &CGF, 6812 llvm::Value *src, llvm::Value *dst) { 6813 llvm::Type * SrcTy = src->getType(); 6814 if (!isa<llvm::PointerType>(SrcTy)) { 6815 unsigned Size = CGM.getDataLayout().getTypeAllocSize(SrcTy); 6816 assert(Size <= 8 && "does not support size > 8"); 6817 src = (Size == 4 ? CGF.Builder.CreateBitCast(src, ObjCTypes.IntTy) 6818 : CGF.Builder.CreateBitCast(src, ObjCTypes.LongTy)); 6819 src = CGF.Builder.CreateIntToPtr(src, ObjCTypes.Int8PtrTy); 6820 } 6821 src = CGF.Builder.CreateBitCast(src, ObjCTypes.ObjectPtrTy); 6822 dst = CGF.Builder.CreateBitCast(dst, ObjCTypes.PtrObjectPtrTy); 6823 llvm::Value *args[] = { src, dst }; 6824 CGF.EmitNounwindRuntimeCall(ObjCTypes.getGcAssignStrongCastFn(), 6825 args, "weakassign"); 6826 } 6827 6828 void CGObjCNonFragileABIMac::EmitGCMemmoveCollectable( 6829 CodeGen::CodeGenFunction &CGF, 6830 llvm::Value *DestPtr, 6831 llvm::Value *SrcPtr, 6832 llvm::Value *Size) { 6833 SrcPtr = CGF.Builder.CreateBitCast(SrcPtr, ObjCTypes.Int8PtrTy); 6834 DestPtr = CGF.Builder.CreateBitCast(DestPtr, ObjCTypes.Int8PtrTy); 6835 llvm::Value *args[] = { DestPtr, SrcPtr, Size }; 6836 CGF.EmitNounwindRuntimeCall(ObjCTypes.GcMemmoveCollectableFn(), args); 6837 } 6838 6839 /// EmitObjCWeakRead - Code gen for loading value of a __weak 6840 /// object: objc_read_weak (id *src) 6841 /// 6842 llvm::Value * CGObjCNonFragileABIMac::EmitObjCWeakRead( 6843 CodeGen::CodeGenFunction &CGF, 6844 llvm::Value *AddrWeakObj) { 6845 llvm::Type* DestTy = 6846 cast<llvm::PointerType>(AddrWeakObj->getType())->getElementType(); 6847 AddrWeakObj = CGF.Builder.CreateBitCast(AddrWeakObj, ObjCTypes.PtrObjectPtrTy); 6848 llvm::Value *read_weak = 6849 CGF.EmitNounwindRuntimeCall(ObjCTypes.getGcReadWeakFn(), 6850 AddrWeakObj, "weakread"); 6851 read_weak = CGF.Builder.CreateBitCast(read_weak, DestTy); 6852 return read_weak; 6853 } 6854 6855 /// EmitObjCWeakAssign - Code gen for assigning to a __weak object. 6856 /// objc_assign_weak (id src, id *dst) 6857 /// 6858 void CGObjCNonFragileABIMac::EmitObjCWeakAssign(CodeGen::CodeGenFunction &CGF, 6859 llvm::Value *src, llvm::Value *dst) { 6860 llvm::Type * SrcTy = src->getType(); 6861 if (!isa<llvm::PointerType>(SrcTy)) { 6862 unsigned Size = CGM.getDataLayout().getTypeAllocSize(SrcTy); 6863 assert(Size <= 8 && "does not support size > 8"); 6864 src = (Size == 4 ? CGF.Builder.CreateBitCast(src, ObjCTypes.IntTy) 6865 : CGF.Builder.CreateBitCast(src, ObjCTypes.LongTy)); 6866 src = CGF.Builder.CreateIntToPtr(src, ObjCTypes.Int8PtrTy); 6867 } 6868 src = CGF.Builder.CreateBitCast(src, ObjCTypes.ObjectPtrTy); 6869 dst = CGF.Builder.CreateBitCast(dst, ObjCTypes.PtrObjectPtrTy); 6870 llvm::Value *args[] = { src, dst }; 6871 CGF.EmitNounwindRuntimeCall(ObjCTypes.getGcAssignWeakFn(), 6872 args, "weakassign"); 6873 } 6874 6875 /// EmitObjCGlobalAssign - Code gen for assigning to a __strong object. 6876 /// objc_assign_global (id src, id *dst) 6877 /// 6878 void CGObjCNonFragileABIMac::EmitObjCGlobalAssign(CodeGen::CodeGenFunction &CGF, 6879 llvm::Value *src, llvm::Value *dst, 6880 bool threadlocal) { 6881 llvm::Type * SrcTy = src->getType(); 6882 if (!isa<llvm::PointerType>(SrcTy)) { 6883 unsigned Size = CGM.getDataLayout().getTypeAllocSize(SrcTy); 6884 assert(Size <= 8 && "does not support size > 8"); 6885 src = (Size == 4 ? CGF.Builder.CreateBitCast(src, ObjCTypes.IntTy) 6886 : CGF.Builder.CreateBitCast(src, ObjCTypes.LongTy)); 6887 src = CGF.Builder.CreateIntToPtr(src, ObjCTypes.Int8PtrTy); 6888 } 6889 src = CGF.Builder.CreateBitCast(src, ObjCTypes.ObjectPtrTy); 6890 dst = CGF.Builder.CreateBitCast(dst, ObjCTypes.PtrObjectPtrTy); 6891 llvm::Value *args[] = { src, dst }; 6892 if (!threadlocal) 6893 CGF.EmitNounwindRuntimeCall(ObjCTypes.getGcAssignGlobalFn(), 6894 args, "globalassign"); 6895 else 6896 CGF.EmitNounwindRuntimeCall(ObjCTypes.getGcAssignThreadLocalFn(), 6897 args, "threadlocalassign"); 6898 } 6899 6900 void 6901 CGObjCNonFragileABIMac::EmitSynchronizedStmt(CodeGen::CodeGenFunction &CGF, 6902 const ObjCAtSynchronizedStmt &S) { 6903 EmitAtSynchronizedStmt(CGF, S, 6904 cast<llvm::Function>(ObjCTypes.getSyncEnterFn()), 6905 cast<llvm::Function>(ObjCTypes.getSyncExitFn())); 6906 } 6907 6908 llvm::Constant * 6909 CGObjCNonFragileABIMac::GetEHType(QualType T) { 6910 // There's a particular fixed type info for 'id'. 6911 if (T->isObjCIdType() || 6912 T->isObjCQualifiedIdType()) { 6913 llvm::Constant *IDEHType = 6914 CGM.getModule().getGlobalVariable("OBJC_EHTYPE_id"); 6915 if (!IDEHType) 6916 IDEHType = 6917 new llvm::GlobalVariable(CGM.getModule(), ObjCTypes.EHTypeTy, 6918 false, 6919 llvm::GlobalValue::ExternalLinkage, 6920 nullptr, "OBJC_EHTYPE_id"); 6921 return IDEHType; 6922 } 6923 6924 // All other types should be Objective-C interface pointer types. 6925 const ObjCObjectPointerType *PT = 6926 T->getAs<ObjCObjectPointerType>(); 6927 assert(PT && "Invalid @catch type."); 6928 const ObjCInterfaceType *IT = PT->getInterfaceType(); 6929 assert(IT && "Invalid @catch type."); 6930 return GetInterfaceEHType(IT->getDecl(), false); 6931 } 6932 6933 void CGObjCNonFragileABIMac::EmitTryStmt(CodeGen::CodeGenFunction &CGF, 6934 const ObjCAtTryStmt &S) { 6935 EmitTryCatchStmt(CGF, S, 6936 cast<llvm::Function>(ObjCTypes.getObjCBeginCatchFn()), 6937 cast<llvm::Function>(ObjCTypes.getObjCEndCatchFn()), 6938 cast<llvm::Function>(ObjCTypes.getExceptionRethrowFn())); 6939 } 6940 6941 /// EmitThrowStmt - Generate code for a throw statement. 6942 void CGObjCNonFragileABIMac::EmitThrowStmt(CodeGen::CodeGenFunction &CGF, 6943 const ObjCAtThrowStmt &S, 6944 bool ClearInsertionPoint) { 6945 if (const Expr *ThrowExpr = S.getThrowExpr()) { 6946 llvm::Value *Exception = CGF.EmitObjCThrowOperand(ThrowExpr); 6947 Exception = CGF.Builder.CreateBitCast(Exception, ObjCTypes.ObjectPtrTy); 6948 CGF.EmitRuntimeCallOrInvoke(ObjCTypes.getExceptionThrowFn(), Exception) 6949 .setDoesNotReturn(); 6950 } else { 6951 CGF.EmitRuntimeCallOrInvoke(ObjCTypes.getExceptionRethrowFn()) 6952 .setDoesNotReturn(); 6953 } 6954 6955 CGF.Builder.CreateUnreachable(); 6956 if (ClearInsertionPoint) 6957 CGF.Builder.ClearInsertionPoint(); 6958 } 6959 6960 llvm::Constant * 6961 CGObjCNonFragileABIMac::GetInterfaceEHType(const ObjCInterfaceDecl *ID, 6962 bool ForDefinition) { 6963 llvm::GlobalVariable * &Entry = EHTypeReferences[ID->getIdentifier()]; 6964 6965 // If we don't need a definition, return the entry if found or check 6966 // if we use an external reference. 6967 if (!ForDefinition) { 6968 if (Entry) 6969 return Entry; 6970 6971 // If this type (or a super class) has the __objc_exception__ 6972 // attribute, emit an external reference. 6973 if (hasObjCExceptionAttribute(CGM.getContext(), ID)) 6974 return Entry = 6975 new llvm::GlobalVariable(CGM.getModule(), ObjCTypes.EHTypeTy, false, 6976 llvm::GlobalValue::ExternalLinkage, 6977 nullptr, 6978 ("OBJC_EHTYPE_$_" + 6979 ID->getObjCRuntimeNameAsString())); 6980 } 6981 6982 // Otherwise we need to either make a new entry or fill in the 6983 // initializer. 6984 assert((!Entry || !Entry->hasInitializer()) && "Duplicate EHType definition"); 6985 llvm::SmallString<64> ClassName(getClassSymbolPrefix()); 6986 ClassName += ID->getObjCRuntimeNameAsString(); 6987 std::string VTableName = "objc_ehtype_vtable"; 6988 llvm::GlobalVariable *VTableGV = 6989 CGM.getModule().getGlobalVariable(VTableName); 6990 if (!VTableGV) 6991 VTableGV = new llvm::GlobalVariable(CGM.getModule(), ObjCTypes.Int8PtrTy, 6992 false, 6993 llvm::GlobalValue::ExternalLinkage, 6994 nullptr, VTableName); 6995 6996 llvm::Value *VTableIdx = llvm::ConstantInt::get(CGM.Int32Ty, 2); 6997 6998 llvm::Constant *Values[] = { 6999 llvm::ConstantExpr::getGetElementPtr(VTableGV, VTableIdx), 7000 GetClassName(ID->getObjCRuntimeNameAsString()), 7001 GetClassGlobal(ClassName.str()) 7002 }; 7003 llvm::Constant *Init = 7004 llvm::ConstantStruct::get(ObjCTypes.EHTypeTy, Values); 7005 7006 llvm::GlobalValue::LinkageTypes L = ForDefinition 7007 ? llvm::GlobalValue::ExternalLinkage 7008 : llvm::GlobalValue::WeakAnyLinkage; 7009 if (Entry) { 7010 Entry->setInitializer(Init); 7011 } else { 7012 llvm::SmallString<64> EHTYPEName("OBJC_EHTYPE_$_"); 7013 EHTYPEName += ID->getObjCRuntimeNameAsString(); 7014 Entry = new llvm::GlobalVariable(CGM.getModule(), ObjCTypes.EHTypeTy, false, 7015 L, 7016 Init, 7017 EHTYPEName.str()); 7018 } 7019 assert(Entry->getLinkage() == L); 7020 7021 if (ID->getVisibility() == HiddenVisibility) 7022 Entry->setVisibility(llvm::GlobalValue::HiddenVisibility); 7023 Entry->setAlignment(CGM.getDataLayout().getABITypeAlignment( 7024 ObjCTypes.EHTypeTy)); 7025 7026 if (ForDefinition) 7027 Entry->setSection("__DATA,__objc_const"); 7028 else 7029 Entry->setSection("__DATA,__datacoal_nt,coalesced"); 7030 7031 return Entry; 7032 } 7033 7034 /* *** */ 7035 7036 CodeGen::CGObjCRuntime * 7037 CodeGen::CreateMacObjCRuntime(CodeGen::CodeGenModule &CGM) { 7038 switch (CGM.getLangOpts().ObjCRuntime.getKind()) { 7039 case ObjCRuntime::FragileMacOSX: 7040 return new CGObjCMac(CGM); 7041 7042 case ObjCRuntime::MacOSX: 7043 case ObjCRuntime::iOS: 7044 return new CGObjCNonFragileABIMac(CGM); 7045 7046 case ObjCRuntime::GNUstep: 7047 case ObjCRuntime::GCC: 7048 case ObjCRuntime::ObjFW: 7049 llvm_unreachable("these runtimes are not Mac runtimes"); 7050 } 7051 llvm_unreachable("bad runtime"); 7052 } 7053