Change ObjCRuntime::LookupClass -> GetClass, and now takes the
  ObjCInterfaceDecl.

Change ObjCRuntime::GenerateMessageSendSuper to take the
  ObjCInterfaceDecl for the super class, instead of just its name.

Change EmitObjCMessageExpr to make the right runtime calls for super
  sends in class methods (i.e. a super send with the class object as
  the receiver).


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@54833 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/CodeGen/CGObjC.cpp b/lib/CodeGen/CGObjC.cpp
index df3226d..54b4e19 100644
--- a/lib/CodeGen/CGObjC.cpp
+++ b/lib/CodeGen/CGObjC.cpp
@@ -48,13 +48,18 @@
   // 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 @@
   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());
   }