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