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