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