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