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