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