Index: .gitignore
===================================================================
--- .gitignore	(revision 5d4fa18bc4bff0eb87535bc141fa9ffb76a6b33d)
+++ .gitignore	(revision a2f146ee136fe38b828af6b499e5a27a7d8006fb)
@@ -29,7 +29,8 @@
 
 # src executables, for lib and bin
-src/driver/cc1
+src/driver/as
 src/driver/cfa
 src/driver/cfa-cpp
+src/driver/cc1
 
 src/prelude/bootloader.c
Index: src/driver/Makefile.am
===================================================================
--- src/driver/Makefile.am	(revision 5d4fa18bc4bff0eb87535bc141fa9ffb76a6b33d)
+++ src/driver/Makefile.am	(revision a2f146ee136fe38b828af6b499e5a27a7d8006fb)
@@ -11,6 +11,6 @@
 ## Created On       : Sun May 31 08:49:31 2015
 ## Last Modified By : Peter A. Buhr
-## Last Modified On : Mon Apr 30 17:44:17 2018
-## Update Count     : 11
+## Last Modified On : Thu Aug  2 12:18:25 2018
+## Update Count     : 14
 ###############################################################################
 
@@ -48,3 +48,7 @@
 cc1_SOURCES = cc1.cc
 
+aslibdir = ${CFA_LIBDIR}
+aslib_PROGRAMS = as
+as_SOURCES = as.cc
+
 MAINTAINERCLEANFILES = $(CFA_BINDIR)/$(CFA_NAME) @CFA_PREFIX@/lib/${cc1lib_PROGRAMS}
Index: src/driver/Makefile.in
===================================================================
--- src/driver/Makefile.in	(revision 5d4fa18bc4bff0eb87535bc141fa9ffb76a6b33d)
+++ src/driver/Makefile.in	(revision a2f146ee136fe38b828af6b499e5a27a7d8006fb)
@@ -97,4 +97,5 @@
 noinst_PROGRAMS = cfa$(EXEEXT)
 cc1lib_PROGRAMS = cc1$(EXEEXT)
+aslib_PROGRAMS = as$(EXEEXT)
 subdir = src/driver
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
@@ -107,6 +108,9 @@
 CONFIG_CLEAN_FILES =
 CONFIG_CLEAN_VPATH_FILES =
-am__installdirs = "$(DESTDIR)$(cc1libdir)"
-PROGRAMS = $(cc1lib_PROGRAMS) $(noinst_PROGRAMS)
+am__installdirs = "$(DESTDIR)$(aslibdir)" "$(DESTDIR)$(cc1libdir)"
+PROGRAMS = $(aslib_PROGRAMS) $(cc1lib_PROGRAMS) $(noinst_PROGRAMS)
+am_as_OBJECTS = as.$(OBJEXT)
+as_OBJECTS = $(am_as_OBJECTS)
+as_LDADD = $(LDADD)
 am_cc1_OBJECTS = cc1.$(OBJEXT)
 cc1_OBJECTS = $(am_cc1_OBJECTS)
@@ -144,6 +148,6 @@
 am__v_CXXLD_0 = @echo "  CXXLD   " $@;
 am__v_CXXLD_1 = 
-SOURCES = $(cc1_SOURCES) $(cfa_SOURCES)
-DIST_SOURCES = $(cc1_SOURCES) $(cfa_SOURCES)
+SOURCES = $(as_SOURCES) $(cc1_SOURCES) $(cfa_SOURCES)
+DIST_SOURCES = $(as_SOURCES) $(cc1_SOURCES) $(cfa_SOURCES)
 am__can_run_installinfo = \
   case $$AM_UPDATE_INFO_DIR in \
@@ -300,4 +304,6 @@
 cc1libdir = ${CFA_LIBDIR}
 cc1_SOURCES = cc1.cc
+aslibdir = ${CFA_LIBDIR}
+as_SOURCES = as.cc
 MAINTAINERCLEANFILES = $(CFA_BINDIR)/$(CFA_NAME) @CFA_PREFIX@/lib/${cc1lib_PROGRAMS}
 all: all-am
@@ -334,4 +340,46 @@
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
 $(am__aclocal_m4_deps):
+install-aslibPROGRAMS: $(aslib_PROGRAMS)
+	@$(NORMAL_INSTALL)
+	@list='$(aslib_PROGRAMS)'; test -n "$(aslibdir)" || list=; \
+	if test -n "$$list"; then \
+	  echo " $(MKDIR_P) '$(DESTDIR)$(aslibdir)'"; \
+	  $(MKDIR_P) "$(DESTDIR)$(aslibdir)" || exit 1; \
+	fi; \
+	for p in $$list; do echo "$$p $$p"; done | \
+	sed 's/$(EXEEXT)$$//' | \
+	while read p p1; do if test -f $$p \
+	  ; then echo "$$p"; echo "$$p"; else :; fi; \
+	done | \
+	sed -e 'p;s,.*/,,;n;h' \
+	    -e 's|.*|.|' \
+	    -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \
+	sed 'N;N;N;s,\n, ,g' | \
+	$(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \
+	  { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+	    if ($$2 == $$4) files[d] = files[d] " " $$1; \
+	    else { print "f", $$3 "/" $$4, $$1; } } \
+	  END { for (d in files) print "f", d, files[d] }' | \
+	while read type dir files; do \
+	    if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+	    test -z "$$files" || { \
+	      echo " $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(aslibdir)$$dir'"; \
+	      $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(aslibdir)$$dir" || exit $$?; \
+	    } \
+	; done
+
+uninstall-aslibPROGRAMS:
+	@$(NORMAL_UNINSTALL)
+	@list='$(aslib_PROGRAMS)'; test -n "$(aslibdir)" || list=; \
+	files=`for p in $$list; do echo "$$p"; done | \
+	  sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \
+	      -e 's/$$/$(EXEEXT)/' \
+	`; \
+	test -n "$$list" || exit 0; \
+	echo " ( cd '$(DESTDIR)$(aslibdir)' && rm -f" $$files ")"; \
+	cd "$(DESTDIR)$(aslibdir)" && rm -f $$files
+
+clean-aslibPROGRAMS:
+	-test -z "$(aslib_PROGRAMS)" || rm -f $(aslib_PROGRAMS)
 install-cc1libPROGRAMS: $(cc1lib_PROGRAMS)
 	@$(NORMAL_INSTALL)
@@ -380,4 +428,8 @@
 	-test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS)
 
+as$(EXEEXT): $(as_OBJECTS) $(as_DEPENDENCIES) $(EXTRA_as_DEPENDENCIES) 
+	@rm -f as$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(as_OBJECTS) $(as_LDADD) $(LIBS)
+
 cc1$(EXEEXT): $(cc1_OBJECTS) $(cc1_DEPENDENCIES) $(EXTRA_cc1_DEPENDENCIES) 
 	@rm -f cc1$(EXEEXT)
@@ -394,4 +446,5 @@
 	-rm -f *.tab.c
 
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/as.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cc1.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cfa.Po@am__quote@
@@ -499,5 +552,5 @@
 all-am: Makefile $(PROGRAMS)
 installdirs:
-	for dir in "$(DESTDIR)$(cc1libdir)"; do \
+	for dir in "$(DESTDIR)$(aslibdir)" "$(DESTDIR)$(cc1libdir)"; do \
 	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
 	done
@@ -535,6 +588,6 @@
 clean: clean-am
 
-clean-am: clean-cc1libPROGRAMS clean-generic clean-noinstPROGRAMS \
-	mostlyclean-am
+clean-am: clean-aslibPROGRAMS clean-cc1libPROGRAMS clean-generic \
+	clean-noinstPROGRAMS mostlyclean-am
 
 distclean: distclean-am
@@ -556,5 +609,5 @@
 info-am:
 
-install-data-am: install-cc1libPROGRAMS
+install-data-am: install-aslibPROGRAMS install-cc1libPROGRAMS
 
 install-dvi: install-dvi-am
@@ -602,5 +655,5 @@
 ps-am:
 
-uninstall-am: uninstall-cc1libPROGRAMS
+uninstall-am: uninstall-aslibPROGRAMS uninstall-cc1libPROGRAMS
 	@$(NORMAL_INSTALL)
 	$(MAKE) $(AM_MAKEFLAGS) uninstall-hook
@@ -608,16 +661,17 @@
 
 .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean \
-	clean-cc1libPROGRAMS clean-generic clean-noinstPROGRAMS \
-	cscopelist-am ctags ctags-am distclean distclean-compile \
-	distclean-generic distclean-tags distdir dvi dvi-am html \
-	html-am info info-am install install-am install-cc1libPROGRAMS \
-	install-data install-data-am install-dvi install-dvi-am \
-	install-exec install-exec-am install-exec-hook install-html \
-	install-html-am install-info install-info-am install-man \
-	install-pdf install-pdf-am install-ps install-ps-am \
-	install-strip installcheck installcheck-am installdirs \
-	maintainer-clean maintainer-clean-generic mostlyclean \
-	mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \
-	tags tags-am uninstall uninstall-am uninstall-cc1libPROGRAMS \
+	clean-aslibPROGRAMS clean-cc1libPROGRAMS clean-generic \
+	clean-noinstPROGRAMS cscopelist-am ctags ctags-am distclean \
+	distclean-compile distclean-generic distclean-tags distdir dvi \
+	dvi-am html html-am info info-am install install-am \
+	install-aslibPROGRAMS install-cc1libPROGRAMS install-data \
+	install-data-am install-dvi install-dvi-am install-exec \
+	install-exec-am install-exec-hook install-html install-html-am \
+	install-info install-info-am install-man install-pdf \
+	install-pdf-am install-ps install-ps-am install-strip \
+	installcheck installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-compile \
+	mostlyclean-generic pdf pdf-am ps ps-am tags tags-am uninstall \
+	uninstall-am uninstall-aslibPROGRAMS uninstall-cc1libPROGRAMS \
 	uninstall-hook
 
Index: src/driver/as.cc
===================================================================
--- src/driver/as.cc	(revision a2f146ee136fe38b828af6b499e5a27a7d8006fb)
+++ src/driver/as.cc	(revision a2f146ee136fe38b828af6b499e5a27a7d8006fb)
@@ -0,0 +1,122 @@
+// 
+// Cforall Version 1.0.0 Copyright (C) 2015 University of Waterloo
+//
+// The contents of this file are covered under the licence agreement in the
+// file "LICENCE" distributed with Cforall.
+// 
+// as.c -- 
+// 
+// Author           : Peter A. Buhr
+// Created On       : Wed Aug  1 10:49:42 2018
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Thu Aug  2 12:06:23 2018
+// Update Count     : 78
+// 
+
+#include <iostream>
+#include <fstream>
+using namespace std;
+#include <cstdio>										// perror
+#include <cstdlib>										// exit, mkstemps
+#include <unistd.h>										// execvp, unlink
+#include <csignal>										// signal
+
+//#define __DEBUG_H__
+
+
+#define SUFFIX ".s"
+char tmpname[] = P_tmpdir "/CFAXXXXXX" SUFFIX;
+int tmpfilefd = -1;
+
+
+void rmfile( const char * fname ) {
+	if ( unlink( fname ) == -1 ) {						// remove tmpname
+		perror ( "CFA Translator error: cpp failed" );
+		exit( EXIT_FAILURE );
+	} // if
+} // rmtmpfile
+
+
+void sigTermHandler( __attribute__((unused)) int signal ) {
+	if ( tmpfilefd != -1 ) {							// RACE, file created ?
+		rmfile( tmpname );								// remove
+		exit( EXIT_FAILURE );							// terminate 
+	} // if
+	tmpfilefd = -1;										// mark closed
+} // sigTermHandler
+
+
+int main( const int argc, const char * argv[], __attribute__((unused)) const char * const env[] ) {
+	#ifdef __DEBUG_H__
+	for ( int i = 0; env[i] != NULL; i += 1 ) {
+		cerr << env[i] << endl;
+	} // for
+
+	for ( int i = 0; i < argc; i += 1 ) {
+		cerr << argv[i] << endl;
+	} // for
+	#endif // __DEBUG_H__
+
+	signal( SIGINT,  sigTermHandler );					// try to delete temporary file on interrupt
+	signal( SIGTERM, sigTermHandler );
+
+	// Create a temporary file to store output of the modified assembler.
+
+	tmpfilefd = mkstemps( tmpname, sizeof( SUFFIX ) - 1 );
+	if ( tmpfilefd == -1 ) {
+		perror( "CFA Translator error: cpp level, mkstemp" );
+		exit( EXIT_FAILURE );
+	} // if
+	FILE * tmpfilest = fdopen( tmpfilefd, "w" );		// wrap C stream (cannot wrap C++ stream)
+
+	#ifdef __DEBUG_H__
+	cerr << "tmpname:" << tmpname << " tmpfilefd:" << tmpfilefd << endl;
+	#endif // __DEBUG_H__
+
+	ifstream in;
+	in.exceptions( ios_base::failbit );					// use exceptions versus return codes
+	try {
+		in.open( argv[argc - 1] );						// assume .s file is last argument
+	} catch( ios_base::failure ) {
+		perror ( "CFA Translator error: cpp failed" );
+		exit( EXIT_FAILURE );
+	} // try
+
+	try {
+		string line;
+		for ( ;; ) {									// loop until end-of-file
+			getline( in, line );
+			line += '\n';
+			fprintf( tmpfilest, "%s", line.c_str() );
+			if ( line == ".Ldebug_info0:\n" ) {			// debug information ?
+				for ( int i = 0; i < 6; i += 1 ) {		// move 6 lines forward
+					getline( in, line );
+					line += '\n';
+					fprintf( tmpfilest, "%s", line.c_str() );
+				} // for
+				getline( in, line );					// ignore C language line
+				fprintf( tmpfilest, "%s", "\t.byte\t0x25\n" ); // replace with CFA language line
+			} // if
+		} // for
+	} catch ( ios_base::failure ) {
+		fclose( tmpfilest );							// flush buffers
+	} // try
+
+	rmfile( argv[argc - 1] );							// remove given file
+
+	if ( rename( tmpname, argv[argc - 1] ) == -1 ) {	// rename temp file to original file
+		perror ( "CFA Translator error: cpp failed" );
+		exit( EXIT_FAILURE );
+	} // if
+
+	argv[0] = "as";
+	execvp( argv[0], (char * const *)argv );			// should not return
+	perror( "CFA Translator error: cpp level, execvp" );
+	exit( EXIT_FAILURE );								// tell gcc not to go any further
+} // main
+
+// Local Variables: //
+// tab-width: 4 //
+// mode: c++ //
+// compile-command: "g++ -Wall -Wextra as.c -o as" //
+// End: //
