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