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