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