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