summaryrefslogtreecommitdiffstats
path: root/clang/lib/CodeGen/CGObjC.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'clang/lib/CodeGen/CGObjC.cpp')
-rw-r--r--clang/lib/CodeGen/CGObjC.cpp21
1 files changed, 12 insertions, 9 deletions
diff --git a/clang/lib/CodeGen/CGObjC.cpp b/clang/lib/CodeGen/CGObjC.cpp
index df3226d128a..54b4e19c572 100644
--- a/clang/lib/CodeGen/CGObjC.cpp
+++ b/clang/lib/CodeGen/CGObjC.cpp
@@ -48,13 +48,18 @@ llvm::Value *CodeGenFunction::EmitObjCMessageExpr(const ObjCMessageExpr *E) {
// Find the receiver
llvm::Value *Receiver;
if (!ReceiverExpr) {
- const char * classname = E->getClassName()->getName();
- if (!strcmp(classname, "super")) {
- classname = E->getMethodDecl()->getClassInterface()->getName();
+ const ObjCInterfaceDecl *OID = E->getClassInfo().first;
+
+ // Very special case, super send in class method. The receiver is
+ // self (the class object) and the send uses super semantics.
+ if (!OID) {
+ assert(!strcmp(E->getClassName()->getName(), "super") &&
+ "Unexpected missing class interface in message send.");
+ OID = E->getMethodDecl()->getClassInterface();
+ isSuperMessage = true;
}
- llvm::Value *ClassName = CGM.GetAddrOfConstantCString(classname);
- ClassName = Builder.CreateStructGEP(ClassName, 0);
- Receiver = Runtime.LookupClass(Builder, ClassName);
+
+ Receiver = Runtime.GetClass(Builder, OID);
} else if (const PredefinedExpr *PDE =
dyn_cast<PredefinedExpr>(E->getReceiver())) {
assert(PDE->getIdentType() == PredefinedExpr::ObjCSuper);
@@ -88,10 +93,8 @@ llvm::Value *CodeGenFunction::EmitObjCMessageExpr(const ObjCMessageExpr *E) {
if (isSuperMessage) {
// super is only valid in an Objective-C method
const ObjCMethodDecl *OMD = cast<ObjCMethodDecl>(CurFuncDecl);
- const char *SuperClass =
- OMD->getClassInterface()->getSuperClass()->getName();
return Runtime.GenerateMessageSendSuper(Builder, ConvertType(E->getType()),
- SuperClass,
+ OMD->getClassInterface()->getSuperClass(),
Receiver, E->getSelector(),
&Args[0], Args.size());
}
OpenPOWER on IntegriCloud