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/CGObjCGNU.cpp b/lib/CodeGen/CGObjCGNU.cpp
index 4c678c9..7257f8d 100644
--- a/lib/CodeGen/CGObjCGNU.cpp
+++ b/lib/CodeGen/CGObjCGNU.cpp
@@ -101,13 +101,13 @@
                                            unsigned ArgC);
   virtual llvm::Value *GenerateMessageSendSuper(llvm::IRBuilder<> &Builder,
                                                 const llvm::Type *ReturnTy,
-                                                const char *SuperClassName,
+                                            const ObjCInterfaceDecl *SuperClass,
                                                 llvm::Value *Receiver,
                                                 Selector Sel,
                                                 llvm::Value** ArgV,
                                                 unsigned ArgC);
-  virtual llvm::Value *LookupClass(llvm::IRBuilder<> &Builder,
-                                   llvm::Value *ClassName);
+  virtual llvm::Value *GetClass(llvm::IRBuilder<> &Builder,
+                                const ObjCInterfaceDecl *OID);
   virtual llvm::Value *GetSelector(llvm::IRBuilder<> &Builder, Selector Sel);
   
   virtual llvm::Function *GenerateMethod(const ObjCMethodDecl *OMD);
@@ -170,8 +170,11 @@
 }
 // This has to perform the lookup every time, since posing and related
 // techniques can modify the name -> class mapping.
-llvm::Value *CGObjCGNU::LookupClass(llvm::IRBuilder<> &Builder,
-    llvm::Value *ClassName) {
+llvm::Value *CGObjCGNU::GetClass(llvm::IRBuilder<> &Builder,
+                                 const ObjCInterfaceDecl *OID) {
+  llvm::Value *ClassName = CGM.GetAddrOfConstantCString(OID->getName());
+  ClassName = Builder.CreateStructGEP(ClassName, 0);
+
   llvm::Constant *ClassLookupFn =
     TheModule.getOrInsertFunction("objc_lookup_class", IdTy, PtrToInt8Ty,
         NULL);
@@ -235,14 +238,13 @@
 ///should be called.
 llvm::Value *CGObjCGNU::GenerateMessageSendSuper(llvm::IRBuilder<> &Builder,
                                                  const llvm::Type *ReturnTy,
-                                                 const char *SuperClassName,
+                                            const ObjCInterfaceDecl *SuperClass,
                                                  llvm::Value *Receiver,
                                                  Selector Sel,
                                                  llvm::Value** ArgV,
                                                  unsigned ArgC) {
   // TODO: This should be cached, not looked up every time.
-  llvm::Value *ReceiverClass = LookupClass(Builder,
-      MakeConstantString(SuperClassName));
+  llvm::Value *ReceiverClass = GetClass(Builder, SuperClass);
   llvm::Value *cmd = GetSelector(Builder, Sel);
   std::vector<const llvm::Type*> impArgTypes;
   impArgTypes.push_back(Receiver->getType());