Index: src/Common/Stats/Time.cc
===================================================================
--- src/Common/Stats/Time.cc	(revision 3c0d4cdd403fcf9c68de3106b67c7b21967ae61f)
+++ src/Common/Stats/Time.cc	(revision c884f2d126e0594e6d9223e0afc85a588178f92f)
@@ -88,10 +88,14 @@
 				virtual void print(std::ostream & os) override {
 					if(currl > prevl) {
+						// std::cerr << "push last " << last << std::endl;
 						parents.push(last);
 					} else if(currl < prevl) {
 						parents.pop();
-					} else {
+						// std::cerr << "pop, top = " << parents.top() << std::endl;
+					}
+					// else {
 						last = end - begin;
-					}
+						// std::cerr << "last = " << last << "\t";
+					// }
 
 					assert(finished);
Index: src/Common/Stats/Time.h
===================================================================
--- src/Common/Stats/Time.h	(revision 3c0d4cdd403fcf9c68de3106b67c7b21967ae61f)
+++ src/Common/Stats/Time.h	(revision c884f2d126e0594e6d9223e0afc85a588178f92f)
@@ -38,5 +38,7 @@
 
 			template<typename func_t>
-			inline void TimeBLock(const char *, func_t) {}
+			inline void TimeBlock(const char *, func_t f) {
+				f();
+			}
 #		else
 			void StartGlobal();
@@ -53,5 +55,5 @@
 
 			template<typename func_t>
-			inline void TimeBLock(const char * name, func_t func) {
+			inline void TimeBlock(const char * name, func_t func) {
 				BlockGuard guard(name);
 				func();
Index: src/SymTab/Validate.cc
===================================================================
--- src/SymTab/Validate.cc	(revision 3c0d4cdd403fcf9c68de3106b67c7b21967ae61f)
+++ src/SymTab/Validate.cc	(revision c884f2d126e0594e6d9223e0afc85a588178f92f)
@@ -315,8 +315,16 @@
 			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::Time::TimeBlock("Link Reference To Types", [&]() {
+				acceptAll( translationUnit, lrt ); // must happen before autogen, because sized flag needs to propagate to generated functions
+			});
+			Stats::Time::TimeBlock("Fix Qualified Types", [&]() {
+				mutateAll( translationUnit, fixQual ); // must happen after LinkReferenceToTypes, because aggregate members are accessed
+			});
+			Stats::Time::TimeBlock("Hoist Structs", [&]() {
+				HoistStruct::hoistStruct( translationUnit ); // must happen after EliminateTypedef, so that aggregate typedefs occur in the correct order
+			});
+			Stats::Time::TimeBlock("Eliminate Typedefs", [&]() {
+				EliminateTypedef::eliminateTypedef( translationUnit ); //
+			});
 		}
 		{
@@ -331,25 +339,51 @@
 			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::Time::TimeBlock("Apply Concurrent Keywords", [&]() {
+				Concurrency::applyKeywords( translationUnit );
+			});
+			Stats::Time::TimeBlock("Forall Pointer Decay", [&]() {
+				acceptAll( translationUnit, fpd ); // must happen before autogenerateRoutines, after Concurrency::applyKeywords because uniqueIds must be set on declaration before resolution
+			});
+			Stats::Time::TimeBlock("Hoist Control Declarations", [&]() {
+				ControlStruct::hoistControlDecls( translationUnit );  // hoist initialization out of for statements; must happen before autogenerateRoutines
+			});
+			Stats::Time::TimeBlock("Generate Autogen routines", [&]() {
+				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::Time::TimeBlock("Implement Mutex Func", [&]() {
+				Concurrency::implementMutexFuncs( translationUnit );
+			});
+			Stats::Time::TimeBlock("Implement Thread Start", [&]() {
+				Concurrency::implementThreadStarter( translationUnit );
+			});
+			Stats::Time::TimeBlock("Compound Literal", [&]() {
+				mutateAll( translationUnit, compoundliteral );
+			});
+			Stats::Time::TimeBlock("Resolve With Expressions", [&]() {
+				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 );
+			Stats::Time::TimeBlock("Fix Object Type", [&]() {
+				FixObjectType::fix( translationUnit );
+			});
+			Stats::Time::TimeBlock("Array Length", [&]() {
+				ArrayLength::computeLength( translationUnit );
+			});
+			Stats::Time::TimeBlock("Find Special Declarations", [&]() {
+				acceptAll( translationUnit, finder ); // xxx - remove this pass soon
+			});
+			Stats::Time::TimeBlock("Fix Label Address", [&]() {
+				mutateAll( translationUnit, labelAddrFixer );
+			});
+			Stats::Time::TimeBlock("Handle Attributes", [&]() {
+				Validate::handleAttributes( translationUnit );
+			});
 		}
 	}
