Index: src/SymTab/Validate.cc
===================================================================
--- src/SymTab/Validate.cc	(revision 1cb7fab24a9d8ae701d8295e3857478969f5fd45)
+++ src/SymTab/Validate.cc	(revision 3c0d4cdd403fcf9c68de3106b67c7b21967ae61f)
@@ -304,35 +304,53 @@
 		PassVisitor<FixQualifiedTypes> fixQual;
 
-		Stats::Heap::newPass("validate-A");
-		acceptAll( translationUnit, hoistDecls );
-		ReplaceTypedef::replaceTypedef( translationUnit );
-		ReturnTypeFixer::fix( translationUnit ); // must happen before autogen
-		acceptAll( translationUnit, epc ); // must happen before VerifyCtorDtorAssign, because void return objects should not exist; before LinkReferenceToTypes because it is an indexer and needs correct types for mangling
-		Stats::Heap::newPass("validate-B");
-		acceptAll( translationUnit, lrt ); // must happen before autogen, because sized flag needs to propagate to generated functions
-		mutateAll( translationUnit, fixQual ); // must happen after LinkReferenceToTypes, because aggregate members are accessed
-		HoistStruct::hoistStruct( translationUnit ); // must happen after EliminateTypedef, so that aggregate typedefs occur in the correct order
-		EliminateTypedef::eliminateTypedef( translationUnit ); //
-		Stats::Heap::newPass("validate-C");
-		acceptAll( translationUnit, genericParams );  // check as early as possible - can't happen before LinkReferenceToTypes
-		VerifyCtorDtorAssign::verify( translationUnit );  // must happen before autogen, because autogen examines existing ctor/dtors
-		ReturnChecker::checkFunctionReturns( translationUnit );
-		InitTweak::fixReturnStatements( translationUnit ); // must happen before autogen
-		Stats::Heap::newPass("validate-D");
-		Concurrency::applyKeywords( translationUnit );
-		acceptAll( translationUnit, fpd ); // must happen before autogenerateRoutines, after Concurrency::applyKeywords because uniqueIds must be set on declaration before resolution
-		ControlStruct::hoistControlDecls( translationUnit );  // hoist initialization out of for statements; must happen before autogenerateRoutines
-		autogenerateRoutines( translationUnit ); // moved up, used to be below compoundLiteral - currently needs EnumAndPointerDecay
-		Stats::Heap::newPass("validate-E");
-		Concurrency::implementMutexFuncs( translationUnit );
-		Concurrency::implementThreadStarter( translationUnit );
-		mutateAll( translationUnit, compoundliteral );
-		ResolvExpr::resolveWithExprs( translationUnit ); // must happen before FixObjectType because user-code is resolved and may contain with variables
-		Stats::Heap::newPass("validate-F");
-		FixObjectType::fix( translationUnit );
-		ArrayLength::computeLength( translationUnit );
-		acceptAll( translationUnit, finder ); // xxx - remove this pass soon
-		mutateAll( translationUnit, labelAddrFixer );
-		Validate::handleAttributes( translationUnit );
+		{
+			Stats::Heap::newPass("validate-A");
+			Stats::Time::BlockGuard guard("validate-A");
+			acceptAll( translationUnit, hoistDecls );
+			ReplaceTypedef::replaceTypedef( translationUnit );
+			ReturnTypeFixer::fix( translationUnit ); // must happen before autogen
+			acceptAll( translationUnit, epc ); // must happen before VerifyCtorDtorAssign, because void return objects should not exist; before LinkReferenceToTypes because it is an indexer and needs correct types for mangling
+		}
+		{
+			Stats::Heap::newPass("validate-B");
+			Stats::Time::BlockGuard guard("validate-B");
+			acceptAll( translationUnit, lrt ); // must happen before autogen, because sized flag needs to propagate to generated functions
+			mutateAll( translationUnit, fixQual ); // must happen after LinkReferenceToTypes, because aggregate members are accessed
+			HoistStruct::hoistStruct( translationUnit ); // must happen after EliminateTypedef, so that aggregate typedefs occur in the correct order
+			EliminateTypedef::eliminateTypedef( translationUnit ); //
+		}
+		{
+			Stats::Heap::newPass("validate-C");
+			Stats::Time::BlockGuard guard("validate-C");
+			acceptAll( translationUnit, genericParams );  // check as early as possible - can't happen before LinkReferenceToTypes
+			VerifyCtorDtorAssign::verify( translationUnit );  // must happen before autogen, because autogen examines existing ctor/dtors
+			ReturnChecker::checkFunctionReturns( translationUnit );
+			InitTweak::fixReturnStatements( translationUnit ); // must happen before autogen
+		}
+		{
+			Stats::Heap::newPass("validate-D");
+			Stats::Time::BlockGuard guard("validate-D");
+			Concurrency::applyKeywords( translationUnit );
+			acceptAll( translationUnit, fpd ); // must happen before autogenerateRoutines, after Concurrency::applyKeywords because uniqueIds must be set on declaration before resolution
+			ControlStruct::hoistControlDecls( translationUnit );  // hoist initialization out of for statements; must happen before autogenerateRoutines
+			autogenerateRoutines( translationUnit ); // moved up, used to be below compoundLiteral - currently needs EnumAndPointerDecay
+		}
+		{
+			Stats::Heap::newPass("validate-E");
+			Stats::Time::BlockGuard guard("validate-E");
+			Concurrency::implementMutexFuncs( translationUnit );
+			Concurrency::implementThreadStarter( translationUnit );
+			mutateAll( translationUnit, compoundliteral );
+			ResolvExpr::resolveWithExprs( translationUnit ); // must happen before FixObjectType because user-code is resolved and may contain with variables
+		}
+		{
+			Stats::Heap::newPass("validate-F");
+			Stats::Time::BlockGuard guard("validate-F");
+			FixObjectType::fix( translationUnit );
+			ArrayLength::computeLength( translationUnit );
+			acceptAll( translationUnit, finder ); // xxx - remove this pass soon
+			mutateAll( translationUnit, labelAddrFixer );
+			Validate::handleAttributes( translationUnit );
+		}
 	}
 
