[cfe-commits] r42452 - in /cfe/trunk: AST/Expr.cpp Lex/IdentifierTable.cpp Parse/ParseObjc.cpp Sema/Sema.h Sema/SemaDecl.cpp Sema/SemaExpr.cpp clang.xcodeproj/project.pbxproj include/clang/AST/ASTContext.h include/clang/AST/Decl.h include/clang/AST/Expr.h include/clang/Lex/IdentifierTable.h include/clang/Lex/Preprocessor.h include/clang/Parse/Action.h include/clang/Parse/Parser.h

Steve Naroff snaroff at apple.com
Fri Oct 5 11:51:31 PDT 2007


On Oct 5, 2007, at 11:49 AM, Fariborz Jahanian wrote:

>
> On Oct 5, 2007, at 11:46 AM, Steve Naroff wrote:
>
>> With the exception of DenseMap, Commit 42643 should address all of
>> your issues below (thanks for the feedback).
>>
>> I will make the DenseMap change separately.
>
> I have already made the change from DenseMap to DenseSet .
>

Thanks!

snaroff

> - fariborz
>
>>
>>
>> snaroff
>>
>> On Oct 3, 2007, at 10:42 PM, Chris Lattner wrote:
>>
>>> On Sep 28, 2007, at 3:22 PM, Steve Naroff wrote:
>>>> Author: snaroff
>>>> Date: Fri Sep 28 17:22:11 2007
>>>> New Revision: 42452
>>>>
>>>> URL: http://llvm.org/viewvc/llvm-project?rev=42452&view=rev
>>>> Log:
>>>>
>>>> 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).
>>>
>>> Very nice Steve!  Some comments:
>>>
>>>> =
>>>> =================================================================== 
>>>> =
>>>> =========
>>>> --- cfe/trunk/include/clang/Lex/IdentifierTable.h (original)
>>>> +++ cfe/trunk/include/clang/Lex/IdentifierTable.h Fri Sep 28
>>>> 17:22:11 2007
>>>> @@ -170,28 +170,24 @@
>>>>   void AddKeywords(const LangOptions &LangOpts);
>>>> };
>>>>
>>>> +/// MultiKeywordSelector - One of these variable length records
>>>> is kept for each
>>>> +/// parsed selector (similar in spirit to IdentifierInfo). We use
>>>> a folding set
>>>> +/// to unique aggregate names (keyword selectors in ObjC  
>>>> parlance).
>>>> +class MultiKeywordSelector : public llvm::FoldingSetNode {
>>>
>>> I don't think there is any reason to export the definition of
>>> MultiKeywordSelector in the header file.  Can you make it just
>>> forward-declared here and suck the definition/implementation into
>>> IdentifierTable.cpp?  Clients should never interact with
>>> MultiKeywordSelector, they should only interact with Selector.
>>>
>>> Ahh, I see you added this later:
>>> /// The only reason it appears in this header is FoldingSet needs
>>> to see it:-(
>>>
>>> Presumably this is because Preprocessor contains:
>>>  /// Selectors - This table contains all the selectors in the
>>> program. Unlike
>>>  /// IdentifierTable above, this table *isn't* populated by the
>>> preprocessor.
>>>  /// It is declared/instantiated here because it's role/lifetime is
>>>  /// conceptually similar the IdentifierTable. In addition, the
>>> current control
>>>  /// flow (in clang::ParseAST()), make it convenient to put here.
>>>  /// FIXME: Make sure the lifetime of Identifiers/Selectors
>>> *isn't* tied to
>>>  /// the lifetime fo the preprocessor.
>>>  llvm::FoldingSet<MultiKeywordSelector> Selectors;
>>>
>>> This declaration is unfortunate for two reasons:
>>> 1. it requires MultiKeywordSelector to be exported out of
>>> IdentifierTable.cpp, and
>>> 2. it requires preprocessor and IdentifierTable.h to #include
>>> FoldingSet.h
>>>
>>> Instead of doing this, I'd suggest adding the following to
>>> IdentifierTable.h:
>>>
>>> class SelectorUniquingTable {
>>>  void *Impl;  // Actually a FoldingSet<MultiKeywordSelector>*
>>>  SelectorUniquingTable(const SelectorUniquingTable&); // DISABLED:
>>> DO NOT IMPLEMENT
>>>  void operator=(const SelectorUniquingTable&); // DISABLED: DO NOT
>>> IMPLEMENT
>>> public:
>>>  SelectorUniquingTable();  // new's the foldingset
>>>  ~SelectorUniquingTable();  // delete's the foldingset
>>>
>>>  Selector getSelector(unsigned nKeys, IdentifierInfo **IIV);
>>>  Selector getUnarySelector(IdentifierInfo *ID);
>>>  Selector getNullarySelector(IdentifierInfo *ID);
>>> };
>>>
>>> With this definition, Parser can contain an instance of
>>> SelectorUniquingTable instead of a folding set, getting rid of the
>>> #include of FoldingSet.h and allowing MultiKeywordSelector to
>>> become private to the .cpp file.
>>>
>>> Another benefit is that stuff like this (from Selector and
>>> MultiKeywordSelector):
>>>> +  friend class Parser; // only the Parser can create these.
>>>
>>> can now befriend the SelectorUniquingTable class instead, fixing a
>>> layering problem (because ideally IdentifierTable will sink into
>>> libbasic).
>>>
>>>
>>>> +  IdentifierInfo *getIdentifierInfoForSlot(unsigned i) {
>>>> +    assert((i < NumArgs) && "getIdentifierInfoForSlot(): illegal
>>>> index");
>>>> +    return keyword_begin()[i];
>>>> +  }
>>>
>>> This method should be const.
>>>
>>> +  friend class llvm::FoldingSet<MultiKeywordSelector>;
>>>
>>> This can go away when it is in the .cpp file, because all the
>>> access can be public.
>>>
>>>> +class Selector {
>>>
>>> The selector class needs a comment above it.
>>>
>>>> +  // Derive the full selector name, placing the result into
>>>> methodBuffer.
>>>> +  // As a convenience, a pointer to the first character is  
>>>> returned.
>>>> +  // Example usage: llvm::SmallString<128> mbuf; Selector->getName
>>>> (mbuf);
>>>> +  char *getName(llvm::SmallVectorImpl<char> &methodBuffer);
>>>
>>> Why is this implemented in ParseObjc.cpp?  It seems like it should
>>> be in IdentifierTable.cpp.
>>>
>>>>
>>>> Modified: cfe/trunk/Sema/SemaDecl.cpp
>>>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/Sema/
>>>> SemaDecl.cpp?rev=42452&r1=42451&r2=42452&view=diff
>>>>
>>>> =================================================================== 
>>>> ==
>>>> =========
>>>> --- cfe/trunk/Sema/SemaDecl.cpp (original)
>>>> +++ cfe/trunk/Sema/SemaDecl.cpp Fri Sep 28 17:22:11 2007
>>>>
>>>> @@ -1206,35 +1206,35 @@
>>>> static void ImplMethodsVsClassMethods(Sema* objSema,
>>>> 				      ObjcImplementationDecl* IMPDecl,
>>>>                                       ObjcInterfaceDecl* IDecl) {
>>>> -  llvm::DenseMap<const SelectorInfo*, char> InsMap;
>>>> +  llvm::DenseMap<void *, char> InsMap;
>>>
>>> Since this code was written, a new llvm::DenseSet was added.  You
>>> should be able to switch this to use DenseSet, which makes it more
>>> obvious what you're doing here.
>>>
>>> Also, instead of using .getAsOpaquePtr(), I think it would make
>>> sense to teach the hash table how to handle Selectors.  It seems
>>> useful to other people and can be added easily to IdentifierInfo.h.
>>>
>>>> =================================================================== 
>>>> ==
>>>> =========
>>>> --- cfe/trunk/include/clang/AST/Expr.h (original)
>>>> +++ cfe/trunk/include/clang/AST/Expr.h Fri Sep 28 17:22:11 2007
>>>> @@ -1100,12 +1101,17 @@
>>>>   Expr *getReceiver() { return SubExprs[RECEIVER]; }
>>>>
>>>>   /// getNumArgs - Return the number of actual arguments to this
>>>> call.
>>>> +  unsigned getNumArgs() const { return SelName.getNumArgs(); }
>>>> +
>>>> +/// getArg - Return the specified argument.
>>>> +  Expr *getArg(unsigned Arg) {
>>>> +    assert(Arg < SelName.getNumArgs() && "Arg access out of
>>>> range!");
>>>> +    return SubExprs[Arg+ARGS_START];
>>>> +  }
>>>
>>> Funky comment indentation.
>>>
>>> Overall, huge leap forward!
>>>
>>> -Chris
>>>
>>
>> _______________________________________________
>> cfe-commits mailing list
>> cfe-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>




More information about the cfe-commits mailing list