// This version does not exlude any id. BaseAST* aid09(int id) { #define match_id(type) \ forv_Vec(type, a, g##type##s) { \ if (a->id == id) \ return a; \ } foreach_ast(match_id); return NULL; }
AstCount::AstCount() { // Initialize member variables for each AST node type // that is handled by the baseAST macro. #define init_members(type) num##type = 0 foreach_ast(init_members); #undef init_members // Initialize other member variables for AST types // not handled by the baseAST macro. numForallIntents = 0; numWhileDoStmt = 0; numDoWhileStmt = 0; numCForLoop = 0; numForLoop = 0; numParamForLoop = 0; }
int AstCount::total() { int sum = 0; // Add those covered by the baseAST macro #define count_members(type) sum += num##type foreach_ast(count_members); #undef count_members // and then add those not covered by the baseAST macro sum += numForallIntents; sum += numWhileDoStmt; sum += numDoWhileStmt; sum += numCForLoop; sum += numForLoop; sum += numParamForLoop; return sum; }
void cleanAst() { cleanModuleList(); // // clear back pointers to dead ast instances // forv_Vec(TypeSymbol, ts, gTypeSymbols) { for(int i = 0; i < ts->type->methods.n; i++) { FnSymbol* method = ts->type->methods.v[i]; if (method && !isAliveQuick(method)) ts->type->methods.v[i] = NULL; if (AggregateType* ct = toAggregateType(ts->type)) { if (ct->defaultInitializer && !isAliveQuick(ct->defaultInitializer)) ct->defaultInitializer = NULL; if (ct->destructor && !isAliveQuick(ct->destructor)) ct->destructor = NULL; } } for(int i = 0; i < ts->type->dispatchChildren.n; i++) { Type* type = ts->type->dispatchChildren.v[i]; if (type && !isAlive(type)) ts->type->dispatchChildren.v[i] = NULL; } } // check iterator-resume-label/goto data before nodes are free'd verifyNcleanRemovedIterResumeGotos(); verifyNcleanCopiedIterResumeGotos(); // clean the other module vectors, without deleting the ast instances (they // will be deleted with the clean_gvec call for ModuleSymbols.) clean_modvec(allModules); clean_modvec(userModules); clean_modvec(mainModules); // // clean global vectors and delete dead ast instances // foreach_ast(clean_gvec); }
void printStatistics(const char* pass) { static int last_nasts = -1; static int maxK = -1, maxN = -1; if (!strcmp(pass, "makeBinary")) { if (strstr(fPrintStatistics, "m")) { fprintf(stderr, "Maximum # of ASTS: %d\n", maxN); fprintf(stderr, "Maximum Size (KB): %d\n", maxK); } } int nasts = foreach_ast_sep(sum_gvecs, +); if (last_nasts == nasts) { fprintf(stderr, "%23s%s\n", "", pass); return; } foreach_ast(decl_counters); int nStmt = nCondStmt + nBlockStmt + nGotoStmt; int kStmt = kCondStmt + kBlockStmt + kGotoStmt + kExternBlockStmt; int nExpr = nUnresolvedSymExpr + nSymExpr + nDefExpr + nCallExpr + nNamedExpr; int kExpr = kUnresolvedSymExpr + kSymExpr + kDefExpr + kCallExpr + kNamedExpr; int nSymbol = nModuleSymbol+nVarSymbol+nArgSymbol+nTypeSymbol+nFnSymbol+nEnumSymbol+nLabelSymbol; int kSymbol = kModuleSymbol+kVarSymbol+kArgSymbol+kTypeSymbol+kFnSymbol+kEnumSymbol+kLabelSymbol; int nType = nPrimitiveType+nEnumType+nAggregateType; int kType = kPrimitiveType+kEnumType+kAggregateType; fprintf(stderr, "%7d asts (%6dK) %s\n", nStmt+nExpr+nSymbol+nType, kStmt+kExpr+kSymbol+kType, pass); if (nStmt+nExpr+nSymbol+nType > maxN) maxN = nStmt+nExpr+nSymbol+nType; if (kStmt+kExpr+kSymbol+kType > maxK) maxK = kStmt+kExpr+kSymbol+kType; if (strstr(fPrintStatistics, "n")) fprintf(stderr, " Stmt %9d Cond %9d Block %9d Goto %9d\n", nStmt, nCondStmt, nBlockStmt, nGotoStmt); if (strstr(fPrintStatistics, "k") && strstr(fPrintStatistics, "n")) fprintf(stderr, " Stmt %9dK Cond %9dK Block %9dK Goto %9dK\n", kStmt, kCondStmt, kBlockStmt, kGotoStmt); if (strstr(fPrintStatistics, "k") && !strstr(fPrintStatistics, "n")) fprintf(stderr, " Stmt %6dK Cond %6dK Block %6dK Goto %6dK\n", kStmt, kCondStmt, kBlockStmt, kGotoStmt); if (strstr(fPrintStatistics, "n")) fprintf(stderr, " Expr %9d Unre %9d Sym %9d Def %9d Call %9d Named %9d\n", nExpr, nUnresolvedSymExpr, nSymExpr, nDefExpr, nCallExpr, nNamedExpr); if (strstr(fPrintStatistics, "k") && strstr(fPrintStatistics, "n")) fprintf(stderr, " Expr %9dK Unre %9dK Sym %9dK Def %9dK Call %9dK Named %9dK\n", kExpr, kUnresolvedSymExpr, kSymExpr, kDefExpr, kCallExpr, kNamedExpr); if (strstr(fPrintStatistics, "k") && !strstr(fPrintStatistics, "n")) fprintf(stderr, " Expr %6dK Unre %6dK Sym %6dK Def %6dK Call %6dK Named %6dK\n", kExpr, kUnresolvedSymExpr, kSymExpr, kDefExpr, kCallExpr, kNamedExpr); if (strstr(fPrintStatistics, "n")) fprintf(stderr, " Sym %9d Mod %9d Var %9d Arg %9d Type %9d Fn %9d Enum %9d Label %9d\n", nSymbol, nModuleSymbol, nVarSymbol, nArgSymbol, nTypeSymbol, nFnSymbol, nEnumSymbol, nLabelSymbol); if (strstr(fPrintStatistics, "k") && strstr(fPrintStatistics, "n")) fprintf(stderr, " Sym %9dK Mod %9dK Var %9dK Arg %9dK Type %9dK Fn %9dK Enum %9dK Label %9dK\n", kSymbol, kModuleSymbol, kVarSymbol, kArgSymbol, kTypeSymbol, kFnSymbol, kEnumSymbol, kLabelSymbol); if (strstr(fPrintStatistics, "k") && !strstr(fPrintStatistics, "n")) fprintf(stderr, " Sym %6dK Mod %6dK Var %6dK Arg %6dK Type %6dK Fn %6dK Enum %6dK Label %6dK\n", kSymbol, kModuleSymbol, kVarSymbol, kArgSymbol, kTypeSymbol, kFnSymbol, kEnumSymbol, kLabelSymbol); if (strstr(fPrintStatistics, "n")) fprintf(stderr, " Type %9d Prim %9d Enum %9d Class %9d \n", nType, nPrimitiveType, nEnumType, nAggregateType); if (strstr(fPrintStatistics, "k") && strstr(fPrintStatistics, "n")) fprintf(stderr, " Type %9dK Prim %9dK Enum %9dK Class %9dK\n", kType, kPrimitiveType, kEnumType, kAggregateType); if (strstr(fPrintStatistics, "k") && !strstr(fPrintStatistics, "n")) fprintf(stderr, " Type %6dK Prim %6dK Enum %6dK Class %6dK\n", kType, kPrimitiveType, kEnumType, kAggregateType); last_nasts = nasts; }