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
//===----------------------------------------------------------------------===//