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