From: Daniel Dunbar Date: Mon, 11 Aug 2008 18:12:00 +0000 (+0000) Subject: Change CodeGenModule to only create ObjC runtime for ObjC files X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=208ff5e8a073de2a5d15cbe03cab8a4c0d935e28;p=clang Change CodeGenModule to only create ObjC runtime for ObjC files - Changed CodeGenModule::getObjCRuntime to return reference. - Added CodeGenModule::hasObjCRuntime predicate. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@54645 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/CGExpr.cpp b/lib/CodeGen/CGExpr.cpp index 68878a2e51..89f552225c 100644 --- a/lib/CodeGen/CGExpr.cpp +++ b/lib/CodeGen/CGExpr.cpp @@ -744,7 +744,7 @@ LValue CodeGenFunction::EmitObjCIvarRefLValue(const ObjCIvarRefExpr *E) { // a class without recompiling all of the subclasses. If this is the case // then the CGObjCRuntime subclass must return true to LateBoundIvars and // implement the lookup itself. - if (CGM.getObjCRuntime()->LateBoundIVars()) { + if (CGM.getObjCRuntime().LateBoundIVars()) { assert(0 && "FIXME: Implement support for late-bound instance variables"); return LValue(); // Not reached. } diff --git a/lib/CodeGen/CGExprConstant.cpp b/lib/CodeGen/CGExprConstant.cpp index b1f7c5161d..5865f21522 100644 --- a/lib/CodeGen/CGExprConstant.cpp +++ b/lib/CodeGen/CGExprConstant.cpp @@ -61,7 +61,7 @@ public: return llvm::ConstantInt::get(ConvertType(E->getType()), E->getValue()); } llvm::Constant *VisitObjCStringLiteral(const ObjCStringLiteral *E) { - return CGM.getObjCRuntime()->GenerateConstantString( + return CGM.getObjCRuntime().GenerateConstantString( E->getString()->getStrData(), E->getString()->getByteLength()); } diff --git a/lib/CodeGen/CGExprScalar.cpp b/lib/CodeGen/CGExprScalar.cpp index 63b8efc5dc..2bd39c1bd6 100644 --- a/lib/CodeGen/CGExprScalar.cpp +++ b/lib/CodeGen/CGExprScalar.cpp @@ -49,7 +49,9 @@ public: ScalarExprEmitter(CodeGenFunction &cgf) : CGF(cgf), Builder(CGF.Builder), - Runtime(CGF.CGM.getObjCRuntime()) { + Runtime(0) { + if (CGF.CGM.hasObjCRuntime()) + Runtime = &CGF.CGM.getObjCRuntime(); } //===--------------------------------------------------------------------===// diff --git a/lib/CodeGen/CGObjC.cpp b/lib/CodeGen/CGObjC.cpp index d1545a2d35..e152488bfa 100644 --- a/lib/CodeGen/CGObjC.cpp +++ b/lib/CodeGen/CGObjC.cpp @@ -21,7 +21,7 @@ using namespace CodeGen; /// Emits an instance of NSConstantString representing the object. llvm::Value *CodeGenFunction::EmitObjCStringLiteral(const ObjCStringLiteral *E){ - return CGM.getObjCRuntime()->GenerateConstantString( + return CGM.getObjCRuntime().GenerateConstantString( E->getString()->getStrData(), E->getString()->getByteLength()); } @@ -31,7 +31,7 @@ llvm::Value *CodeGenFunction::EmitObjCSelectorExpr(const ObjCSelectorExpr *E) { // Note that this implementation allows for non-constant strings to be passed // as arguments to @selector(). Currently, the only thing preventing this // behaviour is the type checking in the front end. - return CGM.getObjCRuntime()->GetSelector(Builder, E->getSelector()); + return CGM.getObjCRuntime().GetSelector(Builder, E->getSelector()); } @@ -41,7 +41,7 @@ llvm::Value *CodeGenFunction::EmitObjCMessageExpr(const ObjCMessageExpr *E) { // implementation vary between runtimes. We can get the receiver and // arguments in generic code. - CGObjCRuntime *Runtime = CGM.getObjCRuntime(); + CGObjCRuntime &Runtime = CGM.getObjCRuntime(); const Expr *ReceiverExpr = E->getReceiver(); bool isSuperMessage = false; // Find the receiver @@ -53,7 +53,7 @@ llvm::Value *CodeGenFunction::EmitObjCMessageExpr(const ObjCMessageExpr *E) { } llvm::Value *ClassName = CGM.GetAddrOfConstantString(classname); ClassName = Builder.CreateStructGEP(ClassName, 0); - Receiver = Runtime->LookupClass(Builder, ClassName); + Receiver = Runtime.LookupClass(Builder, ClassName); } else if (const PredefinedExpr *PDE = dyn_cast(E->getReceiver())) { assert(PDE->getIdentType() == PredefinedExpr::ObjCSuper); @@ -89,12 +89,12 @@ llvm::Value *CodeGenFunction::EmitObjCMessageExpr(const ObjCMessageExpr *E) { const ObjCMethodDecl *OMD = cast(CurFuncDecl); const char *SuperClass = OMD->getClassInterface()->getSuperClass()->getName(); - return Runtime->GenerateMessageSendSuper(Builder, ConvertType(E->getType()), + return Runtime.GenerateMessageSendSuper(Builder, ConvertType(E->getType()), Receiver, SuperClass, Receiver, E->getSelector(), &Args[0], Args.size()); } - return Runtime->GenerateMessageSend(Builder, ConvertType(E->getType()), + return Runtime.GenerateMessageSend(Builder, ConvertType(E->getType()), LoadObjCSelf(), Receiver, E->getSelector(), &Args[0], Args.size()); @@ -119,7 +119,7 @@ void CodeGenFunction::GenerateObjCMethod(const ObjCMethodDecl *OMD) { } const llvm::Type *ReturnTy = CGM.getTypes().ConvertReturnType(OMD->getResultType()); - CurFn = CGM.getObjCRuntime()->MethodPreamble( + CurFn = CGM.getObjCRuntime().MethodPreamble( OMD->getClassInterface()->getName(), CategoryName, OMD->getSelector().getName(), diff --git a/lib/CodeGen/CodeGenModule.cpp b/lib/CodeGen/CodeGenModule.cpp index b3e721308d..347f4d24f9 100644 --- a/lib/CodeGen/CodeGenModule.cpp +++ b/lib/CodeGen/CodeGenModule.cpp @@ -33,13 +33,16 @@ CodeGenModule::CodeGenModule(ASTContext &C, const LangOptions &LO, Diagnostic &diags, bool GenerateDebugInfo, bool UseMacObjCRuntime) : Context(C), Features(LO), TheModule(M), TheTargetData(TD), Diags(diags), - Types(C, M, TD), MemCpyFn(0), MemMoveFn(0), MemSetFn(0), + Types(C, M, TD), Runtime(0), MemCpyFn(0), MemMoveFn(0), MemSetFn(0), CFConstantStringClassRef(0) { - //TODO: Make this selectable at runtime - if (UseMacObjCRuntime) { - Runtime = CreateMacObjCRuntime(*this); - } else { - Runtime = CreateGNUObjCRuntime(*this); + + if (Features.ObjC1) { + // TODO: Make this selectable at runtime + if (UseMacObjCRuntime) { + Runtime = CreateMacObjCRuntime(*this); + } else { + Runtime = CreateGNUObjCRuntime(*this); + } } // If debug info generation is enabled, create the CGDebugInfo object. @@ -53,9 +56,9 @@ CodeGenModule::~CodeGenModule() { void CodeGenModule::Release() { EmitStatics(); - llvm::Function *ObjCInitFunction = Runtime->ModuleInitFunction(); - if (ObjCInitFunction) - AddGlobalCtor(ObjCInitFunction); + if (Runtime) + if (llvm::Function *ObjCInitFunction = Runtime->ModuleInitFunction()) + AddGlobalCtor(ObjCInitFunction); EmitCtorList(GlobalCtors, "llvm.global_ctors"); EmitCtorList(GlobalDtors, "llvm.global_dtors"); EmitAnnotations(); diff --git a/lib/CodeGen/CodeGenModule.h b/lib/CodeGen/CodeGenModule.h index bd45f6580f..0b313c4205 100644 --- a/lib/CodeGen/CodeGenModule.h +++ b/lib/CodeGen/CodeGenModule.h @@ -111,8 +111,18 @@ public: /// Release - Finalize LLVM code generation. void Release(); + + /// getObjCRuntime() - Return a reference to the configured + /// Objective-C runtime. + CGObjCRuntime &getObjCRuntime() { + assert(Runtime && "No Objective-C runtime has been configured."); + return *Runtime; + } - CGObjCRuntime *getObjCRuntime() { return Runtime; } + /// hasObjCRuntime() - Return true iff an Objective-C runtime has + /// been configured. + bool hasObjCRuntime() { return !!Runtime; } + CGDebugInfo *getDebugInfo() { return DebugInfo; } ASTContext &getContext() const { return Context; } const LangOptions &getLangOptions() const { return Features; }