diff options
| author | Chris Lattner <sabre@nondot.org> | 2009-01-18 09:39:41 +0000 | 
|---|---|---|
| committer | Chris Lattner <sabre@nondot.org> | 2009-01-18 09:39:41 +0000 | 
| commit | c671e061eb2c48b3966c54405959ed4ab3941c51 (patch) | |
| tree | 0aa0027a823bfb0a2509dda102d548de849dd7b9 /clang/lib | |
| parent | e9e7abb6b8a95a97ab588bb23d26eabc39117e8d (diff) | |
| download | bcm5719-llvm-c671e061eb2c48b3966c54405959ed4ab3941c51.tar.gz bcm5719-llvm-c671e061eb2c48b3966c54405959ed4ab3941c51.zip  | |
Switch MinimalAction from new/delete'ing its TypeNameInfo to 
allocating them from a recycling bump pointer allocator.  This 
reduces malloc/free traffic of parse-noop (but no other mode),
which makes sharking -parse-noop more meaningful.
llvm-svn: 62460
Diffstat (limited to 'clang/lib')
| -rw-r--r-- | clang/lib/Parse/MinimalAction.cpp | 93 | 
1 files changed, 56 insertions, 37 deletions
diff --git a/clang/lib/Parse/MinimalAction.cpp b/clang/lib/Parse/MinimalAction.cpp index c4e7ecc0c37..2b7b335ed44 100644 --- a/clang/lib/Parse/MinimalAction.cpp +++ b/clang/lib/Parse/MinimalAction.cpp @@ -14,42 +14,64 @@  #include "clang/Parse/Parser.h"  #include "clang/Parse/DeclSpec.h"  #include "clang/Parse/Scope.h" +#include "llvm/Support/Allocator.h" +#include "llvm/Support/RecyclingAllocator.h"  using namespace clang;  /// TypeNameInfo - A link exists here for each scope that an identifier is  /// defined. -struct TypeNameInfo { -  TypeNameInfo *Prev; -  bool isTypeName; -   -  TypeNameInfo(bool istypename, TypeNameInfo *prev) { -    isTypeName = istypename; -    Prev = prev; -  } -}; +namespace { +  struct TypeNameInfo { +    TypeNameInfo *Prev; +    bool isTypeName; +     +    TypeNameInfo(bool istypename, TypeNameInfo *prev) { +      isTypeName = istypename; +      Prev = prev; +    } +  }; + +  struct TypeNameInfoTable { +    llvm::RecyclingAllocator<llvm::BumpPtrAllocator, TypeNameInfo> Allocator; +     +    void AddEntry(bool isTypename, IdentifierInfo *II) { +      TypeNameInfo *TI = Allocator.Allocate<TypeNameInfo>(); +      new (TI) TypeNameInfo(1, II->getFETokenInfo<TypeNameInfo>()); +      II->setFETokenInfo(TI); +    } +     +    void DeleteEntry(TypeNameInfo *Entry) { +      Entry->~TypeNameInfo(); +      Allocator.Deallocate(Entry); +    } +  }; +} + +static TypeNameInfoTable *getTable(void *TP) { +  return static_cast<TypeNameInfoTable*>(TP); +}  MinimalAction::MinimalAction(Preprocessor &pp)  -  : Idents(pp.getIdentifierTable()), PP(pp) {} +  : Idents(pp.getIdentifierTable()), PP(pp) { +  TypeNameInfoTablePtr = new TypeNameInfoTable(); +} + +MinimalAction::~MinimalAction() { +  delete getTable(TypeNameInfoTablePtr); +}  void MinimalAction::ActOnTranslationUnitScope(SourceLocation Loc, Scope *S) {    TUScope = S;    if (!PP.getLangOptions().ObjC1) return; -  // recognize the ObjC built-in type identifiers.  -  IdentifierInfo *II; -  TypeNameInfo *TI; -  II = &Idents.get("id"); -  TI = new TypeNameInfo(1, II->getFETokenInfo<TypeNameInfo>()); -  II->setFETokenInfo(TI); -  II = &Idents.get("SEL"); -  TI = new TypeNameInfo(1, II->getFETokenInfo<TypeNameInfo>()); -  II->setFETokenInfo(TI); -  II = &Idents.get("Class"); -  TI = new TypeNameInfo(1, II->getFETokenInfo<TypeNameInfo>()); -  II->setFETokenInfo(TI); -  II = &Idents.get("Protocol"); -  TI = new TypeNameInfo(1, II->getFETokenInfo<TypeNameInfo>()); -  II->setFETokenInfo(TI); + +  TypeNameInfoTable &TNIT = *getTable(TypeNameInfoTablePtr); +   +  // Recognize the ObjC built-in type identifiers as types.  +  TNIT.AddEntry(true, &Idents.get("id")); +  TNIT.AddEntry(true, &Idents.get("SEL")); +  TNIT.AddEntry(true, &Idents.get("Class")); +  TNIT.AddEntry(true, &Idents.get("Protocol"));  }  /// isTypeName - This looks at the IdentifierInfo::FETokenInfo field to @@ -101,9 +123,8 @@ MinimalAction::ActOnDeclarator(Scope *S, Declarator &D, DeclTy *LastInGroup) {    // It does need to handle the uncommon case of shadowing a typedef name with a    // non-typedef name. e.g. { typedef int a; a xx; { int a; } }    if (weCurrentlyHaveTypeInfo || isTypeName) { -    TypeNameInfo *TI = new TypeNameInfo(isTypeName, weCurrentlyHaveTypeInfo); - -    II->setFETokenInfo(TI); +    // Allocate and add the 'TypeNameInfo' "decl". +    getTable(TypeNameInfoTablePtr)->AddEntry(isTypeName, II);      // Remember that this needs to be removed when the scope is popped.      S->AddDecl(II); @@ -121,10 +142,8 @@ MinimalAction::ActOnStartClassInterface(SourceLocation AtInterfaceLoc,                                          unsigned NumProtocols,                                          SourceLocation EndProtoLoc,                                          AttributeList *AttrList) { -  TypeNameInfo *TI = -    new TypeNameInfo(1, ClassName->getFETokenInfo<TypeNameInfo>()); - -  ClassName->setFETokenInfo(TI); +  // Allocate and add the 'TypeNameInfo' "decl". +  getTable(TypeNameInfoTablePtr)->AddEntry(true, ClassName);    return 0;  } @@ -134,10 +153,8 @@ Action::DeclTy *  MinimalAction::ActOnForwardClassDeclaration(SourceLocation AtClassLoc,                                  IdentifierInfo **IdentList, unsigned NumElts) {    for (unsigned i = 0; i != NumElts; ++i) { -    TypeNameInfo *TI = -      new TypeNameInfo(1, IdentList[i]->getFETokenInfo<TypeNameInfo>()); - -    IdentList[i]->setFETokenInfo(TI); +    // Allocate and add the 'TypeNameInfo' "decl". +    getTable(TypeNameInfoTablePtr)->AddEntry(true, IdentList[i]);      // Remember that this needs to be removed when the scope is popped.      TUScope->AddDecl(IdentList[i]); @@ -148,6 +165,8 @@ MinimalAction::ActOnForwardClassDeclaration(SourceLocation AtClassLoc,  /// ActOnPopScope - When a scope is popped, if any typedefs are now  /// out-of-scope, they are removed from the IdentifierInfo::FETokenInfo field.  void MinimalAction::ActOnPopScope(SourceLocation Loc, Scope *S) { +  TypeNameInfoTable &Table = *getTable(TypeNameInfoTablePtr); +      for (Scope::decl_iterator I = S->decl_begin(), E = S->decl_end();         I != E; ++I) {      IdentifierInfo &II = *static_cast<IdentifierInfo*>(*I); @@ -156,7 +175,7 @@ void MinimalAction::ActOnPopScope(SourceLocation Loc, Scope *S) {      if (TI) {        TypeNameInfo *Next = TI->Prev; -      delete TI; +      Table.DeleteEntry(TI);        II.setFETokenInfo(Next);      }  | 

