Index: src/CodeGen/module.mk
===================================================================
--- src/CodeGen/module.mk	(revision f56c32e54c020031f40ff50223fe09a667f86da8)
+++ src/CodeGen/module.mk	(revision 0050a5ff3fdf8bc520652ac831418c77148183f4)
@@ -18,8 +18,11 @@
 #	ArgTweak/Mutate.cc
 
-SRC +=  CodeGen/Generate.cc \
+SRC_CODEGEN = \
 	CodeGen/CodeGenerator.cc \
+	CodeGen/FixMain.cc \
 	CodeGen/GenType.cc \
-	CodeGen/FixNames.cc \
-	CodeGen/FixMain.cc \
 	CodeGen/OperatorTable.cc
+
+
+SRC += $(SRC_CODEGEN) CodeGen/Generate.cc CodeGen/FixNames.cc
+SRCDEMANGLE += $(SRC_CODEGEN)
Index: src/Common/Heap.cc
===================================================================
--- src/Common/Heap.cc	(revision f56c32e54c020031f40ff50223fe09a667f86da8)
+++ 	(revision )
@@ -1,209 +1,0 @@
-//
-// Cforall Version 1.0.0 Copyright (C) 2018 University of Waterloo
-//
-// The contents of this file are covered under the licence agreement in the
-// file "LICENCE" distributed with Cforall.
-//
-// Heap.cc --
-//
-// Author           : Thierry Delisle
-// Created On       : Thu May  3 16:16:10 2018
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Fri May  4 17:27:31 2018
-// Update Count     : 28
-//
-
-#include <cassert>
-#include <cmath>
-#include <cstddef>
-#include <cstring>
-#include <iomanip>
-#include <iostream>
-
-//#define WITH_HEAP_STATISTICS
-
-namespace HeapStats {
-#if !defined( WITH_HEAP_STATISTICS )
-	void newPass( const char * const ) {}
-
-	void printStats() {}
-#else
-	struct StatBlock {
-		const char * name  = nullptr;	///< Name of this pass
-		size_t mallocs     = 0;			///< Allocations in this pass
-		size_t frees       = 0;			///< Frees in this pass
-		size_t n_allocs    = 0;			///< Current number of live allocations
-		size_t peak_allocs = 0;			///< Peak number of live allocations this pass
-	};
-
-	StatBlock    passes[100] = {{ "Pre-Parse", 0, 0, 0, 0 }};
-	const size_t passes_size = sizeof(passes) / sizeof(passes[0]);
-	size_t       passes_cnt = 1;
-
-	void newPass( const char * const name ) {
-		passes[passes_cnt].name    = name;
-		passes[passes_cnt].mallocs = 0;
-		passes[passes_cnt].frees   = 0;
-		passes[passes_cnt].n_allocs 
-			= passes[passes_cnt].peak_allocs 
-			= passes[passes_cnt-1].n_allocs;
-		passes_cnt++;
-
-		assertf(passes_cnt < passes_size, "Too many passes for HeapStats, increase the size of the array in Heap.h");
-	}
-
-	void print(size_t value, size_t total) {
-		std::cerr << std::setw(12) << value;
-		std::cerr << "(" << std::setw(3);
-		std::cerr << (value == 0 ? 0 : value * 100 / total);
-		std::cerr << "%) | ";
-	}
-
-	void print(const StatBlock& stat, size_t nc, size_t total_mallocs, size_t total_frees, size_t overall_peak) {
-		std::cerr << std::setw(nc) << stat.name;
-		std::cerr << " | ";
-
-		print(stat.mallocs,     total_mallocs);
-		print(stat.frees,       total_frees  );
-		print(stat.peak_allocs, overall_peak );
-		std::cerr << "\n";
-	}
-
-	void print(char c, size_t nc) {
-		for(size_t i = 0; i < nc; i++) {
-			std::cerr << c;
-		}
-		std::cerr << '\n';
-	}
-
-	void printStats() {
-		size_t nc = 0;
-		size_t total_mallocs = 0;
-		size_t total_frees   = 0;
-		size_t overall_peak  = 0;
-		for(size_t i = 0; i < passes_cnt; i++) {
-			nc = std::max(nc, std::strlen(passes[i].name));
-			total_mallocs += passes[i].mallocs;
-			total_frees   += passes[i].frees;
-			overall_peak = std::max(overall_peak, passes[i].peak_allocs);
-		}
-		size_t nct = nc + 65;
-
-		const char * const title = "Heap Usage Statistic";
-		print('=', nct);
-		for(size_t i = 0; i < (nct - std::strlen(title)) / 2; i++) std::cerr << ' ';
-		std::cerr << title << std::endl;
-		print('-', nct);
-		std::cerr << std::setw(nc) << "Pass";
-		std::cerr << " |       Malloc Count |         Free Count |        Peak Allocs |" << std::endl;
-
-		print('-', nct);
-		for(size_t i = 0; i < passes_cnt; i++) {
-			print(passes[i], nc, total_mallocs, total_frees, overall_peak);
-		}
-		print('-', nct);
-		print({"Sum", total_mallocs, total_frees, 0, overall_peak}, 
-			nc, total_mallocs, total_frees, overall_peak);
-
-	}
-
-#include <stdarg.h>
-#include <stddef.h>
-#include <stdio.h>
-#include <string.h>
-#include <unistd.h>
-#include <signal.h>
-	extern "C" {
-#include <dlfcn.h>
-#include <execinfo.h>
-	}
-
-//=============================================================================================
-// Interposing helpers
-//=============================================================================================
-
-	typedef void (* generic_fptr_t)(void);
-	generic_fptr_t interpose_symbol( const char * symbol, const char * version ) {
-		const char * error;
-
-		static void * library;
-		if ( ! library ) {
-#if defined( RTLD_NEXT )
-			library = RTLD_NEXT;
-#else
-			// missing RTLD_NEXT => must hard-code library name, assuming libstdc++
-			library = dlopen( "libc.so.6", RTLD_LAZY );
-			error = dlerror();
-			if ( error ) {
-				std::cerr << "interpose_symbol : failed to open libc, " << error << std::endl;
-				abort();
-			}
-#endif // RTLD_NEXT
-		} // if
-
-		generic_fptr_t fptr;
-
-#if defined( _GNU_SOURCE )
-		if ( version ) {
-			fptr = (generic_fptr_t)dlvsym( library, symbol, version );
-		} else {
-			fptr = (generic_fptr_t)dlsym( library, symbol );
-		}
-#else
-		fptr = (generic_fptr_t)dlsym( library, symbol );
-#endif // _GNU_SOURCE
-
-		error = dlerror();
-		if ( error ) {
-			std::cerr << "interpose_symbol : internal error, " << error << std::endl;
-			abort();
-		}
-
-		return fptr;
-	}
-
-	extern "C" {
-		void * malloc( size_t size ) __attribute__((malloc));
-		void * malloc( size_t size ) {
-			static auto __malloc = reinterpret_cast<void * (*)(size_t)>(interpose_symbol( "malloc", nullptr ));
-			if( passes_cnt > 0 ) {
-				passes[passes_cnt - 1].mallocs++;
-				passes[passes_cnt - 1].n_allocs++;
-				passes[passes_cnt - 1].peak_allocs 
-					= std::max(passes[passes_cnt - 1].peak_allocs, passes[passes_cnt - 1].n_allocs);
-			}
-			return __malloc( size );
-		}
-
-		void free( void * ptr ) {
-			static auto __free = reinterpret_cast<void   (*)(void *)>(interpose_symbol( "free", nullptr ));
-			if( passes_cnt > 0 ) {
-				passes[passes_cnt - 1].frees++;
-				passes[passes_cnt - 1].n_allocs--;
-			}
-			return __free( ptr );
-		}
-
-		void * calloc( size_t nelem, size_t size ) {
-			static auto __calloc = reinterpret_cast<void * (*)(size_t, size_t)>(interpose_symbol( "calloc", nullptr ));
-			if( passes_cnt > 0 ) {
-				passes[passes_cnt - 1].mallocs++;
-				passes[passes_cnt - 1].n_allocs++;
-				passes[passes_cnt - 1].peak_allocs 
-					= std::max(passes[passes_cnt - 1].peak_allocs, passes[passes_cnt - 1].n_allocs);
-			}
-			return __calloc( nelem, size );
-		}
-
-		void * realloc( void * ptr, size_t size ) {
-			static auto __realloc = reinterpret_cast<void * (*)(void *, size_t)>(interpose_symbol( "realloc", nullptr ));
-			void * s = __realloc( ptr, size );
-			if ( s != ptr && passes_cnt > 0 ) {			// did realloc get new storage ?
-				passes[passes_cnt - 1].mallocs++;
-				passes[passes_cnt - 1].frees++;
-			} // if
-			return s;
-		}
-	}
-#endif
-}
Index: src/Common/Heap.h
===================================================================
--- src/Common/Heap.h	(revision f56c32e54c020031f40ff50223fe09a667f86da8)
+++ 	(revision )
@@ -1,21 +1,0 @@
-//
-// Cforall Version 1.0.0 Copyright (C) 2018 University of Waterloo
-//
-// The contents of this file are covered under the licence agreement in the
-// file "LICENCE" distributed with Cforall.
-//
-// Heap.h --
-//
-// Author           : Thierry Delisle
-// Created On       : Thu May  3 16:16:10 2018
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Fri May  4 14:34:08 2018
-// Update Count     : 3
-//
-
-#pragma once
-
-namespace HeapStats {
-	void newPass( const char * const name );
-	void printStats();
-}
Index: src/Common/Stats.h
===================================================================
--- src/Common/Stats.h	(revision 0050a5ff3fdf8bc520652ac831418c77148183f4)
+++ src/Common/Stats.h	(revision 0050a5ff3fdf8bc520652ac831418c77148183f4)
@@ -0,0 +1,19 @@
+//
+// Cforall Version 1.0.0 Copyright (C) 2019 University of Waterloo
+//
+// The contents of this file are covered under the licence agreement in the
+// file "LICENCE" distributed with Cforall.
+//
+// Heap.h --
+//
+// Author           : Thierry Delisle
+// Created On       : Thu Feb 28 11::27:10 2019
+// Last Modified By :
+// Last Modified On :
+// Update Count     :
+//
+
+#pragma once
+
+#include "Common/Stats/Counter.h"
+#include "Common/Stats/Heap.h"
Index: src/Common/Stats/Counter.cc
===================================================================
--- src/Common/Stats/Counter.cc	(revision 0050a5ff3fdf8bc520652ac831418c77148183f4)
+++ src/Common/Stats/Counter.cc	(revision 0050a5ff3fdf8bc520652ac831418c77148183f4)
@@ -0,0 +1,68 @@
+//
+// Cforall Version 1.0.0 Copyright (C) 2019 University of Waterloo
+//
+// The contents of this file are covered under the licence agreement in the
+// file "LICENCE" distributed with Cforall.
+//
+// Heap.h --
+//
+// Author           : Thierry Delisle
+// Created On       : Thu Feb 28 13::27:10 2019
+// Last Modified By :
+// Last Modified On :
+// Update Count     :
+//
+
+#include "Counter.h"
+
+#include <algorithm>
+#include <cstring>
+#include <iomanip>
+
+namespace Stats {
+	namespace Counters {
+
+		template<typename T>
+		void ForAllCounters(BaseCounter::list_t & range, size_t level, T func) {
+			auto it = range.head;
+			while(it) {
+				auto next = it->next;
+				func(it, level);
+				ForAllCounters(it->children, level + 1, func);
+				it = next;
+			}
+		}
+
+		void print() {
+			if(!BaseCounter::top.head) return;
+			size_t nc = 0;
+			ForAllCounters(BaseCounter::top, 0, [&](BaseCounter * node, size_t level) {
+				nc = std::max(nc, (4 * level) + std::strlen(node->name));
+			});
+
+			const char * const title = "Counter Statistic";
+			size_t nct = nc + 14;
+			std::cerr << std::string(nct, '=') << std::endl;
+			std::cerr << std::string((nct - std::strlen(title)) / 2, ' ');
+			std::cerr << title << std::endl;
+			std::cerr << std::string(nct, '-') << std::endl;
+
+
+			ForAllCounters(BaseCounter::top, 0, [&](BaseCounter * node, size_t level) {
+				std::cerr << std::string(level * 4, ' ');
+				std::cerr << node->name;
+				std::cerr << std::string(nc - ((level * 4) + std::strlen(node->name)), ' ');
+				std::cerr << " | ";
+				std::cerr << std::setw(9);
+				node->print(std::cerr);
+				std::cerr << " |";
+				std::cerr << '\n';
+				delete node;
+			});
+
+			std::cerr << std::string(nct, '-') << std::endl;
+		}
+
+		BaseCounter::list_t BaseCounter::top;
+	}
+}
Index: src/Common/Stats/Counter.h
===================================================================
--- src/Common/Stats/Counter.h	(revision 0050a5ff3fdf8bc520652ac831418c77148183f4)
+++ src/Common/Stats/Counter.h	(revision 0050a5ff3fdf8bc520652ac831418c77148183f4)
@@ -0,0 +1,152 @@
+//
+// Cforall Version 1.0.0 Copyright (C) 2019 University of Waterloo
+//
+// The contents of this file are covered under the licence agreement in the
+// file "LICENCE" distributed with Cforall.
+//
+// Heap.h --
+//
+// Author           : Thierry Delisle
+// Created On       : Thu Feb 28 12::05:10 2019
+// Last Modified By :
+// Last Modified On :
+// Update Count     :
+//
+
+#pragma once
+
+#include <cstdint>
+#include <iostream>
+
+namespace Stats {
+	namespace Counters {
+		void print();
+
+		class BaseCounter {
+		public:
+			BaseCounter(const char * const name) : name(name) {
+				top.append(this);
+			}
+
+			BaseCounter(const char * const name, BaseCounter * parent) : name(name) {
+				parent->children.append(this);
+			}
+		protected:
+			virtual ~BaseCounter() = default;
+
+			struct list_t {
+				BaseCounter * head = nullptr;
+				BaseCounter * tail = nullptr;
+
+				void append(BaseCounter * node) {
+					if(!head) { head = node; }
+					else      { tail->next = node;}
+					tail = node;
+				}
+			};
+
+		private:
+			virtual void print(std::ostream &) = 0;
+			template<typename T>
+			friend void ForAllCounters(BaseCounter::list_t &, size_t, T );
+			friend void print();
+
+		private:
+			const char * const name;
+
+			BaseCounter * next = nullptr;
+			list_t children;
+
+			static list_t top;
+		};
+
+		class CounterGroup : public BaseCounter {
+		public:
+			CounterGroup(const char * const name ) : BaseCounter(name) {}
+			CounterGroup(const char * const name, BaseCounter * parent) : BaseCounter(name, parent) {}
+
+		protected:
+			virtual ~CounterGroup() = default;
+
+		private:
+			virtual void print(std::ostream & os) {
+				os << "";
+			}
+			template<typename T>
+			friend void ForAllCounters(BaseCounter::list_t &, size_t, T );
+			friend void print();
+		};
+
+		class SimpleCounter : public BaseCounter {
+		public:
+			SimpleCounter(const char * const name ) : BaseCounter(name) {}
+			SimpleCounter(const char * const name, BaseCounter * parent) : BaseCounter(name, parent) {}
+
+			inline void operator++(int)          { count++;        }
+			inline void operator+=(size_t value) { count += value; }
+		protected:
+			virtual ~SimpleCounter() = default;
+
+		private:
+			virtual void print(std::ostream & os) {
+				os << count;
+			}
+			template<typename T>
+			friend void ForAllCounters(BaseCounter::list_t &, size_t, T );
+			friend void print();
+
+			size_t count = 0;
+
+		};
+
+		template<typename T>
+		class AverageCounter : public BaseCounter {
+		public:
+			AverageCounter(const char * const name ) : BaseCounter(name), sum{} {}
+			AverageCounter(const char * const name, BaseCounter * parent) : BaseCounter(name, parent), sum{} {}
+
+			inline void push(T value) {
+				sum += value;
+				count++;
+			}
+
+		protected:
+			virtual ~AverageCounter() = default;
+
+		private:
+			virtual void print(std::ostream & os) {
+				os << sum / count;
+			}
+			template<typename F>
+			friend void ForAllCounters(BaseCounter::list_t &, size_t, F );
+			friend void print();
+
+			T sum;
+			size_t count = 1;
+		};
+
+		template<typename T>
+		class MaxCounter : public BaseCounter {
+		public:
+			MaxCounter(const char * const name ) : BaseCounter(name), max{} {}
+			MaxCounter(const char * const name, BaseCounter * parent) : BaseCounter(name, parent), max{} {}
+
+			inline void push(T value) {
+				max = std::max(max, value);
+			}
+
+		protected:
+			virtual ~MaxCounter() = default;
+
+		private:
+			virtual void print(std::ostream & os) {
+				os << max;
+			}
+			template<typename F>
+			friend void ForAllCounters(BaseCounter::list_t &, size_t, F );
+			friend void print();
+
+			T max;
+		};
+	}
+}
Index: src/Common/Stats/Heap.cc
===================================================================
--- src/Common/Stats/Heap.cc	(revision 0050a5ff3fdf8bc520652ac831418c77148183f4)
+++ src/Common/Stats/Heap.cc	(revision 0050a5ff3fdf8bc520652ac831418c77148183f4)
@@ -0,0 +1,209 @@
+//
+// Cforall Version 1.0.0 Copyright (C) 2018 University of Waterloo
+//
+// The contents of this file are covered under the licence agreement in the
+// file "LICENCE" distributed with Cforall.
+//
+// Heap.cc --
+//
+// Author           : Thierry Delisle
+// Created On       : Thu May  3 16:16:10 2018
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Fri May  4 17:27:31 2018
+// Update Count     : 28
+//
+
+#include <cassert>
+#include <cmath>
+#include <cstddef>
+#include <cstring>
+#include <iomanip>
+#include <iostream>
+
+namespace Stats {
+	namespace Heap {
+#if defined( NO_HEAP_STATISTICS )
+		void newPass( const char * const ) {}
+
+		void print() {}
+#else
+		struct StatBlock {
+			const char * name  = nullptr;	///< Name of this pass
+			size_t mallocs     = 0;			///< Allocations in this pass
+			size_t frees       = 0;			///< Frees in this pass
+			size_t n_allocs    = 0;			///< Current number of live allocations
+			size_t peak_allocs = 0;			///< Peak number of live allocations this pass
+		};
+
+		StatBlock    passes[100] = {{ "Pre-Parse", 0, 0, 0, 0 }};
+		const size_t passes_size = sizeof(passes) / sizeof(passes[0]);
+		size_t       passes_cnt = 1;
+
+		void newPass( const char * const name ) {
+			passes[passes_cnt].name    = name;
+			passes[passes_cnt].mallocs = 0;
+			passes[passes_cnt].frees   = 0;
+			passes[passes_cnt].n_allocs
+				= passes[passes_cnt].peak_allocs
+				= passes[passes_cnt-1].n_allocs;
+			passes_cnt++;
+
+			assertf(passes_cnt < passes_size, "Too many passes for Stats::Heap, increase the size of the array in Heap.cc");
+		}
+
+		void print(size_t value, size_t total) {
+			std::cerr << std::setw(12) << value;
+			std::cerr << "(" << std::setw(3);
+			std::cerr << (value == 0 ? 0 : value * 100 / total);
+			std::cerr << "%) | ";
+		}
+
+		void print(const StatBlock& stat, size_t nc, size_t total_mallocs, size_t total_frees, size_t overall_peak) {
+			std::cerr << std::setw(nc) << stat.name;
+			std::cerr << " | ";
+
+			print(stat.mallocs,     total_mallocs);
+			print(stat.frees,       total_frees  );
+			print(stat.peak_allocs, overall_peak );
+			std::cerr << "\n";
+		}
+
+		void print(char c, size_t nc) {
+			for(size_t i = 0; i < nc; i++) {
+				std::cerr << c;
+			}
+			std::cerr << '\n';
+		}
+
+		void print() {
+			size_t nc = 0;
+			size_t total_mallocs = 0;
+			size_t total_frees   = 0;
+			size_t overall_peak  = 0;
+			for(size_t i = 0; i < passes_cnt; i++) {
+				nc = std::max(nc, std::strlen(passes[i].name));
+				total_mallocs += passes[i].mallocs;
+				total_frees   += passes[i].frees;
+				overall_peak = std::max(overall_peak, passes[i].peak_allocs);
+			}
+			size_t nct = nc + 65;
+
+			const char * const title = "Heap Usage Statistic";
+			print('=', nct);
+			for(size_t i = 0; i < (nct - std::strlen(title)) / 2; i++) std::cerr << ' ';
+			std::cerr << title << std::endl;
+			print('-', nct);
+			std::cerr << std::setw(nc) << "Pass";
+			std::cerr << " |       Malloc Count |         Free Count |        Peak Allocs |" << std::endl;
+
+			print('-', nct);
+			for(size_t i = 0; i < passes_cnt; i++) {
+				print(passes[i], nc, total_mallocs, total_frees, overall_peak);
+			}
+			print('-', nct);
+			print({"Sum", total_mallocs, total_frees, 0, overall_peak},
+				nc, total_mallocs, total_frees, overall_peak);
+
+		}
+
+#include <stdarg.h>
+#include <stddef.h>
+#include <stdio.h>
+#include <string.h>
+#include <unistd.h>
+#include <signal.h>
+		extern "C" {
+#include <dlfcn.h>
+#include <execinfo.h>
+		}
+
+	//=============================================================================================
+	// Interposing helpers
+	//=============================================================================================
+
+		typedef void (* generic_fptr_t)(void);
+		generic_fptr_t interpose_symbol( const char * symbol, const char * version ) {
+			const char * error;
+
+			static void * library;
+			if ( ! library ) {
+#				if defined( RTLD_NEXT )
+					library = RTLD_NEXT;
+#				else
+					// missing RTLD_NEXT => must hard-code library name, assuming libstdc++
+					library = dlopen( "libc.so.6", RTLD_LAZY );
+					error = dlerror();
+					if ( error ) {
+						std::cerr << "interpose_symbol : failed to open libc, " << error << std::endl;
+						abort();
+					}
+#				endif // RTLD_NEXT
+			} // if
+
+			generic_fptr_t fptr;
+
+#			if defined( _GNU_SOURCE )
+				if ( version ) {
+					fptr = (generic_fptr_t)dlvsym( library, symbol, version );
+				} else {
+					fptr = (generic_fptr_t)dlsym( library, symbol );
+				}
+#			else
+				fptr = (generic_fptr_t)dlsym( library, symbol );
+#			endif // _GNU_SOURCE
+
+			error = dlerror();
+			if ( error ) {
+				std::cerr << "interpose_symbol : internal error, " << error << std::endl;
+				abort();
+			}
+
+			return fptr;
+		}
+
+		extern "C" {
+			void * malloc( size_t size ) __attribute__((malloc));
+			void * malloc( size_t size ) {
+				static auto __malloc = reinterpret_cast<void * (*)(size_t)>(interpose_symbol( "malloc", nullptr ));
+				if( passes_cnt > 0 ) {
+					passes[passes_cnt - 1].mallocs++;
+					passes[passes_cnt - 1].n_allocs++;
+					passes[passes_cnt - 1].peak_allocs
+						= std::max(passes[passes_cnt - 1].peak_allocs, passes[passes_cnt - 1].n_allocs);
+				}
+				return __malloc( size );
+			}
+
+			void free( void * ptr ) {
+				static auto __free = reinterpret_cast<void   (*)(void *)>(interpose_symbol( "free", nullptr ));
+				if( passes_cnt > 0 ) {
+					passes[passes_cnt - 1].frees++;
+					passes[passes_cnt - 1].n_allocs--;
+				}
+				return __free( ptr );
+			}
+
+			void * calloc( size_t nelem, size_t size ) {
+				static auto __calloc = reinterpret_cast<void * (*)(size_t, size_t)>(interpose_symbol( "calloc", nullptr ));
+				if( passes_cnt > 0 ) {
+					passes[passes_cnt - 1].mallocs++;
+					passes[passes_cnt - 1].n_allocs++;
+					passes[passes_cnt - 1].peak_allocs
+						= std::max(passes[passes_cnt - 1].peak_allocs, passes[passes_cnt - 1].n_allocs);
+				}
+				return __calloc( nelem, size );
+			}
+
+			void * realloc( void * ptr, size_t size ) {
+				static auto __realloc = reinterpret_cast<void * (*)(void *, size_t)>(interpose_symbol( "realloc", nullptr ));
+				void * s = __realloc( ptr, size );
+				if ( s != ptr && passes_cnt > 0 ) {			// did realloc get new storage ?
+					passes[passes_cnt - 1].mallocs++;
+					passes[passes_cnt - 1].frees++;
+				} // if
+				return s;
+			}
+		}
+#endif
+	}
+}
Index: src/Common/Stats/Heap.h
===================================================================
--- src/Common/Stats/Heap.h	(revision 0050a5ff3fdf8bc520652ac831418c77148183f4)
+++ src/Common/Stats/Heap.h	(revision 0050a5ff3fdf8bc520652ac831418c77148183f4)
@@ -0,0 +1,23 @@
+//
+// Cforall Version 1.0.0 Copyright (C) 2018 University of Waterloo
+//
+// The contents of this file are covered under the licence agreement in the
+// file "LICENCE" distributed with Cforall.
+//
+// Heap.h --
+//
+// Author           : Thierry Delisle
+// Created On       : Thu May  3 16:16:10 2018
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Fri May  4 14:34:08 2018
+// Update Count     : 3
+//
+
+#pragma once
+
+namespace Stats {
+	namespace Heap {
+		void newPass( const char * const name );
+		void print();
+	}
+}
Index: src/Common/module.mk
===================================================================
--- src/Common/module.mk	(revision f56c32e54c020031f40ff50223fe09a667f86da8)
+++ src/Common/module.mk	(revision 0050a5ff3fdf8bc520652ac831418c77148183f4)
@@ -15,8 +15,12 @@
 ###############################################################################
 
-SRC += Common/SemanticError.cc \
-       Common/UniqueName.cc \
-       Common/DebugMalloc.cc \
-       Common/Assert.cc \
-       Common/Heap.cc \
-       Common/Eval.cc
+SRC_COMMON = \
+      Common/Assert.cc \
+      Common/Stats/Heap.cc \
+      Common/Stats/Counter.cc \
+      Common/Eval.cc \
+      Common/SemanticError.cc \
+      Common/UniqueName.cc
+
+SRC += $(SRC_COMMON) Common/DebugMalloc.cc
+SRCDEMANGLE += $(SRC_COMMON)
Index: src/CompilationState.cc
===================================================================
--- src/CompilationState.cc	(revision f56c32e54c020031f40ff50223fe09a667f86da8)
+++ src/CompilationState.cc	(revision 0050a5ff3fdf8bc520652ac831418c77148183f4)
@@ -38,5 +38,7 @@
 	codegenp = false,
 	prettycodegenp = false,
-	linemarks = false;
+	linemarks = false,
+	stats_heap = false,
+	stats_counters = false;
 
 // Local Variables: //
Index: src/CompilationState.h
===================================================================
--- src/CompilationState.h	(revision f56c32e54c020031f40ff50223fe09a667f86da8)
+++ src/CompilationState.h	(revision 0050a5ff3fdf8bc520652ac831418c77148183f4)
@@ -39,5 +39,7 @@
 	codegenp,
 	prettycodegenp,
-	linemarks;
+	linemarks,
+	stats_heap,
+	stats_counters;
 
 // is the compiler building prelude or libcfa?
Index: src/Concurrency/module.mk
===================================================================
--- src/Concurrency/module.mk	(revision f56c32e54c020031f40ff50223fe09a667f86da8)
+++ src/Concurrency/module.mk	(revision 0050a5ff3fdf8bc520652ac831418c77148183f4)
@@ -15,5 +15,5 @@
 ###############################################################################
 
-SRC += Concurrency/Keywords.cc \
-       Concurrency/Waitfor.cc
+SRC += Concurrency/Keywords.cc Concurrency/Waitfor.cc
+SRCDEMANGLE += Concurrency/Keywords.cc
 
Index: src/ControlStruct/module.mk
===================================================================
--- src/ControlStruct/module.mk	(revision f56c32e54c020031f40ff50223fe09a667f86da8)
+++ src/ControlStruct/module.mk	(revision 0050a5ff3fdf8bc520652ac831418c77148183f4)
@@ -15,8 +15,12 @@
 ###############################################################################
 
-SRC +=  ControlStruct/LabelGenerator.cc \
+SRC_CONTROLSTRUCT = \
+	ControlStruct/ForExprMutator.cc \
 	ControlStruct/LabelFixer.cc \
+	ControlStruct/LabelGenerator.cc \
 	ControlStruct/MLEMutator.cc \
-	ControlStruct/Mutate.cc \
-	ControlStruct/ForExprMutator.cc \
-	ControlStruct/ExceptTranslate.cc
+	ControlStruct/Mutate.cc
+
+SRC += $(SRC_CONTROLSTRUCT) ControlStruct/ExceptTranslate.cc
+SRCDEMANGLE += $(SRC_CONTROLSTRUCT)
+
Index: src/GenPoly/module.mk
===================================================================
--- src/GenPoly/module.mk	(revision f56c32e54c020031f40ff50223fe09a667f86da8)
+++ src/GenPoly/module.mk	(revision 0050a5ff3fdf8bc520652ac831418c77148183f4)
@@ -22,2 +22,5 @@
        GenPoly/FindFunction.cc \
        GenPoly/InstantiateGeneric.cc
+
+SRCDEMANGLE += GenPoly/GenPoly.cc GenPoly/Lvalue.cc
+
Index: src/InitTweak/module.mk
===================================================================
--- src/InitTweak/module.mk	(revision f56c32e54c020031f40ff50223fe09a667f86da8)
+++ src/InitTweak/module.mk	(revision 0050a5ff3fdf8bc520652ac831418c77148183f4)
@@ -20,2 +20,5 @@
 	InitTweak/InitTweak.cc
 
+SRCDEMANGLE += InitTweak/GenInit.cc \
+	InitTweak/InitTweak.cc
+
Index: src/Makefile.am
===================================================================
--- src/Makefile.am	(revision f56c32e54c020031f40ff50223fe09a667f86da8)
+++ src/Makefile.am	(revision 0050a5ff3fdf8bc520652ac831418c77148183f4)
@@ -20,6 +20,8 @@
 
 SRC = main.cc \
-			MakeLibCfa.cc \
-			CompilationState.cc
+      MakeLibCfa.cc \
+      CompilationState.cc
+
+SRCDEMANGLE = CompilationState.cc
 
 MAINTAINERCLEANFILES =
@@ -60,91 +62,8 @@
 demangler_SOURCES = SymTab/demangler.cc
 
-demangler_LDADD = libdemangle.a			# yywrap
+demangler_LDADD = libdemangle.a -ldl			# yywrap
 
 noinst_LIBRARIES = libdemangle.a
-libdemangle_a_SOURCES = SymTab/Demangle.cc SymTab/ManglerCommon.cc \
-	SynTree/Type.cc \
-	SynTree/VoidType.cc \
-	SynTree/BasicType.cc \
-	SynTree/PointerType.cc \
-	SynTree/ArrayType.cc \
-	SynTree/ReferenceType.cc \
-	SynTree/FunctionType.cc \
-	SynTree/ReferenceToType.cc \
-	SynTree/TupleType.cc \
-	SynTree/TypeofType.cc \
-	SynTree/AttrType.cc \
-	SynTree/VarArgsType.cc \
-	SynTree/ZeroOneType.cc \
-	SynTree/Constant.cc \
-	SynTree/Expression.cc \
-	SynTree/TupleExpr.cc \
-	SynTree/CommaExpr.cc \
-	SynTree/TypeExpr.cc \
-	SynTree/ApplicationExpr.cc \
-	SynTree/AddressExpr.cc \
-	SynTree/Statement.cc \
-	SynTree/CompoundStmt.cc \
-	SynTree/DeclStmt.cc \
-	SynTree/Declaration.cc \
-	SynTree/DeclarationWithType.cc \
-	SynTree/ObjectDecl.cc \
-	SynTree/FunctionDecl.cc \
-	SynTree/AggregateDecl.cc \
-	SynTree/NamedTypeDecl.cc \
-	SynTree/TypeDecl.cc \
-	SynTree/Initializer.cc \
-	SynTree/TypeSubstitution.cc \
-	SynTree/Attribute.cc \
-	SynTree/DeclReplacer.cc \
-	CompilationState.cc \
-	CodeGen/CodeGenerator.cc \
-	CodeGen/FixMain.cc \
-	CodeGen/GenType.cc \
-	CodeGen/OperatorTable.cc \
-	Common/Assert.cc \
-	Common/Eval.cc \
-	Common/SemanticError.cc \
-	Common/UniqueName.cc \
-	Concurrency/Keywords.cc \
-	ControlStruct/ForExprMutator.cc \
-	ControlStruct/LabelFixer.cc \
-	ControlStruct/LabelGenerator.cc \
-	ControlStruct/MLEMutator.cc \
-	ControlStruct/Mutate.cc \
-	GenPoly/GenPoly.cc \
-	GenPoly/Lvalue.cc \
-	InitTweak/GenInit.cc \
-	InitTweak/InitTweak.cc \
-	Parser/LinkageSpec.cc \
-	ResolvExpr/AdjustExprType.cc \
-	ResolvExpr/Alternative.cc \
-	ResolvExpr/AlternativeFinder.cc \
-	ResolvExpr/ExplodedActual.cc \
-	ResolvExpr/CastCost.cc \
-	ResolvExpr/CommonType.cc \
-	ResolvExpr/ConversionCost.cc \
-	ResolvExpr/CurrentObject.cc \
-	ResolvExpr/FindOpenVars.cc \
-	ResolvExpr/Occurs.cc \
-	ResolvExpr/PolyCost.cc \
-	ResolvExpr/PtrsAssignable.cc \
-	ResolvExpr/PtrsCastable.cc \
-	ResolvExpr/RenameVars.cc \
-	ResolvExpr/ResolveAssertions.cc \
-	ResolvExpr/Resolver.cc \
-	ResolvExpr/ResolveTypeof.cc \
-	ResolvExpr/SpecCost.cc \
-	ResolvExpr/TypeEnvironment.cc \
-	ResolvExpr/Unify.cc \
-	SymTab/Autogen.cc \
-	SymTab/FixFunction.cc \
-	SymTab/Indexer.cc \
-	SymTab/Mangler.cc \
-	SymTab/Validate.cc \
-	Tuples/Explode.cc \
-	Tuples/TupleAssignment.cc \
-	Tuples/TupleExpansion.cc \
-	Validate/HandleAttributes.cc
+libdemangle_a_SOURCES = $(SRCDEMANGLE)
 
 MAINTAINERCLEANFILES += ${libdir}/${notdir ${cfa_cpplib_PROGRAMS}}
Index: src/Makefile.in
===================================================================
--- src/Makefile.in	(revision f56c32e54c020031f40ff50223fe09a667f86da8)
+++ src/Makefile.in	(revision 0050a5ff3fdf8bc520652ac831418c77148183f4)
@@ -162,44 +162,22 @@
 libdemangle_a_LIBADD =
 am__dirstamp = $(am__leading_dot)dirstamp
-am_libdemangle_a_OBJECTS = SymTab/Demangle.$(OBJEXT) \
-	SymTab/ManglerCommon.$(OBJEXT) SynTree/Type.$(OBJEXT) \
-	SynTree/VoidType.$(OBJEXT) SynTree/BasicType.$(OBJEXT) \
-	SynTree/PointerType.$(OBJEXT) SynTree/ArrayType.$(OBJEXT) \
-	SynTree/ReferenceType.$(OBJEXT) SynTree/FunctionType.$(OBJEXT) \
-	SynTree/ReferenceToType.$(OBJEXT) SynTree/TupleType.$(OBJEXT) \
-	SynTree/TypeofType.$(OBJEXT) SynTree/AttrType.$(OBJEXT) \
-	SynTree/VarArgsType.$(OBJEXT) SynTree/ZeroOneType.$(OBJEXT) \
-	SynTree/Constant.$(OBJEXT) SynTree/Expression.$(OBJEXT) \
-	SynTree/TupleExpr.$(OBJEXT) SynTree/CommaExpr.$(OBJEXT) \
-	SynTree/TypeExpr.$(OBJEXT) SynTree/ApplicationExpr.$(OBJEXT) \
-	SynTree/AddressExpr.$(OBJEXT) SynTree/Statement.$(OBJEXT) \
-	SynTree/CompoundStmt.$(OBJEXT) SynTree/DeclStmt.$(OBJEXT) \
-	SynTree/Declaration.$(OBJEXT) \
-	SynTree/DeclarationWithType.$(OBJEXT) \
-	SynTree/ObjectDecl.$(OBJEXT) SynTree/FunctionDecl.$(OBJEXT) \
-	SynTree/AggregateDecl.$(OBJEXT) \
-	SynTree/NamedTypeDecl.$(OBJEXT) SynTree/TypeDecl.$(OBJEXT) \
-	SynTree/Initializer.$(OBJEXT) \
-	SynTree/TypeSubstitution.$(OBJEXT) SynTree/Attribute.$(OBJEXT) \
-	SynTree/DeclReplacer.$(OBJEXT) CompilationState.$(OBJEXT) \
-	CodeGen/CodeGenerator.$(OBJEXT) CodeGen/FixMain.$(OBJEXT) \
-	CodeGen/GenType.$(OBJEXT) CodeGen/OperatorTable.$(OBJEXT) \
-	Common/Assert.$(OBJEXT) Common/Eval.$(OBJEXT) \
-	Common/SemanticError.$(OBJEXT) Common/UniqueName.$(OBJEXT) \
-	Concurrency/Keywords.$(OBJEXT) \
-	ControlStruct/ForExprMutator.$(OBJEXT) \
+am__objects_1 = CodeGen/CodeGenerator.$(OBJEXT) \
+	CodeGen/FixMain.$(OBJEXT) CodeGen/GenType.$(OBJEXT) \
+	CodeGen/OperatorTable.$(OBJEXT)
+am__objects_2 = Common/Assert.$(OBJEXT) Common/Stats/Heap.$(OBJEXT) \
+	Common/Stats/Counter.$(OBJEXT) Common/Eval.$(OBJEXT) \
+	Common/SemanticError.$(OBJEXT) Common/UniqueName.$(OBJEXT)
+am__objects_3 = ControlStruct/ForExprMutator.$(OBJEXT) \
 	ControlStruct/LabelFixer.$(OBJEXT) \
 	ControlStruct/LabelGenerator.$(OBJEXT) \
 	ControlStruct/MLEMutator.$(OBJEXT) \
-	ControlStruct/Mutate.$(OBJEXT) GenPoly/GenPoly.$(OBJEXT) \
-	GenPoly/Lvalue.$(OBJEXT) InitTweak/GenInit.$(OBJEXT) \
-	InitTweak/InitTweak.$(OBJEXT) Parser/LinkageSpec.$(OBJEXT) \
-	ResolvExpr/AdjustExprType.$(OBJEXT) \
+	ControlStruct/Mutate.$(OBJEXT)
+am__objects_4 = ResolvExpr/AdjustExprType.$(OBJEXT) \
 	ResolvExpr/Alternative.$(OBJEXT) \
 	ResolvExpr/AlternativeFinder.$(OBJEXT) \
-	ResolvExpr/ExplodedActual.$(OBJEXT) \
 	ResolvExpr/CastCost.$(OBJEXT) ResolvExpr/CommonType.$(OBJEXT) \
 	ResolvExpr/ConversionCost.$(OBJEXT) \
 	ResolvExpr/CurrentObject.$(OBJEXT) \
+	ResolvExpr/ExplodedActual.$(OBJEXT) \
 	ResolvExpr/FindOpenVars.$(OBJEXT) ResolvExpr/Occurs.$(OBJEXT) \
 	ResolvExpr/PolyCost.$(OBJEXT) \
@@ -212,64 +190,9 @@
 	ResolvExpr/SpecCost.$(OBJEXT) \
 	ResolvExpr/TypeEnvironment.$(OBJEXT) \
-	ResolvExpr/Unify.$(OBJEXT) SymTab/Autogen.$(OBJEXT) \
-	SymTab/FixFunction.$(OBJEXT) SymTab/Indexer.$(OBJEXT) \
-	SymTab/Mangler.$(OBJEXT) SymTab/Validate.$(OBJEXT) \
-	Tuples/Explode.$(OBJEXT) Tuples/TupleAssignment.$(OBJEXT) \
-	Tuples/TupleExpansion.$(OBJEXT) \
-	Validate/HandleAttributes.$(OBJEXT)
-libdemangle_a_OBJECTS = $(am_libdemangle_a_OBJECTS)
-am__installdirs = "$(DESTDIR)$(cfa_cpplibdir)"
-PROGRAMS = $(cfa_cpplib_PROGRAMS)
-am__objects_1 = main.$(OBJEXT) MakeLibCfa.$(OBJEXT) \
-	CompilationState.$(OBJEXT) CodeGen/Generate.$(OBJEXT) \
-	CodeGen/CodeGenerator.$(OBJEXT) CodeGen/GenType.$(OBJEXT) \
-	CodeGen/FixNames.$(OBJEXT) CodeGen/FixMain.$(OBJEXT) \
-	CodeGen/OperatorTable.$(OBJEXT) CodeTools/DeclStats.$(OBJEXT) \
-	CodeTools/ResolvProtoDump.$(OBJEXT) \
-	CodeTools/TrackLoc.$(OBJEXT) Concurrency/Keywords.$(OBJEXT) \
-	Concurrency/Waitfor.$(OBJEXT) Common/SemanticError.$(OBJEXT) \
-	Common/UniqueName.$(OBJEXT) Common/DebugMalloc.$(OBJEXT) \
-	Common/Assert.$(OBJEXT) Common/Heap.$(OBJEXT) \
-	Common/Eval.$(OBJEXT) ControlStruct/LabelGenerator.$(OBJEXT) \
-	ControlStruct/LabelFixer.$(OBJEXT) \
-	ControlStruct/MLEMutator.$(OBJEXT) \
-	ControlStruct/Mutate.$(OBJEXT) \
-	ControlStruct/ForExprMutator.$(OBJEXT) \
-	ControlStruct/ExceptTranslate.$(OBJEXT) GenPoly/Box.$(OBJEXT) \
-	GenPoly/GenPoly.$(OBJEXT) GenPoly/ScrubTyVars.$(OBJEXT) \
-	GenPoly/Lvalue.$(OBJEXT) GenPoly/Specialize.$(OBJEXT) \
-	GenPoly/FindFunction.$(OBJEXT) \
-	GenPoly/InstantiateGeneric.$(OBJEXT) \
-	InitTweak/GenInit.$(OBJEXT) InitTweak/FixInit.$(OBJEXT) \
-	InitTweak/FixGlobalInit.$(OBJEXT) \
-	InitTweak/InitTweak.$(OBJEXT) Parser/parser.$(OBJEXT) \
-	Parser/lex.$(OBJEXT) Parser/TypedefTable.$(OBJEXT) \
-	Parser/ParseNode.$(OBJEXT) Parser/DeclarationNode.$(OBJEXT) \
-	Parser/ExpressionNode.$(OBJEXT) Parser/StatementNode.$(OBJEXT) \
-	Parser/InitializerNode.$(OBJEXT) Parser/TypeData.$(OBJEXT) \
-	Parser/LinkageSpec.$(OBJEXT) Parser/parserutility.$(OBJEXT) \
-	ResolvExpr/AlternativeFinder.$(OBJEXT) \
-	ResolvExpr/Alternative.$(OBJEXT) ResolvExpr/Unify.$(OBJEXT) \
-	ResolvExpr/PtrsAssignable.$(OBJEXT) \
-	ResolvExpr/CommonType.$(OBJEXT) \
-	ResolvExpr/ConversionCost.$(OBJEXT) \
-	ResolvExpr/CastCost.$(OBJEXT) \
-	ResolvExpr/PtrsCastable.$(OBJEXT) \
-	ResolvExpr/AdjustExprType.$(OBJEXT) \
-	ResolvExpr/AlternativePrinter.$(OBJEXT) \
-	ResolvExpr/Resolver.$(OBJEXT) \
-	ResolvExpr/ResolveTypeof.$(OBJEXT) \
-	ResolvExpr/RenameVars.$(OBJEXT) \
-	ResolvExpr/FindOpenVars.$(OBJEXT) \
-	ResolvExpr/PolyCost.$(OBJEXT) ResolvExpr/Occurs.$(OBJEXT) \
-	ResolvExpr/TypeEnvironment.$(OBJEXT) \
-	ResolvExpr/CurrentObject.$(OBJEXT) \
-	ResolvExpr/ExplodedActual.$(OBJEXT) \
-	ResolvExpr/SpecCost.$(OBJEXT) \
-	ResolvExpr/ResolveAssertions.$(OBJEXT) \
+	ResolvExpr/Unify.$(OBJEXT)
+am__objects_5 = SymTab/Autogen.$(OBJEXT) SymTab/FixFunction.$(OBJEXT) \
 	SymTab/Indexer.$(OBJEXT) SymTab/Mangler.$(OBJEXT) \
-	SymTab/ManglerCommon.$(OBJEXT) SymTab/Validate.$(OBJEXT) \
-	SymTab/FixFunction.$(OBJEXT) SymTab/Autogen.$(OBJEXT) \
-	SynTree/Type.$(OBJEXT) SynTree/VoidType.$(OBJEXT) \
+	SymTab/ManglerCommon.$(OBJEXT) SymTab/Validate.$(OBJEXT)
+am__objects_6 = SynTree/Type.$(OBJEXT) SynTree/VoidType.$(OBJEXT) \
 	SynTree/BasicType.$(OBJEXT) SynTree/PointerType.$(OBJEXT) \
 	SynTree/ArrayType.$(OBJEXT) SynTree/ReferenceType.$(OBJEXT) \
@@ -290,10 +213,46 @@
 	SynTree/Initializer.$(OBJEXT) \
 	SynTree/TypeSubstitution.$(OBJEXT) SynTree/Attribute.$(OBJEXT) \
-	SynTree/DeclReplacer.$(OBJEXT) \
+	SynTree/DeclReplacer.$(OBJEXT)
+am__objects_7 = CompilationState.$(OBJEXT) $(am__objects_1) \
+	Concurrency/Keywords.$(OBJEXT) $(am__objects_2) \
+	$(am__objects_3) GenPoly/GenPoly.$(OBJEXT) \
+	GenPoly/Lvalue.$(OBJEXT) InitTweak/GenInit.$(OBJEXT) \
+	InitTweak/InitTweak.$(OBJEXT) Parser/LinkageSpec.$(OBJEXT) \
+	$(am__objects_4) $(am__objects_5) SymTab/Demangle.$(OBJEXT) \
+	$(am__objects_6) Tuples/TupleAssignment.$(OBJEXT) \
+	Tuples/TupleExpansion.$(OBJEXT) Tuples/Explode.$(OBJEXT) \
+	Validate/HandleAttributes.$(OBJEXT)
+am_libdemangle_a_OBJECTS = $(am__objects_7)
+libdemangle_a_OBJECTS = $(am_libdemangle_a_OBJECTS)
+am__installdirs = "$(DESTDIR)$(cfa_cpplibdir)"
+PROGRAMS = $(cfa_cpplib_PROGRAMS)
+am__objects_8 = main.$(OBJEXT) MakeLibCfa.$(OBJEXT) \
+	CompilationState.$(OBJEXT) $(am__objects_1) \
+	CodeGen/Generate.$(OBJEXT) CodeGen/FixNames.$(OBJEXT) \
+	CodeTools/DeclStats.$(OBJEXT) \
+	CodeTools/ResolvProtoDump.$(OBJEXT) \
+	CodeTools/TrackLoc.$(OBJEXT) Concurrency/Keywords.$(OBJEXT) \
+	Concurrency/Waitfor.$(OBJEXT) $(am__objects_2) \
+	Common/DebugMalloc.$(OBJEXT) $(am__objects_3) \
+	ControlStruct/ExceptTranslate.$(OBJEXT) GenPoly/Box.$(OBJEXT) \
+	GenPoly/GenPoly.$(OBJEXT) GenPoly/ScrubTyVars.$(OBJEXT) \
+	GenPoly/Lvalue.$(OBJEXT) GenPoly/Specialize.$(OBJEXT) \
+	GenPoly/FindFunction.$(OBJEXT) \
+	GenPoly/InstantiateGeneric.$(OBJEXT) \
+	InitTweak/GenInit.$(OBJEXT) InitTweak/FixInit.$(OBJEXT) \
+	InitTweak/FixGlobalInit.$(OBJEXT) \
+	InitTweak/InitTweak.$(OBJEXT) Parser/parser.$(OBJEXT) \
+	Parser/lex.$(OBJEXT) Parser/TypedefTable.$(OBJEXT) \
+	Parser/ParseNode.$(OBJEXT) Parser/DeclarationNode.$(OBJEXT) \
+	Parser/ExpressionNode.$(OBJEXT) Parser/StatementNode.$(OBJEXT) \
+	Parser/InitializerNode.$(OBJEXT) Parser/TypeData.$(OBJEXT) \
+	Parser/LinkageSpec.$(OBJEXT) Parser/parserutility.$(OBJEXT) \
+	$(am__objects_4) ResolvExpr/AlternativePrinter.$(OBJEXT) \
+	$(am__objects_5) $(am__objects_6) \
 	Tuples/TupleAssignment.$(OBJEXT) \
 	Tuples/TupleExpansion.$(OBJEXT) Tuples/Explode.$(OBJEXT) \
 	Validate/HandleAttributes.$(OBJEXT) \
 	Virtual/ExpandCasts.$(OBJEXT)
-am____driver_cfa_cpp_OBJECTS = $(am__objects_1)
+am____driver_cfa_cpp_OBJECTS = $(am__objects_8)
 ___driver_cfa_cpp_OBJECTS = $(am____driver_cfa_cpp_OBJECTS)
 ___driver_cfa_cpp_DEPENDENCIES =
@@ -563,15 +522,9 @@
 AUTOMAKE_OPTIONS = foreign subdir-objects
 ACLOCAL_AMFLAGS = -I automake
-SRC = main.cc MakeLibCfa.cc CompilationState.cc CodeGen/Generate.cc \
-	CodeGen/CodeGenerator.cc CodeGen/GenType.cc \
-	CodeGen/FixNames.cc CodeGen/FixMain.cc \
-	CodeGen/OperatorTable.cc CodeTools/DeclStats.cc \
+SRC = main.cc MakeLibCfa.cc CompilationState.cc $(SRC_CODEGEN) \
+	CodeGen/Generate.cc CodeGen/FixNames.cc CodeTools/DeclStats.cc \
 	CodeTools/ResolvProtoDump.cc CodeTools/TrackLoc.cc \
-	Concurrency/Keywords.cc Concurrency/Waitfor.cc \
-	Common/SemanticError.cc Common/UniqueName.cc \
-	Common/DebugMalloc.cc Common/Assert.cc Common/Heap.cc \
-	Common/Eval.cc ControlStruct/LabelGenerator.cc \
-	ControlStruct/LabelFixer.cc ControlStruct/MLEMutator.cc \
-	ControlStruct/Mutate.cc ControlStruct/ForExprMutator.cc \
+	Concurrency/Keywords.cc Concurrency/Waitfor.cc $(SRC_COMMON) \
+	Common/DebugMalloc.cc $(SRC_CONTROLSTRUCT) \
 	ControlStruct/ExceptTranslate.cc GenPoly/Box.cc \
 	GenPoly/GenPoly.cc GenPoly/ScrubTyVars.cc GenPoly/Lvalue.cc \
@@ -584,41 +537,108 @@
 	Parser/StatementNode.cc Parser/InitializerNode.cc \
 	Parser/TypeData.cc Parser/LinkageSpec.cc \
-	Parser/parserutility.cc ResolvExpr/AlternativeFinder.cc \
-	ResolvExpr/Alternative.cc ResolvExpr/Unify.cc \
-	ResolvExpr/PtrsAssignable.cc ResolvExpr/CommonType.cc \
-	ResolvExpr/ConversionCost.cc ResolvExpr/CastCost.cc \
-	ResolvExpr/PtrsCastable.cc ResolvExpr/AdjustExprType.cc \
-	ResolvExpr/AlternativePrinter.cc ResolvExpr/Resolver.cc \
-	ResolvExpr/ResolveTypeof.cc ResolvExpr/RenameVars.cc \
-	ResolvExpr/FindOpenVars.cc ResolvExpr/PolyCost.cc \
-	ResolvExpr/Occurs.cc ResolvExpr/TypeEnvironment.cc \
-	ResolvExpr/CurrentObject.cc ResolvExpr/ExplodedActual.cc \
-	ResolvExpr/SpecCost.cc ResolvExpr/ResolveAssertions.cc \
-	SymTab/Indexer.cc SymTab/Mangler.cc SymTab/ManglerCommon.cc \
-	SymTab/Validate.cc SymTab/FixFunction.cc SymTab/Autogen.cc \
-	SynTree/Type.cc SynTree/VoidType.cc SynTree/BasicType.cc \
-	SynTree/PointerType.cc SynTree/ArrayType.cc \
-	SynTree/ReferenceType.cc SynTree/FunctionType.cc \
-	SynTree/ReferenceToType.cc SynTree/TupleType.cc \
-	SynTree/TypeofType.cc SynTree/AttrType.cc \
-	SynTree/VarArgsType.cc SynTree/ZeroOneType.cc \
-	SynTree/Constant.cc SynTree/Expression.cc SynTree/TupleExpr.cc \
-	SynTree/CommaExpr.cc SynTree/TypeExpr.cc \
-	SynTree/ApplicationExpr.cc SynTree/AddressExpr.cc \
-	SynTree/Statement.cc SynTree/CompoundStmt.cc \
-	SynTree/DeclStmt.cc SynTree/Declaration.cc \
-	SynTree/DeclarationWithType.cc SynTree/ObjectDecl.cc \
-	SynTree/FunctionDecl.cc SynTree/AggregateDecl.cc \
-	SynTree/NamedTypeDecl.cc SynTree/TypeDecl.cc \
-	SynTree/Initializer.cc SynTree/TypeSubstitution.cc \
-	SynTree/Attribute.cc SynTree/DeclReplacer.cc \
+	Parser/parserutility.cc $(SRC_RESOLVEXPR) \
+	ResolvExpr/AlternativePrinter.cc $(SRC_SYMTAB) $(SRC_SYNTREE) \
 	Tuples/TupleAssignment.cc Tuples/TupleExpansion.cc \
 	Tuples/Explode.cc Validate/HandleAttributes.cc \
 	Virtual/ExpandCasts.cc
+SRCDEMANGLE = CompilationState.cc $(SRC_CODEGEN) \
+	Concurrency/Keywords.cc $(SRC_COMMON) $(SRC_CONTROLSTRUCT) \
+	GenPoly/GenPoly.cc GenPoly/Lvalue.cc InitTweak/GenInit.cc \
+	InitTweak/InitTweak.cc Parser/LinkageSpec.cc $(SRC_RESOLVEXPR) \
+	$(SRC_SYMTAB) SymTab/Demangle.cc $(SRC_SYNTREE) \
+	Tuples/TupleAssignment.cc Tuples/TupleExpansion.cc \
+	Tuples/Explode.cc Validate/HandleAttributes.cc
 MAINTAINERCLEANFILES = ${libdir}/${notdir ${cfa_cpplib_PROGRAMS}}
 MOSTLYCLEANFILES = Parser/lex.cc Parser/parser.cc Parser/parser.hh \
 	Parser/parser.output
+SRC_CODEGEN = \
+	CodeGen/CodeGenerator.cc \
+	CodeGen/FixMain.cc \
+	CodeGen/GenType.cc \
+	CodeGen/OperatorTable.cc
+
+SRC_COMMON = \
+      Common/Assert.cc \
+      Common/Stats/Heap.cc \
+      Common/Stats/Counter.cc \
+      Common/Eval.cc \
+      Common/SemanticError.cc \
+      Common/UniqueName.cc
+
+SRC_CONTROLSTRUCT = \
+	ControlStruct/ForExprMutator.cc \
+	ControlStruct/LabelFixer.cc \
+	ControlStruct/LabelGenerator.cc \
+	ControlStruct/MLEMutator.cc \
+	ControlStruct/Mutate.cc
+
 BUILT_SOURCES = Parser/parser.hh
 AM_YFLAGS = -d -t -v
+SRC_RESOLVEXPR = \
+      ResolvExpr/AdjustExprType.cc \
+      ResolvExpr/Alternative.cc \
+      ResolvExpr/AlternativeFinder.cc \
+      ResolvExpr/CastCost.cc \
+      ResolvExpr/CommonType.cc \
+      ResolvExpr/ConversionCost.cc \
+      ResolvExpr/CurrentObject.cc \
+      ResolvExpr/ExplodedActual.cc \
+      ResolvExpr/FindOpenVars.cc \
+      ResolvExpr/Occurs.cc \
+      ResolvExpr/PolyCost.cc \
+      ResolvExpr/PtrsAssignable.cc \
+      ResolvExpr/PtrsCastable.cc \
+      ResolvExpr/RenameVars.cc \
+      ResolvExpr/ResolveAssertions.cc \
+      ResolvExpr/Resolver.cc \
+      ResolvExpr/ResolveTypeof.cc \
+      ResolvExpr/SpecCost.cc \
+      ResolvExpr/TypeEnvironment.cc \
+      ResolvExpr/Unify.cc
+
+SRC_SYMTAB = \
+      SymTab/Autogen.cc \
+      SymTab/FixFunction.cc \
+      SymTab/Indexer.cc \
+      SymTab/Mangler.cc \
+      SymTab/ManglerCommon.cc \
+      SymTab/Validate.cc
+
+SRC_SYNTREE = \
+      SynTree/Type.cc \
+      SynTree/VoidType.cc \
+      SynTree/BasicType.cc \
+      SynTree/PointerType.cc \
+      SynTree/ArrayType.cc \
+      SynTree/ReferenceType.cc \
+      SynTree/FunctionType.cc \
+      SynTree/ReferenceToType.cc \
+      SynTree/TupleType.cc \
+      SynTree/TypeofType.cc \
+      SynTree/AttrType.cc \
+      SynTree/VarArgsType.cc \
+      SynTree/ZeroOneType.cc \
+      SynTree/Constant.cc \
+      SynTree/Expression.cc \
+      SynTree/TupleExpr.cc \
+      SynTree/CommaExpr.cc \
+      SynTree/TypeExpr.cc \
+      SynTree/ApplicationExpr.cc \
+      SynTree/AddressExpr.cc \
+      SynTree/Statement.cc \
+      SynTree/CompoundStmt.cc \
+      SynTree/DeclStmt.cc \
+      SynTree/Declaration.cc \
+      SynTree/DeclarationWithType.cc \
+      SynTree/ObjectDecl.cc \
+      SynTree/FunctionDecl.cc \
+      SynTree/AggregateDecl.cc \
+      SynTree/NamedTypeDecl.cc \
+      SynTree/TypeDecl.cc \
+      SynTree/Initializer.cc \
+      SynTree/TypeSubstitution.cc \
+      SynTree/Attribute.cc \
+      SynTree/DeclReplacer.cc
+
 
 # put into lib for now
@@ -630,91 +650,7 @@
 ARFLAGS = cr
 demangler_SOURCES = SymTab/demangler.cc
-demangler_LDADD = libdemangle.a			# yywrap
+demangler_LDADD = libdemangle.a -ldl			# yywrap
 noinst_LIBRARIES = libdemangle.a
-libdemangle_a_SOURCES = SymTab/Demangle.cc SymTab/ManglerCommon.cc \
-	SynTree/Type.cc \
-	SynTree/VoidType.cc \
-	SynTree/BasicType.cc \
-	SynTree/PointerType.cc \
-	SynTree/ArrayType.cc \
-	SynTree/ReferenceType.cc \
-	SynTree/FunctionType.cc \
-	SynTree/ReferenceToType.cc \
-	SynTree/TupleType.cc \
-	SynTree/TypeofType.cc \
-	SynTree/AttrType.cc \
-	SynTree/VarArgsType.cc \
-	SynTree/ZeroOneType.cc \
-	SynTree/Constant.cc \
-	SynTree/Expression.cc \
-	SynTree/TupleExpr.cc \
-	SynTree/CommaExpr.cc \
-	SynTree/TypeExpr.cc \
-	SynTree/ApplicationExpr.cc \
-	SynTree/AddressExpr.cc \
-	SynTree/Statement.cc \
-	SynTree/CompoundStmt.cc \
-	SynTree/DeclStmt.cc \
-	SynTree/Declaration.cc \
-	SynTree/DeclarationWithType.cc \
-	SynTree/ObjectDecl.cc \
-	SynTree/FunctionDecl.cc \
-	SynTree/AggregateDecl.cc \
-	SynTree/NamedTypeDecl.cc \
-	SynTree/TypeDecl.cc \
-	SynTree/Initializer.cc \
-	SynTree/TypeSubstitution.cc \
-	SynTree/Attribute.cc \
-	SynTree/DeclReplacer.cc \
-	CompilationState.cc \
-	CodeGen/CodeGenerator.cc \
-	CodeGen/FixMain.cc \
-	CodeGen/GenType.cc \
-	CodeGen/OperatorTable.cc \
-	Common/Assert.cc \
-	Common/Eval.cc \
-	Common/SemanticError.cc \
-	Common/UniqueName.cc \
-	Concurrency/Keywords.cc \
-	ControlStruct/ForExprMutator.cc \
-	ControlStruct/LabelFixer.cc \
-	ControlStruct/LabelGenerator.cc \
-	ControlStruct/MLEMutator.cc \
-	ControlStruct/Mutate.cc \
-	GenPoly/GenPoly.cc \
-	GenPoly/Lvalue.cc \
-	InitTweak/GenInit.cc \
-	InitTweak/InitTweak.cc \
-	Parser/LinkageSpec.cc \
-	ResolvExpr/AdjustExprType.cc \
-	ResolvExpr/Alternative.cc \
-	ResolvExpr/AlternativeFinder.cc \
-	ResolvExpr/ExplodedActual.cc \
-	ResolvExpr/CastCost.cc \
-	ResolvExpr/CommonType.cc \
-	ResolvExpr/ConversionCost.cc \
-	ResolvExpr/CurrentObject.cc \
-	ResolvExpr/FindOpenVars.cc \
-	ResolvExpr/Occurs.cc \
-	ResolvExpr/PolyCost.cc \
-	ResolvExpr/PtrsAssignable.cc \
-	ResolvExpr/PtrsCastable.cc \
-	ResolvExpr/RenameVars.cc \
-	ResolvExpr/ResolveAssertions.cc \
-	ResolvExpr/Resolver.cc \
-	ResolvExpr/ResolveTypeof.cc \
-	ResolvExpr/SpecCost.cc \
-	ResolvExpr/TypeEnvironment.cc \
-	ResolvExpr/Unify.cc \
-	SymTab/Autogen.cc \
-	SymTab/FixFunction.cc \
-	SymTab/Indexer.cc \
-	SymTab/Mangler.cc \
-	SymTab/Validate.cc \
-	Tuples/Explode.cc \
-	Tuples/TupleAssignment.cc \
-	Tuples/TupleExpansion.cc \
-	Validate/HandleAttributes.cc
-
+libdemangle_a_SOURCES = $(SRCDEMANGLE)
 all: $(BUILT_SOURCES)
 	$(MAKE) $(AM_MAKEFLAGS) all-am
@@ -755,88 +691,4 @@
 clean-noinstLIBRARIES:
 	-test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES)
-SymTab/$(am__dirstamp):
-	@$(MKDIR_P) SymTab
-	@: > SymTab/$(am__dirstamp)
-SymTab/$(DEPDIR)/$(am__dirstamp):
-	@$(MKDIR_P) SymTab/$(DEPDIR)
-	@: > SymTab/$(DEPDIR)/$(am__dirstamp)
-SymTab/Demangle.$(OBJEXT): SymTab/$(am__dirstamp) \
-	SymTab/$(DEPDIR)/$(am__dirstamp)
-SymTab/ManglerCommon.$(OBJEXT): SymTab/$(am__dirstamp) \
-	SymTab/$(DEPDIR)/$(am__dirstamp)
-SynTree/$(am__dirstamp):
-	@$(MKDIR_P) SynTree
-	@: > SynTree/$(am__dirstamp)
-SynTree/$(DEPDIR)/$(am__dirstamp):
-	@$(MKDIR_P) SynTree/$(DEPDIR)
-	@: > SynTree/$(DEPDIR)/$(am__dirstamp)
-SynTree/Type.$(OBJEXT): SynTree/$(am__dirstamp) \
-	SynTree/$(DEPDIR)/$(am__dirstamp)
-SynTree/VoidType.$(OBJEXT): SynTree/$(am__dirstamp) \
-	SynTree/$(DEPDIR)/$(am__dirstamp)
-SynTree/BasicType.$(OBJEXT): SynTree/$(am__dirstamp) \
-	SynTree/$(DEPDIR)/$(am__dirstamp)
-SynTree/PointerType.$(OBJEXT): SynTree/$(am__dirstamp) \
-	SynTree/$(DEPDIR)/$(am__dirstamp)
-SynTree/ArrayType.$(OBJEXT): SynTree/$(am__dirstamp) \
-	SynTree/$(DEPDIR)/$(am__dirstamp)
-SynTree/ReferenceType.$(OBJEXT): SynTree/$(am__dirstamp) \
-	SynTree/$(DEPDIR)/$(am__dirstamp)
-SynTree/FunctionType.$(OBJEXT): SynTree/$(am__dirstamp) \
-	SynTree/$(DEPDIR)/$(am__dirstamp)
-SynTree/ReferenceToType.$(OBJEXT): SynTree/$(am__dirstamp) \
-	SynTree/$(DEPDIR)/$(am__dirstamp)
-SynTree/TupleType.$(OBJEXT): SynTree/$(am__dirstamp) \
-	SynTree/$(DEPDIR)/$(am__dirstamp)
-SynTree/TypeofType.$(OBJEXT): SynTree/$(am__dirstamp) \
-	SynTree/$(DEPDIR)/$(am__dirstamp)
-SynTree/AttrType.$(OBJEXT): SynTree/$(am__dirstamp) \
-	SynTree/$(DEPDIR)/$(am__dirstamp)
-SynTree/VarArgsType.$(OBJEXT): SynTree/$(am__dirstamp) \
-	SynTree/$(DEPDIR)/$(am__dirstamp)
-SynTree/ZeroOneType.$(OBJEXT): SynTree/$(am__dirstamp) \
-	SynTree/$(DEPDIR)/$(am__dirstamp)
-SynTree/Constant.$(OBJEXT): SynTree/$(am__dirstamp) \
-	SynTree/$(DEPDIR)/$(am__dirstamp)
-SynTree/Expression.$(OBJEXT): SynTree/$(am__dirstamp) \
-	SynTree/$(DEPDIR)/$(am__dirstamp)
-SynTree/TupleExpr.$(OBJEXT): SynTree/$(am__dirstamp) \
-	SynTree/$(DEPDIR)/$(am__dirstamp)
-SynTree/CommaExpr.$(OBJEXT): SynTree/$(am__dirstamp) \
-	SynTree/$(DEPDIR)/$(am__dirstamp)
-SynTree/TypeExpr.$(OBJEXT): SynTree/$(am__dirstamp) \
-	SynTree/$(DEPDIR)/$(am__dirstamp)
-SynTree/ApplicationExpr.$(OBJEXT): SynTree/$(am__dirstamp) \
-	SynTree/$(DEPDIR)/$(am__dirstamp)
-SynTree/AddressExpr.$(OBJEXT): SynTree/$(am__dirstamp) \
-	SynTree/$(DEPDIR)/$(am__dirstamp)
-SynTree/Statement.$(OBJEXT): SynTree/$(am__dirstamp) \
-	SynTree/$(DEPDIR)/$(am__dirstamp)
-SynTree/CompoundStmt.$(OBJEXT): SynTree/$(am__dirstamp) \
-	SynTree/$(DEPDIR)/$(am__dirstamp)
-SynTree/DeclStmt.$(OBJEXT): SynTree/$(am__dirstamp) \
-	SynTree/$(DEPDIR)/$(am__dirstamp)
-SynTree/Declaration.$(OBJEXT): SynTree/$(am__dirstamp) \
-	SynTree/$(DEPDIR)/$(am__dirstamp)
-SynTree/DeclarationWithType.$(OBJEXT): SynTree/$(am__dirstamp) \
-	SynTree/$(DEPDIR)/$(am__dirstamp)
-SynTree/ObjectDecl.$(OBJEXT): SynTree/$(am__dirstamp) \
-	SynTree/$(DEPDIR)/$(am__dirstamp)
-SynTree/FunctionDecl.$(OBJEXT): SynTree/$(am__dirstamp) \
-	SynTree/$(DEPDIR)/$(am__dirstamp)
-SynTree/AggregateDecl.$(OBJEXT): SynTree/$(am__dirstamp) \
-	SynTree/$(DEPDIR)/$(am__dirstamp)
-SynTree/NamedTypeDecl.$(OBJEXT): SynTree/$(am__dirstamp) \
-	SynTree/$(DEPDIR)/$(am__dirstamp)
-SynTree/TypeDecl.$(OBJEXT): SynTree/$(am__dirstamp) \
-	SynTree/$(DEPDIR)/$(am__dirstamp)
-SynTree/Initializer.$(OBJEXT): SynTree/$(am__dirstamp) \
-	SynTree/$(DEPDIR)/$(am__dirstamp)
-SynTree/TypeSubstitution.$(OBJEXT): SynTree/$(am__dirstamp) \
-	SynTree/$(DEPDIR)/$(am__dirstamp)
-SynTree/Attribute.$(OBJEXT): SynTree/$(am__dirstamp) \
-	SynTree/$(DEPDIR)/$(am__dirstamp)
-SynTree/DeclReplacer.$(OBJEXT): SynTree/$(am__dirstamp) \
-	SynTree/$(DEPDIR)/$(am__dirstamp)
 CodeGen/$(am__dirstamp):
 	@$(MKDIR_P) CodeGen
@@ -853,4 +705,12 @@
 CodeGen/OperatorTable.$(OBJEXT): CodeGen/$(am__dirstamp) \
 	CodeGen/$(DEPDIR)/$(am__dirstamp)
+Concurrency/$(am__dirstamp):
+	@$(MKDIR_P) Concurrency
+	@: > Concurrency/$(am__dirstamp)
+Concurrency/$(DEPDIR)/$(am__dirstamp):
+	@$(MKDIR_P) Concurrency/$(DEPDIR)
+	@: > Concurrency/$(DEPDIR)/$(am__dirstamp)
+Concurrency/Keywords.$(OBJEXT): Concurrency/$(am__dirstamp) \
+	Concurrency/$(DEPDIR)/$(am__dirstamp)
 Common/$(am__dirstamp):
 	@$(MKDIR_P) Common
@@ -861,4 +721,14 @@
 Common/Assert.$(OBJEXT): Common/$(am__dirstamp) \
 	Common/$(DEPDIR)/$(am__dirstamp)
+Common/Stats/$(am__dirstamp):
+	@$(MKDIR_P) Common/Stats
+	@: > Common/Stats/$(am__dirstamp)
+Common/Stats/$(DEPDIR)/$(am__dirstamp):
+	@$(MKDIR_P) Common/Stats/$(DEPDIR)
+	@: > Common/Stats/$(DEPDIR)/$(am__dirstamp)
+Common/Stats/Heap.$(OBJEXT): Common/Stats/$(am__dirstamp) \
+	Common/Stats/$(DEPDIR)/$(am__dirstamp)
+Common/Stats/Counter.$(OBJEXT): Common/Stats/$(am__dirstamp) \
+	Common/Stats/$(DEPDIR)/$(am__dirstamp)
 Common/Eval.$(OBJEXT): Common/$(am__dirstamp) \
 	Common/$(DEPDIR)/$(am__dirstamp)
@@ -867,12 +737,4 @@
 Common/UniqueName.$(OBJEXT): Common/$(am__dirstamp) \
 	Common/$(DEPDIR)/$(am__dirstamp)
-Concurrency/$(am__dirstamp):
-	@$(MKDIR_P) Concurrency
-	@: > Concurrency/$(am__dirstamp)
-Concurrency/$(DEPDIR)/$(am__dirstamp):
-	@$(MKDIR_P) Concurrency/$(DEPDIR)
-	@: > Concurrency/$(DEPDIR)/$(am__dirstamp)
-Concurrency/Keywords.$(OBJEXT): Concurrency/$(am__dirstamp) \
-	Concurrency/$(DEPDIR)/$(am__dirstamp)
 ControlStruct/$(am__dirstamp):
 	@$(MKDIR_P) ControlStruct
@@ -931,14 +793,14 @@
 ResolvExpr/AlternativeFinder.$(OBJEXT): ResolvExpr/$(am__dirstamp) \
 	ResolvExpr/$(DEPDIR)/$(am__dirstamp)
+ResolvExpr/CastCost.$(OBJEXT): ResolvExpr/$(am__dirstamp) \
+	ResolvExpr/$(DEPDIR)/$(am__dirstamp)
+ResolvExpr/CommonType.$(OBJEXT): ResolvExpr/$(am__dirstamp) \
+	ResolvExpr/$(DEPDIR)/$(am__dirstamp)
+ResolvExpr/ConversionCost.$(OBJEXT): ResolvExpr/$(am__dirstamp) \
+	ResolvExpr/$(DEPDIR)/$(am__dirstamp)
+ResolvExpr/CurrentObject.$(OBJEXT): ResolvExpr/$(am__dirstamp) \
+	ResolvExpr/$(DEPDIR)/$(am__dirstamp)
 ResolvExpr/ExplodedActual.$(OBJEXT): ResolvExpr/$(am__dirstamp) \
 	ResolvExpr/$(DEPDIR)/$(am__dirstamp)
-ResolvExpr/CastCost.$(OBJEXT): ResolvExpr/$(am__dirstamp) \
-	ResolvExpr/$(DEPDIR)/$(am__dirstamp)
-ResolvExpr/CommonType.$(OBJEXT): ResolvExpr/$(am__dirstamp) \
-	ResolvExpr/$(DEPDIR)/$(am__dirstamp)
-ResolvExpr/ConversionCost.$(OBJEXT): ResolvExpr/$(am__dirstamp) \
-	ResolvExpr/$(DEPDIR)/$(am__dirstamp)
-ResolvExpr/CurrentObject.$(OBJEXT): ResolvExpr/$(am__dirstamp) \
-	ResolvExpr/$(DEPDIR)/$(am__dirstamp)
 ResolvExpr/FindOpenVars.$(OBJEXT): ResolvExpr/$(am__dirstamp) \
 	ResolvExpr/$(DEPDIR)/$(am__dirstamp)
@@ -965,4 +827,10 @@
 ResolvExpr/Unify.$(OBJEXT): ResolvExpr/$(am__dirstamp) \
 	ResolvExpr/$(DEPDIR)/$(am__dirstamp)
+SymTab/$(am__dirstamp):
+	@$(MKDIR_P) SymTab
+	@: > SymTab/$(am__dirstamp)
+SymTab/$(DEPDIR)/$(am__dirstamp):
+	@$(MKDIR_P) SymTab/$(DEPDIR)
+	@: > SymTab/$(DEPDIR)/$(am__dirstamp)
 SymTab/Autogen.$(OBJEXT): SymTab/$(am__dirstamp) \
 	SymTab/$(DEPDIR)/$(am__dirstamp)
@@ -973,6 +841,84 @@
 SymTab/Mangler.$(OBJEXT): SymTab/$(am__dirstamp) \
 	SymTab/$(DEPDIR)/$(am__dirstamp)
+SymTab/ManglerCommon.$(OBJEXT): SymTab/$(am__dirstamp) \
+	SymTab/$(DEPDIR)/$(am__dirstamp)
 SymTab/Validate.$(OBJEXT): SymTab/$(am__dirstamp) \
 	SymTab/$(DEPDIR)/$(am__dirstamp)
+SymTab/Demangle.$(OBJEXT): SymTab/$(am__dirstamp) \
+	SymTab/$(DEPDIR)/$(am__dirstamp)
+SynTree/$(am__dirstamp):
+	@$(MKDIR_P) SynTree
+	@: > SynTree/$(am__dirstamp)
+SynTree/$(DEPDIR)/$(am__dirstamp):
+	@$(MKDIR_P) SynTree/$(DEPDIR)
+	@: > SynTree/$(DEPDIR)/$(am__dirstamp)
+SynTree/Type.$(OBJEXT): SynTree/$(am__dirstamp) \
+	SynTree/$(DEPDIR)/$(am__dirstamp)
+SynTree/VoidType.$(OBJEXT): SynTree/$(am__dirstamp) \
+	SynTree/$(DEPDIR)/$(am__dirstamp)
+SynTree/BasicType.$(OBJEXT): SynTree/$(am__dirstamp) \
+	SynTree/$(DEPDIR)/$(am__dirstamp)
+SynTree/PointerType.$(OBJEXT): SynTree/$(am__dirstamp) \
+	SynTree/$(DEPDIR)/$(am__dirstamp)
+SynTree/ArrayType.$(OBJEXT): SynTree/$(am__dirstamp) \
+	SynTree/$(DEPDIR)/$(am__dirstamp)
+SynTree/ReferenceType.$(OBJEXT): SynTree/$(am__dirstamp) \
+	SynTree/$(DEPDIR)/$(am__dirstamp)
+SynTree/FunctionType.$(OBJEXT): SynTree/$(am__dirstamp) \
+	SynTree/$(DEPDIR)/$(am__dirstamp)
+SynTree/ReferenceToType.$(OBJEXT): SynTree/$(am__dirstamp) \
+	SynTree/$(DEPDIR)/$(am__dirstamp)
+SynTree/TupleType.$(OBJEXT): SynTree/$(am__dirstamp) \
+	SynTree/$(DEPDIR)/$(am__dirstamp)
+SynTree/TypeofType.$(OBJEXT): SynTree/$(am__dirstamp) \
+	SynTree/$(DEPDIR)/$(am__dirstamp)
+SynTree/AttrType.$(OBJEXT): SynTree/$(am__dirstamp) \
+	SynTree/$(DEPDIR)/$(am__dirstamp)
+SynTree/VarArgsType.$(OBJEXT): SynTree/$(am__dirstamp) \
+	SynTree/$(DEPDIR)/$(am__dirstamp)
+SynTree/ZeroOneType.$(OBJEXT): SynTree/$(am__dirstamp) \
+	SynTree/$(DEPDIR)/$(am__dirstamp)
+SynTree/Constant.$(OBJEXT): SynTree/$(am__dirstamp) \
+	SynTree/$(DEPDIR)/$(am__dirstamp)
+SynTree/Expression.$(OBJEXT): SynTree/$(am__dirstamp) \
+	SynTree/$(DEPDIR)/$(am__dirstamp)
+SynTree/TupleExpr.$(OBJEXT): SynTree/$(am__dirstamp) \
+	SynTree/$(DEPDIR)/$(am__dirstamp)
+SynTree/CommaExpr.$(OBJEXT): SynTree/$(am__dirstamp) \
+	SynTree/$(DEPDIR)/$(am__dirstamp)
+SynTree/TypeExpr.$(OBJEXT): SynTree/$(am__dirstamp) \
+	SynTree/$(DEPDIR)/$(am__dirstamp)
+SynTree/ApplicationExpr.$(OBJEXT): SynTree/$(am__dirstamp) \
+	SynTree/$(DEPDIR)/$(am__dirstamp)
+SynTree/AddressExpr.$(OBJEXT): SynTree/$(am__dirstamp) \
+	SynTree/$(DEPDIR)/$(am__dirstamp)
+SynTree/Statement.$(OBJEXT): SynTree/$(am__dirstamp) \
+	SynTree/$(DEPDIR)/$(am__dirstamp)
+SynTree/CompoundStmt.$(OBJEXT): SynTree/$(am__dirstamp) \
+	SynTree/$(DEPDIR)/$(am__dirstamp)
+SynTree/DeclStmt.$(OBJEXT): SynTree/$(am__dirstamp) \
+	SynTree/$(DEPDIR)/$(am__dirstamp)
+SynTree/Declaration.$(OBJEXT): SynTree/$(am__dirstamp) \
+	SynTree/$(DEPDIR)/$(am__dirstamp)
+SynTree/DeclarationWithType.$(OBJEXT): SynTree/$(am__dirstamp) \
+	SynTree/$(DEPDIR)/$(am__dirstamp)
+SynTree/ObjectDecl.$(OBJEXT): SynTree/$(am__dirstamp) \
+	SynTree/$(DEPDIR)/$(am__dirstamp)
+SynTree/FunctionDecl.$(OBJEXT): SynTree/$(am__dirstamp) \
+	SynTree/$(DEPDIR)/$(am__dirstamp)
+SynTree/AggregateDecl.$(OBJEXT): SynTree/$(am__dirstamp) \
+	SynTree/$(DEPDIR)/$(am__dirstamp)
+SynTree/NamedTypeDecl.$(OBJEXT): SynTree/$(am__dirstamp) \
+	SynTree/$(DEPDIR)/$(am__dirstamp)
+SynTree/TypeDecl.$(OBJEXT): SynTree/$(am__dirstamp) \
+	SynTree/$(DEPDIR)/$(am__dirstamp)
+SynTree/Initializer.$(OBJEXT): SynTree/$(am__dirstamp) \
+	SynTree/$(DEPDIR)/$(am__dirstamp)
+SynTree/TypeSubstitution.$(OBJEXT): SynTree/$(am__dirstamp) \
+	SynTree/$(DEPDIR)/$(am__dirstamp)
+SynTree/Attribute.$(OBJEXT): SynTree/$(am__dirstamp) \
+	SynTree/$(DEPDIR)/$(am__dirstamp)
+SynTree/DeclReplacer.$(OBJEXT): SynTree/$(am__dirstamp) \
+	SynTree/$(DEPDIR)/$(am__dirstamp)
 Tuples/$(am__dirstamp):
 	@$(MKDIR_P) Tuples
@@ -981,9 +927,9 @@
 	@$(MKDIR_P) Tuples/$(DEPDIR)
 	@: > Tuples/$(DEPDIR)/$(am__dirstamp)
-Tuples/Explode.$(OBJEXT): Tuples/$(am__dirstamp) \
-	Tuples/$(DEPDIR)/$(am__dirstamp)
 Tuples/TupleAssignment.$(OBJEXT): Tuples/$(am__dirstamp) \
 	Tuples/$(DEPDIR)/$(am__dirstamp)
 Tuples/TupleExpansion.$(OBJEXT): Tuples/$(am__dirstamp) \
+	Tuples/$(DEPDIR)/$(am__dirstamp)
+Tuples/Explode.$(OBJEXT): Tuples/$(am__dirstamp) \
 	Tuples/$(DEPDIR)/$(am__dirstamp)
 Validate/$(am__dirstamp):
@@ -1068,6 +1014,4 @@
 	Concurrency/$(DEPDIR)/$(am__dirstamp)
 Common/DebugMalloc.$(OBJEXT): Common/$(am__dirstamp) \
-	Common/$(DEPDIR)/$(am__dirstamp)
-Common/Heap.$(OBJEXT): Common/$(am__dirstamp) \
 	Common/$(DEPDIR)/$(am__dirstamp)
 ControlStruct/ExceptTranslate.$(OBJEXT):  \
@@ -1140,4 +1084,5 @@
 	-rm -f CodeTools/*.$(OBJEXT)
 	-rm -f Common/*.$(OBJEXT)
+	-rm -f Common/Stats/*.$(OBJEXT)
 	-rm -f Concurrency/*.$(OBJEXT)
 	-rm -f ControlStruct/*.$(OBJEXT)
@@ -1170,7 +1115,8 @@
 @AMDEP_TRUE@@am__include@ @am__quote@Common/$(DEPDIR)/DebugMalloc.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@Common/$(DEPDIR)/Eval.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@Common/$(DEPDIR)/Heap.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@Common/$(DEPDIR)/SemanticError.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@Common/$(DEPDIR)/UniqueName.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@Common/Stats/$(DEPDIR)/Counter.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@Common/Stats/$(DEPDIR)/Heap.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@Concurrency/$(DEPDIR)/Keywords.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@Concurrency/$(DEPDIR)/Waitfor.Po@am__quote@
@@ -1434,4 +1380,6 @@
 	-rm -f Common/$(DEPDIR)/$(am__dirstamp)
 	-rm -f Common/$(am__dirstamp)
+	-rm -f Common/Stats/$(DEPDIR)/$(am__dirstamp)
+	-rm -f Common/Stats/$(am__dirstamp)
 	-rm -f Concurrency/$(DEPDIR)/$(am__dirstamp)
 	-rm -f Concurrency/$(am__dirstamp)
@@ -1471,5 +1419,5 @@
 
 distclean: distclean-am
-	-rm -rf ./$(DEPDIR) CodeGen/$(DEPDIR) CodeTools/$(DEPDIR) Common/$(DEPDIR) Concurrency/$(DEPDIR) ControlStruct/$(DEPDIR) GenPoly/$(DEPDIR) InitTweak/$(DEPDIR) Parser/$(DEPDIR) ResolvExpr/$(DEPDIR) SymTab/$(DEPDIR) SynTree/$(DEPDIR) Tuples/$(DEPDIR) Validate/$(DEPDIR) Virtual/$(DEPDIR)
+	-rm -rf ./$(DEPDIR) CodeGen/$(DEPDIR) CodeTools/$(DEPDIR) Common/$(DEPDIR) Common/Stats/$(DEPDIR) Concurrency/$(DEPDIR) ControlStruct/$(DEPDIR) GenPoly/$(DEPDIR) InitTweak/$(DEPDIR) Parser/$(DEPDIR) ResolvExpr/$(DEPDIR) SymTab/$(DEPDIR) SynTree/$(DEPDIR) Tuples/$(DEPDIR) Validate/$(DEPDIR) Virtual/$(DEPDIR)
 	-rm -f Makefile
 distclean-am: clean-am distclean-compile distclean-generic \
@@ -1517,5 +1465,5 @@
 
 maintainer-clean: maintainer-clean-am
-	-rm -rf ./$(DEPDIR) CodeGen/$(DEPDIR) CodeTools/$(DEPDIR) Common/$(DEPDIR) Concurrency/$(DEPDIR) ControlStruct/$(DEPDIR) GenPoly/$(DEPDIR) InitTweak/$(DEPDIR) Parser/$(DEPDIR) ResolvExpr/$(DEPDIR) SymTab/$(DEPDIR) SynTree/$(DEPDIR) Tuples/$(DEPDIR) Validate/$(DEPDIR) Virtual/$(DEPDIR)
+	-rm -rf ./$(DEPDIR) CodeGen/$(DEPDIR) CodeTools/$(DEPDIR) Common/$(DEPDIR) Common/Stats/$(DEPDIR) Concurrency/$(DEPDIR) ControlStruct/$(DEPDIR) GenPoly/$(DEPDIR) InitTweak/$(DEPDIR) Parser/$(DEPDIR) ResolvExpr/$(DEPDIR) SymTab/$(DEPDIR) SynTree/$(DEPDIR) Tuples/$(DEPDIR) Validate/$(DEPDIR) Virtual/$(DEPDIR)
 	-rm -f Makefile
 maintainer-clean-am: distclean-am maintainer-clean-generic
Index: src/Parser/TypeData.h
===================================================================
--- src/Parser/TypeData.h	(revision f56c32e54c020031f40ff50223fe09a667f86da8)
+++ src/Parser/TypeData.h	(revision 0050a5ff3fdf8bc520652ac831418c77148183f4)
@@ -31,23 +31,23 @@
 	struct Aggregate_t {
 		DeclarationNode::Aggregate kind;
-		const std::string * name;
-		DeclarationNode * params;
-		ExpressionNode * actuals;						// holds actual parameters later applied to AggInst
-		DeclarationNode * fields;
+		const std::string * name = nullptr;
+		DeclarationNode * params = nullptr;
+		ExpressionNode * actuals = nullptr;						// holds actual parameters later applied to AggInst
+		DeclarationNode * fields = nullptr;
 		bool body;
 		bool anon;
 
 		bool tagged;
-		const std::string * parent;
+		const std::string * parent = nullptr;
 	};
 
 	struct AggInst_t {
-		TypeData * aggregate;
-		ExpressionNode * params;
+		TypeData * aggregate = nullptr;
+		ExpressionNode * params = nullptr;
 		bool hoistType;
 	};
 
 	struct Array_t {
-		ExpressionNode * dimension;
+		ExpressionNode * dimension = nullptr;
 		bool isVarLen;
 		bool isStatic;
@@ -55,6 +55,6 @@
 
 	struct Enumeration_t {
-		const std::string * name;
-		DeclarationNode * constants;
+		const std::string * name = nullptr;
+		DeclarationNode * constants = nullptr;
 		bool body;
 		bool anon;
@@ -62,22 +62,22 @@
 
 	struct Function_t {
-		mutable DeclarationNode * params;				// mutables modified in buildKRFunction
-		mutable DeclarationNode * idList;				// old-style
-		mutable DeclarationNode * oldDeclList;
-		StatementNode * body;
-		ExpressionNode * withExprs;						// expressions from function's with_clause
+		mutable DeclarationNode * params = nullptr;				// mutables modified in buildKRFunction
+		mutable DeclarationNode * idList = nullptr;				// old-style
+		mutable DeclarationNode * oldDeclList = nullptr;
+		StatementNode * body = nullptr;
+		ExpressionNode * withExprs = nullptr;						// expressions from function's with_clause
 	};
 
 	struct Symbolic_t {
-		const std::string * name;
+		const std::string * name = nullptr;
 		bool isTypedef;									// false => TYPEGENname, true => TYPEDEFname
-		DeclarationNode * params;
-		ExpressionNode * actuals;
-		DeclarationNode * assertions;
+		DeclarationNode * params = nullptr;
+		ExpressionNode * actuals = nullptr;
+		DeclarationNode * assertions = nullptr;
 	};
 
 	struct Qualified_t {								// qualified type S.T
-		TypeData * parent;
-		TypeData * child;
+		TypeData * parent = nullptr;
+		TypeData * child = nullptr;
 	};
 
@@ -93,5 +93,5 @@
 
 	Type::Qualifiers qualifiers;
-	DeclarationNode * forall;
+	DeclarationNode * forall = nullptr;
 
 	Aggregate_t aggregate;
@@ -102,6 +102,6 @@
 	Symbolic_t symbolic;
 	Qualified_t qualified;
-	DeclarationNode * tuple;
-	ExpressionNode * typeexpr;
+	DeclarationNode * tuple = nullptr;
+	ExpressionNode * typeexpr = nullptr;
 
 	TypeData( Kind k = Unknown );
Index: src/Parser/module.mk
===================================================================
--- src/Parser/module.mk	(revision f56c32e54c020031f40ff50223fe09a667f86da8)
+++ src/Parser/module.mk	(revision 0050a5ff3fdf8bc520652ac831418c77148183f4)
@@ -31,3 +31,7 @@
        Parser/parserutility.cc
 
+SRCDEMANGLE += \
+	Parser/LinkageSpec.cc
+
+
 MOSTLYCLEANFILES += Parser/lex.cc Parser/parser.cc Parser/parser.hh Parser/parser.output
Index: src/ResolvExpr/CommonType.cc
===================================================================
--- src/ResolvExpr/CommonType.cc	(revision f56c32e54c020031f40ff50223fe09a667f86da8)
+++ src/ResolvExpr/CommonType.cc	(revision 0050a5ff3fdf8bc520652ac831418c77148183f4)
@@ -177,5 +177,5 @@
 
 	// GENERATED START, DO NOT EDIT
-	// GENERATED BY BasicTypes-gen.cc
+	// GENERATED BY ../../main/src/BasicTypes-gen.cc
 	#define BT BasicType::
 	static const BasicType::Kind commonTypes[BasicType::NUMBER_OF_BASIC_TYPES][BasicType::NUMBER_OF_BASIC_TYPES] = { // nearest common ancestor
Index: src/ResolvExpr/ConversionCost.cc
===================================================================
--- src/ResolvExpr/ConversionCost.cc	(revision f56c32e54c020031f40ff50223fe09a667f86da8)
+++ src/ResolvExpr/ConversionCost.cc	(revision 0050a5ff3fdf8bc520652ac831418c77148183f4)
@@ -182,5 +182,5 @@
 
 	// GENERATED START, DO NOT EDIT
-	// GENERATED BY BasicTypes-gen.cc
+	// GENERATED BY ../../main/src/BasicTypes-gen.cc
 	/* EXTENDED INTEGRAL RANK HIERARCHY (root to leaves)
 	                         _Bool
@@ -207,5 +207,5 @@
 
 	// GENERATED START, DO NOT EDIT
-	// GENERATED BY BasicTypes-gen.cc
+	// GENERATED BY ../../main/src/BasicTypes-gen.cc
 	static const int costMatrix[BasicType::NUMBER_OF_BASIC_TYPES][BasicType::NUMBER_OF_BASIC_TYPES] = { // path length from root to node
 		/*             B    C   SC   UC   SI  SUI    I   UI   LI  LUI  LLI LLUI   IB  UIB  _FH  _FH   _F  _FC    F   FC  _FX _FXC   FD _FDC    D   DC F80X_FDXC  F80  _FB_FLDC   FB   LD  LDC _FBX_FLDXC */
@@ -254,5 +254,5 @@
 
 	// GENERATED START, DO NOT EDIT
-	// GENERATED BY BasicTypes-gen.cc
+	// GENERATED BY ../../main/src/BasicTypes-gen.cc
 	static const int signMatrix[BasicType::NUMBER_OF_BASIC_TYPES][BasicType::NUMBER_OF_BASIC_TYPES] = { // number of sign changes in safe conversion
 		/*             B    C   SC   UC   SI  SUI    I   UI   LI  LUI  LLI LLUI   IB  UIB  _FH  _FH   _F  _FC    F   FC  _FX _FXC   FD _FDC    D   DC F80X_FDXC  F80  _FB_FLDC   FB   LD  LDC _FBX_FLDXC */
Index: src/ResolvExpr/module.mk
===================================================================
--- src/ResolvExpr/module.mk	(revision f56c32e54c020031f40ff50223fe09a667f86da8)
+++ src/ResolvExpr/module.mk	(revision 0050a5ff3fdf8bc520652ac831418c77148183f4)
@@ -15,23 +15,26 @@
 ###############################################################################
 
-SRC += ResolvExpr/AlternativeFinder.cc \
-       ResolvExpr/Alternative.cc \
-       ResolvExpr/Unify.cc \
-       ResolvExpr/PtrsAssignable.cc \
-       ResolvExpr/CommonType.cc \
-       ResolvExpr/ConversionCost.cc \
-       ResolvExpr/CastCost.cc \
-       ResolvExpr/PtrsCastable.cc \
-       ResolvExpr/AdjustExprType.cc \
-       ResolvExpr/AlternativePrinter.cc \
-       ResolvExpr/Resolver.cc \
-       ResolvExpr/ResolveTypeof.cc \
-       ResolvExpr/RenameVars.cc \
-       ResolvExpr/FindOpenVars.cc \
-       ResolvExpr/PolyCost.cc \
-       ResolvExpr/Occurs.cc \
-       ResolvExpr/TypeEnvironment.cc \
-       ResolvExpr/CurrentObject.cc \
-       ResolvExpr/ExplodedActual.cc \
-       ResolvExpr/SpecCost.cc \
-       ResolvExpr/ResolveAssertions.cc
+SRC_RESOLVEXPR = \
+      ResolvExpr/AdjustExprType.cc \
+      ResolvExpr/Alternative.cc \
+      ResolvExpr/AlternativeFinder.cc \
+      ResolvExpr/CastCost.cc \
+      ResolvExpr/CommonType.cc \
+      ResolvExpr/ConversionCost.cc \
+      ResolvExpr/CurrentObject.cc \
+      ResolvExpr/ExplodedActual.cc \
+      ResolvExpr/FindOpenVars.cc \
+      ResolvExpr/Occurs.cc \
+      ResolvExpr/PolyCost.cc \
+      ResolvExpr/PtrsAssignable.cc \
+      ResolvExpr/PtrsCastable.cc \
+      ResolvExpr/RenameVars.cc \
+      ResolvExpr/ResolveAssertions.cc \
+      ResolvExpr/Resolver.cc \
+      ResolvExpr/ResolveTypeof.cc \
+      ResolvExpr/SpecCost.cc \
+      ResolvExpr/TypeEnvironment.cc \
+      ResolvExpr/Unify.cc
+
+SRC += $(SRC_RESOLVEXPR) ResolvExpr/AlternativePrinter.cc
+SRCDEMANGLE += $(SRC_RESOLVEXPR)
Index: src/SymTab/Indexer.cc
===================================================================
--- src/SymTab/Indexer.cc	(revision f56c32e54c020031f40ff50223fe09a667f86da8)
+++ src/SymTab/Indexer.cc	(revision 0050a5ff3fdf8bc520652ac831418c77148183f4)
@@ -26,4 +26,5 @@
 #include "Common/SemanticError.h"  // for SemanticError
 #include "Common/utility.h"        // for cloneAll
+#include "Common/Stats/Counter.h" // for counters
 #include "GenPoly/GenPoly.h"
 #include "InitTweak/InitTweak.h"   // for isConstructor, isCopyFunction, isC...
@@ -41,4 +42,19 @@
 
 namespace SymTab {
+
+	// Statistics block
+	namespace {
+		auto idtable_group = new Stats::Counters::CounterGroup("IdTable");
+		auto idtable_find  = new Stats::Counters::SimpleCounter("Find calls", idtable_group);
+		auto idtable_size  = new Stats::Counters::AverageCounter<double>("Average Size", idtable_group);
+		auto idtable_key   = new Stats::Counters::AverageCounter<double>("Average Key Size", idtable_group);
+
+		auto indexers_group = new Stats::Counters::CounterGroup("Indexers");
+		auto indexers_count = new Stats::Counters::SimpleCounter("Count", indexers_group);
+		auto indexers_size  = new Stats::Counters::AverageCounter<double>("Average Size", indexers_group);
+		auto indexers_depth_a  = new Stats::Counters::AverageCounter<double>("Average Depth", indexers_group);
+		auto indexers_depth_m  = new Stats::Counters::MaxCounter<size_t>("Max Depth", indexers_group);
+	}
+
 	std::ostream & operator<<( std::ostream & out, const Indexer::IdData & data ) {
 		return out << "(" << data.id << "," << data.baseExpr << ")";
@@ -197,7 +213,11 @@
 	}
 
-	Indexer::Indexer() : tables( 0 ), scope( 0 ) {}
-
-	Indexer::Indexer( const Indexer &that ) : doDebug( that.doDebug ), tables( newRef( that.tables ) ), scope( that.scope ) {}
+	Indexer::Indexer() : tables( 0 ), scope( 0 ) {
+		(*indexers_count)++;
+	}
+
+	Indexer::Indexer( const Indexer &that ) : doDebug( that.doDebug ), tables( newRef( that.tables ) ), scope( that.scope ) {
+		(*indexers_count)++;
+	}
 
 	Indexer::Indexer( Indexer &&that ) : doDebug( that.doDebug ), tables( that.tables ), scope( that.scope ) {
@@ -206,4 +226,13 @@
 
 	Indexer::~Indexer() {
+		if(tables) {
+			indexers_size->push( tables->idTable.size() );
+			size_t depth = 1;
+			for( auto crnt = tables->base.tables; crnt; crnt = crnt->base.tables ) {
+				++depth;
+			}
+			indexers_depth_a->push( depth );
+			indexers_depth_m->push( depth );
+		}
 		deleteRef( tables );
 	}
@@ -237,4 +266,7 @@
 		while ( searchTables ) {
 
+			(*idtable_find)++;
+			idtable_key->push( id.size() );
+			idtable_size->push( searchTables->idTable.size() );
 			IdTable::const_iterator decls = searchTables->idTable.find( id );
 			if ( decls != searchTables->idTable.end() ) {
@@ -313,4 +345,7 @@
 		if ( tables->scope < scope ) return nullptr;
 
+		(*idtable_find)++;
+		idtable_key->push( id.size() );
+		idtable_size->push( tables->idTable.size() );
 		IdTable::const_iterator decls = tables->idTable.find( id );
 		if ( decls != tables->idTable.end() ) {
@@ -331,4 +366,7 @@
 		if ( tables->scope < scope ) return false;
 
+		(*idtable_find)++;
+		idtable_key->push( id.size() );
+		idtable_size->push( tables->idTable.size() );
 		IdTable::const_iterator decls = tables->idTable.find( id );
 		if ( decls != tables->idTable.end() ) {
@@ -347,4 +385,7 @@
 		if ( tables->scope < scope ) return false;
 
+		(*idtable_find)++;
+		idtable_key->push( id.size() );
+		idtable_size->push( tables->idTable.size() );
 		IdTable::const_iterator decls = tables->idTable.find( id );
 		if ( decls != tables->idTable.end() ) {
Index: src/SymTab/ManglerCommon.cc
===================================================================
--- src/SymTab/ManglerCommon.cc	(revision f56c32e54c020031f40ff50223fe09a667f86da8)
+++ src/SymTab/ManglerCommon.cc	(revision 0050a5ff3fdf8bc520652ac831418c77148183f4)
@@ -24,5 +24,5 @@
 
 			// GENERATED START, DO NOT EDIT
-			// GENERATED BY BasicTypes-gen.cc
+			// GENERATED BY ../../main/src/BasicTypes-gen.cc
 			// NOTES ON MANGLING:
 			// * Itanium spec says that Float80 encodes to "e" (like LongDouble), but the distinct lengths cause resolution problems.
Index: src/SymTab/Validate.cc
===================================================================
--- src/SymTab/Validate.cc	(revision f56c32e54c020031f40ff50223fe09a667f86da8)
+++ src/SymTab/Validate.cc	(revision 0050a5ff3fdf8bc520652ac831418c77148183f4)
@@ -49,4 +49,5 @@
 #include "CodeGen/OperatorTable.h"     // for isCtorDtor, isCtorDtorAssign
 #include "ControlStruct/Mutate.h"      // for ForExprMutator
+#include "Common/Stats.h"              // for Stats::Heap
 #include "Common/PassVisitor.h"        // for PassVisitor, WithDeclsToAdd
 #include "Common/ScopedMap.h"          // for ScopedMap
@@ -303,24 +304,30 @@
 		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 );
Index: src/SymTab/module.mk
===================================================================
--- src/SymTab/module.mk	(revision f56c32e54c020031f40ff50223fe09a667f86da8)
+++ src/SymTab/module.mk	(revision 0050a5ff3fdf8bc520652ac831418c77148183f4)
@@ -15,8 +15,12 @@
 ###############################################################################
 
-SRC += SymTab/Indexer.cc \
-       SymTab/Mangler.cc \
-       SymTab/ManglerCommon.cc \
-       SymTab/Validate.cc \
-       SymTab/FixFunction.cc \
-       SymTab/Autogen.cc
+SRC_SYMTAB = \
+      SymTab/Autogen.cc \
+      SymTab/FixFunction.cc \
+      SymTab/Indexer.cc \
+      SymTab/Mangler.cc \
+      SymTab/ManglerCommon.cc \
+      SymTab/Validate.cc
+
+SRC += $(SRC_SYMTAB)
+SRCDEMANGLE += $(SRC_SYMTAB) SymTab/Demangle.cc
Index: src/SynTree/Type.h
===================================================================
--- src/SynTree/Type.h	(revision f56c32e54c020031f40ff50223fe09a667f86da8)
+++ src/SynTree/Type.h	(revision 0050a5ff3fdf8bc520652ac831418c77148183f4)
@@ -208,5 +208,5 @@
   public:
 	// GENERATED START, DO NOT EDIT
-	// GENERATED BY BasicTypes-gen.cc
+	// GENERATED BY ../../main/src/BasicTypes-gen.cc
 	enum Kind {
 		Bool,
Index: src/SynTree/module.mk
===================================================================
--- src/SynTree/module.mk	(revision f56c32e54c020031f40ff50223fe09a667f86da8)
+++ src/SynTree/module.mk	(revision 0050a5ff3fdf8bc520652ac831418c77148183f4)
@@ -15,37 +15,40 @@
 ###############################################################################
 
-SRC += SynTree/Type.cc \
-       SynTree/VoidType.cc \
-       SynTree/BasicType.cc \
-       SynTree/PointerType.cc \
-       SynTree/ArrayType.cc \
-       SynTree/ReferenceType.cc \
-       SynTree/FunctionType.cc \
-       SynTree/ReferenceToType.cc \
-       SynTree/TupleType.cc \
-       SynTree/TypeofType.cc \
-       SynTree/AttrType.cc \
-       SynTree/VarArgsType.cc \
-       SynTree/ZeroOneType.cc \
-       SynTree/Constant.cc \
-       SynTree/Expression.cc \
-       SynTree/TupleExpr.cc \
-       SynTree/CommaExpr.cc \
-       SynTree/TypeExpr.cc \
-       SynTree/ApplicationExpr.cc \
-       SynTree/AddressExpr.cc \
-       SynTree/Statement.cc \
-       SynTree/CompoundStmt.cc \
-       SynTree/DeclStmt.cc \
-       SynTree/Declaration.cc \
-       SynTree/DeclarationWithType.cc \
-       SynTree/ObjectDecl.cc \
-       SynTree/FunctionDecl.cc \
-       SynTree/AggregateDecl.cc \
-       SynTree/NamedTypeDecl.cc \
-       SynTree/TypeDecl.cc \
-       SynTree/Initializer.cc \
-       SynTree/TypeSubstitution.cc \
-       SynTree/Attribute.cc \
-       SynTree/DeclReplacer.cc
+SRC_SYNTREE = \
+      SynTree/Type.cc \
+      SynTree/VoidType.cc \
+      SynTree/BasicType.cc \
+      SynTree/PointerType.cc \
+      SynTree/ArrayType.cc \
+      SynTree/ReferenceType.cc \
+      SynTree/FunctionType.cc \
+      SynTree/ReferenceToType.cc \
+      SynTree/TupleType.cc \
+      SynTree/TypeofType.cc \
+      SynTree/AttrType.cc \
+      SynTree/VarArgsType.cc \
+      SynTree/ZeroOneType.cc \
+      SynTree/Constant.cc \
+      SynTree/Expression.cc \
+      SynTree/TupleExpr.cc \
+      SynTree/CommaExpr.cc \
+      SynTree/TypeExpr.cc \
+      SynTree/ApplicationExpr.cc \
+      SynTree/AddressExpr.cc \
+      SynTree/Statement.cc \
+      SynTree/CompoundStmt.cc \
+      SynTree/DeclStmt.cc \
+      SynTree/Declaration.cc \
+      SynTree/DeclarationWithType.cc \
+      SynTree/ObjectDecl.cc \
+      SynTree/FunctionDecl.cc \
+      SynTree/AggregateDecl.cc \
+      SynTree/NamedTypeDecl.cc \
+      SynTree/TypeDecl.cc \
+      SynTree/Initializer.cc \
+      SynTree/TypeSubstitution.cc \
+      SynTree/Attribute.cc \
+      SynTree/DeclReplacer.cc
 
+SRC += $(SRC_SYNTREE)
+SRCDEMANGLE += $(SRC_SYNTREE)
Index: src/Tuples/module.mk
===================================================================
--- src/Tuples/module.mk	(revision f56c32e54c020031f40ff50223fe09a667f86da8)
+++ src/Tuples/module.mk	(revision 0050a5ff3fdf8bc520652ac831418c77148183f4)
@@ -15,5 +15,4 @@
 ###############################################################################
 
-SRC += 	Tuples/TupleAssignment.cc \
-	Tuples/TupleExpansion.cc \
-	Tuples/Explode.cc
+SRC += Tuples/TupleAssignment.cc Tuples/TupleExpansion.cc Tuples/Explode.cc
+SRCDEMANGLE += Tuples/TupleAssignment.cc Tuples/TupleExpansion.cc Tuples/Explode.cc
Index: src/Validate/module.mk
===================================================================
--- src/Validate/module.mk	(revision f56c32e54c020031f40ff50223fe09a667f86da8)
+++ src/Validate/module.mk	(revision 0050a5ff3fdf8bc520652ac831418c77148183f4)
@@ -16,2 +16,3 @@
 
 SRC += Validate/HandleAttributes.cc
+SRCDEMANGLE += Validate/HandleAttributes.cc
Index: src/main.cc
===================================================================
--- src/main.cc	(revision f56c32e54c020031f40ff50223fe09a667f86da8)
+++ src/main.cc	(revision 0050a5ff3fdf8bc520652ac831418c77148183f4)
@@ -37,5 +37,5 @@
 #include "CodeTools/TrackLoc.h"             // for fillLocations
 #include "Common/CompilerError.h"           // for CompilerError
-#include "Common/Heap.h"
+#include "Common/Stats.h"
 #include "Common/PassVisitor.h"
 #include "Common/SemanticError.h"           // for SemanticError
@@ -67,5 +67,5 @@
 #define PASS(name, pass)                   \
 	if ( errorp ) { cerr << name << endl; } \
-	HeapStats::newPass(name);               \
+	Stats::Heap::newPass(name);               \
 	pass;
 
@@ -377,10 +377,14 @@
 
 	deleteAll( translationUnit );
-	if(!libcfap && !treep) HeapStats::printStats();
+	if(!libcfap && !treep) {
+		if(stats_counters) Stats::Counters::print();
+		if(stats_heap) Stats::Heap::print();
+	}
+
 	return 0;
 } // main
 
 void parse_cmdline( int argc, char * argv[], const char *& filename ) {
-	enum { Ast, Bbox, Bresolver, CtorInitFix, DeclStats, Expr, ExprAlt, Grammar, LibCFA, Linemarks, Nolinemarks, Nopreamble, Parse, PreludeDir, Prototypes, Resolver, ResolvProto, Symbol, Tree, TupleExpansion, Validate, };
+	enum { Ast, Bbox, Bresolver, CtorInitFix, DeclStats, Expr, ExprAlt, Grammar, LibCFA, Linemarks, Nolinemarks, Nopreamble, Parse, PreludeDir, Prototypes, Resolver, ResolvProto, Stats, Symbol, Tree, TupleExpansion, Validate};
 
 	static struct option long_opts[] = {
@@ -402,4 +406,5 @@
 		{ "resolver", no_argument, 0, Resolver },
 		{ "resolv-proto", no_argument, 0, ResolvProto },
+		{ "stats", required_argument, 0, Stats },
 		{ "symbol", no_argument, 0, Symbol },
 		{ "tree", no_argument, 0, Tree },
@@ -489,4 +494,24 @@
 		  case 'R':										// dump resolv-proto instance
 			resolvprotop = true;
+			break;
+		  case Stats:
+			{
+				std::stringstream ss(optarg);
+				while(ss.good()) {
+					std::string substr;
+					getline( ss, substr, ',' );
+					if(substr == "counters") {
+						stats_counters = true;
+					} else if(substr == "heap") {
+						stats_heap = true;
+					} else if(substr == "none") {
+						stats_counters = false;
+						stats_heap = false;
+					} else {
+						std::cerr << "Ignoring unknown statistic " << substr << std::endl;
+					}
+				}
+
+			}
 			break;
 		  case Symbol:
