diff options
Diffstat (limited to 'lib/CodeGen')
-rw-r--r-- | lib/CodeGen/CGObjC.cpp | 5 | ||||
-rw-r--r-- | lib/CodeGen/CGObjCGNU.cpp | 4 | ||||
-rw-r--r-- | lib/CodeGen/CGObjCMac.cpp | 44 | ||||
-rw-r--r-- | lib/CodeGen/CGObjCRuntime.h | 11 |
4 files changed, 17 insertions, 47 deletions
diff --git a/lib/CodeGen/CGObjC.cpp b/lib/CodeGen/CGObjC.cpp index 6a8fe3c4f9..7270884572 100644 --- a/lib/CodeGen/CGObjC.cpp +++ b/lib/CodeGen/CGObjC.cpp @@ -61,7 +61,7 @@ llvm::Value *CodeGenFunction::EmitObjCMessageExpr(const ObjCMessageExpr *E) { isSuperMessage = true; Receiver = LoadObjCSelf(); } else { - Receiver = EmitScalarExpr(E->getReceiver()); + Receiver = EmitScalarExpr(E->getReceiver()); } // Process the arguments @@ -91,12 +91,11 @@ llvm::Value *CodeGenFunction::EmitObjCMessageExpr(const ObjCMessageExpr *E) { const char *SuperClass = OMD->getClassInterface()->getSuperClass()->getName(); return Runtime.GenerateMessageSendSuper(Builder, ConvertType(E->getType()), - Receiver, SuperClass, + SuperClass, Receiver, E->getSelector(), &Args[0], Args.size()); } return Runtime.GenerateMessageSend(Builder, ConvertType(E->getType()), - LoadObjCSelf(), Receiver, E->getSelector(), &Args[0], Args.size()); } diff --git a/lib/CodeGen/CGObjCGNU.cpp b/lib/CodeGen/CGObjCGNU.cpp index ab896cc675..54aca0c96d 100644 --- a/lib/CodeGen/CGObjCGNU.cpp +++ b/lib/CodeGen/CGObjCGNU.cpp @@ -93,14 +93,12 @@ public: virtual llvm::Constant *GenerateConstantString(const std::string &String); virtual llvm::Value *GenerateMessageSend(llvm::IRBuilder<> &Builder, const llvm::Type *ReturnTy, - llvm::Value *Sender, llvm::Value *Receiver, Selector Sel, llvm::Value** ArgV, unsigned ArgC); virtual llvm::Value *GenerateMessageSendSuper(llvm::IRBuilder<> &Builder, const llvm::Type *ReturnTy, - llvm::Value *Sender, const char *SuperClassName, llvm::Value *Receiver, Selector Sel, @@ -265,7 +263,6 @@ llvm::Constant *CGObjCGNU::GenerateConstantString(const std::string &Str) { ///should be called. llvm::Value *CGObjCGNU::GenerateMessageSendSuper(llvm::IRBuilder<> &Builder, const llvm::Type *ReturnTy, - llvm::Value *Sender, const char *SuperClassName, llvm::Value *Receiver, Selector Sel, @@ -312,7 +309,6 @@ llvm::Value *CGObjCGNU::GenerateMessageSendSuper(llvm::IRBuilder<> &Builder, /// Generate code for a message send expression. llvm::Value *CGObjCGNU::GenerateMessageSend(llvm::IRBuilder<> &Builder, const llvm::Type *ReturnTy, - llvm::Value *Sender, llvm::Value *Receiver, Selector Sel, llvm::Value** ArgV, diff --git a/lib/CodeGen/CGObjCMac.cpp b/lib/CodeGen/CGObjCMac.cpp index f7fe2570c0..85f9860413 100644 --- a/lib/CodeGen/CGObjCMac.cpp +++ b/lib/CodeGen/CGObjCMac.cpp @@ -38,10 +38,10 @@ private: public: const llvm::Type *LongTy; - /// ObjectTy - Opaque type for Objective-C objects - const llvm::Type *ObjectTy, *ObjectPtrTy; - /// SelectorTy - Opaque type for Objective-C selectors - const llvm::Type *SelectorTy, *SelectorPtrTy; + /// ObjectPtrTy - LLVM type for object handles (typeof(id)) + const llvm::Type *ObjectPtrTy; + /// SelectorTy - LLVM type for selector handles (typeof(SEL)) + const llvm::Type *SelectorPtrTy; public: ObjCTypesHelper(CodeGen::CodeGenModule &cgm); @@ -91,7 +91,6 @@ public: virtual llvm::Value *GenerateMessageSend(llvm::IRBuilder<> &Builder, const llvm::Type *ReturnTy, - llvm::Value *Sender, llvm::Value *Receiver, Selector Sel, llvm::Value** ArgV, @@ -99,7 +98,6 @@ public: virtual llvm::Value *GenerateMessageSendSuper(llvm::IRBuilder<> &Builder, const llvm::Type *ReturnTy, - llvm::Value *Sender, const char *SuperClassName, llvm::Value *Receiver, Selector Sel, @@ -247,7 +245,6 @@ llvm::Constant *CGObjCMac::GenerateConstantString(const std::string &String) { /// which class's method should be called. llvm::Value *CGObjCMac::GenerateMessageSendSuper(llvm::IRBuilder<> &Builder, const llvm::Type *ReturnTy, - llvm::Value *Sender, const char *SuperClassName, llvm::Value *Receiver, Selector Sel, @@ -260,24 +257,18 @@ llvm::Value *CGObjCMac::GenerateMessageSendSuper(llvm::IRBuilder<> &Builder, /// Generate code for a message send expression. llvm::Value *CGObjCMac::GenerateMessageSend(llvm::IRBuilder<> &Builder, const llvm::Type *ReturnTy, - llvm::Value *Sender, llvm::Value *Receiver, Selector Sel, llvm::Value** ArgV, - unsigned ArgC) { - if (!Sender) { - llvm::Function *F = ObjCTypes.getMessageSendFn(); - llvm::Value **Args = new llvm::Value*[ArgC+2]; - Args[0] = Builder.CreateBitCast(Receiver, ObjCTypes.ObjectPtrTy, "tmp"); - Args[1] = EmitSelector(Builder, Sel); - std::copy(ArgV, ArgV+ArgC, Args+2); - llvm::CallInst *CI = Builder.CreateCall(F, Args, Args+ArgC+2, "tmp"); - delete[] Args; - return Builder.CreateBitCast(CI, ReturnTy, "tmp"); - } else { - assert(0 && "cannot generate message sends with sender"); - return 0; - } + unsigned ArgC) { + llvm::Function *F = ObjCTypes.getMessageSendFn(); + llvm::Value **Args = new llvm::Value*[ArgC+2]; + Args[0] = Builder.CreateBitCast(Receiver, ObjCTypes.ObjectPtrTy, "tmp"); + Args[1] = EmitSelector(Builder, Sel); + std::copy(ArgV, ArgV+ArgC, Args+2); + llvm::CallInst *CI = Builder.CreateCall(F, Args, Args+ArgC+2, "tmp"); + delete[] Args; + return Builder.CreateBitCast(CI, ReturnTy, "tmp"); } llvm::Value *CGObjCMac::GenerateProtocolRef(llvm::IRBuilder<> &Builder, @@ -453,14 +444,9 @@ ObjCTypesHelper::ObjCTypesHelper(CodeGen::CodeGenModule &cgm) CFConstantStringClassReference(0), MessageSendFn(0), LongTy(CGM.getTypes().ConvertType(CGM.getContext().LongTy)), - // FIXME: We want the types from the front-end. - ObjectTy(llvm::OpaqueType::get()), - ObjectPtrTy(llvm::PointerType::getUnqual(ObjectTy)), - SelectorTy(llvm::OpaqueType::get()), - SelectorPtrTy(llvm::PointerType::getUnqual(SelectorTy)) + ObjectPtrTy(CGM.getTypes().ConvertType(CGM.getContext().getObjCIdType())), + SelectorPtrTy(CGM.getTypes().ConvertType(CGM.getContext().getObjCSelType())) { - CGM.getModule().addTypeName("struct.__objc_object", ObjectTy); - CGM.getModule().addTypeName("struct.__objc_selector", SelectorTy); } ObjCTypesHelper::~ObjCTypesHelper() { diff --git a/lib/CodeGen/CGObjCRuntime.h b/lib/CodeGen/CGObjCRuntime.h index d4f7bb07cd..07301b50dc 100644 --- a/lib/CodeGen/CGObjCRuntime.h +++ b/lib/CodeGen/CGObjCRuntime.h @@ -47,11 +47,6 @@ public: /// Generate an Objective-C message send operation virtual llvm::Value *GenerateMessageSend(BuilderType &Builder, const llvm::Type *ReturnTy, - // FIXME: This should be - // dropped, it is unused - // and generates a spurious - // load. - llvm::Value *Sender, llvm::Value *Receiver, Selector Sel, llvm::Value** ArgV, @@ -87,12 +82,6 @@ public: const llvm::SmallVectorImpl<std::string> &Protocols) =0; virtual llvm::Value *GenerateMessageSendSuper(llvm::IRBuilder<true> &Builder, const llvm::Type *ReturnTy, - // FIXME: This should - // be dropped, it is - // unused and - // generates a - // spurious load. - llvm::Value *Sender, const char *SuperClassName, llvm::Value *Receiver, Selector Sel, |