diff options
Diffstat (limited to 'contrib/llvm/tools/clang/lib/CodeGen/CGObjCGNU.cpp')
-rw-r--r-- | contrib/llvm/tools/clang/lib/CodeGen/CGObjCGNU.cpp | 546 |
1 files changed, 252 insertions, 294 deletions
diff --git a/contrib/llvm/tools/clang/lib/CodeGen/CGObjCGNU.cpp b/contrib/llvm/tools/clang/lib/CodeGen/CGObjCGNU.cpp index a7ab850..619a66a 100644 --- a/contrib/llvm/tools/clang/lib/CodeGen/CGObjCGNU.cpp +++ b/contrib/llvm/tools/clang/lib/CodeGen/CGObjCGNU.cpp @@ -27,11 +27,11 @@ #include "clang/Basic/SourceManager.h" #include "llvm/ADT/SmallVector.h" #include "llvm/ADT/StringMap.h" +#include "llvm/IR/CallSite.h" #include "llvm/IR/DataLayout.h" #include "llvm/IR/Intrinsics.h" #include "llvm/IR/LLVMContext.h" #include "llvm/IR/Module.h" -#include "llvm/Support/CallSite.h" #include "llvm/Support/Compiler.h" #include <cstdarg> @@ -53,7 +53,8 @@ class LazyRuntimeFunction { /// Constructor leaves this class uninitialized, because it is intended to /// be used as a field in another class and not all of the types that are /// used as arguments will necessarily be available at construction time. - LazyRuntimeFunction() : CGM(0), FunctionName(0), Function(0) {} + LazyRuntimeFunction() + : CGM(nullptr), FunctionName(nullptr), Function(nullptr) {} /// Initialises the lazy function with the name, return type, and the types /// of the arguments. @@ -62,7 +63,7 @@ class LazyRuntimeFunction { llvm::Type *RetTy, ...) { CGM =Mod; FunctionName = name; - Function = 0; + Function = nullptr; ArgTys.clear(); va_list Args; va_start(Args, RetTy); @@ -76,7 +77,7 @@ class LazyRuntimeFunction { /// LLVM constant. operator llvm::Constant*() { if (!Function) { - if (0 == FunctionName) return 0; + if (!FunctionName) return nullptr; // We put the return type on the end of the vector, so pop it back off llvm::Type *RetTy = ArgTys.back(); ArgTys.pop_back(); @@ -236,9 +237,8 @@ protected: NameAndAttributes += TypeStr; NameAndAttributes += '\0'; NameAndAttributes += PD->getNameAsString(); - NameAndAttributes += '\0'; return llvm::ConstantExpr::getGetElementPtr( - CGM.GetAddrOfConstantString(NameAndAttributes), Zeros); + CGM.GetAddrOfConstantCString(NameAndAttributes), Zeros); } return MakeConstantString(PD->getNameAsString()); } @@ -479,103 +479,92 @@ public: CGObjCGNU(CodeGenModule &cgm, unsigned runtimeABIVersion, unsigned protocolClassVersion); - virtual llvm::Constant *GenerateConstantString(const StringLiteral *); + llvm::Constant *GenerateConstantString(const StringLiteral *) override; - virtual RValue - GenerateMessageSend(CodeGenFunction &CGF, - ReturnValueSlot Return, - QualType ResultType, - Selector Sel, - llvm::Value *Receiver, - const CallArgList &CallArgs, + RValue + GenerateMessageSend(CodeGenFunction &CGF, ReturnValueSlot Return, + QualType ResultType, Selector Sel, + llvm::Value *Receiver, const CallArgList &CallArgs, const ObjCInterfaceDecl *Class, - const ObjCMethodDecl *Method); - virtual RValue - GenerateMessageSendSuper(CodeGenFunction &CGF, - ReturnValueSlot Return, - QualType ResultType, - Selector Sel, + const ObjCMethodDecl *Method) override; + RValue + GenerateMessageSendSuper(CodeGenFunction &CGF, ReturnValueSlot Return, + QualType ResultType, Selector Sel, const ObjCInterfaceDecl *Class, - bool isCategoryImpl, - llvm::Value *Receiver, - bool IsClassMessage, - const CallArgList &CallArgs, - const ObjCMethodDecl *Method); - virtual llvm::Value *GetClass(CodeGenFunction &CGF, - const ObjCInterfaceDecl *OID); - virtual llvm::Value *GetSelector(CodeGenFunction &CGF, Selector Sel, - bool lval = false); - virtual llvm::Value *GetSelector(CodeGenFunction &CGF, const ObjCMethodDecl - *Method); - virtual llvm::Constant *GetEHType(QualType T); - - virtual llvm::Function *GenerateMethod(const ObjCMethodDecl *OMD, - const ObjCContainerDecl *CD); - virtual void GenerateCategory(const ObjCCategoryImplDecl *CMD); - virtual void GenerateClass(const ObjCImplementationDecl *ClassDecl); - virtual void RegisterAlias(const ObjCCompatibleAliasDecl *OAD); - virtual llvm::Value *GenerateProtocolRef(CodeGenFunction &CGF, - const ObjCProtocolDecl *PD); - virtual void GenerateProtocol(const ObjCProtocolDecl *PD); - virtual llvm::Function *ModuleInitFunction(); - virtual llvm::Constant *GetPropertyGetFunction(); - virtual llvm::Constant *GetPropertySetFunction(); - virtual llvm::Constant *GetOptimizedPropertySetFunction(bool atomic, - bool copy); - virtual llvm::Constant *GetSetStructFunction(); - virtual llvm::Constant *GetGetStructFunction(); - virtual llvm::Constant *GetCppAtomicObjectGetFunction(); - virtual llvm::Constant *GetCppAtomicObjectSetFunction(); - virtual llvm::Constant *EnumerationMutationFunction(); - - virtual void EmitTryStmt(CodeGenFunction &CGF, - const ObjCAtTryStmt &S); - virtual void EmitSynchronizedStmt(CodeGenFunction &CGF, - const ObjCAtSynchronizedStmt &S); - virtual void EmitThrowStmt(CodeGenFunction &CGF, - const ObjCAtThrowStmt &S, - bool ClearInsertionPoint=true); - virtual llvm::Value * EmitObjCWeakRead(CodeGenFunction &CGF, - llvm::Value *AddrWeakObj); - virtual void EmitObjCWeakAssign(CodeGenFunction &CGF, - llvm::Value *src, llvm::Value *dst); - virtual void EmitObjCGlobalAssign(CodeGenFunction &CGF, - llvm::Value *src, llvm::Value *dest, - bool threadlocal=false); - virtual void EmitObjCIvarAssign(CodeGenFunction &CGF, - llvm::Value *src, llvm::Value *dest, - llvm::Value *ivarOffset); - virtual void EmitObjCStrongCastAssign(CodeGenFunction &CGF, - llvm::Value *src, llvm::Value *dest); - virtual void EmitGCMemmoveCollectable(CodeGenFunction &CGF, - llvm::Value *DestPtr, - llvm::Value *SrcPtr, - llvm::Value *Size); - virtual LValue EmitObjCValueForIvar(CodeGenFunction &CGF, - QualType ObjectTy, - llvm::Value *BaseValue, - const ObjCIvarDecl *Ivar, - unsigned CVRQualifiers); - virtual llvm::Value *EmitIvarOffset(CodeGenFunction &CGF, - const ObjCInterfaceDecl *Interface, - const ObjCIvarDecl *Ivar); - virtual llvm::Value *EmitNSAutoreleasePoolClassRef(CodeGenFunction &CGF); - virtual llvm::Constant *BuildGCBlockLayout(CodeGenModule &CGM, - const CGBlockInfo &blockInfo) { + bool isCategoryImpl, llvm::Value *Receiver, + bool IsClassMessage, const CallArgList &CallArgs, + const ObjCMethodDecl *Method) override; + llvm::Value *GetClass(CodeGenFunction &CGF, + const ObjCInterfaceDecl *OID) override; + llvm::Value *GetSelector(CodeGenFunction &CGF, Selector Sel, + bool lval = false) override; + llvm::Value *GetSelector(CodeGenFunction &CGF, + const ObjCMethodDecl *Method) override; + llvm::Constant *GetEHType(QualType T) override; + + llvm::Function *GenerateMethod(const ObjCMethodDecl *OMD, + const ObjCContainerDecl *CD) override; + void GenerateCategory(const ObjCCategoryImplDecl *CMD) override; + void GenerateClass(const ObjCImplementationDecl *ClassDecl) override; + void RegisterAlias(const ObjCCompatibleAliasDecl *OAD) override; + llvm::Value *GenerateProtocolRef(CodeGenFunction &CGF, + const ObjCProtocolDecl *PD) override; + void GenerateProtocol(const ObjCProtocolDecl *PD) override; + llvm::Function *ModuleInitFunction() override; + llvm::Constant *GetPropertyGetFunction() override; + llvm::Constant *GetPropertySetFunction() override; + llvm::Constant *GetOptimizedPropertySetFunction(bool atomic, + bool copy) override; + llvm::Constant *GetSetStructFunction() override; + llvm::Constant *GetGetStructFunction() override; + llvm::Constant *GetCppAtomicObjectGetFunction() override; + llvm::Constant *GetCppAtomicObjectSetFunction() override; + llvm::Constant *EnumerationMutationFunction() override; + + void EmitTryStmt(CodeGenFunction &CGF, + const ObjCAtTryStmt &S) override; + void EmitSynchronizedStmt(CodeGenFunction &CGF, + const ObjCAtSynchronizedStmt &S) override; + void EmitThrowStmt(CodeGenFunction &CGF, + const ObjCAtThrowStmt &S, + bool ClearInsertionPoint=true) override; + llvm::Value * EmitObjCWeakRead(CodeGenFunction &CGF, + llvm::Value *AddrWeakObj) override; + void EmitObjCWeakAssign(CodeGenFunction &CGF, + llvm::Value *src, llvm::Value *dst) override; + void EmitObjCGlobalAssign(CodeGenFunction &CGF, + llvm::Value *src, llvm::Value *dest, + bool threadlocal=false) override; + void EmitObjCIvarAssign(CodeGenFunction &CGF, llvm::Value *src, + llvm::Value *dest, llvm::Value *ivarOffset) override; + void EmitObjCStrongCastAssign(CodeGenFunction &CGF, + llvm::Value *src, llvm::Value *dest) override; + void EmitGCMemmoveCollectable(CodeGenFunction &CGF, llvm::Value *DestPtr, + llvm::Value *SrcPtr, + llvm::Value *Size) override; + LValue EmitObjCValueForIvar(CodeGenFunction &CGF, QualType ObjectTy, + llvm::Value *BaseValue, const ObjCIvarDecl *Ivar, + unsigned CVRQualifiers) override; + llvm::Value *EmitIvarOffset(CodeGenFunction &CGF, + const ObjCInterfaceDecl *Interface, + const ObjCIvarDecl *Ivar) override; + llvm::Value *EmitNSAutoreleasePoolClassRef(CodeGenFunction &CGF) override; + llvm::Constant *BuildGCBlockLayout(CodeGenModule &CGM, + const CGBlockInfo &blockInfo) override { return NULLPtr; } - virtual llvm::Constant *BuildRCBlockLayout(CodeGenModule &CGM, - const CGBlockInfo &blockInfo) { + llvm::Constant *BuildRCBlockLayout(CodeGenModule &CGM, + const CGBlockInfo &blockInfo) override { return NULLPtr; } - - virtual llvm::Constant *BuildByrefLayout(CodeGenModule &CGM, - QualType T) { + + llvm::Constant *BuildByrefLayout(CodeGenModule &CGM, QualType T) override { return NULLPtr; } - - virtual llvm::GlobalVariable *GetClassGlobal(const std::string &Name) { - return 0; + + llvm::GlobalVariable *GetClassGlobal(const std::string &Name, + bool Weak = false) override { + return nullptr; } }; /// Class representing the legacy GCC Objective-C ABI. This is the default when @@ -595,11 +584,9 @@ class CGObjCGCC : public CGObjCGNU { /// arguments. Returns the IMP for the corresponding method. LazyRuntimeFunction MsgLookupSuperFn; protected: - virtual llvm::Value *LookupIMP(CodeGenFunction &CGF, - llvm::Value *&Receiver, - llvm::Value *cmd, - llvm::MDNode *node, - MessageSendInfo &MSI) { + llvm::Value *LookupIMP(CodeGenFunction &CGF, llvm::Value *&Receiver, + llvm::Value *cmd, llvm::MDNode *node, + MessageSendInfo &MSI) override { CGBuilderTy &Builder = CGF.Builder; llvm::Value *args[] = { EnforceType(Builder, Receiver, IdTy), @@ -608,10 +595,8 @@ protected: imp->setMetadata(msgSendMDKind, node); return imp.getInstruction(); } - virtual llvm::Value *LookupIMPSuper(CodeGenFunction &CGF, - llvm::Value *ObjCSuper, - llvm::Value *cmd, - MessageSendInfo &MSI) { + llvm::Value *LookupIMPSuper(CodeGenFunction &CGF, llvm::Value *ObjCSuper, + llvm::Value *cmd, MessageSendInfo &MSI) override { CGBuilderTy &Builder = CGF.Builder; llvm::Value *lookupArgs[] = {EnforceType(Builder, ObjCSuper, PtrToObjCSuperTy), cmd}; @@ -620,10 +605,11 @@ protected: public: CGObjCGCC(CodeGenModule &Mod) : CGObjCGNU(Mod, 8, 2) { // IMP objc_msg_lookup(id, SEL); - MsgLookupFn.init(&CGM, "objc_msg_lookup", IMPTy, IdTy, SelectorTy, NULL); + MsgLookupFn.init(&CGM, "objc_msg_lookup", IMPTy, IdTy, SelectorTy, + nullptr); // IMP objc_msg_lookup_super(struct objc_super*, SEL); MsgLookupSuperFn.init(&CGM, "objc_msg_lookup_super", IMPTy, - PtrToObjCSuperTy, SelectorTy, NULL); + PtrToObjCSuperTy, SelectorTy, nullptr); } }; /// Class used when targeting the new GNUstep runtime ABI. @@ -654,13 +640,11 @@ class CGObjCGNUstep : public CGObjCGNU { /// lookup functions. llvm::Type *SlotTy; public: - virtual llvm::Constant *GetEHType(QualType T); + llvm::Constant *GetEHType(QualType T) override; protected: - virtual llvm::Value *LookupIMP(CodeGenFunction &CGF, - llvm::Value *&Receiver, - llvm::Value *cmd, - llvm::MDNode *node, - MessageSendInfo &MSI) { + llvm::Value *LookupIMP(CodeGenFunction &CGF, llvm::Value *&Receiver, + llvm::Value *cmd, llvm::MDNode *node, + MessageSendInfo &MSI) override { CGBuilderTy &Builder = CGF.Builder; llvm::Function *LookupFn = SlotLookupFn; @@ -696,10 +680,9 @@ class CGObjCGNUstep : public CGObjCGNU { Receiver = Builder.CreateLoad(ReceiverPtr, true); return imp; } - virtual llvm::Value *LookupIMPSuper(CodeGenFunction &CGF, - llvm::Value *ObjCSuper, - llvm::Value *cmd, - MessageSendInfo &MSI) { + llvm::Value *LookupIMPSuper(CodeGenFunction &CGF, llvm::Value *ObjCSuper, + llvm::Value *cmd, + MessageSendInfo &MSI) override { CGBuilderTy &Builder = CGF.Builder; llvm::Value *lookupArgs[] = {ObjCSuper, cmd}; @@ -714,68 +697,68 @@ class CGObjCGNUstep : public CGObjCGNU { const ObjCRuntime &R = CGM.getLangOpts().ObjCRuntime; llvm::StructType *SlotStructTy = llvm::StructType::get(PtrTy, - PtrTy, PtrTy, IntTy, IMPTy, NULL); + PtrTy, PtrTy, IntTy, IMPTy, nullptr); SlotTy = llvm::PointerType::getUnqual(SlotStructTy); // Slot_t objc_msg_lookup_sender(id *receiver, SEL selector, id sender); SlotLookupFn.init(&CGM, "objc_msg_lookup_sender", SlotTy, PtrToIdTy, - SelectorTy, IdTy, NULL); + SelectorTy, IdTy, nullptr); // Slot_t objc_msg_lookup_super(struct objc_super*, SEL); SlotLookupSuperFn.init(&CGM, "objc_slot_lookup_super", SlotTy, - PtrToObjCSuperTy, SelectorTy, NULL); + PtrToObjCSuperTy, SelectorTy, nullptr); // If we're in ObjC++ mode, then we want to make if (CGM.getLangOpts().CPlusPlus) { llvm::Type *VoidTy = llvm::Type::getVoidTy(VMContext); // void *__cxa_begin_catch(void *e) - EnterCatchFn.init(&CGM, "__cxa_begin_catch", PtrTy, PtrTy, NULL); + EnterCatchFn.init(&CGM, "__cxa_begin_catch", PtrTy, PtrTy, nullptr); // void __cxa_end_catch(void) - ExitCatchFn.init(&CGM, "__cxa_end_catch", VoidTy, NULL); + ExitCatchFn.init(&CGM, "__cxa_end_catch", VoidTy, nullptr); // void _Unwind_Resume_or_Rethrow(void*) ExceptionReThrowFn.init(&CGM, "_Unwind_Resume_or_Rethrow", VoidTy, - PtrTy, NULL); + PtrTy, nullptr); } else if (R.getVersion() >= VersionTuple(1, 7)) { llvm::Type *VoidTy = llvm::Type::getVoidTy(VMContext); // id objc_begin_catch(void *e) - EnterCatchFn.init(&CGM, "objc_begin_catch", IdTy, PtrTy, NULL); + EnterCatchFn.init(&CGM, "objc_begin_catch", IdTy, PtrTy, nullptr); // void objc_end_catch(void) - ExitCatchFn.init(&CGM, "objc_end_catch", VoidTy, NULL); + ExitCatchFn.init(&CGM, "objc_end_catch", VoidTy, nullptr); // void _Unwind_Resume_or_Rethrow(void*) ExceptionReThrowFn.init(&CGM, "objc_exception_rethrow", VoidTy, - PtrTy, NULL); + PtrTy, nullptr); } llvm::Type *VoidTy = llvm::Type::getVoidTy(VMContext); SetPropertyAtomic.init(&CGM, "objc_setProperty_atomic", VoidTy, IdTy, - SelectorTy, IdTy, PtrDiffTy, NULL); + SelectorTy, IdTy, PtrDiffTy, nullptr); SetPropertyAtomicCopy.init(&CGM, "objc_setProperty_atomic_copy", VoidTy, - IdTy, SelectorTy, IdTy, PtrDiffTy, NULL); + IdTy, SelectorTy, IdTy, PtrDiffTy, nullptr); SetPropertyNonAtomic.init(&CGM, "objc_setProperty_nonatomic", VoidTy, - IdTy, SelectorTy, IdTy, PtrDiffTy, NULL); + IdTy, SelectorTy, IdTy, PtrDiffTy, nullptr); SetPropertyNonAtomicCopy.init(&CGM, "objc_setProperty_nonatomic_copy", - VoidTy, IdTy, SelectorTy, IdTy, PtrDiffTy, NULL); + VoidTy, IdTy, SelectorTy, IdTy, PtrDiffTy, nullptr); // void objc_setCppObjectAtomic(void *dest, const void *src, void // *helper); CxxAtomicObjectSetFn.init(&CGM, "objc_setCppObjectAtomic", VoidTy, PtrTy, - PtrTy, PtrTy, NULL); + PtrTy, PtrTy, nullptr); // void objc_getCppObjectAtomic(void *dest, const void *src, void // *helper); CxxAtomicObjectGetFn.init(&CGM, "objc_getCppObjectAtomic", VoidTy, PtrTy, - PtrTy, PtrTy, NULL); + PtrTy, PtrTy, nullptr); } - virtual llvm::Constant *GetCppAtomicObjectGetFunction() { + llvm::Constant *GetCppAtomicObjectGetFunction() override { // The optimised functions were added in version 1.7 of the GNUstep // runtime. assert (CGM.getLangOpts().ObjCRuntime.getVersion() >= VersionTuple(1, 7)); return CxxAtomicObjectGetFn; } - virtual llvm::Constant *GetCppAtomicObjectSetFunction() { + llvm::Constant *GetCppAtomicObjectSetFunction() override { // The optimised functions were added in version 1.7 of the GNUstep // runtime. assert (CGM.getLangOpts().ObjCRuntime.getVersion() >= VersionTuple(1, 7)); return CxxAtomicObjectSetFn; } - virtual llvm::Constant *GetOptimizedPropertySetFunction(bool atomic, - bool copy) { + llvm::Constant *GetOptimizedPropertySetFunction(bool atomic, + bool copy) override { // The optimised property functions omit the GC check, and so are not // safe to use in GC mode. The standard functions are fast in GC mode, // so there is less advantage in using them. @@ -789,10 +772,8 @@ class CGObjCGNUstep : public CGObjCGNU { if (copy) return SetPropertyAtomicCopy; return SetPropertyAtomic; } - if (copy) return SetPropertyNonAtomicCopy; - return SetPropertyNonAtomic; - return 0; + return copy ? SetPropertyNonAtomicCopy : SetPropertyNonAtomic; } }; @@ -810,11 +791,9 @@ protected: /// arguments. Returns the IMP for the corresponding method. LazyRuntimeFunction MsgLookupSuperFn, MsgLookupSuperFnSRet; - virtual llvm::Value *LookupIMP(CodeGenFunction &CGF, - llvm::Value *&Receiver, - llvm::Value *cmd, - llvm::MDNode *node, - MessageSendInfo &MSI) { + llvm::Value *LookupIMP(CodeGenFunction &CGF, llvm::Value *&Receiver, + llvm::Value *cmd, llvm::MDNode *node, + MessageSendInfo &MSI) override { CGBuilderTy &Builder = CGF.Builder; llvm::Value *args[] = { EnforceType(Builder, Receiver, IdTy), @@ -830,10 +809,8 @@ protected: return imp.getInstruction(); } - virtual llvm::Value *LookupIMPSuper(CodeGenFunction &CGF, - llvm::Value *ObjCSuper, - llvm::Value *cmd, - MessageSendInfo &MSI) { + llvm::Value *LookupIMPSuper(CodeGenFunction &CGF, llvm::Value *ObjCSuper, + llvm::Value *cmd, MessageSendInfo &MSI) override { CGBuilderTy &Builder = CGF.Builder; llvm::Value *lookupArgs[] = {EnforceType(Builder, ObjCSuper, PtrToObjCSuperTy), cmd}; @@ -844,8 +821,8 @@ protected: return CGF.EmitNounwindRuntimeCall(MsgLookupSuperFn, lookupArgs); } - virtual llvm::Value *GetClassNamed(CodeGenFunction &CGF, - const std::string &Name, bool isWeak) { + llvm::Value *GetClassNamed(CodeGenFunction &CGF, + const std::string &Name, bool isWeak) override { if (isWeak) return CGObjCGNU::GetClassNamed(CGF, Name, isWeak); @@ -858,7 +835,7 @@ protected: if (!ClassSymbol) ClassSymbol = new llvm::GlobalVariable(TheModule, LongTy, false, llvm::GlobalValue::ExternalLinkage, - 0, SymbolName); + nullptr, SymbolName); return ClassSymbol; } @@ -866,14 +843,14 @@ protected: public: CGObjCObjFW(CodeGenModule &Mod): CGObjCGNU(Mod, 9, 3) { // IMP objc_msg_lookup(id, SEL); - MsgLookupFn.init(&CGM, "objc_msg_lookup", IMPTy, IdTy, SelectorTy, NULL); + MsgLookupFn.init(&CGM, "objc_msg_lookup", IMPTy, IdTy, SelectorTy, nullptr); MsgLookupFnSRet.init(&CGM, "objc_msg_lookup_stret", IMPTy, IdTy, - SelectorTy, NULL); + SelectorTy, nullptr); // IMP objc_msg_lookup_super(struct objc_super*, SEL); MsgLookupSuperFn.init(&CGM, "objc_msg_lookup_super", IMPTy, - PtrToObjCSuperTy, SelectorTy, NULL); + PtrToObjCSuperTy, SelectorTy, nullptr); MsgLookupSuperFnSRet.init(&CGM, "objc_msg_lookup_super_stret", IMPTy, - PtrToObjCSuperTy, SelectorTy, NULL); + PtrToObjCSuperTy, SelectorTy, nullptr); } }; } // end anonymous namespace @@ -891,7 +868,8 @@ void CGObjCGNU::EmitClassRef(const std::string &className) { llvm::GlobalVariable *ClassSymbol = TheModule.getGlobalVariable(symbolName); if (!ClassSymbol) { ClassSymbol = new llvm::GlobalVariable(TheModule, LongTy, false, - llvm::GlobalValue::ExternalLinkage, 0, symbolName); + llvm::GlobalValue::ExternalLinkage, + nullptr, symbolName); } new llvm::GlobalVariable(TheModule, ClassSymbol->getType(), true, llvm::GlobalValue::WeakAnyLinkage, ClassSymbol, symbolRef); @@ -908,10 +886,11 @@ static std::string SymbolNameForMethod(const StringRef &ClassName, } CGObjCGNU::CGObjCGNU(CodeGenModule &cgm, unsigned runtimeABIVersion, - unsigned protocolClassVersion) + unsigned protocolClassVersion) : CGObjCRuntime(cgm), TheModule(CGM.getModule()), - VMContext(cgm.getLLVMContext()), ClassPtrAlias(0), MetaClassPtrAlias(0), - RuntimeVersion(runtimeABIVersion), ProtocolVersion(protocolClassVersion) { + VMContext(cgm.getLLVMContext()), ClassPtrAlias(nullptr), + MetaClassPtrAlias(nullptr), RuntimeVersion(runtimeABIVersion), + ProtocolVersion(protocolClassVersion) { msgSendMDKind = VMContext.getMDKindID("GNUObjCMessageSend"); @@ -948,7 +927,7 @@ CGObjCGNU::CGObjCGNU(CodeGenModule &cgm, unsigned runtimeABIVersion, Int64Ty = llvm::Type::getInt64Ty(VMContext); IntPtrTy = - TheModule.getPointerSize() == llvm::Module::Pointer32 ? Int32Ty : Int64Ty; + CGM.getDataLayout().getPointerSizeInBits() == 32 ? Int32Ty : Int64Ty; // Object type QualType UnqualIdTy = CGM.getContext().getObjCIdType(); @@ -961,35 +940,35 @@ CGObjCGNU::CGObjCGNU(CodeGenModule &cgm, unsigned runtimeABIVersion, } PtrToIdTy = llvm::PointerType::getUnqual(IdTy); - ObjCSuperTy = llvm::StructType::get(IdTy, IdTy, NULL); + ObjCSuperTy = llvm::StructType::get(IdTy, IdTy, nullptr); PtrToObjCSuperTy = llvm::PointerType::getUnqual(ObjCSuperTy); llvm::Type *VoidTy = llvm::Type::getVoidTy(VMContext); // void objc_exception_throw(id); - ExceptionThrowFn.init(&CGM, "objc_exception_throw", VoidTy, IdTy, NULL); - ExceptionReThrowFn.init(&CGM, "objc_exception_throw", VoidTy, IdTy, NULL); + ExceptionThrowFn.init(&CGM, "objc_exception_throw", VoidTy, IdTy, nullptr); + ExceptionReThrowFn.init(&CGM, "objc_exception_throw", VoidTy, IdTy, nullptr); // int objc_sync_enter(id); - SyncEnterFn.init(&CGM, "objc_sync_enter", IntTy, IdTy, NULL); + SyncEnterFn.init(&CGM, "objc_sync_enter", IntTy, IdTy, nullptr); // int objc_sync_exit(id); - SyncExitFn.init(&CGM, "objc_sync_exit", IntTy, IdTy, NULL); + SyncExitFn.init(&CGM, "objc_sync_exit", IntTy, IdTy, nullptr); // void objc_enumerationMutation (id) EnumerationMutationFn.init(&CGM, "objc_enumerationMutation", VoidTy, - IdTy, NULL); + IdTy, nullptr); // id objc_getProperty(id, SEL, ptrdiff_t, BOOL) GetPropertyFn.init(&CGM, "objc_getProperty", IdTy, IdTy, SelectorTy, - PtrDiffTy, BoolTy, NULL); + PtrDiffTy, BoolTy, nullptr); // void objc_setProperty(id, SEL, ptrdiff_t, id, BOOL, BOOL) SetPropertyFn.init(&CGM, "objc_setProperty", VoidTy, IdTy, SelectorTy, - PtrDiffTy, IdTy, BoolTy, BoolTy, NULL); + PtrDiffTy, IdTy, BoolTy, BoolTy, nullptr); // void objc_setPropertyStruct(void*, void*, ptrdiff_t, BOOL, BOOL) GetStructPropertyFn.init(&CGM, "objc_getPropertyStruct", VoidTy, PtrTy, PtrTy, - PtrDiffTy, BoolTy, BoolTy, NULL); + PtrDiffTy, BoolTy, BoolTy, nullptr); // void objc_setPropertyStruct(void*, void*, ptrdiff_t, BOOL, BOOL) SetStructPropertyFn.init(&CGM, "objc_setPropertyStruct", VoidTy, PtrTy, PtrTy, - PtrDiffTy, BoolTy, BoolTy, NULL); + PtrDiffTy, BoolTy, BoolTy, nullptr); // IMP type llvm::Type *IMPArgs[] = { IdTy, SelectorTy }; @@ -1014,20 +993,20 @@ CGObjCGNU::CGObjCGNU(CodeGenModule &cgm, unsigned runtimeABIVersion, // id objc_assign_ivar(id, id, ptrdiff_t); IvarAssignFn.init(&CGM, "objc_assign_ivar", IdTy, IdTy, IdTy, PtrDiffTy, - NULL); + nullptr); // id objc_assign_strongCast (id, id*) StrongCastAssignFn.init(&CGM, "objc_assign_strongCast", IdTy, IdTy, - PtrToIdTy, NULL); + PtrToIdTy, nullptr); // id objc_assign_global(id, id*); GlobalAssignFn.init(&CGM, "objc_assign_global", IdTy, IdTy, PtrToIdTy, - NULL); + nullptr); // id objc_assign_weak(id, id*); - WeakAssignFn.init(&CGM, "objc_assign_weak", IdTy, IdTy, PtrToIdTy, NULL); + WeakAssignFn.init(&CGM, "objc_assign_weak", IdTy, IdTy, PtrToIdTy, nullptr); // id objc_read_weak(id*); - WeakReadFn.init(&CGM, "objc_read_weak", IdTy, PtrToIdTy, NULL); + WeakReadFn.init(&CGM, "objc_read_weak", IdTy, PtrToIdTy, nullptr); // void *objc_memmove_collectable(void*, void *, size_t); MemMoveFn.init(&CGM, "objc_memmove_collectable", PtrTy, PtrTy, PtrTy, - SizeTy, NULL); + SizeTy, nullptr); } } @@ -1066,8 +1045,7 @@ llvm::Value *CGObjCGNU::GetSelector(CodeGenFunction &CGF, Selector Sel, const std::string &TypeEncoding, bool lval) { SmallVectorImpl<TypedSelector> &Types = SelectorTable[Sel]; - llvm::GlobalAlias *SelValue = 0; - + llvm::GlobalAlias *SelValue = nullptr; for (SmallVectorImpl<TypedSelector>::iterator i = Types.begin(), e = Types.end() ; i!=e ; i++) { @@ -1076,11 +1054,10 @@ llvm::Value *CGObjCGNU::GetSelector(CodeGenFunction &CGF, Selector Sel, break; } } - if (0 == SelValue) { - SelValue = new llvm::GlobalAlias(SelectorTy, - llvm::GlobalValue::PrivateLinkage, - ".objc_selector_"+Sel.getAsString(), NULL, - &TheModule); + if (!SelValue) { + SelValue = llvm::GlobalAlias::create( + SelectorTy->getElementType(), 0, llvm::GlobalValue::PrivateLinkage, + ".objc_selector_" + Sel.getAsString(), &TheModule); Types.push_back(TypedSelector(TypeEncoding, SelValue)); } @@ -1113,7 +1090,7 @@ llvm::Constant *CGObjCGNU::GetEHType(QualType T) { if (CGM.getLangOpts().ObjCRuntime.isNonFragile()) { return MakeConstantString("@id"); } else { - return 0; + return nullptr; } } @@ -1142,7 +1119,7 @@ llvm::Constant *CGObjCGNUstep::GetEHType(QualType T) { new llvm::GlobalVariable(CGM.getModule(), PtrToInt8Ty, false, llvm::GlobalValue::ExternalLinkage, - 0, "__objc_id_type_info"); + nullptr, "__objc_id_type_info"); return llvm::ConstantExpr::getBitCast(IDEHType, PtrToInt8Ty); } @@ -1169,7 +1146,8 @@ llvm::Constant *CGObjCGNUstep::GetEHType(QualType T) { llvm::Constant *Vtable = TheModule.getGlobalVariable(vtableName); if (!Vtable) { Vtable = new llvm::GlobalVariable(TheModule, PtrToInt8Ty, true, - llvm::GlobalValue::ExternalLinkage, 0, vtableName); + llvm::GlobalValue::ExternalLinkage, + nullptr, vtableName); } llvm::Constant *Two = llvm::ConstantInt::get(IntTy, 2); Vtable = llvm::ConstantExpr::getGetElementPtr(Vtable, Two); @@ -1183,7 +1161,7 @@ llvm::Constant *CGObjCGNUstep::GetEHType(QualType T) { fields.push_back(typeName); llvm::Constant *TI = MakeGlobal(llvm::StructType::get(PtrToInt8Ty, PtrToInt8Ty, - NULL), fields, "__objc_eh_typeinfo_" + className, + nullptr), fields, "__objc_eh_typeinfo_" + className, llvm::GlobalValue::LinkOnceODRLinkage); return llvm::ConstantExpr::getBitCast(TI, PtrToInt8Ty); } @@ -1209,7 +1187,7 @@ llvm::Constant *CGObjCGNU::GenerateConstantString(const StringLiteral *SL) { if (!isa) isa = new llvm::GlobalVariable(TheModule, IdTy, /* isConstant */false, - llvm::GlobalValue::ExternalWeakLinkage, 0, Sym); + llvm::GlobalValue::ExternalWeakLinkage, nullptr, Sym); else if (isa->getType() != PtrToIdTy) isa = llvm::ConstantExpr::getBitCast(isa, PtrToIdTy); @@ -1218,7 +1196,7 @@ llvm::Constant *CGObjCGNU::GenerateConstantString(const StringLiteral *SL) { Ivars.push_back(MakeConstantString(Str)); Ivars.push_back(llvm::ConstantInt::get(IntTy, Str.size())); llvm::Constant *ObjCStr = MakeGlobal( - llvm::StructType::get(PtrToIdTy, PtrToInt8Ty, IntTy, NULL), + llvm::StructType::get(PtrToIdTy, PtrToInt8Ty, IntTy, nullptr), Ivars, ".objc_str"); ObjCStr = llvm::ConstantExpr::getBitCast(ObjCStr, PtrToInt8Ty); ObjCStrings[Str] = ObjCStr; @@ -1247,7 +1225,7 @@ CGObjCGNU::GenerateMessageSendSuper(CodeGenFunction &CGF, CGM.getTypes().ConvertType(ResultType))); } if (Sel == ReleaseSel) { - return RValue::get(0); + return RValue::get(nullptr); } } @@ -1262,9 +1240,9 @@ CGObjCGNU::GenerateMessageSendSuper(CodeGenFunction &CGF, MessageSendInfo MSI = getMessageSendInfo(Method, ResultType, ActualArgs); - llvm::Value *ReceiverClass = 0; + llvm::Value *ReceiverClass = nullptr; if (isCategoryImpl) { - llvm::Constant *classLookupFunction = 0; + llvm::Constant *classLookupFunction = nullptr; if (IsClassMessage) { classLookupFunction = CGM.CreateRuntimeFunction(llvm::FunctionType::get( IdTy, PtrTy, true), "objc_get_meta_class"); @@ -1282,16 +1260,16 @@ CGObjCGNU::GenerateMessageSendSuper(CodeGenFunction &CGF, // super_class pointer from either the class or metaclass structure. if (IsClassMessage) { if (!MetaClassPtrAlias) { - MetaClassPtrAlias = new llvm::GlobalAlias(IdTy, - llvm::GlobalValue::InternalLinkage, ".objc_metaclass_ref" + - Class->getNameAsString(), NULL, &TheModule); + MetaClassPtrAlias = llvm::GlobalAlias::create( + IdTy->getElementType(), 0, llvm::GlobalValue::InternalLinkage, + ".objc_metaclass_ref" + Class->getNameAsString(), &TheModule); } ReceiverClass = MetaClassPtrAlias; } else { if (!ClassPtrAlias) { - ClassPtrAlias = new llvm::GlobalAlias(IdTy, - llvm::GlobalValue::InternalLinkage, ".objc_class_ref" + - Class->getNameAsString(), NULL, &TheModule); + ClassPtrAlias = llvm::GlobalAlias::create( + IdTy->getElementType(), 0, llvm::GlobalValue::InternalLinkage, + ".objc_class_ref" + Class->getNameAsString(), &TheModule); } ReceiverClass = ClassPtrAlias; } @@ -1299,14 +1277,14 @@ CGObjCGNU::GenerateMessageSendSuper(CodeGenFunction &CGF, // Cast the pointer to a simplified version of the class structure ReceiverClass = Builder.CreateBitCast(ReceiverClass, llvm::PointerType::getUnqual( - llvm::StructType::get(IdTy, IdTy, NULL))); + llvm::StructType::get(IdTy, IdTy, nullptr))); // Get the superclass pointer ReceiverClass = Builder.CreateStructGEP(ReceiverClass, 1); // Load the superclass pointer ReceiverClass = Builder.CreateLoad(ReceiverClass); // Construct the structure used to look up the IMP llvm::StructType *ObjCSuperTy = llvm::StructType::get( - Receiver->getType(), IdTy, NULL); + Receiver->getType(), IdTy, nullptr); llvm::Value *ObjCSuper = Builder.CreateAlloca(ObjCSuperTy); Builder.CreateStore(Receiver, Builder.CreateStructGEP(ObjCSuper, 0)); @@ -1326,7 +1304,8 @@ CGObjCGNU::GenerateMessageSendSuper(CodeGenFunction &CGF, llvm::MDNode *node = llvm::MDNode::get(VMContext, impMD); llvm::Instruction *call; - RValue msgRet = CGF.EmitCall(MSI.CallInfo, imp, Return, ActualArgs, 0, &call); + RValue msgRet = CGF.EmitCall(MSI.CallInfo, imp, Return, ActualArgs, nullptr, + &call); call->setMetadata(msgSendMDKind, node); return msgRet; } @@ -1350,7 +1329,7 @@ CGObjCGNU::GenerateMessageSend(CodeGenFunction &CGF, CGM.getTypes().ConvertType(ResultType))); } if (Sel == ReleaseSel) { - return RValue::get(0); + return RValue::get(nullptr); } } @@ -1368,9 +1347,9 @@ CGObjCGNU::GenerateMessageSend(CodeGenFunction &CGF, bool isPointerSizedReturn = (ResultType->isAnyPointerType() || ResultType->isIntegralOrEnumerationType() || ResultType->isVoidType()); - llvm::BasicBlock *startBB = 0; - llvm::BasicBlock *messageBB = 0; - llvm::BasicBlock *continueBB = 0; + llvm::BasicBlock *startBB = nullptr; + llvm::BasicBlock *messageBB = nullptr; + llvm::BasicBlock *continueBB = nullptr; if (!isPointerSizedReturn) { startBB = Builder.GetInsertBlock(); @@ -1395,7 +1374,8 @@ CGObjCGNU::GenerateMessageSend(CodeGenFunction &CGF, llvm::Value *impMD[] = { llvm::MDString::get(VMContext, Sel.getAsString()), llvm::MDString::get(VMContext, Class ? Class->getNameAsString() :""), - llvm::ConstantInt::get(llvm::Type::getInt1Ty(VMContext), Class!=0) + llvm::ConstantInt::get(llvm::Type::getInt1Ty(VMContext), + Class!=nullptr) }; llvm::MDNode *node = llvm::MDNode::get(VMContext, impMD); @@ -1438,7 +1418,8 @@ CGObjCGNU::GenerateMessageSend(CodeGenFunction &CGF, imp = EnforceType(Builder, imp, MSI.MessengerType); llvm::Instruction *call; - RValue msgRet = CGF.EmitCall(MSI.CallInfo, imp, Return, ActualArgs, 0, &call); + RValue msgRet = CGF.EmitCall(MSI.CallInfo, imp, Return, ActualArgs, nullptr, + &call); call->setMetadata(msgSendMDKind, node); @@ -1494,7 +1475,7 @@ GenerateMethodList(const StringRef &ClassName, PtrToInt8Ty, // Really a selector, but the runtime creates it us. PtrToInt8Ty, // Method types IMPTy, //Method pointer - NULL); + nullptr); std::vector<llvm::Constant*> Methods; std::vector<llvm::Constant*> Elements; for (unsigned int i = 0, e = MethodTypes.size(); i < e; ++i) { @@ -1526,7 +1507,7 @@ GenerateMethodList(const StringRef &ClassName, NextPtrTy, IntTy, ObjCMethodArrayTy, - NULL); + nullptr); Methods.clear(); Methods.push_back(llvm::ConstantPointerNull::get( @@ -1550,7 +1531,7 @@ GenerateIvarList(ArrayRef<llvm::Constant *> IvarNames, PtrToInt8Ty, PtrToInt8Ty, IntTy, - NULL); + nullptr); std::vector<llvm::Constant*> Ivars; std::vector<llvm::Constant*> Elements; for (unsigned int i = 0, e = IvarNames.size() ; i < e ; i++) { @@ -1572,7 +1553,7 @@ GenerateIvarList(ArrayRef<llvm::Constant *> IvarNames, // Structure containing array and array count llvm::StructType *ObjCIvarListTy = llvm::StructType::get(IntTy, ObjCIvarArrayTy, - NULL); + nullptr); // Create an instance of the structure return MakeGlobal(ObjCIvarListTy, Elements, ".objc_ivar_list"); @@ -1622,7 +1603,7 @@ llvm::Constant *CGObjCGNU::GenerateClassStructure( Properties->getType(), // properties IntPtrTy, // strong_pointers IntPtrTy, // weak_pointers - NULL); + nullptr); llvm::Constant *Zero = llvm::ConstantInt::get(LongTy, 0); // Fill in the structure std::vector<llvm::Constant*> Elements; @@ -1676,7 +1657,7 @@ GenerateProtocolMethodList(ArrayRef<llvm::Constant *> MethodNames, llvm::StructType *ObjCMethodDescTy = llvm::StructType::get( PtrToInt8Ty, // Really a selector, but the runtime does the casting for us. PtrToInt8Ty, - NULL); + nullptr); std::vector<llvm::Constant*> Methods; std::vector<llvm::Constant*> Elements; for (unsigned int i = 0, e = MethodTypes.size() ; i < e ; i++) { @@ -1690,7 +1671,7 @@ GenerateProtocolMethodList(ArrayRef<llvm::Constant *> MethodNames, llvm::Constant *Array = llvm::ConstantArray::get(ObjCMethodArrayTy, Methods); llvm::StructType *ObjCMethodDescListTy = llvm::StructType::get( - IntTy, ObjCMethodArrayTy, NULL); + IntTy, ObjCMethodArrayTy, nullptr); Methods.clear(); Methods.push_back(llvm::ConstantInt::get(IntTy, MethodNames.size())); Methods.push_back(Array); @@ -1705,11 +1686,11 @@ llvm::Constant *CGObjCGNU::GenerateProtocolList(ArrayRef<std::string>Protocols){ PtrTy, //Should be a recurisve pointer, but it's always NULL here. SizeTy, ProtocolArrayTy, - NULL); + nullptr); std::vector<llvm::Constant*> Elements; for (const std::string *iter = Protocols.begin(), *endIter = Protocols.end(); iter != endIter ; iter++) { - llvm::Constant *protocol = 0; + llvm::Constant *protocol = nullptr; llvm::StringMap<llvm::Constant*>::iterator value = ExistingProtocols.find(*iter); if (value == ExistingProtocols.end()) { @@ -1755,7 +1736,7 @@ llvm::Constant *CGObjCGNU::GenerateEmptyProtocol( MethodList->getType(), MethodList->getType(), MethodList->getType(), - NULL); + nullptr); std::vector<llvm::Constant*> Elements; // The isa pointer must be set to a magic number so the runtime knows it's // the correct layout. @@ -1779,24 +1760,22 @@ void CGObjCGNU::GenerateProtocol(const ObjCProtocolDecl *PD) { PD = Def; SmallVector<std::string, 16> Protocols; - for (ObjCProtocolDecl::protocol_iterator PI = PD->protocol_begin(), - E = PD->protocol_end(); PI != E; ++PI) - Protocols.push_back((*PI)->getNameAsString()); + for (const auto *PI : PD->protocols()) + Protocols.push_back(PI->getNameAsString()); SmallVector<llvm::Constant*, 16> InstanceMethodNames; SmallVector<llvm::Constant*, 16> InstanceMethodTypes; SmallVector<llvm::Constant*, 16> OptionalInstanceMethodNames; SmallVector<llvm::Constant*, 16> OptionalInstanceMethodTypes; - for (ObjCProtocolDecl::instmeth_iterator iter = PD->instmeth_begin(), - E = PD->instmeth_end(); iter != E; iter++) { + for (const auto *I : PD->instance_methods()) { std::string TypeStr; - Context.getObjCEncodingForMethodDecl(*iter, TypeStr); - if ((*iter)->getImplementationControl() == ObjCMethodDecl::Optional) { + Context.getObjCEncodingForMethodDecl(I, TypeStr); + if (I->getImplementationControl() == ObjCMethodDecl::Optional) { OptionalInstanceMethodNames.push_back( - MakeConstantString((*iter)->getSelector().getAsString())); + MakeConstantString(I->getSelector().getAsString())); OptionalInstanceMethodTypes.push_back(MakeConstantString(TypeStr)); } else { InstanceMethodNames.push_back( - MakeConstantString((*iter)->getSelector().getAsString())); + MakeConstantString(I->getSelector().getAsString())); InstanceMethodTypes.push_back(MakeConstantString(TypeStr)); } } @@ -1805,18 +1784,16 @@ void CGObjCGNU::GenerateProtocol(const ObjCProtocolDecl *PD) { SmallVector<llvm::Constant*, 16> ClassMethodTypes; SmallVector<llvm::Constant*, 16> OptionalClassMethodNames; SmallVector<llvm::Constant*, 16> OptionalClassMethodTypes; - for (ObjCProtocolDecl::classmeth_iterator - iter = PD->classmeth_begin(), endIter = PD->classmeth_end(); - iter != endIter ; iter++) { + for (const auto *I : PD->class_methods()) { std::string TypeStr; - Context.getObjCEncodingForMethodDecl((*iter),TypeStr); - if ((*iter)->getImplementationControl() == ObjCMethodDecl::Optional) { + Context.getObjCEncodingForMethodDecl(I,TypeStr); + if (I->getImplementationControl() == ObjCMethodDecl::Optional) { OptionalClassMethodNames.push_back( - MakeConstantString((*iter)->getSelector().getAsString())); + MakeConstantString(I->getSelector().getAsString())); OptionalClassMethodTypes.push_back(MakeConstantString(TypeStr)); } else { ClassMethodNames.push_back( - MakeConstantString((*iter)->getSelector().getAsString())); + MakeConstantString(I->getSelector().getAsString())); ClassMethodTypes.push_back(MakeConstantString(TypeStr)); } } @@ -1840,19 +1817,16 @@ void CGObjCGNU::GenerateProtocol(const ObjCProtocolDecl *PD) { // structures for protocol metadata everywhere. llvm::StructType *PropertyMetadataTy = llvm::StructType::get( PtrToInt8Ty, Int8Ty, Int8Ty, Int8Ty, Int8Ty, PtrToInt8Ty, - PtrToInt8Ty, PtrToInt8Ty, PtrToInt8Ty, NULL); + PtrToInt8Ty, PtrToInt8Ty, PtrToInt8Ty, nullptr); std::vector<llvm::Constant*> Properties; std::vector<llvm::Constant*> OptionalProperties; // Add all of the property methods need adding to the method list and to the // property metadata list. - for (ObjCContainerDecl::prop_iterator - iter = PD->prop_begin(), endIter = PD->prop_end(); - iter != endIter ; iter++) { + for (auto *property : PD->properties()) { std::vector<llvm::Constant*> Fields; - ObjCPropertyDecl *property = *iter; - Fields.push_back(MakePropertyEncodingString(property, 0)); + Fields.push_back(MakePropertyEncodingString(property, nullptr)); PushPropertyAttributes(Fields, property); if (ObjCMethodDecl *getter = property->getGetterMethodDecl()) { @@ -1919,7 +1893,7 @@ void CGObjCGNU::GenerateProtocol(const ObjCProtocolDecl *PD) { OptionalClassMethodList->getType(), PropertyList->getType(), OptionalPropertyList->getType(), - NULL); + nullptr); std::vector<llvm::Constant*> Elements; // The isa pointer must be set to a magic number so the runtime knows it's // the correct layout. @@ -1960,7 +1934,7 @@ void CGObjCGNU::GenerateProtocolHolderCategory() { PtrTy, //Should be a recurisve pointer, but it's always NULL here. SizeTy, ProtocolArrayTy, - NULL); + nullptr); std::vector<llvm::Constant*> ProtocolElements; for (llvm::StringMapIterator<llvm::Constant*> iter = ExistingProtocols.begin(), endIter = ExistingProtocols.end(); @@ -1980,7 +1954,7 @@ void CGObjCGNU::GenerateProtocolHolderCategory() { ProtocolElements, ".objc_protocol_list"), PtrTy)); Categories.push_back(llvm::ConstantExpr::getBitCast( MakeGlobal(llvm::StructType::get(PtrToInt8Ty, PtrToInt8Ty, - PtrTy, PtrTy, PtrTy, NULL), Elements), PtrTy)); + PtrTy, PtrTy, PtrTy, nullptr), Elements), PtrTy)); } /// Libobjc2 uses a bitfield representation where small(ish) bitfields are @@ -1996,8 +1970,7 @@ void CGObjCGNU::GenerateProtocolHolderCategory() { /// bitfield / with the 63rd bit set will be 1<<64. llvm::Constant *CGObjCGNU::MakeBitField(ArrayRef<bool> bits) { int bitCount = bits.size(); - int ptrBits = - (TheModule.getPointerSize() == llvm::Module::Pointer32) ? 32 : 64; + int ptrBits = CGM.getDataLayout().getPointerSizeInBits(); if (bitCount < ptrBits) { uint64_t val = 1; for (int i=0 ; i<bitCount ; ++i) { @@ -2021,7 +1994,7 @@ llvm::Constant *CGObjCGNU::MakeBitField(ArrayRef<bool> bits) { llvm::ConstantInt::get(Int32Ty, values.size()), array }; llvm::Constant *GS = MakeGlobal(llvm::StructType::get(Int32Ty, arrayTy, - NULL), fields); + nullptr), fields); llvm::Constant *ptr = llvm::ConstantExpr::getPtrToInt(GS, IntPtrTy); return ptr; } @@ -2032,24 +2005,20 @@ void CGObjCGNU::GenerateCategory(const ObjCCategoryImplDecl *OCD) { // Collect information about instance methods SmallVector<Selector, 16> InstanceMethodSels; SmallVector<llvm::Constant*, 16> InstanceMethodTypes; - for (ObjCCategoryImplDecl::instmeth_iterator - iter = OCD->instmeth_begin(), endIter = OCD->instmeth_end(); - iter != endIter ; iter++) { - InstanceMethodSels.push_back((*iter)->getSelector()); + for (const auto *I : OCD->instance_methods()) { + InstanceMethodSels.push_back(I->getSelector()); std::string TypeStr; - CGM.getContext().getObjCEncodingForMethodDecl(*iter,TypeStr); + CGM.getContext().getObjCEncodingForMethodDecl(I,TypeStr); InstanceMethodTypes.push_back(MakeConstantString(TypeStr)); } // Collect information about class methods SmallVector<Selector, 16> ClassMethodSels; SmallVector<llvm::Constant*, 16> ClassMethodTypes; - for (ObjCCategoryImplDecl::classmeth_iterator - iter = OCD->classmeth_begin(), endIter = OCD->classmeth_end(); - iter != endIter ; iter++) { - ClassMethodSels.push_back((*iter)->getSelector()); + for (const auto *I : OCD->class_methods()) { + ClassMethodSels.push_back(I->getSelector()); std::string TypeStr; - CGM.getContext().getObjCEncodingForMethodDecl(*iter,TypeStr); + CGM.getContext().getObjCEncodingForMethodDecl(I,TypeStr); ClassMethodTypes.push_back(MakeConstantString(TypeStr)); } @@ -2077,7 +2046,7 @@ void CGObjCGNU::GenerateCategory(const ObjCCategoryImplDecl *OCD) { GenerateProtocolList(Protocols), PtrTy)); Categories.push_back(llvm::ConstantExpr::getBitCast( MakeGlobal(llvm::StructType::get(PtrToInt8Ty, PtrToInt8Ty, - PtrTy, PtrTy, PtrTy, NULL), Elements), PtrTy)); + PtrTy, PtrTy, PtrTy, nullptr), Elements), PtrTy)); } llvm::Constant *CGObjCGNU::GeneratePropertyList(const ObjCImplementationDecl *OID, @@ -2088,17 +2057,14 @@ llvm::Constant *CGObjCGNU::GeneratePropertyList(const ObjCImplementationDecl *OI // setter name, setter types, getter name, getter types. llvm::StructType *PropertyMetadataTy = llvm::StructType::get( PtrToInt8Ty, Int8Ty, Int8Ty, Int8Ty, Int8Ty, PtrToInt8Ty, - PtrToInt8Ty, PtrToInt8Ty, PtrToInt8Ty, NULL); + PtrToInt8Ty, PtrToInt8Ty, PtrToInt8Ty, nullptr); std::vector<llvm::Constant*> Properties; // Add all of the property methods need adding to the method list and to the // property metadata list. - for (ObjCImplDecl::propimpl_iterator - iter = OID->propimpl_begin(), endIter = OID->propimpl_end(); - iter != endIter ; iter++) { + for (auto *propertyImpl : OID->property_impls()) { std::vector<llvm::Constant*> Fields; - ObjCPropertyDecl *property = iter->getPropertyDecl(); - ObjCPropertyImplDecl *propertyImpl = *iter; + ObjCPropertyDecl *property = propertyImpl->getPropertyDecl(); bool isSynthesized = (propertyImpl->getPropertyImplementation() == ObjCPropertyImplDecl::Synthesize); bool isDynamic = (propertyImpl->getPropertyImplementation() == @@ -2265,12 +2231,10 @@ void CGObjCGNU::GenerateClass(const ObjCImplementationDecl *OID) { // Collect information about instance methods SmallVector<Selector, 16> InstanceMethodSels; SmallVector<llvm::Constant*, 16> InstanceMethodTypes; - for (ObjCImplementationDecl::instmeth_iterator - iter = OID->instmeth_begin(), endIter = OID->instmeth_end(); - iter != endIter ; iter++) { - InstanceMethodSels.push_back((*iter)->getSelector()); + for (const auto *I : OID->instance_methods()) { + InstanceMethodSels.push_back(I->getSelector()); std::string TypeStr; - Context.getObjCEncodingForMethodDecl((*iter),TypeStr); + Context.getObjCEncodingForMethodDecl(I,TypeStr); InstanceMethodTypes.push_back(MakeConstantString(TypeStr)); } @@ -2281,22 +2245,16 @@ void CGObjCGNU::GenerateClass(const ObjCImplementationDecl *OID) { // Collect information about class methods SmallVector<Selector, 16> ClassMethodSels; SmallVector<llvm::Constant*, 16> ClassMethodTypes; - for (ObjCImplementationDecl::classmeth_iterator - iter = OID->classmeth_begin(), endIter = OID->classmeth_end(); - iter != endIter ; iter++) { - ClassMethodSels.push_back((*iter)->getSelector()); + for (const auto *I : OID->class_methods()) { + ClassMethodSels.push_back(I->getSelector()); std::string TypeStr; - Context.getObjCEncodingForMethodDecl((*iter),TypeStr); + Context.getObjCEncodingForMethodDecl(I,TypeStr); ClassMethodTypes.push_back(MakeConstantString(TypeStr)); } // Collect the names of referenced protocols SmallVector<std::string, 16> Protocols; - for (ObjCInterfaceDecl::protocol_iterator - I = ClassDecl->protocol_begin(), - E = ClassDecl->protocol_end(); I != E; ++I) - Protocols.push_back((*I)->getNameAsString()); - - + for (const auto *I : ClassDecl->protocols()) + Protocols.push_back(I->getNameAsString()); // Get the superclass pointer. llvm::Constant *SuperClass; @@ -2326,7 +2284,7 @@ void CGObjCGNU::GenerateClass(const ObjCImplementationDecl *OID) { // the offset (third field in ivar structure) llvm::Type *IndexTy = Int32Ty; llvm::Constant *offsetPointerIndexes[] = {Zeros[0], - llvm::ConstantInt::get(IndexTy, 1), 0, + llvm::ConstantInt::get(IndexTy, 1), nullptr, llvm::ConstantInt::get(IndexTy, 2) }; unsigned ivarIndex = 0; @@ -2357,14 +2315,14 @@ void CGObjCGNU::GenerateClass(const ObjCImplementationDecl *OID) { llvm::Constant *ZeroPtr = llvm::ConstantInt::get(IntPtrTy, 0); //Generate metaclass for class methods llvm::Constant *MetaClassStruct = GenerateClassStructure(NULLPtr, - NULLPtr, 0x12L, ClassName.c_str(), 0, Zeros[0], GenerateIvarList( + NULLPtr, 0x12L, ClassName.c_str(), nullptr, Zeros[0], GenerateIvarList( empty, empty, empty), ClassMethodList, NULLPtr, NULLPtr, NULLPtr, ZeroPtr, ZeroPtr, true); // Generate the class structure llvm::Constant *ClassStruct = GenerateClassStructure(MetaClassStruct, SuperClass, 0x11L, - ClassName.c_str(), 0, + ClassName.c_str(), nullptr, llvm::ConstantInt::get(LongTy, instanceSize), IvarList, MethodList, GenerateProtocolList(Protocols), IvarOffsetArray, Properties, StrongIvarBitmap, WeakIvarBitmap); @@ -2374,13 +2332,13 @@ void CGObjCGNU::GenerateClass(const ObjCImplementationDecl *OID) { ClassPtrAlias->replaceAllUsesWith( llvm::ConstantExpr::getBitCast(ClassStruct, IdTy)); ClassPtrAlias->eraseFromParent(); - ClassPtrAlias = 0; + ClassPtrAlias = nullptr; } if (MetaClassPtrAlias) { MetaClassPtrAlias->replaceAllUsesWith( llvm::ConstantExpr::getBitCast(MetaClassStruct, IdTy)); MetaClassPtrAlias->eraseFromParent(); - MetaClassPtrAlias = 0; + MetaClassPtrAlias = nullptr; } // Add class structure to list to be added to the symtab later @@ -2393,7 +2351,7 @@ llvm::Function *CGObjCGNU::ModuleInitFunction() { // Only emit an ObjC load function if no Objective-C stuff has been called if (Classes.empty() && Categories.empty() && ConstantStrings.empty() && ExistingProtocols.empty() && SelectorTable.empty()) - return NULL; + return nullptr; // Add all referenced protocols to a category. GenerateProtocolHolderCategory(); @@ -2401,8 +2359,8 @@ llvm::Function *CGObjCGNU::ModuleInitFunction() { llvm::StructType *SelStructTy = dyn_cast<llvm::StructType>( SelectorTy->getElementType()); llvm::Type *SelStructPtrTy = SelectorTy; - if (SelStructTy == 0) { - SelStructTy = llvm::StructType::get(PtrToInt8Ty, PtrToInt8Ty, NULL); + if (!SelStructTy) { + SelStructTy = llvm::StructType::get(PtrToInt8Ty, PtrToInt8Ty, nullptr); SelStructPtrTy = llvm::PointerType::getUnqual(SelStructTy); } @@ -2423,7 +2381,7 @@ llvm::Function *CGObjCGNU::ModuleInitFunction() { Elements.push_back(llvm::ConstantArray::get(StaticsArrayTy, ConstantStrings)); llvm::StructType *StaticsListTy = - llvm::StructType::get(PtrToInt8Ty, StaticsArrayTy, NULL); + llvm::StructType::get(PtrToInt8Ty, StaticsArrayTy, nullptr); llvm::Type *StaticsListPtrTy = llvm::PointerType::getUnqual(StaticsListTy); Statics = MakeGlobal(StaticsListTy, Elements, ".objc_statics"); @@ -2441,7 +2399,7 @@ llvm::Function *CGObjCGNU::ModuleInitFunction() { llvm::StructType *SymTabTy = llvm::StructType::get(LongTy, SelStructPtrTy, llvm::Type::getInt16Ty(VMContext), llvm::Type::getInt16Ty(VMContext), - ClassListTy, NULL); + ClassListTy, nullptr); Elements.clear(); // Pointer to an array of selectors used in this module. @@ -2522,7 +2480,7 @@ llvm::Function *CGObjCGNU::ModuleInitFunction() { // constants llvm::StructType * ModuleTy = llvm::StructType::get(LongTy, LongTy, PtrToInt8Ty, llvm::PointerType::getUnqual(SymTabTy), - (RuntimeVersion >= 10) ? IntTy : NULL, NULL); + (RuntimeVersion >= 10) ? IntTy : nullptr, nullptr); Elements.clear(); // Runtime version, used for ABI compatibility checking. Elements.push_back(llvm::ConstantInt::get(LongTy, RuntimeVersion)); @@ -2595,7 +2553,7 @@ llvm::Function *CGObjCGNU::ModuleInitFunction() { llvm::Constant::getNullValue(RegisterAlias->getType())); Builder.CreateCondBr(HasRegisterAlias, AliasBB, NoAliasBB); - // The true branch (has alias registration fucntion): + // The true branch (has alias registration function): Builder.SetInsertPoint(AliasBB); // Emit alias registration calls: for (std::vector<ClassAliasPair>::iterator iter = ClassAliases.begin(); @@ -2603,7 +2561,7 @@ llvm::Function *CGObjCGNU::ModuleInitFunction() { llvm::Constant *TheClass = TheModule.getGlobalVariable(("_OBJC_CLASS_" + iter->first).c_str(), true); - if (0 != TheClass) { + if (TheClass) { TheClass = llvm::ConstantExpr::getBitCast(TheClass, PtrTy); Builder.CreateCall2(RegisterAlias, TheClass, MakeConstantString(iter->second)); @@ -2653,7 +2611,7 @@ llvm::Constant *CGObjCGNU::GetPropertySetFunction() { llvm::Constant *CGObjCGNU::GetOptimizedPropertySetFunction(bool atomic, bool copy) { - return 0; + return nullptr; } llvm::Constant *CGObjCGNU::GetGetStructFunction() { @@ -2663,10 +2621,10 @@ llvm::Constant *CGObjCGNU::GetSetStructFunction() { return SetStructPropertyFn; } llvm::Constant *CGObjCGNU::GetCppAtomicObjectGetFunction() { - return 0; + return nullptr; } llvm::Constant *CGObjCGNU::GetCppAtomicObjectSetFunction() { - return 0; + return nullptr; } llvm::Constant *CGObjCGNU::EnumerationMutationFunction() { @@ -2814,7 +2772,7 @@ llvm::GlobalVariable *CGObjCGNU::ObjCIvarOffsetVariable( } else { IvarOffsetPointer = new llvm::GlobalVariable(TheModule, llvm::Type::getInt32PtrTy(VMContext), false, - llvm::GlobalValue::ExternalLinkage, 0, Name); + llvm::GlobalValue::ExternalLinkage, nullptr, Name); } } return IvarOffsetPointer; @@ -2844,7 +2802,7 @@ static const ObjCInterfaceDecl *FindIvarInterface(ASTContext &Context, if (const ObjCInterfaceDecl *Super = OID->getSuperClass()) return FindIvarInterface(Context, Super, OIVD); - return 0; + return nullptr; } llvm::Value *CGObjCGNU::EmitIvarOffset(CodeGenFunction &CGF, |