зеркало из https://github.com/microsoft/clang-1.git
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
This commit is contained in:
Родитель
6379a7a153
Коммит
208ff5e8a0
|
@ -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.
|
||||
}
|
||||
|
|
|
@ -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());
|
||||
}
|
||||
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
||||
//===--------------------------------------------------------------------===//
|
||||
|
|
|
@ -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(),
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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; }
|
||||
|
|
Загрузка…
Ссылка в новой задаче