diff options
author | Daniel Dunbar <daniel@zuster.org> | 2008-08-25 08:19:24 +0000 |
---|---|---|
committer | Daniel Dunbar <daniel@zuster.org> | 2008-08-25 08:19:24 +0000 |
commit | f56f1913e91ad32bed52dd3f6afc26735d336584 (patch) | |
tree | 724b1e90dadde963394942cf8fab5a053375ee8d /lib/CodeGen/CGObjCGNU.cpp | |
parent | 8af9c78c7e5e8165f89c9858baee5e9bb9ec3a89 (diff) |
Fix Obj-C super sends inside class methods.
- NeXT loads the super class at runtime; this required changing the
runtime interface to pass more information down.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@55307 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/CGObjCGNU.cpp')
-rw-r--r-- | lib/CodeGen/CGObjCGNU.cpp | 17 |
1 files changed, 11 insertions, 6 deletions
diff --git a/lib/CodeGen/CGObjCGNU.cpp b/lib/CodeGen/CGObjCGNU.cpp index b64f365832..1b254c0a26 100644 --- a/lib/CodeGen/CGObjCGNU.cpp +++ b/lib/CodeGen/CGObjCGNU.cpp @@ -97,12 +97,14 @@ public: virtual CodeGen::RValue GenerateMessageSend(CodeGen::CodeGenFunction &CGF, const ObjCMessageExpr *E, - llvm::Value *Receiver); + llvm::Value *Receiver, + bool IsClassMessage); virtual CodeGen::RValue GenerateMessageSendSuper(CodeGen::CodeGenFunction &CGF, const ObjCMessageExpr *E, - const ObjCInterfaceDecl *Super, - llvm::Value *Receiver); + const ObjCInterfaceDecl *Class, + llvm::Value *Receiver, + bool IsClassMessage); virtual llvm::Value *GetClass(llvm::IRBuilder<> &Builder, const ObjCInterfaceDecl *OID); virtual llvm::Value *GetSelector(llvm::IRBuilder<> &Builder, Selector Sel); @@ -236,8 +238,10 @@ llvm::Constant *CGObjCGNU::GenerateConstantString(const std::string &Str) { CodeGen::RValue CGObjCGNU::GenerateMessageSendSuper(CodeGen::CodeGenFunction &CGF, const ObjCMessageExpr *E, - const ObjCInterfaceDecl *SuperClass, - llvm::Value *Receiver) { + const ObjCInterfaceDecl *Class, + llvm::Value *Receiver, + bool IsClassMessage) { + const ObjCInterfaceDecl *SuperClass = Class->getSuperClass(); const llvm::Type *ReturnTy = CGM.getTypes().ConvertType(E->getType()); // TODO: This should be cached, not looked up every time. llvm::Value *ReceiverClass = GetClass(CGF.Builder, SuperClass); @@ -280,7 +284,8 @@ CGObjCGNU::GenerateMessageSendSuper(CodeGen::CodeGenFunction &CGF, CodeGen::RValue CGObjCGNU::GenerateMessageSend(CodeGen::CodeGenFunction &CGF, const ObjCMessageExpr *E, - llvm::Value *Receiver) { + llvm::Value *Receiver, + bool IsClassMessage) { const llvm::Type *ReturnTy = CGM.getTypes().ConvertType(E->getType()); llvm::Value *cmd = GetSelector(CGF.Builder, E->getSelector()); |