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