Yesterday I discovered that 78% of all selectors in "Cocoa.h" take 0/1 argument.

This motivated implementing a devious clattner inspired solution:-)

This approach uses a small value "Selector" class to point to an IdentifierInfo for the 0/1 case. For multi-keyword selectors, we instantiate a MultiKeywordSelector object (previously known as SelectorInfo). Now, the incremental cost for selectors is only 24,800 for Cocoa.h! This saves 156,592 bytes, or 86%!! The size reduction is also the result of getting rid of the AST slot, which was not strictly necessary (we will associate a selector with it's method using another table...most likely in Sema).

This change was critical to make now, before we have too many clients.

I still need to add some comments to the Selector class...will likely add later today/tomorrow.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@42452 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/AST/Expr.cpp b/AST/Expr.cpp
index 312d209..40a95c0 100644
--- a/AST/Expr.cpp
+++ b/AST/Expr.cpp
@@ -869,11 +869,11 @@
 }
 
 // constructor for instance messages.
-ObjCMessageExpr::ObjCMessageExpr(Expr *receiver, SelectorInfo *selInfo,
+ObjCMessageExpr::ObjCMessageExpr(Expr *receiver, Selector selInfo,
                 QualType retType, SourceLocation LBrac, SourceLocation RBrac,
                 Expr **ArgExprs)
-  : Expr(ObjCMessageExprClass, retType), Selector(selInfo), ClassName(0) {
-  unsigned numArgs = selInfo->getNumArgs();
+  : Expr(ObjCMessageExprClass, retType), SelName(selInfo), ClassName(0) {
+  unsigned numArgs = selInfo.getNumArgs();
   SubExprs = new Expr*[numArgs+1];
   SubExprs[RECEIVER] = receiver;
   if (numArgs) {
@@ -886,11 +886,11 @@
 
 // constructor for class messages. 
 // FIXME: clsName should be typed to ObjCInterfaceType
-ObjCMessageExpr::ObjCMessageExpr(IdentifierInfo *clsName, SelectorInfo *selInfo,
+ObjCMessageExpr::ObjCMessageExpr(IdentifierInfo *clsName, Selector selInfo,
                 QualType retType, SourceLocation LBrac, SourceLocation RBrac,
                 Expr **ArgExprs)
-  : Expr(ObjCMessageExprClass, retType), Selector(selInfo), ClassName(clsName) {
-  unsigned numArgs = selInfo->getNumArgs();
+  : Expr(ObjCMessageExprClass, retType), SelName(selInfo), ClassName(clsName) {
+  unsigned numArgs = selInfo.getNumArgs();
   SubExprs = new Expr*[numArgs+1];
   SubExprs[RECEIVER] = 0;
   if (numArgs) {
@@ -901,21 +901,6 @@
   RBracloc = RBrac;
 }
 
-// The following 3 methods are defined here (instead of Epxr.h) to avoid
-// importing "IdentifierTable.h" into the header.
-unsigned ObjCMessageExpr::getNumArgs() const { return Selector->getNumArgs(); }
-
-/// getArg - Return the specified argument.
-Expr *ObjCMessageExpr::getArg(unsigned Arg) {
-  assert(Arg < Selector->getNumArgs() && "Arg access out of range!");
-  return SubExprs[Arg+ARGS_START];
-}
-const Expr *ObjCMessageExpr::getArg(unsigned Arg) const {
-  assert(Arg < Selector->getNumArgs() && "Arg access out of range!");
-  return SubExprs[Arg+ARGS_START];
-}
-
-
 //===----------------------------------------------------------------------===//
 //  Child Iterators for iterating over subexpressions/substatements
 //===----------------------------------------------------------------------===//