Index: doc/bibliography/cfa.bib
===================================================================
--- doc/bibliography/cfa.bib	(revision 2f0a35990a3246990679740f55a62fbfce807686)
+++ doc/bibliography/cfa.bib	(revision 80cdb2f57747705b86dcdf3b714896ec1092137e)
@@ -4563,10 +4563,12 @@
 }
 
-@book{obj-c-book,
-    keywords	= {objective-c},
-    contributor	= {a3moss@uwaterloo.ca},
-    author	= {{Apple Computer Inc.}},
-    title	= {The {Objective-C} Programming Language},
-    year	= 2002
+@manual{obj-c-book,
+    keywords = {objective-c},
+    contributor = {a3moss@uwaterloo.ca},
+    author = {{Apple Computer Inc.}},
+    title = {The {Objective-C} Programming Language},
+    publisher = {Apple Computer Inc.},
+    address = {Cupertino, CA},
+    year = 2003
 }
 
Index: doc/generic_types/evaluation/.gitignore
===================================================================
--- doc/generic_types/evaluation/.gitignore	(revision 80cdb2f57747705b86dcdf3b714896ec1092137e)
+++ doc/generic_types/evaluation/.gitignore	(revision 80cdb2f57747705b86dcdf3b714896ec1092137e)
@@ -0,0 +1,8 @@
+c-bench
+cpp-bench
+cfa-bench
+c2-bench
+cpp2-bench
+cfa2-bench
+*.o
+*.d
Index: doc/generic_types/evaluation/Makefile
===================================================================
--- doc/generic_types/evaluation/Makefile	(revision 2f0a35990a3246990679740f55a62fbfce807686)
+++ doc/generic_types/evaluation/Makefile	(revision 80cdb2f57747705b86dcdf3b714896ec1092137e)
@@ -1,22 +1,101 @@
-CFA=cfa
+CFA = my-cfa
+DEPFLAGS = -MMD -MP
 
-# %.o : %.cf
-#	$(CFA) -c $(CFLAGS) $(CPPFLAGS) $< -o $@
+.PHONY: all clean distclean bench
 
-cfa-stack.o: cfa-stack.c cfa-stack.h
-	$(CFA) -c $(CFLAGS) $(CPPFLAGS) $< -o $@
+all: c-bench cpp-bench cfa-bench c2-bench cpp2-bench cfa2-bench
 
-c-bench: c-bench.c bench.h c-stack.o
-	$(CC) $(CFLAGS) $(CPPFLAGS) -o $@ $< c-stack.o
+# rewrite object generation to auto-determine deps
+COMPILE.c = $(CC) $(DEPFLAGS) $(CFLAGS) $(CPPFLAGS)
+COMPILE.cpp = $(CXX) $(DEPFLAGS) $(CXXFLAGS) $(CPPFLAGS)
+COMPILE.cfa = $(CFA) $(DEPFLAGS) $(CFLAGS) $(CPPFLAGS)
 
-cpp-bench: cpp-bench.cpp bench.h cpp-stack.h
-	$(CXX) $(CXXFLAGS) $(CPPFLAGS) -o $@ $<
+c-%.o : c-%.c
+c-%.o : c-%.c c-%.d
+	$(COMPILE.c) -O0 $(OUTPUT_OPTION) -c $<
 
-cfa-bench: cfa-bench.c bench.h cfa-stack.o
-	$(CFA) $(CFLAGS) $(CPPFLAGS) -o $@ $< cfa-stack.o
+cpp-%.o : cpp-%.cpp
+cpp-%.o : cpp-%.cpp cpp-%.d
+	$(COMPILE.cpp) -O0 $(OUTPUT_OPTION) -c $<
+
+cfa-%.o : cfa-%.c
+cfa-%.o : cfa-%.c cfa-%.d
+	$(COMPILE.cfa) -O0 $(OUTPUT_OPTION) -c $<
+
+c2-%.o : c-%.c
+c2-%.o : c-%.c c-%.d
+	$(COMPILE.c) -O2 $(OUTPUT_OPTION) -c $<
+
+cpp2-%.o : cpp-%.cpp
+cpp2-%.o : cpp-%.cpp cpp-%.d
+	$(COMPILE.cpp) -O2 $(OUTPUT_OPTION) -c $<
+
+cfa2-%.o : cfa-%.c
+cfa2-%.o : cfa-%.c cfa-%.d
+	$(COMPILE.cfa) -O2 $(OUTPUT_OPTION) -c $<
+
+COBJS = c-stack.o
+CPPOBJS = 
+CFAOBJS = cfa-stack.o
+C2OBJS = $(patsubst c-%,c2-%, $(COBJS))
+CPP2OBJS = $(patsubst cpp-%,cpp2-%, $(CPPOBJS))
+CFA2OBJS = $(patsubst cfa-%,cfa2-%, $(CFAOBJS))
+
+c-bench: c-bench.c c-bench.d $(COBJS)
+	$(COMPILE.c) -O0 -o $@ $< $(COBJS) $(LDFLAGS)
+
+cpp-bench: cpp-bench.cpp cpp-bench.d $(CPPOBJS)
+	$(COMPILE.cpp) -O0 -o $@ $< $(CPPOBJS) $(LDFLAGS)
+
+cfa-bench: cfa-bench.c cfa-bench.d $(CFAOBJS)
+	$(COMPILE.cfa) -O0 -o $@ $< $(CFAOBJS) $(LDFLAGS)
+
+c2-bench: c-bench.c c-bench.d $(C2OBJS)
+	$(COMPILE.c) -O2 -o $@ $< $(C2OBJS) $(LDFLAGS)
+
+cpp2-bench: cpp-bench.cpp cpp-bench.d $(CPP2OBJS)
+	$(COMPILE.cpp) -O2 -o $@ $< $(CPP2OBJS) $(LDFLAGS)
+
+cfa2-bench: cfa-bench.c cfa-bench.d $(CFA2OBJS)
+	$(COMPILE.cfa) -O2 -o $@ $< $(CFA2OBJS) $(LDFLAGS)
 
 clean:
-	-rm *.o
-	-rm c-bench
-	-rm cpp-bench
-	-rm cfa-bench
+	-rm $(COBJS) c-bench
+	-rm $(CPPOBJS) cpp-bench
+	-rm $(CFAOBJS) cfa-bench
+	-rm $(C2OBJS) c2-bench
+	-rm $(CPP2OBJS) cpp2-bench
+	-rm $(CFA2OBJS) cfa2-bench
+
+distclean: clean
+	-rm $(COBJS:.o=.d) c-bench.d
+	-rm $(CPPOBJS:.o=.d) cpp-bench.d
+	-rm $(CFAOBJS:.o=.d) cfa-bench.d
+
+bench: c-bench cpp-bench cfa-bench c2-bench cpp2-bench cfa2-bench
+	@echo '## C ##'
+	@./c-bench
+	@echo '## C++ ##'
+	@./cpp-bench
+	@echo '## Cforall ##'
+	@./cfa-bench
+	@echo '## C -O2 ##'
+	@./c2-bench
+	@echo '## C++ -O2 ##'
+	@./cpp2-bench
+	@echo '## Cforall -O2 ##'
+	@./cfa2-bench
+
+# so make doesn't fail without dependency files
+%.d: ;
+
+# so make won't delete dependency files
+.PRECIOUS: %.d
+
+# include dependency files
+-include: $(COBJS:.o=.d)
+-include: $(CPPOBJS:.o=.d)
+-include: $(CFAOBJS:.o=.d)
+-include: c-bench.d
+-include: cpp-bench.d
+-include: cfa-bench.d
Index: doc/generic_types/evaluation/cfa-stack.c
===================================================================
--- doc/generic_types/evaluation/cfa-stack.c	(revision 2f0a35990a3246990679740f55a62fbfce807686)
+++ doc/generic_types/evaluation/cfa-stack.c	(revision 80cdb2f57747705b86dcdf3b714896ec1092137e)
@@ -8,5 +8,5 @@
 
 forall(otype T) void ?{}(stack(T)* s) {
-	?{}( s->head, 0 );
+	?{}( &s->head, 0 );
 }
 
@@ -25,5 +25,5 @@
 
 forall(otype T) void push(stack(T)* s, T value) {
-	s->head = new( value, s->head );
+	s->head = ((stack_node(T)*)malloc()){ value, s->head };
 }
 
