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