diff options
Diffstat (limited to 'clang/lib/CodeGen')
-rw-r--r-- | clang/lib/CodeGen/CGExpr.cpp | 2 | ||||
-rw-r--r-- | clang/lib/CodeGen/CGExprConstant.cpp | 2 | ||||
-rw-r--r-- | clang/lib/CodeGen/CGExprScalar.cpp | 4 | ||||
-rw-r--r-- | clang/lib/CodeGen/CGObjC.cpp | 14 | ||||
-rw-r--r-- | clang/lib/CodeGen/CodeGenModule.cpp | 21 | ||||
-rw-r--r-- | clang/lib/CodeGen/CodeGenModule.h | 12 |
6 files changed, 35 insertions, 20 deletions
diff --git a/clang/lib/CodeGen/CGExpr.cpp b/clang/lib/CodeGen/CGExpr.cpp index 68878a2e511..89f552225c1 100644 --- a/clang/lib/CodeGen/CGExpr.cpp +++ b/clang/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/clang/lib/CodeGen/CGExprConstant.cpp b/clang/lib/CodeGen/CGExprConstant.cpp index b1f7c5161d7..5865f215223 100644 --- a/clang/lib/CodeGen/CGExprConstant.cpp +++ b/clang/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/clang/lib/CodeGen/CGExprScalar.cpp b/clang/lib/CodeGen/CGExprScalar.cpp index 63b8efc5dcb..2bd39c1bd6b 100644 --- a/clang/lib/CodeGen/CGExprScalar.cpp +++ b/clang/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/clang/lib/CodeGen/CGObjC.cpp b/clang/lib/CodeGen/CGObjC.cpp index d1545a2d359..e152488bfae 100644 --- a/clang/lib/CodeGen/CGObjC.cpp +++ b/clang/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<PredefinedExpr>(E->getReceiver())) { assert(PDE->getIdentType() == PredefinedExpr::ObjCSuper); @@ -89,12 +89,12 @@ llvm::Value *CodeGenFunction::EmitObjCMessageExpr(const ObjCMessageExpr *E) { const ObjCMethodDecl *OMD = cast<ObjCMethodDecl>(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/clang/lib/CodeGen/CodeGenModule.cpp b/clang/lib/CodeGen/CodeGenModule.cpp index b3e721308d6..347f4d24f90 100644 --- a/clang/lib/CodeGen/CodeGenModule.cpp +++ b/clang/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/clang/lib/CodeGen/CodeGenModule.h b/clang/lib/CodeGen/CodeGenModule.h index bd45f6580f0..0b313c42052 100644 --- a/clang/lib/CodeGen/CodeGenModule.h +++ b/clang/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; } |