DeclBase.cpp revision 01e6779faca1e3a3164c697d6e2dfee0881a6981
156d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman//===--- DeclBase.cpp - Declaration AST Node Implementation ---------------===//
256d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman//
356d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman//                     The LLVM Compiler Infrastructure
456d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman//
556d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman// This file is distributed under the University of Illinois Open Source
656d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman// License. See LICENSE.TXT for details.
756d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman//
856d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman//===----------------------------------------------------------------------===//
956d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman//
1056d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman// This file implements the Decl and DeclContext classes.
1156d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman//
1256d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman//===----------------------------------------------------------------------===//
1356d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman
1456d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman#include "clang/AST/DeclBase.h"
15e91593ef084479340582b2ba177b44be50a717b7Daniel Dunbar#include "clang/AST/DeclObjC.h"
16d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidis#include "clang/AST/DeclCXX.h"
1756d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman#include "clang/AST/ASTContext.h"
1856d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman#include "llvm/ADT/DenseMap.h"
1956d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedmanusing namespace clang;
2056d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman
2156d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman//===----------------------------------------------------------------------===//
2256d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman//  Statistics
2356d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman//===----------------------------------------------------------------------===//
2456d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman
2556d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman// temporary statistics gathering
2656d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedmanstatic unsigned nFuncs = 0;
2756d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedmanstatic unsigned nVars = 0;
2856d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedmanstatic unsigned nParmVars = 0;
2956d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedmanstatic unsigned nSUC = 0;
3055d71f9f4cf5f123db5d6dcfd20f3a8d5699c226Argyrios Kyrtzidisstatic unsigned nCXXSUC = 0;
3156d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedmanstatic unsigned nEnumConst = 0;
3256d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedmanstatic unsigned nEnumDecls = 0;
3356d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedmanstatic unsigned nNamespaces = 0;
3456d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedmanstatic unsigned nTypedef = 0;
3556d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedmanstatic unsigned nFieldDecls = 0;
3655d71f9f4cf5f123db5d6dcfd20f3a8d5699c226Argyrios Kyrtzidisstatic unsigned nCXXFieldDecls = 0;
3756d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedmanstatic unsigned nInterfaceDecls = 0;
3856d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedmanstatic unsigned nClassDecls = 0;
3956d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedmanstatic unsigned nMethodDecls = 0;
4056d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedmanstatic unsigned nProtocolDecls = 0;
4156d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedmanstatic unsigned nForwardProtocolDecls = 0;
4256d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedmanstatic unsigned nCategoryDecls = 0;
4356d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedmanstatic unsigned nIvarDecls = 0;
4401e6779faca1e3a3164c697d6e2dfee0881a6981Ted Kremenekstatic unsigned nAtDefsFieldDecls = 0;
4556d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedmanstatic unsigned nObjCImplementationDecls = 0;
4656d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedmanstatic unsigned nObjCCategoryImpl = 0;
4756d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedmanstatic unsigned nObjCCompatibleAlias = 0;
4856d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedmanstatic unsigned nObjCPropertyDecl = 0;
4956d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedmanstatic unsigned nObjCPropertyImplDecl = 0;
5056d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedmanstatic unsigned nLinkageSpecDecl = 0;
5156d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedmanstatic unsigned nFileScopeAsmDecl = 0;
5256d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman
5356d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedmanstatic bool StatSwitch = false;
5456d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman
5556d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman// This keeps track of all decl attributes. Since so few decls have attrs, we
5656d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman// keep them in a hash map instead of wasting space in the Decl class.
5756d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedmantypedef llvm::DenseMap<const Decl*, Attr*> DeclAttrMapTy;
5856d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman
5956d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedmanstatic DeclAttrMapTy *DeclAttrs = 0;
6056d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman
6156d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedmanconst char *Decl::getDeclKindName() const {
6256d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  switch (DeclKind) {
6356d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  default: assert(0 && "Unknown decl kind!");
6456d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  case Namespace:           return "Namespace";
6556d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  case Typedef:             return "Typedef";
6656d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  case Function:            return "Function";
6756d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  case Var:                 return "Var";
6856d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  case ParmVar:             return "ParmVar";
6956d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  case EnumConstant:        return "EnumConstant";
7056d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  case ObjCIvar:            return "ObjCIvar";
7156d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  case ObjCInterface:       return "ObjCInterface";
7256d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  case ObjCClass:           return "ObjCClass";
7356d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  case ObjCMethod:          return "ObjCMethod";
7456d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  case ObjCProtocol:        return "ObjCProtocol";
7556d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  case ObjCForwardProtocol: return "ObjCForwardProtocol";
7656d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  case Struct:              return "Struct";
7756d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  case Union:               return "Union";
7856d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  case Class:               return "Class";
7956d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  case Enum:                return "Enum";
8056d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  }
8156d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman}
8256d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman
8356d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedmanbool Decl::CollectingStats(bool Enable) {
8456d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  if (Enable)
8556d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman    StatSwitch = true;
8656d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  return StatSwitch;
8756d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman}
8856d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman
8956d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedmanvoid Decl::PrintStats() {
9056d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  fprintf(stderr, "*** Decl Stats:\n");
9156d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  fprintf(stderr, "  %d decls total.\n",
9255d71f9f4cf5f123db5d6dcfd20f3a8d5699c226Argyrios Kyrtzidis          int(nFuncs+nVars+nParmVars+nFieldDecls+nSUC+nCXXFieldDecls+nCXXSUC+
9356d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman              nEnumDecls+nEnumConst+nTypedef+nInterfaceDecls+nClassDecls+
9456d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman              nMethodDecls+nProtocolDecls+nCategoryDecls+nIvarDecls+
9501e6779faca1e3a3164c697d6e2dfee0881a6981Ted Kremenek              nAtDefsFieldDecls+nNamespaces));
9656d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  fprintf(stderr, "    %d namespace decls, %d each (%d bytes)\n",
9756d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman          nNamespaces, (int)sizeof(NamespaceDecl),
9856d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman          int(nNamespaces*sizeof(NamespaceDecl)));
9956d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  fprintf(stderr, "    %d function decls, %d each (%d bytes)\n",
10056d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman          nFuncs, (int)sizeof(FunctionDecl), int(nFuncs*sizeof(FunctionDecl)));
10156d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  fprintf(stderr, "    %d variable decls, %d each (%d bytes)\n",
10256d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman          nVars, (int)sizeof(VarDecl),
10356d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman          int(nVars*sizeof(VarDecl)));
10456d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  fprintf(stderr, "    %d parameter variable decls, %d each (%d bytes)\n",
10556d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman          nParmVars, (int)sizeof(ParmVarDecl),
10656d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman          int(nParmVars*sizeof(ParmVarDecl)));
10756d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  fprintf(stderr, "    %d field decls, %d each (%d bytes)\n",
10856d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman          nFieldDecls, (int)sizeof(FieldDecl),
10956d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman          int(nFieldDecls*sizeof(FieldDecl)));
11001e6779faca1e3a3164c697d6e2dfee0881a6981Ted Kremenek  fprintf(stderr, "    %d @defs generated field decls, %d each (%d bytes)\n",
11101e6779faca1e3a3164c697d6e2dfee0881a6981Ted Kremenek          nAtDefsFieldDecls, (int)sizeof(ObjCAtDefsFieldDecl),
11201e6779faca1e3a3164c697d6e2dfee0881a6981Ted Kremenek          int(nAtDefsFieldDecls*sizeof(ObjCAtDefsFieldDecl)));
11356d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  fprintf(stderr, "    %d struct/union/class decls, %d each (%d bytes)\n",
11456d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman          nSUC, (int)sizeof(RecordDecl),
11556d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman          int(nSUC*sizeof(RecordDecl)));
11655d71f9f4cf5f123db5d6dcfd20f3a8d5699c226Argyrios Kyrtzidis  fprintf(stderr, "    %d C++ field decls, %d each (%d bytes)\n",
11755d71f9f4cf5f123db5d6dcfd20f3a8d5699c226Argyrios Kyrtzidis          nCXXFieldDecls, (int)sizeof(CXXFieldDecl),
11855d71f9f4cf5f123db5d6dcfd20f3a8d5699c226Argyrios Kyrtzidis          int(nCXXFieldDecls*sizeof(CXXFieldDecl)));
11955d71f9f4cf5f123db5d6dcfd20f3a8d5699c226Argyrios Kyrtzidis  fprintf(stderr, "    %d C++ struct/union/class decls, %d each (%d bytes)\n",
12055d71f9f4cf5f123db5d6dcfd20f3a8d5699c226Argyrios Kyrtzidis          nCXXSUC, (int)sizeof(CXXRecordDecl),
12155d71f9f4cf5f123db5d6dcfd20f3a8d5699c226Argyrios Kyrtzidis          int(nCXXSUC*sizeof(CXXRecordDecl)));
12256d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  fprintf(stderr, "    %d enum decls, %d each (%d bytes)\n",
12356d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman          nEnumDecls, (int)sizeof(EnumDecl),
12456d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman          int(nEnumDecls*sizeof(EnumDecl)));
12556d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  fprintf(stderr, "    %d enum constant decls, %d each (%d bytes)\n",
12656d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman          nEnumConst, (int)sizeof(EnumConstantDecl),
12756d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman          int(nEnumConst*sizeof(EnumConstantDecl)));
12856d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  fprintf(stderr, "    %d typedef decls, %d each (%d bytes)\n",
12956d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman          nTypedef, (int)sizeof(TypedefDecl),int(nTypedef*sizeof(TypedefDecl)));
13056d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  // Objective-C decls...
13156d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  fprintf(stderr, "    %d interface decls, %d each (%d bytes)\n",
13256d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman          nInterfaceDecls, (int)sizeof(ObjCInterfaceDecl),
13356d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman          int(nInterfaceDecls*sizeof(ObjCInterfaceDecl)));
13456d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  fprintf(stderr, "    %d instance variable decls, %d each (%d bytes)\n",
13556d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman          nIvarDecls, (int)sizeof(ObjCIvarDecl),
13656d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman          int(nIvarDecls*sizeof(ObjCIvarDecl)));
13756d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  fprintf(stderr, "    %d class decls, %d each (%d bytes)\n",
13856d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman          nClassDecls, (int)sizeof(ObjCClassDecl),
13956d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman          int(nClassDecls*sizeof(ObjCClassDecl)));
14056d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  fprintf(stderr, "    %d method decls, %d each (%d bytes)\n",
14156d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman          nMethodDecls, (int)sizeof(ObjCMethodDecl),
14256d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman          int(nMethodDecls*sizeof(ObjCMethodDecl)));
14356d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  fprintf(stderr, "    %d protocol decls, %d each (%d bytes)\n",
14456d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman          nProtocolDecls, (int)sizeof(ObjCProtocolDecl),
14556d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman          int(nProtocolDecls*sizeof(ObjCProtocolDecl)));
14656d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  fprintf(stderr, "    %d forward protocol decls, %d each (%d bytes)\n",
14756d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman          nForwardProtocolDecls, (int)sizeof(ObjCForwardProtocolDecl),
14856d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman          int(nForwardProtocolDecls*sizeof(ObjCForwardProtocolDecl)));
14956d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  fprintf(stderr, "    %d category decls, %d each (%d bytes)\n",
15056d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman          nCategoryDecls, (int)sizeof(ObjCCategoryDecl),
15156d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman          int(nCategoryDecls*sizeof(ObjCCategoryDecl)));
15256d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman
15356d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  fprintf(stderr, "    %d class implementation decls, %d each (%d bytes)\n",
15456d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman          nObjCImplementationDecls, (int)sizeof(ObjCImplementationDecl),
15556d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman          int(nObjCImplementationDecls*sizeof(ObjCImplementationDecl)));
15656d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman
15756d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  fprintf(stderr, "    %d class implementation decls, %d each (%d bytes)\n",
15856d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman          nObjCCategoryImpl, (int)sizeof(ObjCCategoryImplDecl),
15956d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman          int(nObjCCategoryImpl*sizeof(ObjCCategoryImplDecl)));
16056d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman
16156d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  fprintf(stderr, "    %d compatibility alias decls, %d each (%d bytes)\n",
16256d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman          nObjCCompatibleAlias, (int)sizeof(ObjCCompatibleAliasDecl),
16356d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman          int(nObjCCompatibleAlias*sizeof(ObjCCompatibleAliasDecl)));
16456d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman
16556d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  fprintf(stderr, "    %d property decls, %d each (%d bytes)\n",
16656d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman          nObjCPropertyDecl, (int)sizeof(ObjCPropertyDecl),
16756d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman          int(nObjCPropertyDecl*sizeof(ObjCPropertyDecl)));
16856d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman
16956d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  fprintf(stderr, "    %d property implementation decls, %d each (%d bytes)\n",
17056d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman          nObjCPropertyImplDecl, (int)sizeof(ObjCPropertyImplDecl),
17156d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman          int(nObjCPropertyImplDecl*sizeof(ObjCPropertyImplDecl)));
17256d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman
17356d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  fprintf(stderr, "Total bytes = %d\n",
17456d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman          int(nFuncs*sizeof(FunctionDecl)+
17556d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman              nVars*sizeof(VarDecl)+nParmVars*sizeof(ParmVarDecl)+
17656d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman              nFieldDecls*sizeof(FieldDecl)+nSUC*sizeof(RecordDecl)+
17755d71f9f4cf5f123db5d6dcfd20f3a8d5699c226Argyrios Kyrtzidis              nCXXFieldDecls*sizeof(CXXFieldDecl)+nCXXSUC*sizeof(CXXRecordDecl)+
17856d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman              nEnumDecls*sizeof(EnumDecl)+nEnumConst*sizeof(EnumConstantDecl)+
17956d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman              nTypedef*sizeof(TypedefDecl)+
18056d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman              nInterfaceDecls*sizeof(ObjCInterfaceDecl)+
18156d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman              nIvarDecls*sizeof(ObjCIvarDecl)+
18256d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman              nClassDecls*sizeof(ObjCClassDecl)+
18356d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman              nMethodDecls*sizeof(ObjCMethodDecl)+
18456d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman              nProtocolDecls*sizeof(ObjCProtocolDecl)+
18556d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman              nForwardProtocolDecls*sizeof(ObjCForwardProtocolDecl)+
18656d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman              nCategoryDecls*sizeof(ObjCCategoryDecl)+
18756d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman              nObjCImplementationDecls*sizeof(ObjCImplementationDecl)+
18856d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman              nObjCCategoryImpl*sizeof(ObjCCategoryImplDecl)+
18956d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman              nObjCCompatibleAlias*sizeof(ObjCCompatibleAliasDecl)+
19056d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman              nObjCPropertyDecl*sizeof(ObjCPropertyDecl)+
19156d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman              nObjCPropertyImplDecl*sizeof(ObjCPropertyImplDecl)+
19256d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman              nLinkageSpecDecl*sizeof(LinkageSpecDecl)+
19356d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman              nFileScopeAsmDecl*sizeof(FileScopeAsmDecl)+
19456d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman              nNamespaces*sizeof(NamespaceDecl)));
19556d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman
19656d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman}
19756d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman
19856d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedmanvoid Decl::addDeclKind(Kind k) {
19956d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  switch (k) {
20056d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  case Namespace:           nNamespaces++; break;
20156d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  case Typedef:             nTypedef++; break;
20256d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  case Function:            nFuncs++; break;
20356d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  case Var:                 nVars++; break;
20456d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  case ParmVar:             nParmVars++; break;
20556d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  case EnumConstant:        nEnumConst++; break;
20656d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  case Field:               nFieldDecls++; break;
20756d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  case Struct: case Union: case Class: nSUC++; break;
20856d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  case Enum:                nEnumDecls++; break;
20956d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  case ObjCInterface:       nInterfaceDecls++; break;
21056d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  case ObjCClass:           nClassDecls++; break;
21156d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  case ObjCMethod:          nMethodDecls++; break;
21256d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  case ObjCProtocol:        nProtocolDecls++; break;
21356d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  case ObjCForwardProtocol: nForwardProtocolDecls++; break;
21456d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  case ObjCCategory:        nCategoryDecls++; break;
21556d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  case ObjCIvar:            nIvarDecls++; break;
21601e6779faca1e3a3164c697d6e2dfee0881a6981Ted Kremenek  case ObjCAtDefsField:     nAtDefsFieldDecls++; break;
21756d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  case ObjCImplementation:  nObjCImplementationDecls++; break;
21856d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  case ObjCCategoryImpl:    nObjCCategoryImpl++; break;
21956d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  case ObjCCompatibleAlias: nObjCCompatibleAlias++; break;
22056d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  case ObjCProperty:        nObjCPropertyDecl++; break;
22156d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  case ObjCPropertyImpl:    nObjCPropertyImplDecl++; break;
22256d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  case LinkageSpec:         nLinkageSpecDecl++; break;
22356d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  case FileScopeAsm:        nFileScopeAsmDecl++; break;
2244111024be81e7c0525e42dadcc126d27e5bf2425Chris Lattner  case ImplicitParam:
22556d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  case TranslationUnit:     break;
226d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidis
22755d71f9f4cf5f123db5d6dcfd20f3a8d5699c226Argyrios Kyrtzidis  case CXXField:            nCXXFieldDecls++; break;
22855d71f9f4cf5f123db5d6dcfd20f3a8d5699c226Argyrios Kyrtzidis  case CXXStruct: case CXXUnion: case CXXClass: nCXXSUC++; break;
229d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidis  // FIXME: Statistics for C++ decls.
230d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidis  case CXXMethod:
231d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidis  case CXXClassVar:
232d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidis    break;
23356d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  }
23456d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman}
23556d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman
23656d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman//===----------------------------------------------------------------------===//
23756d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman// Decl Implementation
23856d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman//===----------------------------------------------------------------------===//
23956d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman
24056d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman// Out-of-line virtual method providing a home for Decl.
24156d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli FriedmanDecl::~Decl() {
24256d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  if (!HasAttrs)
24356d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman    return;
24456d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman
24556d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  DeclAttrMapTy::iterator it = DeclAttrs->find(this);
24656d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  assert(it != DeclAttrs->end() && "No attrs found but HasAttrs is true!");
24756d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman
24856d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  // release attributes.
24956d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  delete it->second;
25056d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  invalidateAttrs();
25156d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman}
25256d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman
25356d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedmanvoid Decl::addAttr(Attr *NewAttr) {
25456d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  if (!DeclAttrs)
25556d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman    DeclAttrs = new DeclAttrMapTy();
25656d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman
25756d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  Attr *&ExistingAttr = (*DeclAttrs)[this];
25856d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman
25956d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  NewAttr->setNext(ExistingAttr);
26056d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  ExistingAttr = NewAttr;
26156d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman
26256d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  HasAttrs = true;
26356d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman}
26456d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman
26556d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedmanvoid Decl::invalidateAttrs() {
26656d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  if (!HasAttrs) return;
26756d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman
26856d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  HasAttrs = false;
26956d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  (*DeclAttrs)[this] = 0;
27056d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  DeclAttrs->erase(this);
27156d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman
27256d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  if (DeclAttrs->empty()) {
27356d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman    delete DeclAttrs;
27456d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman    DeclAttrs = 0;
27556d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  }
27656d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman}
27756d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman
27856d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedmanconst Attr *Decl::getAttrs() const {
27956d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  if (!HasAttrs)
28056d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman    return 0;
28156d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman
28256d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  return (*DeclAttrs)[this];
28356d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman}
28456d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman
28556d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedmanvoid Decl::swapAttrs(Decl *RHS) {
28656d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  bool HasLHSAttr = this->HasAttrs;
28756d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  bool HasRHSAttr = RHS->HasAttrs;
28856d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman
28956d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  // Usually, neither decl has attrs, nothing to do.
29056d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  if (!HasLHSAttr && !HasRHSAttr) return;
29156d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman
29256d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  // If 'this' has no attrs, swap the other way.
29356d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  if (!HasLHSAttr)
29456d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman    return RHS->swapAttrs(this);
29556d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman
29656d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  // Handle the case when both decls have attrs.
29756d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  if (HasRHSAttr) {
29856d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman    std::swap((*DeclAttrs)[this], (*DeclAttrs)[RHS]);
29956d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman    return;
30056d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  }
30156d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman
30256d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  // Otherwise, LHS has an attr and RHS doesn't.
30356d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  (*DeclAttrs)[RHS] = (*DeclAttrs)[this];
30456d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  (*DeclAttrs).erase(this);
30556d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  this->HasAttrs = false;
30656d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  RHS->HasAttrs = true;
30756d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman}
30856d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman
30956d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman
31056d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedmanvoid Decl::Destroy(ASTContext& C) {
31156d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman
31256d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  if (ScopedDecl* SD = dyn_cast<ScopedDecl>(this)) {
31356d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman
31456d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman    // Observe the unrolled recursion.  By setting N->NextDeclarator = 0x0
31556d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman    // within the loop, only the Destroy method for the first ScopedDecl
31656d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman    // will deallocate all of the ScopedDecls in a chain.
31756d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman
31856d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman    ScopedDecl* N = SD->getNextDeclarator();
31956d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman
32056d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman    while (N) {
32156d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman      ScopedDecl* Tmp = N->getNextDeclarator();
32256d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman      N->NextDeclarator = 0x0;
32356d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman      N->Destroy(C);
32456d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman      N = Tmp;
32556d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman    }
32656d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  }
32756d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman
32856d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  this->~Decl();
32956d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  C.getAllocator().Deallocate((void *)this);
33056d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman}
33156d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman
33256d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman//===----------------------------------------------------------------------===//
33356d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman// DeclContext Implementation
33456d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman//===----------------------------------------------------------------------===//
33556d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman
33656d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli FriedmanDeclContext *DeclContext::getParent() const {
33756d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  if (ScopedDecl *SD = dyn_cast<ScopedDecl>(this))
33856d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman    return SD->getDeclContext();
33956d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  else
34056d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman    return NULL;
34156d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman}
34256d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman
34356d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli FriedmanDecl *DeclContext::ToDecl (const DeclContext *D) {
34456d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  return CastTo<Decl>(D);
34556d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman}
34656d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman
34756d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli FriedmanDeclContext *DeclContext::FromDecl (const Decl *D) {
34856d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  return CastTo<DeclContext>(D);
34956d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman}
350