Index: src/driver/cc1.cc
===================================================================
--- src/driver/cc1.cc	(revision 7937abf354b8e749febe628bea58455f1f153459)
+++ src/driver/cc1.cc	(revision 7b9375750bf2f89700a27d7fd3cef79bbc71ef92)
@@ -10,6 +10,6 @@
 // Created On       : Fri Aug 26 14:23:51 2005
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Mon Jan 25 16:05:15 2016
-// Update Count     : 56
+// Last Modified On : Wed May  4 23:29:19 2016
+// Update Count     : 74
 //
 
@@ -108,9 +108,13 @@
 	const char *args[argc + 100];						// leave space for 100 additional cpp command line values
 	int nargs = 1;										// number of arguments in args list; 0 => command name
-	const char *uargs[20];								// leave space for 20 additional cfa-cpp command line values
-	int nuargs = 1;										// 0 => command name
+	const char *cargs[20];								// leave space for 20 additional cfa-cpp command line values
+	int ncargs = 1;										// 0 => command name
 
 	signal( SIGINT,  sigTermHandler );
 	signal( SIGTERM, sigTermHandler );
+
+#ifdef __DEBUG_H__
+	cerr << "Stage1" << endl;
+#endif // __DEBUG_H__
 
 	// process all the arguments
@@ -153,9 +157,9 @@
 				CFA_flag = true;
 			} else if ( prefix( arg, D__CFA_FLAGPREFIX__ ) ) {
-				uargs[nuargs] = ( *new string( arg.substr( D__CFA_FLAGPREFIX__.size() ) ) ).c_str();
-				nuargs += 1;
+				cargs[ncargs] = ( *new string( arg.substr( D__CFA_FLAGPREFIX__.size() ) ) ).c_str();
+				ncargs += 1;
 			} else if ( arg == "-D" && prefix( argv[i + 1], D__CFA_FLAGPREFIX__.substr(2) ) ) {
-				uargs[nuargs] = ( *new string( string( argv[i + 1] ).substr( D__CFA_FLAGPREFIX__.size() - 2 ) ) ).c_str();
-				nuargs += 1;
+				cargs[ncargs] = ( *new string( string( argv[i + 1] ).substr( D__CFA_FLAGPREFIX__.size() - 2 ) ) ).c_str();
+				ncargs += 1;
 				i += 1;									// and the argument
 			} else if ( prefix( arg, D__GCC_BPREFIX__ ) ) {
@@ -317,26 +321,41 @@
 
 	if ( fork() == 0 ) {								// child runs CFA
-		uargs[0] = ( *new string( bprefix + "/cfa-cpp" ) ).c_str();
-
-		uargs[nuargs] = tmpname;
-		nuargs += 1;
+		cargs[0] = ( *new string( bprefix + "/cfa-cpp" ) ).c_str();
+
+		// Source file-name without suffix used to generate routine names containing external initializations for TU.
+		string filename( cpp_in );
+		string::size_type posn = filename.find_last_of( "/" );
+		if ( posn != string::npos ) {
+			filename = filename.substr( posn + 1 );
+		} // if
+		posn = filename.find_last_of( "." );
+		if ( posn != string::npos ) {
+			filename = filename.substr( 0, posn );
+		} // if
+		cargs[ncargs] = ( *new string( "-F" ) ).c_str();
+		ncargs += 1;
+		cargs[ncargs] = ( *new string( filename ) ).c_str();
+		ncargs += 1;
+
+		cargs[ncargs] = tmpname;
+		ncargs += 1;
 		if ( o_name != NULL ) {
-			uargs[nuargs] = o_name;
-			nuargs += 1;
+			cargs[ncargs] = o_name;
+			ncargs += 1;
 		} else if ( ! CFA_flag ) {						// run cfa-cpp ?
-			uargs[nuargs] = cpp_out;
-			nuargs += 1;
-		} // if
-		uargs[nuargs] = NULL;							// terminate argument list
-
-#ifdef __DEBUG_H__
-		cerr << "cfa-cpp nuargs: " << o_name << " " << CFA_flag << " " << nuargs << endl;
-		for ( i = 0; uargs[i] != NULL; i += 1 ) {
-			cerr << uargs[i] << " ";
+			cargs[ncargs] = cpp_out;
+			ncargs += 1;
+		} // if
+		cargs[ncargs] = NULL;							// terminate argument list
+
+#ifdef __DEBUG_H__
+		cerr << "cfa-cpp ncargs: " << o_name << " " << CFA_flag << " " << ncargs << endl;
+		for ( i = 0; cargs[i] != NULL; i += 1 ) {
+			cerr << cargs[i] << " ";
 		} // for
 		cerr << endl;
 #endif // __DEBUG_H__
 
-		execvp( uargs[0], (char * const *)uargs );		// should not return
+		execvp( cargs[0], (char * const *)cargs );		// should not return
 		perror( "CFA Translator error: cpp level, execvp" );
 		exit( EXIT_FAILURE );
@@ -370,4 +389,8 @@
 	const char *args[argc + 100];						// leave space for 100 additional cfa command line values
 	int nargs = 1;										// number of arguments in args list; 0 => command name
+
+#ifdef __DEBUG_H__
+	cerr << "Stage2" << endl;
+#endif // __DEBUG_H__
 
 	// process all the arguments
@@ -467,12 +490,6 @@
 
 	if ( arg == "-E" ) {
-#ifdef __DEBUG_H__
-		cerr << "Stage1" << endl;
-#endif // __DEBUG_H__
 		Stage1( argc, argv );
 	} else if ( arg == "-fpreprocessed" ) {
-#ifdef __DEBUG_H__
-		cerr << "Stage2" << endl;
-#endif // __DEBUG_H__
 		Stage2( argc, argv );
 	} else {
Index: src/main.cc
===================================================================
--- src/main.cc	(revision 7937abf354b8e749febe628bea58455f1f153459)
+++ src/main.cc	(revision 7b9375750bf2f89700a27d7fd3cef79bbc71ef92)
@@ -10,6 +10,6 @@
 // Created On       : Fri May 15 23:12:02 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Wed Jan 27 22:20:20 2016
-// Update Count     : 199
+// Last Modified On : Wed May  4 23:32:59 2016
+// Update Count     : 203
 //
 
@@ -97,10 +97,11 @@
 	std::ostream *output = &std::cout;
 	int long_index;
-	std::list< Declaration* > translationUnit;
+	std::list< Declaration * > translationUnit;
+	const char *filename = NULL;;
 
 	opterr = 0;											// prevent getopt from printing error messages
 	
 	int c;
-	while ( (c = getopt_long( argc, argv, "abefglnpqrstvyzD:", long_opts, &long_index )) != -1 ) {
+	while ( (c = getopt_long( argc, argv, "abefglnpqrstvyzD:F:", long_opts, &long_index )) != -1 ) {
 		switch ( c ) {
 		  case Ast:
@@ -162,4 +163,7 @@
 			break;
 		  case 'D':										// ignore -Dxxx
+			break;
+		  case 'F':										// source file-name without suffix
+			filename = optarg;
 			break;
 		  case '?':
