some cleanups on top of David's patch.  There are still two
remaining open issues I've communicated to him:

1) self can be assigned to, and his patch didn't handle it correctly.
2) CollectObjCIvarTypes is N^2 (because each subclass reprocesses
   all parent class ivars) and flattens classes.  If A derives from B, 
   and both have an int, I'd expect to get { {i32}, i32}, not { i32, i32}.

David, please review.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@48970 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/CodeGen/CGExprScalar.cpp b/lib/CodeGen/CGExprScalar.cpp
index 6c53261..9497ece 100644
--- a/lib/CodeGen/CGExprScalar.cpp
+++ b/lib/CodeGen/CGExprScalar.cpp
@@ -19,7 +19,6 @@
 #include "llvm/GlobalVariable.h"
 #include "llvm/Intrinsics.h"
 #include "llvm/Support/Compiler.h"
-#include "llvm/ValueSymbolTable.h"
 #include <cstdarg>
 
 using namespace clang;
@@ -51,7 +50,6 @@
     Builder(CGF.Builder), 
     Runtime(CGF.CGM.getObjCRuntime()) {
   }
-
   
   //===--------------------------------------------------------------------===//
   //                               Utilities
@@ -127,7 +125,7 @@
     return EmitLoadOfLValue(E);
   }
   Value *VisitObjCMessageExpr(ObjCMessageExpr *E);
-  Value *VisitObjCIvarRefExpr(ObjCIvarRefExpr *E);
+  Value *VisitObjCIvarRefExpr(ObjCIvarRefExpr *E) { return EmitLoadOfLValue(E);}
   Value *VisitArraySubscriptExpr(ArraySubscriptExpr *E);
   Value *VisitMemberExpr(Expr *E)           { return EmitLoadOfLValue(E); }
   Value *VisitOCUVectorElementExpr(Expr *E) { return EmitLoadOfLValue(E); }
@@ -451,22 +449,18 @@
   return llvm::UndefValue::get(CGF.ConvertType(E->getType()));
 }
 
-Value *ScalarExprEmitter::VisitObjCIvarRefExpr(ObjCIvarRefExpr *E) {
-  return Builder.CreateLoad(CGF.EmitObjCIvarRefLValue(E).getAddress());
-}
-
 Value *ScalarExprEmitter::VisitObjCMessageExpr(ObjCMessageExpr *E) {
   // Only the lookup mechanism and first two arguments of the method
   // implementation vary between runtimes.  We can get the receiver and
   // arguments in generic code.
   
   // Find the receiver
-  llvm::Value * Receiver = CGF.EmitScalarExpr(E->getReceiver());
+  llvm::Value *Receiver = CGF.EmitScalarExpr(E->getReceiver());
 
   // Process the arguments
-  unsigned int ArgC = E->getNumArgs();
+  unsigned ArgC = E->getNumArgs();
   llvm::SmallVector<llvm::Value*, 16> Args;
-  for(unsigned i=0 ; i<ArgC ; i++) {
+  for (unsigned i = 0; i != ArgC; ++i) {
     Expr *ArgExpr = E->getArg(i);
     QualType ArgTy = ArgExpr->getType();
     if (!CGF.hasAggregateLLVMType(ArgTy)) {
@@ -489,13 +483,11 @@
   llvm::Constant *Selector = CGF.CGM.GetAddrOfConstantString(SelStr);
 
   llvm::Value *SelPtr = Builder.CreateStructGEP(Selector, 0);
-  return Runtime->generateMessageSend(Builder,
-      ConvertType(E->getType()),
-      CGF.CurFn->getValueSymbolTable().lookup("self"),
-      Receiver,
-      SelPtr,
-      &Args[0],
-      Args.size());
+  return Runtime->generateMessageSend(Builder, ConvertType(E->getType()),
+                                      // FIXME: Self can be assigned to!
+                                      CGF.CurFn->arg_begin(),
+                                      Receiver, SelPtr,
+                                      &Args[0], Args.size());
 }
 
 Value *ScalarExprEmitter::VisitArraySubscriptExpr(ArraySubscriptExpr *E) {