DeclBase.cpp revision 8e9bebdea69c590dedfbf27374114cb76fe12fbd
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; 348e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregorstatic unsigned nOverFuncs = 0; 3556d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedmanstatic unsigned nTypedef = 0; 3656d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedmanstatic unsigned nFieldDecls = 0; 3755d71f9f4cf5f123db5d6dcfd20f3a8d5699c226Argyrios Kyrtzidisstatic unsigned nCXXFieldDecls = 0; 3856d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedmanstatic unsigned nInterfaceDecls = 0; 3956d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedmanstatic unsigned nClassDecls = 0; 4056d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedmanstatic unsigned nMethodDecls = 0; 4156d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedmanstatic unsigned nProtocolDecls = 0; 4256d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedmanstatic unsigned nForwardProtocolDecls = 0; 4356d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedmanstatic unsigned nCategoryDecls = 0; 4456d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedmanstatic unsigned nIvarDecls = 0; 4501e6779faca1e3a3164c697d6e2dfee0881a6981Ted Kremenekstatic unsigned nAtDefsFieldDecls = 0; 4656d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedmanstatic unsigned nObjCImplementationDecls = 0; 4756d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedmanstatic unsigned nObjCCategoryImpl = 0; 4856d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedmanstatic unsigned nObjCCompatibleAlias = 0; 4956d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedmanstatic unsigned nObjCPropertyDecl = 0; 5056d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedmanstatic unsigned nObjCPropertyImplDecl = 0; 5156d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedmanstatic unsigned nLinkageSpecDecl = 0; 5256d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedmanstatic unsigned nFileScopeAsmDecl = 0; 5356ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroffstatic unsigned nBlockDecls = 0; 5456d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman 5556d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedmanstatic bool StatSwitch = false; 5656d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman 5756d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman// This keeps track of all decl attributes. Since so few decls have attrs, we 5856d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman// keep them in a hash map instead of wasting space in the Decl class. 5956d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedmantypedef llvm::DenseMap<const Decl*, Attr*> DeclAttrMapTy; 6056d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman 6156d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedmanstatic DeclAttrMapTy *DeclAttrs = 0; 6256d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman 6356d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedmanconst char *Decl::getDeclKindName() const { 6456d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman switch (DeclKind) { 6556d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman default: assert(0 && "Unknown decl kind!"); 6656d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman case Namespace: return "Namespace"; 678e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregor case OverloadedFunction: return "OverloadedFunction"; 6856d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman case Typedef: return "Typedef"; 6956d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman case Function: return "Function"; 7056d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman case Var: return "Var"; 7156d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman case ParmVar: return "ParmVar"; 7256d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman case EnumConstant: return "EnumConstant"; 7356d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman case ObjCIvar: return "ObjCIvar"; 7456d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman case ObjCInterface: return "ObjCInterface"; 7556d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman case ObjCClass: return "ObjCClass"; 7656d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman case ObjCMethod: return "ObjCMethod"; 7756d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman case ObjCProtocol: return "ObjCProtocol"; 7856d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman case ObjCForwardProtocol: return "ObjCForwardProtocol"; 7935bc0821c4f80041724cd4c5c4889b2581546a41Argyrios Kyrtzidis case Record: return "Record"; 8035bc0821c4f80041724cd4c5c4889b2581546a41Argyrios Kyrtzidis case CXXRecord: return "CXXRecord"; 8156d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman case Enum: return "Enum"; 8256ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff case Block: return "Block"; 8356d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman } 8456d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman} 8556d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman 8656d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedmanbool Decl::CollectingStats(bool Enable) { 8756d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman if (Enable) 8856d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman StatSwitch = true; 8956d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman return StatSwitch; 9056d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman} 9156d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman 9256d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedmanvoid Decl::PrintStats() { 9356d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman fprintf(stderr, "*** Decl Stats:\n"); 9456d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman fprintf(stderr, " %d decls total.\n", 9555d71f9f4cf5f123db5d6dcfd20f3a8d5699c226Argyrios Kyrtzidis int(nFuncs+nVars+nParmVars+nFieldDecls+nSUC+nCXXFieldDecls+nCXXSUC+ 9656d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman nEnumDecls+nEnumConst+nTypedef+nInterfaceDecls+nClassDecls+ 9756d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman nMethodDecls+nProtocolDecls+nCategoryDecls+nIvarDecls+ 988e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregor nAtDefsFieldDecls+nNamespaces+nOverFuncs)); 9956d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman fprintf(stderr, " %d namespace decls, %d each (%d bytes)\n", 10056d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman nNamespaces, (int)sizeof(NamespaceDecl), 10156d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman int(nNamespaces*sizeof(NamespaceDecl))); 1028e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregor fprintf(stderr, " %d overloaded function decls, %d each (%d bytes)\n", 1038e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregor nOverFuncs, (int)sizeof(OverloadedFunctionDecl), 1048e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregor int(nOverFuncs*sizeof(OverloadedFunctionDecl))); 10556d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman fprintf(stderr, " %d function decls, %d each (%d bytes)\n", 10656d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman nFuncs, (int)sizeof(FunctionDecl), int(nFuncs*sizeof(FunctionDecl))); 10756d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman fprintf(stderr, " %d variable decls, %d each (%d bytes)\n", 10856d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman nVars, (int)sizeof(VarDecl), 10956d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman int(nVars*sizeof(VarDecl))); 11056d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman fprintf(stderr, " %d parameter variable decls, %d each (%d bytes)\n", 11156d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman nParmVars, (int)sizeof(ParmVarDecl), 11256d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman int(nParmVars*sizeof(ParmVarDecl))); 11356d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman fprintf(stderr, " %d field decls, %d each (%d bytes)\n", 11456d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman nFieldDecls, (int)sizeof(FieldDecl), 11556d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman int(nFieldDecls*sizeof(FieldDecl))); 11601e6779faca1e3a3164c697d6e2dfee0881a6981Ted Kremenek fprintf(stderr, " %d @defs generated field decls, %d each (%d bytes)\n", 11701e6779faca1e3a3164c697d6e2dfee0881a6981Ted Kremenek nAtDefsFieldDecls, (int)sizeof(ObjCAtDefsFieldDecl), 11801e6779faca1e3a3164c697d6e2dfee0881a6981Ted Kremenek int(nAtDefsFieldDecls*sizeof(ObjCAtDefsFieldDecl))); 11956d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman fprintf(stderr, " %d struct/union/class decls, %d each (%d bytes)\n", 12056d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman nSUC, (int)sizeof(RecordDecl), 12156d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman int(nSUC*sizeof(RecordDecl))); 12255d71f9f4cf5f123db5d6dcfd20f3a8d5699c226Argyrios Kyrtzidis fprintf(stderr, " %d C++ field decls, %d each (%d bytes)\n", 12355d71f9f4cf5f123db5d6dcfd20f3a8d5699c226Argyrios Kyrtzidis nCXXFieldDecls, (int)sizeof(CXXFieldDecl), 12455d71f9f4cf5f123db5d6dcfd20f3a8d5699c226Argyrios Kyrtzidis int(nCXXFieldDecls*sizeof(CXXFieldDecl))); 12555d71f9f4cf5f123db5d6dcfd20f3a8d5699c226Argyrios Kyrtzidis fprintf(stderr, " %d C++ struct/union/class decls, %d each (%d bytes)\n", 12655d71f9f4cf5f123db5d6dcfd20f3a8d5699c226Argyrios Kyrtzidis nCXXSUC, (int)sizeof(CXXRecordDecl), 12755d71f9f4cf5f123db5d6dcfd20f3a8d5699c226Argyrios Kyrtzidis int(nCXXSUC*sizeof(CXXRecordDecl))); 12856d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman fprintf(stderr, " %d enum decls, %d each (%d bytes)\n", 12956d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman nEnumDecls, (int)sizeof(EnumDecl), 13056d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman int(nEnumDecls*sizeof(EnumDecl))); 13156d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman fprintf(stderr, " %d enum constant decls, %d each (%d bytes)\n", 13256d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman nEnumConst, (int)sizeof(EnumConstantDecl), 13356d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman int(nEnumConst*sizeof(EnumConstantDecl))); 13456d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman fprintf(stderr, " %d typedef decls, %d each (%d bytes)\n", 13556d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman nTypedef, (int)sizeof(TypedefDecl),int(nTypedef*sizeof(TypedefDecl))); 13656d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman // Objective-C decls... 13756d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman fprintf(stderr, " %d interface decls, %d each (%d bytes)\n", 13856d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman nInterfaceDecls, (int)sizeof(ObjCInterfaceDecl), 13956d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman int(nInterfaceDecls*sizeof(ObjCInterfaceDecl))); 14056d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman fprintf(stderr, " %d instance variable decls, %d each (%d bytes)\n", 14156d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman nIvarDecls, (int)sizeof(ObjCIvarDecl), 14256d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman int(nIvarDecls*sizeof(ObjCIvarDecl))); 14356d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman fprintf(stderr, " %d class decls, %d each (%d bytes)\n", 14456d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman nClassDecls, (int)sizeof(ObjCClassDecl), 14556d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman int(nClassDecls*sizeof(ObjCClassDecl))); 14656d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman fprintf(stderr, " %d method decls, %d each (%d bytes)\n", 14756d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman nMethodDecls, (int)sizeof(ObjCMethodDecl), 14856d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman int(nMethodDecls*sizeof(ObjCMethodDecl))); 14956d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman fprintf(stderr, " %d protocol decls, %d each (%d bytes)\n", 15056d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman nProtocolDecls, (int)sizeof(ObjCProtocolDecl), 15156d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman int(nProtocolDecls*sizeof(ObjCProtocolDecl))); 15256d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman fprintf(stderr, " %d forward protocol decls, %d each (%d bytes)\n", 15356d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman nForwardProtocolDecls, (int)sizeof(ObjCForwardProtocolDecl), 15456d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman int(nForwardProtocolDecls*sizeof(ObjCForwardProtocolDecl))); 15556d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman fprintf(stderr, " %d category decls, %d each (%d bytes)\n", 15656d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman nCategoryDecls, (int)sizeof(ObjCCategoryDecl), 15756d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman int(nCategoryDecls*sizeof(ObjCCategoryDecl))); 15856d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman 15956d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman fprintf(stderr, " %d class implementation decls, %d each (%d bytes)\n", 16056d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman nObjCImplementationDecls, (int)sizeof(ObjCImplementationDecl), 16156d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman int(nObjCImplementationDecls*sizeof(ObjCImplementationDecl))); 16256d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman 16356d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman fprintf(stderr, " %d class implementation decls, %d each (%d bytes)\n", 16456d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman nObjCCategoryImpl, (int)sizeof(ObjCCategoryImplDecl), 16556d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman int(nObjCCategoryImpl*sizeof(ObjCCategoryImplDecl))); 16656d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman 16756d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman fprintf(stderr, " %d compatibility alias decls, %d each (%d bytes)\n", 16856d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman nObjCCompatibleAlias, (int)sizeof(ObjCCompatibleAliasDecl), 16956d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman int(nObjCCompatibleAlias*sizeof(ObjCCompatibleAliasDecl))); 17056d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman 17156d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman fprintf(stderr, " %d property decls, %d each (%d bytes)\n", 17256d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman nObjCPropertyDecl, (int)sizeof(ObjCPropertyDecl), 17356d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman int(nObjCPropertyDecl*sizeof(ObjCPropertyDecl))); 17456d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman 17556d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman fprintf(stderr, " %d property implementation decls, %d each (%d bytes)\n", 17656d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman nObjCPropertyImplDecl, (int)sizeof(ObjCPropertyImplDecl), 17756d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman int(nObjCPropertyImplDecl*sizeof(ObjCPropertyImplDecl))); 17856d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman 17956d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman fprintf(stderr, "Total bytes = %d\n", 18056d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman int(nFuncs*sizeof(FunctionDecl)+ 18156d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman nVars*sizeof(VarDecl)+nParmVars*sizeof(ParmVarDecl)+ 18256d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman nFieldDecls*sizeof(FieldDecl)+nSUC*sizeof(RecordDecl)+ 18355d71f9f4cf5f123db5d6dcfd20f3a8d5699c226Argyrios Kyrtzidis nCXXFieldDecls*sizeof(CXXFieldDecl)+nCXXSUC*sizeof(CXXRecordDecl)+ 18456d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman nEnumDecls*sizeof(EnumDecl)+nEnumConst*sizeof(EnumConstantDecl)+ 18556d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman nTypedef*sizeof(TypedefDecl)+ 18656d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman nInterfaceDecls*sizeof(ObjCInterfaceDecl)+ 18756d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman nIvarDecls*sizeof(ObjCIvarDecl)+ 18856d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman nClassDecls*sizeof(ObjCClassDecl)+ 18956d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman nMethodDecls*sizeof(ObjCMethodDecl)+ 19056d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman nProtocolDecls*sizeof(ObjCProtocolDecl)+ 19156d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman nForwardProtocolDecls*sizeof(ObjCForwardProtocolDecl)+ 19256d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman nCategoryDecls*sizeof(ObjCCategoryDecl)+ 19356d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman nObjCImplementationDecls*sizeof(ObjCImplementationDecl)+ 19456d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman nObjCCategoryImpl*sizeof(ObjCCategoryImplDecl)+ 19556d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman nObjCCompatibleAlias*sizeof(ObjCCompatibleAliasDecl)+ 19656d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman nObjCPropertyDecl*sizeof(ObjCPropertyDecl)+ 19756d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman nObjCPropertyImplDecl*sizeof(ObjCPropertyImplDecl)+ 19856d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman nLinkageSpecDecl*sizeof(LinkageSpecDecl)+ 19956d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman nFileScopeAsmDecl*sizeof(FileScopeAsmDecl)+ 2008e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregor nNamespaces*sizeof(NamespaceDecl)+ 2018e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregor nOverFuncs*sizeof(OverloadedFunctionDecl))); 20256d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman 20356d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman} 20456d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman 20556d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedmanvoid Decl::addDeclKind(Kind k) { 20656d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman switch (k) { 20756d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman case Namespace: nNamespaces++; break; 2088e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregor case OverloadedFunction: nOverFuncs++; break; 20956d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman case Typedef: nTypedef++; break; 21056d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman case Function: nFuncs++; break; 21156d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman case Var: nVars++; break; 21256d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman case ParmVar: nParmVars++; break; 21356d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman case EnumConstant: nEnumConst++; break; 21456d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman case Field: nFieldDecls++; break; 21535bc0821c4f80041724cd4c5c4889b2581546a41Argyrios Kyrtzidis case Record: nSUC++; break; 21656d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman case Enum: nEnumDecls++; break; 21756d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman case ObjCInterface: nInterfaceDecls++; break; 21856d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman case ObjCClass: nClassDecls++; break; 21956d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman case ObjCMethod: nMethodDecls++; break; 22056d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman case ObjCProtocol: nProtocolDecls++; break; 22156d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman case ObjCForwardProtocol: nForwardProtocolDecls++; break; 22256d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman case ObjCCategory: nCategoryDecls++; break; 22356d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman case ObjCIvar: nIvarDecls++; break; 22401e6779faca1e3a3164c697d6e2dfee0881a6981Ted Kremenek case ObjCAtDefsField: nAtDefsFieldDecls++; break; 22556d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman case ObjCImplementation: nObjCImplementationDecls++; break; 22656d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman case ObjCCategoryImpl: nObjCCategoryImpl++; break; 22756d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman case ObjCCompatibleAlias: nObjCCompatibleAlias++; break; 22856d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman case ObjCProperty: nObjCPropertyDecl++; break; 22956d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman case ObjCPropertyImpl: nObjCPropertyImplDecl++; break; 23056d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman case LinkageSpec: nLinkageSpecDecl++; break; 23156d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman case FileScopeAsm: nFileScopeAsmDecl++; break; 23256ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff case Block: nBlockDecls++; break; 2334111024be81e7c0525e42dadcc126d27e5bf2425Chris Lattner case ImplicitParam: 23456d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman case TranslationUnit: break; 235d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidis 23655d71f9f4cf5f123db5d6dcfd20f3a8d5699c226Argyrios Kyrtzidis case CXXField: nCXXFieldDecls++; break; 23735bc0821c4f80041724cd4c5c4889b2581546a41Argyrios Kyrtzidis case CXXRecord: nCXXSUC++; break; 238d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidis // FIXME: Statistics for C++ decls. 239d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidis case CXXMethod: 240d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidis case CXXClassVar: 241d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidis break; 24256d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman } 24356d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman} 24456d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman 24556d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman//===----------------------------------------------------------------------===// 24656d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman// Decl Implementation 24756d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman//===----------------------------------------------------------------------===// 24856d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman 24956d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman// Out-of-line virtual method providing a home for Decl. 25056d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli FriedmanDecl::~Decl() { 25156d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman if (!HasAttrs) 25256d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman return; 25356d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman 25456d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman DeclAttrMapTy::iterator it = DeclAttrs->find(this); 25556d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman assert(it != DeclAttrs->end() && "No attrs found but HasAttrs is true!"); 25656d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman 25756d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman // release attributes. 25856d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman delete it->second; 25956d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman invalidateAttrs(); 26056d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman} 26156d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman 26256d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedmanvoid Decl::addAttr(Attr *NewAttr) { 26356d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman if (!DeclAttrs) 26456d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman DeclAttrs = new DeclAttrMapTy(); 26556d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman 26656d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman Attr *&ExistingAttr = (*DeclAttrs)[this]; 26756d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman 26856d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman NewAttr->setNext(ExistingAttr); 26956d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman ExistingAttr = NewAttr; 27056d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman 27156d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman HasAttrs = true; 27256d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman} 27356d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman 27456d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedmanvoid Decl::invalidateAttrs() { 27556d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman if (!HasAttrs) return; 27656d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman 27756d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman HasAttrs = false; 27856d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman (*DeclAttrs)[this] = 0; 27956d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman DeclAttrs->erase(this); 28056d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman 28156d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman if (DeclAttrs->empty()) { 28256d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman delete DeclAttrs; 28356d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman DeclAttrs = 0; 28456d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman } 28556d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman} 28656d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman 28756d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedmanconst Attr *Decl::getAttrs() const { 28856d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman if (!HasAttrs) 28956d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman return 0; 29056d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman 29156d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman return (*DeclAttrs)[this]; 29256d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman} 29356d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman 29456d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedmanvoid Decl::swapAttrs(Decl *RHS) { 29556d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman bool HasLHSAttr = this->HasAttrs; 29656d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman bool HasRHSAttr = RHS->HasAttrs; 29756d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman 29856d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman // Usually, neither decl has attrs, nothing to do. 29956d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman if (!HasLHSAttr && !HasRHSAttr) return; 30056d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman 30156d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman // If 'this' has no attrs, swap the other way. 30256d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman if (!HasLHSAttr) 30356d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman return RHS->swapAttrs(this); 30456d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman 30556d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman // Handle the case when both decls have attrs. 30656d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman if (HasRHSAttr) { 30756d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman std::swap((*DeclAttrs)[this], (*DeclAttrs)[RHS]); 30856d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman return; 30956d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman } 31056d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman 31156d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman // Otherwise, LHS has an attr and RHS doesn't. 31256d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman (*DeclAttrs)[RHS] = (*DeclAttrs)[this]; 31356d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman (*DeclAttrs).erase(this); 31456d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman this->HasAttrs = false; 31556d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman RHS->HasAttrs = true; 31656d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman} 31756d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman 31856d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman 31956d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedmanvoid Decl::Destroy(ASTContext& C) { 32056d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman 32156d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman if (ScopedDecl* SD = dyn_cast<ScopedDecl>(this)) { 32256d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman 32356d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman // Observe the unrolled recursion. By setting N->NextDeclarator = 0x0 32456d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman // within the loop, only the Destroy method for the first ScopedDecl 32556d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman // will deallocate all of the ScopedDecls in a chain. 32656d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman 32756d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman ScopedDecl* N = SD->getNextDeclarator(); 32856d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman 32956d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman while (N) { 33056d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman ScopedDecl* Tmp = N->getNextDeclarator(); 33156d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman N->NextDeclarator = 0x0; 33256d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman N->Destroy(C); 33356d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman N = Tmp; 33456d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman } 33556d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman } 33656d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman 33756d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman this->~Decl(); 33856d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman C.getAllocator().Deallocate((void *)this); 33956d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman} 34056d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman 34142220c5432c141d47cc8ce786e472b49dc907378Argyrios KyrtzidisDecl *Decl::castFromDeclContext (const DeclContext *D) { 34242220c5432c141d47cc8ce786e472b49dc907378Argyrios Kyrtzidis return DeclContext::CastTo<Decl>(D); 34342220c5432c141d47cc8ce786e472b49dc907378Argyrios Kyrtzidis} 34442220c5432c141d47cc8ce786e472b49dc907378Argyrios Kyrtzidis 34542220c5432c141d47cc8ce786e472b49dc907378Argyrios KyrtzidisDeclContext *Decl::castToDeclContext(const Decl *D) { 34642220c5432c141d47cc8ce786e472b49dc907378Argyrios Kyrtzidis return DeclContext::CastTo<DeclContext>(D); 34742220c5432c141d47cc8ce786e472b49dc907378Argyrios Kyrtzidis} 34842220c5432c141d47cc8ce786e472b49dc907378Argyrios Kyrtzidis 34956d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman//===----------------------------------------------------------------------===// 35056d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman// DeclContext Implementation 35156d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman//===----------------------------------------------------------------------===// 35256d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman 353d2595ecce5f8350e485c83bfe767549a522b2802Argyrios KyrtzidisDeclContext *DeclContext::getParent() { 354d2595ecce5f8350e485c83bfe767549a522b2802Argyrios Kyrtzidis if (ScopedDecl *SD = dyn_cast<ScopedDecl>(this)) 35556d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman return SD->getDeclContext(); 356d2595ecce5f8350e485c83bfe767549a522b2802Argyrios Kyrtzidis else if (BlockDecl *BD = dyn_cast<BlockDecl>(this)) 357090276f5e164d491a1bb3f541bafdb394f5e6f04Steve Naroff return BD->getParentContext(); 35856d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman else 35956d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman return NULL; 36056d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman} 361