Changeset 330d933
- Timestamp:
- Aug 25, 2019, 8:48:51 AM (4 years ago)
- Branches:
- ADT, arm-eh, ast-experimental, enum, forall-pointer-decay, jacob/cs343-translation, jenkins-sandbox, master, new-ast, new-ast-unique-expr, pthread-emulation, qualifiedEnum
- Children:
- 2aab69b, 5a43ab8
- Parents:
- f9bf142 (diff), bbb1b35 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)
links above to see all the changes relative to each parent. - Files:
-
- 2 added
- 49 edited
Legend:
- Unmodified
- Added
- Removed
-
Jenkins/FullBuild
rf9bf142 r330d933 132 132 133 133 <img src="https://cforall.uwaterloo.ca/jenkins/job/Cforall/job/master/plot/Compilation/getPlot?index=0" > 134 <img src="https://cforall.uwaterloo.ca/jenkins/job/Cforall/job/master/plot/Compilation/getPlot?index=1" > 134 135 135 136 <p>- Logs ----------------------------------------------------------------</p> -
Jenkinsfile
rf9bf142 r330d933 197 197 if( Settings.Publish && !Settings.RunBenchmark ) { echo 'No results to publish!!!' } 198 198 199 def groupCompile = new PlotGroup('Compilation', ' seconds', true)200 def groupConcurrency = new PlotGroup('Concurrency', ' nanoseconds', false)199 def groupCompile = new PlotGroup('Compilation', 'duration (s) - lower is better', true) 200 def groupConcurrency = new PlotGroup('Concurrency', 'duration (n) - lower is better', false) 201 201 202 202 //Then publish the results 203 do_plot(Settings.RunBenchmark && Settings.Publish, 'compile' , groupCompile , 'Compilation')204 do_plot(Settings.RunBenchmark && Settings.Publish, 'compile -diff' , groupCompile , 'Compilation Speed-Up')205 do_plot(Settings.RunBenchmark && Settings.Publish, 'ctxswitch' , groupConcurrency, 'Context Switching')206 do_plot(Settings.RunBenchmark && Settings.Publish, 'ctxswitch -diff', groupConcurrency, 'Context Switching Speed-Up')207 do_plot(Settings.RunBenchmark && Settings.Publish, 'mutex' , groupConcurrency, 'Mutual Exclusion')208 do_plot(Settings.RunBenchmark && Settings.Publish, 'mutex -diff' , groupConcurrency, 'Mutual Exclusion Speed-Up')209 do_plot(Settings.RunBenchmark && Settings.Publish, 'signal' , groupConcurrency, 'Internal and External Scheduling')210 do_plot(Settings.RunBenchmark && Settings.Publish, 'signal -diff' , groupConcurrency, 'Internal and External Scheduling Speed-Up')203 do_plot(Settings.RunBenchmark && Settings.Publish, 'compile' , groupCompile , false, 'Compilation') 204 do_plot(Settings.RunBenchmark && Settings.Publish, 'compile.diff' , groupCompile , true , 'Compilation (relative)') 205 do_plot(Settings.RunBenchmark && Settings.Publish, 'ctxswitch' , groupConcurrency, false, 'Context Switching') 206 do_plot(Settings.RunBenchmark && Settings.Publish, 'ctxswitch.diff', groupConcurrency, true , 'Context Switching (relative)') 207 do_plot(Settings.RunBenchmark && Settings.Publish, 'mutex' , groupConcurrency, false, 'Mutual Exclusion') 208 do_plot(Settings.RunBenchmark && Settings.Publish, 'mutex.diff' , groupConcurrency, true , 'Mutual Exclusion (relative)') 209 do_plot(Settings.RunBenchmark && Settings.Publish, 'signal' , groupConcurrency, false, 'Internal and External Scheduling') 210 do_plot(Settings.RunBenchmark && Settings.Publish, 'signal.diff' , groupConcurrency, true , 'Internal and External Scheduling (relative)') 211 211 } 212 212 } … … 466 466 } 467 467 468 def do_plot(boolean new_data, String file, PlotGroup group, String title) {468 def do_plot(boolean new_data, String file, PlotGroup group, boolean relative, String title) { 469 469 470 470 if(new_data) { … … 489 489 exclZero: false, 490 490 keepRecords: false, 491 logarithmic: group.log,491 logarithmic: !relative && group.log, 492 492 numBuilds: '120', 493 493 useDescr: true, -
Makefile.in
rf9bf142 r330d933 281 281 CYGPATH_W = @CYGPATH_W@ 282 282 DEFS = @DEFS@ 283 DEMANGLER = @DEMANGLER@ 283 284 DEPDIR = @DEPDIR@ 284 285 DLLTOOL = @DLLTOOL@ … … 306 307 LIBCFA_TARGET_DIRS = @LIBCFA_TARGET_DIRS@ 307 308 LIBCFA_TARGET_MAKEFILES = @LIBCFA_TARGET_MAKEFILES@ 309 LIBDEMANGLE = @LIBDEMANGLE@ 308 310 LIBOBJS = @LIBOBJS@ 309 311 LIBS = @LIBS@ -
automake/cfa.m4
rf9bf142 r330d933 66 66 "x86-64" ) cannon_arch_name="x64";; 67 67 "x86_64" ) cannon_arch_name="x64";; 68 "aarch64" ) cannon_arch_name=" x64";;68 "aarch64" ) cannon_arch_name="arm";; 69 69 "x86" ) cannon_arch_name="x86";; 70 70 "i386" ) cannon_arch_name="x86";; -
benchmark/Makefile.in
rf9bf142 r330d933 231 231 CYGPATH_W = @CYGPATH_W@ 232 232 DEFS = @DEFS@ 233 DEMANGLER = @DEMANGLER@ 233 234 DEPDIR = @DEPDIR@ 234 235 DLLTOOL = @DLLTOOL@ … … 256 257 LIBCFA_TARGET_DIRS = @LIBCFA_TARGET_DIRS@ 257 258 LIBCFA_TARGET_MAKEFILES = @LIBCFA_TARGET_MAKEFILES@ 259 LIBDEMANGLE = @LIBDEMANGLE@ 258 260 LIBOBJS = @LIBOBJS@ 259 261 LIBS = @LIBS@ -
configure
rf9bf142 r330d933 637 637 LIBOBJS 638 638 CFA_BACKEND_CC 639 DEMANGLER 640 LIBDEMANGLE 639 641 WITH_LIBTCMALLOC_FALSE 640 642 WITH_LIBTCMALLOC_TRUE … … 797 799 with_target_hosts 798 800 enable_gprofiler 801 enable_demangler 799 802 enable_dependency_tracking 800 803 enable_shared … … 1457 1460 --disable-silent-rules verbose build output (undo: "make V=0") 1458 1461 --enable-gprofiler whether or not to enable gprofiler tools (if available) 1462 --enable-demangler whether or not to build the demangler (executable and library) 1459 1463 --enable-dependency-tracking 1460 1464 do not reject slow dependency extractors … … 3401 3405 3402 3406 3407 # Check whether --enable-demangler was given. 3408 if test "${enable_demangler+set}" = set; then : 3409 enableval=$enable_demangler; enable_demangler=$enableval 3410 else 3411 enable_demangler=yes 3412 fi 3413 3414 3403 3415 TARGET_HOSTS=${target_hosts} 3404 3416 … … 3433 3445 "x86-64" ) cannon_arch_name="x64";; 3434 3446 "x86_64" ) cannon_arch_name="x64";; 3435 "aarch64" ) cannon_arch_name=" x64";;3447 "aarch64" ) cannon_arch_name="arm";; 3436 3448 "x86" ) cannon_arch_name="x86";; 3437 3449 "i386" ) cannon_arch_name="x86";; … … 3475 3487 "x86-64" ) cannon_arch_name="x64";; 3476 3488 "x86_64" ) cannon_arch_name="x64";; 3477 "aarch64" ) cannon_arch_name=" x64";;3489 "aarch64" ) cannon_arch_name="arm";; 3478 3490 "x86" ) cannon_arch_name="x86";; 3479 3491 "i386" ) cannon_arch_name="x86";; … … 16780 16792 16781 16793 16794 # conditionnally build the demangler 16795 if test "x$enable_demangler" == xyes; then 16796 LIBDEMANGLE="libdemangle.a" 16797 DEMANGLER="demangler" 16798 else 16799 LIBDEMANGLE="" 16800 DEMANGLER="" 16801 fi 16802 16803 16804 16782 16805 # Checks for header files. 16783 16806 for ac_header in libintl.h malloc.h unistd.h -
configure.ac
rf9bf142 r330d933 133 133 enable_gprofiler=$enableval, enable_gprofiler=yes) 134 134 135 AC_ARG_ENABLE(demangler, 136 [ --enable-demangler whether or not to build the demangler (executable and library)], 137 enable_demangler=$enableval, enable_demangler=yes) 138 135 139 AC_SUBST(TARGET_HOSTS, ${target_hosts}) 136 140 … … 205 209 AM_CONDITIONAL([WITH_LIBTCMALLOC], [test "x$enable_gprofiler" = "xyes" -a "$HAVE_LIBTCMALLOC" -eq 1]) 206 210 211 # conditionnally build the demangler 212 if test "x$enable_demangler" == xyes; then 213 LIBDEMANGLE="libdemangle.a" 214 DEMANGLER="demangler" 215 else 216 LIBDEMANGLE="" 217 DEMANGLER="" 218 fi 219 AC_SUBST([LIBDEMANGLE]) 220 AC_SUBST([DEMANGLER]) 221 207 222 # Checks for header files. 208 223 AC_CHECK_HEADERS([libintl.h malloc.h unistd.h], [], [echo "Error: Missing required header"; exit 1]) -
driver/Makefile.in
rf9bf142 r330d933 218 218 CYGPATH_W = @CYGPATH_W@ 219 219 DEFS = @DEFS@ 220 DEMANGLER = @DEMANGLER@ 220 221 DEPDIR = @DEPDIR@ 221 222 DLLTOOL = @DLLTOOL@ … … 243 244 LIBCFA_TARGET_DIRS = @LIBCFA_TARGET_DIRS@ 244 245 LIBCFA_TARGET_MAKEFILES = @LIBCFA_TARGET_MAKEFILES@ 246 LIBDEMANGLE = @LIBDEMANGLE@ 245 247 LIBOBJS = @LIBOBJS@ 246 248 LIBS = @LIBS@ -
driver/cc1.cc
rf9bf142 r330d933 10 10 // Created On : Fri Aug 26 14:23:51 2005 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Mon Sep 3 16:57:05 201813 // Update Count : 12512 // Last Modified On : Fri Aug 23 15:06:27 2019 13 // Update Count : 371 14 14 // 15 15 … … 19 19 #include <string> 20 20 using std::string; 21 #include <algorithm> // find 21 22 #include <cstdio> // stderr, stdout, perror, fprintf 22 23 #include <cstdlib> // getenv, exit, mkstemp 23 24 #include <unistd.h> // execvp, fork, unlink 24 25 #include <sys/wait.h> // wait 26 #include <fcntl.h> 27 25 28 26 29 #include "config.h" // configure info … … 30 33 31 34 32 string compiler_name( CFA_BACKEND_CC ); // path/name of C compiler 33 34 string D__GCC_BPREFIX__( "-D__GCC_BPREFIX__=" ); 35 string D__CFA_FLAGPREFIX__( "-D__CFA_FLAG__=" ); 36 37 char tmpname[] = P_tmpdir "/CFAXXXXXX"; 38 int tmpfilefd = -1; 39 40 41 bool prefix( string arg, string pre ) { 35 static string installlibdir( CFA_LIBDIR ); // fixed location of cc1 and cfa-cpp commands when installed 36 static string compiler_path( CFA_BACKEND_CC ); // path/name of C compiler 37 static bool CFA_flag = false; // -CFA flag 38 static bool save_temps = false; // -save-temps flag 39 static string o_file; 40 41 42 static bool prefix( const string & arg, const string & pre ) { 42 43 return arg.substr( 0, pre.size() ) == pre; 43 44 } // prefix 44 45 45 enum { NumSuffixes = 2 }; 46 const string suffixes[NumSuffixes] = { "cfa", "hfa", }; 47 48 void suffix( string arg, const char * args[], int & nargs ) { 49 //std::cerr << arg << std::endl; 46 static void suffix( const string & arg, const char * args[], int & nargs ) { 47 enum { NumSuffixes = 3 }; 48 static const string suffixes[NumSuffixes] = { "cfa", "hfa", "ifa" }; 49 50 50 size_t dot = arg.find_last_of( "." ); 51 //std::cerr << dot << " " << (dot != string::npos ? arg.substr( dot + 1 ) : "fred" ) << std::endl;52 51 if ( dot == string::npos ) return; 53 string sx = arg.substr( dot + 1 ); 54 for ( int i = 0; i < NumSuffixes; i += 1 ) { 55 if ( sx == suffixes[i] ) { 56 args[nargs] = "-x"; 57 nargs += 1; 58 args[nargs] = "c"; 59 nargs += 1; 60 return; 61 } // if 62 } // for 52 const string * end = suffixes + NumSuffixes; 53 if ( std::find( suffixes, end, arg.substr( dot + 1 ) ) != end ) { 54 args[nargs++] = "-x"; 55 args[nargs++] = "c"; 56 } // if 63 57 } // suffix 64 58 65 59 66 void checkEnv( const char * args[], int & nargs ) { 67 char *value; 68 69 value = getenv( "__CFA_COMPILER__" ); 70 if ( value != NULL ) { 71 compiler_name = value; 72 #ifdef __DEBUG_H__ 73 cerr << "env arg:\"" << compiler_name << "\"" << endl; 74 #endif // __DEBUG_H__ 75 } // if 76 77 value = getenv( "__GCC_MACHINE__" ); 78 if ( value != NULL ) { 79 args[nargs] = ( *new string( value ) ).c_str(); // pass the argument along 80 #ifdef __DEBUG_H__ 81 cerr << "env arg:\"" << args[nargs] << "\"" << endl; 82 #endif // __DEBUG_H__ 83 nargs += 1; 84 } // if 85 86 value = getenv( "__GCC_VERSION__" ); 87 if ( value != NULL ) { 88 args[nargs] = ( *new string( value ) ).c_str(); // pass the argument along 89 #ifdef __DEBUG_H__ 90 cerr << "env arg:\"" << args[nargs] << "\"" << endl; 91 #endif // __DEBUG_H__ 92 nargs += 1; 93 } // if 94 } // checkEnv 95 96 97 void rmtmpfile() { 60 static string __CFA_FLAGPREFIX__( "__CFA_FLAG" ); 61 62 static void checkEnv1( const char * args[], int & nargs ) { // stage 1 63 extern char ** environ; 64 65 for ( int i = 0; environ[i]; i += 1 ) { 66 string arg( environ[i] ); 67 #ifdef __DEBUG_H__ 68 cerr << "env arg:\"" << arg << "\"" << endl; 69 #endif // __DEBUG_H__ 70 71 if ( prefix( arg, __CFA_FLAGPREFIX__ ) ) { 72 string val( arg.substr( __CFA_FLAGPREFIX__.size() + 4 ) ); 73 if ( prefix( val, "-compiler=" ) ) { 74 compiler_path = val.substr( 10 ); 75 } // if 76 } // if 77 } // for 78 } // checkEnv1 79 80 81 static void checkEnv2( const char * args[], int & nargs ) { // stage 2 82 extern char ** environ; 83 84 for ( int i = 0; environ[i]; i += 1 ) { 85 string arg( environ[i] ); 86 #ifdef __DEBUG_H__ 87 cerr << "env arg:\"" << arg << "\"" << endl; 88 #endif // __DEBUG_H__ 89 90 if ( prefix( arg, __CFA_FLAGPREFIX__ ) ) { 91 string val( arg.substr( __CFA_FLAGPREFIX__.size() + 4 ) ); 92 if ( prefix( val, "-compiler=" ) ) { 93 compiler_path = val.substr( 10 ); 94 } else if ( val == "-CFA" ) { 95 CFA_flag = true; 96 } else if ( val == "-save-temps" ) { 97 save_temps = true; 98 } else if ( prefix( val, "-o=" ) ) { // output file for -CFA 99 o_file = val.substr( 3 ); 100 } else { 101 args[nargs++] = ( *new string( arg.substr( __CFA_FLAGPREFIX__.size() + 4 ) ) ).c_str(); 102 } // if 103 } // if 104 } // for 105 } // checkEnv2 106 107 108 static char tmpname[] = P_tmpdir "/CFAXXXXXX.i"; 109 static int tmpfilefd = -1; 110 static bool startrm = false; 111 112 static void rmtmpfile() { 113 if ( tmpfilefd == -1 ) return; // RACE, file created ? 114 115 startrm = true; // RACE with C-c C-c 98 116 if ( unlink( tmpname ) == -1 ) { // remove tmpname 99 perror ( "C FA Translator error: cpp failed" );100 exit( EXIT_FAILURE ); 101 } // if 102 tmpfilefd = -1; // mark closed117 perror ( "CC1 Translator error: failed, unlink" ); 118 exit( EXIT_FAILURE ); 119 } // if 120 tmpfilefd = -1; // mark removed 103 121 } // rmtmpfile 104 122 105 123 106 void sigTermHandler( __attribute__((unused)) int signal ) { 124 static void sigTermHandler( int ) { // C-c C-c 125 if ( startrm ) return; // return and let rmtmpfile finish, and then program finishes 126 107 127 if ( tmpfilefd != -1 ) { // RACE, file created ? 108 rmtmpfile(); // remove 109 exit( EXIT_FAILURE ); // terminate110 } // if128 rmtmpfile(); // remove tmpname 129 } // if 130 exit( EXIT_FAILURE ); // terminate 111 131 } // sigTermHandler 112 132 113 133 114 void Stage1( const int argc, const char * const argv[] ) {134 static void Stage1( const int argc, const char * const argv[] ) { 115 135 int code; 116 117 136 string arg; 118 string bprefix; 119 120 const char *cpp_in = NULL; 121 const char *cpp_out = NULL; 122 123 bool CFA_flag = false; 137 138 const char * cpp_in = nullptr; 139 const char * cpp_out = nullptr; 140 124 141 bool cpp_flag = false; 125 const char *o_name = NULL;126 127 const char * args[argc + 100]; // leave space for 100 additional cpp command line values142 bool o_flag = false; 143 144 const char * args[argc + 100]; // leave space for 100 additional cpp command line values 128 145 int nargs = 1; // number of arguments in args list; 0 => command name 129 const char *cargs[20]; // leave space for 20 additional cfa-cpp command line values130 int ncargs = 1; // 0 => command name131 132 signal( SIGINT, sigTermHandler );133 signal( SIGTERM, sigTermHandler );134 146 135 147 #ifdef __DEBUG_H__ 136 148 cerr << "Stage1" << endl; 137 149 #endif // __DEBUG_H__ 138 checkEnv ( args, nargs ); // arguments passed via environment variables150 checkEnv1( args, nargs ); // arguments passed via environment variables 139 151 #ifdef __DEBUG_H__ 140 152 for ( int i = 1; i < argc; i += 1 ) { … … 168 180 i += 1; // and the argument 169 181 cpp_flag = true; 170 } else if ( arg == "-D__CFA_PREPROCESS__" ) { 171 CFA_flag = true; 172 } else if ( arg == "-D" && string( argv[i + 1] ) == "__CFA_PREPROCESS__" ) { 173 i += 1; // and the argument 174 CFA_flag = true; 175 } else if ( prefix( arg, D__CFA_FLAGPREFIX__ ) ) { 176 cargs[ncargs] = ( *new string( arg.substr( D__CFA_FLAGPREFIX__.size() ) ) ).c_str(); 177 ncargs += 1; 178 } else if ( arg == "-D" && prefix( argv[i + 1], D__CFA_FLAGPREFIX__.substr(2) ) ) { 179 cargs[ncargs] = ( *new string( string( argv[i + 1] ).substr( D__CFA_FLAGPREFIX__.size() - 2 ) ) ).c_str(); 180 ncargs += 1; 181 i += 1; // and the argument 182 } else if ( prefix( arg, D__GCC_BPREFIX__ ) ) { 183 bprefix = arg.substr( D__GCC_BPREFIX__.size() ); 184 } else if ( arg == "-D" && prefix( argv[i + 1], D__GCC_BPREFIX__.substr(2) ) ) { 185 bprefix = string( argv[i + 1] ).substr( D__GCC_BPREFIX__.size() - 2 ); 186 i += 1; // and the argument 187 188 // all other flags 182 183 // all other flags 189 184 190 185 } else if ( arg == "-o" ) { 191 186 i += 1; 192 o_name = argv[i]; 187 o_flag = true; 188 cpp_out = argv[i]; 193 189 } else { 194 args[nargs] = argv[i]; // pass the flag along 195 nargs += 1; 190 args[nargs++] = argv[i]; // pass the flag along 196 191 // CPP flags with an argument 197 192 if ( arg == "-D" || arg == "-U" || arg == "-I" || arg == "-MF" || arg == "-MT" || arg == "-MQ" || … … 199 194 arg == "-iwithprefix" || arg == "-iwithprefixbefore" || arg == "-isystem" || arg == "-isysroot" ) { 200 195 i += 1; 201 args[nargs] = argv[i]; // pass the argument along 202 nargs += 1; 196 args[nargs++] = argv[i]; // pass the argument along 203 197 #ifdef __DEBUG_H__ 204 198 cerr << "argv[" << i << "]:\"" << argv[i] << "\"" << endl; 205 199 #endif // __DEBUG_H__ 206 200 } else if ( arg == "-MD" || arg == "-MMD" ) { 207 args[nargs] = "-MF"; // insert before file 208 nargs += 1; 201 args[nargs++] = "-MF"; // insert before file 209 202 i += 1; 210 args[nargs] = argv[i]; // pass the argument along 211 nargs += 1; 203 args[nargs++] = argv[i]; // pass the argument along 212 204 #ifdef __DEBUG_H__ 213 205 cerr << "argv[" << i << "]:\"" << argv[i] << "\"" << endl; … … 216 208 } // if 217 209 } else { // obtain input and possibly output files 218 if ( cpp_in == NULL) {210 if ( cpp_in == nullptr ) { 219 211 cpp_in = argv[i]; 220 212 #ifdef __DEBUG_H__ 221 213 cerr << "cpp_in:\"" << cpp_in << "\"" << endl; 222 214 #endif // __DEBUG_H__ 223 } else if ( cpp_out == NULL) {215 } else if ( cpp_out == nullptr ) { 224 216 cpp_out = argv[i]; 225 217 #ifdef __DEBUG_H__ … … 238 230 cerr << " " << args[i]; 239 231 } // for 240 if ( cpp_in != NULL) cerr << " " << cpp_in;241 if ( cpp_out != NULL) cerr << " " << cpp_out;232 if ( cpp_in != nullptr ) cerr << " " << cpp_in; 233 if ( cpp_out != nullptr ) cerr << " " << cpp_out; 242 234 cerr << endl; 243 235 #endif // __DEBUG_H__ 244 236 245 if ( cpp_in == NULL) {237 if ( cpp_in == nullptr ) { 246 238 cerr << "Usage: " << argv[0] << " input-file [output-file] [options]" << endl; 247 239 exit( EXIT_FAILURE ); … … 252 244 // output or -o. The call to cfa has a -E so it does not have to be added to the argument list. 253 245 254 args[0] = compiler_ name.c_str();246 args[0] = compiler_path.c_str(); 255 247 suffix( cpp_in, args, nargs ); // check suffix 256 args[nargs] = cpp_in; 257 nargs += 1; 258 if ( o_name != NULL ) { // location for output 259 args[nargs] = "-o"; 260 nargs += 1; 261 args[nargs] = o_name; 262 nargs += 1; 263 } // if 264 args[nargs] = NULL; // terminate argument list 248 args[nargs++] = cpp_in; 249 if ( o_flag ) { // location for output 250 args[nargs++] = "-o"; 251 } // if 252 args[nargs++] = cpp_out; 253 args[nargs] = nullptr; // terminate argument list 265 254 266 255 #ifdef __DEBUG_H__ 267 256 cerr << "nargs: " << nargs << endl; 268 for ( int i = 0; args[i] != NULL; i += 1 ) {257 for ( int i = 0; args[i] != nullptr; i += 1 ) { 269 258 cerr << args[i] << " "; 270 259 } // for … … 272 261 #endif // __DEBUG_H__ 273 262 274 execvp( args[0], (char *const *)args ); // should not return 275 perror( "CFA Translator error: cpp level, execvp" ); 276 exit( EXIT_FAILURE ); 277 } // if 278 279 // Create a temporary file to store output of the C preprocessor. 280 281 tmpfilefd = mkstemp( tmpname ); 282 if ( tmpfilefd == -1 ) { 283 perror( "CFA Translator error: cpp level, mkstemp" ); 284 exit( EXIT_FAILURE ); 285 } // if 286 287 #ifdef __DEBUG_H__ 288 cerr << "tmpname:" << tmpname << " tmpfilefd:" << tmpfilefd << endl; 289 #endif // __DEBUG_H__ 290 291 // Run the C preprocessor and save the output in tmpfile. 263 execvp( args[0], (char * const *)args ); // should not return 264 perror( "CC1 Translator error: stage 1, execvp" ); 265 exit( EXIT_FAILURE ); 266 } // if 267 268 // Run the C preprocessor and save the output in the given file. 292 269 293 270 if ( fork() == 0 ) { // child process ? … … 295 272 // an error (e.g., cannot find include file). Whereas, output is always generated, even when there is an error, 296 273 // when cpp writes to stdout. Hence, stdout is redirected into the temporary file. 297 if ( freopen( tmpname, "w", stdout ) == NULL ) { // redirect stdout to tmpname298 perror( "C FA Translator error: cpp level, freopen" );274 if ( freopen( cpp_out, "w", stdout ) == nullptr ) { // redirect stdout to output file 275 perror( "CC1 Translator error: stage 1, freopen" ); 299 276 exit( EXIT_FAILURE ); 300 277 } // if 301 278 302 args[0] = compiler_ name.c_str();279 args[0] = compiler_path.c_str(); 303 280 suffix( cpp_in, args, nargs ); // check suffix 304 args[nargs] = cpp_in; // input to cpp 305 nargs += 1; 306 args[nargs] = NULL; // terminate argument list 281 args[nargs++] = cpp_in; // input to cpp 282 args[nargs] = nullptr; // terminate argument list 307 283 308 284 #ifdef __DEBUG_H__ 309 285 cerr << "cpp nargs: " << nargs << endl; 310 for ( int i = 0; args[i] != NULL; i += 1 ) {286 for ( int i = 0; args[i] != nullptr; i += 1 ) { 311 287 cerr << args[i] << " "; 312 288 } // for … … 314 290 #endif // __DEBUG_H__ 315 291 316 execvp( args[0], (char * const *)args );// should not return317 perror( "C FA Translator error: cpp level, execvp" );292 execvp( args[0], (char * const *)args ); // should not return 293 perror( "CC1 Translator error: stage 1, execvp" ); 318 294 exit( EXIT_FAILURE ); 319 295 } // if … … 325 301 #endif // __DEBUG_H__ 326 302 327 if ( WIFSIGNALED(code) != 0 ) { // child failed ?328 rmtmpfile(); // remove tmpname329 cerr << "CFA Translator error: cpp failed with signal " << WTERMSIG(code) << endl;330 exit( EXIT_FAILURE );331 } // if332 333 if ( WEXITSTATUS(code) != 0 ) { // child error ?334 rmtmpfile(); // remove tmpname335 exit( WEXITSTATUS( code ) ); // do not continue336 } // if337 338 // If -CFA flag specified, run the cfa-cpp preprocessor on the temporary file, and output is written to standard339 // output. Otherwise, run the cfa-cpp preprocessor on the temporary file and save the result into the output file.340 341 if ( fork() == 0 ) { // child runs CFA342 cargs[0] = ( *new string( bprefix + "cfa-cpp" ) ).c_str();343 344 // Source file-name used to generate routine names containing global initializations for TU.345 cargs[ncargs] = ( *new string( "-F" ) ).c_str();346 ncargs += 1;347 cargs[ncargs] = ( *new string( string( cpp_in ) ) ).c_str();348 ncargs += 1;349 350 cargs[ncargs] = tmpname;351 ncargs += 1;352 if ( o_name != NULL ) {353 cargs[ncargs] = o_name;354 ncargs += 1;355 } else if ( ! CFA_flag ) { // run cfa-cpp ?356 cargs[ncargs] = cpp_out;357 ncargs += 1;358 } // if359 cargs[ncargs] = NULL; // terminate argument list360 361 #ifdef __DEBUG_H__362 cerr << "cfa-cpp ncargs: " << (o_name ? o_name : "No -o") << " " << CFA_flag << " " << ncargs << endl;363 for ( int i = 0; cargs[i] != NULL; i += 1 ) {364 cerr << cargs[i] << " ";365 } // for366 cerr << endl;367 #endif // __DEBUG_H__368 369 execvp( cargs[0], (char * const *)cargs ); // should not return370 perror( "CFA Translator error: cpp level, execvp" );371 exit( EXIT_FAILURE );372 } // if373 374 wait( &code ); // wait for child to finish375 376 #ifdef __DEBUG_H__377 cerr << "return code from cfa-cpp:" << WEXITSTATUS(code) << endl;378 #endif // __DEBUG_H__379 380 // Must unlink here because file must exist across execvp.381 rmtmpfile(); // remove tmpname382 383 303 if ( WIFSIGNALED(code) ) { // child failed ? 384 cerr << "C FA Translator error: cfa-cpp failed with signal" << WTERMSIG(code) << endl;385 exit( EXIT_FAILURE ); 386 } // if 387 388 exit( WEXITSTATUS(code) ); 304 cerr << "CC1 Translator error: stage 1, child failed " << WTERMSIG(code) << endl; 305 exit( EXIT_FAILURE ); 306 } // if 307 308 exit( WEXITSTATUS(code) ); // bad cpp result stops top-level gcc 389 309 } // Stage1 390 310 391 311 392 void Stage2( const int argc, const char * const * argv ) { 312 static void Stage2( const int argc, const char * const * argv ) { 313 int code; 393 314 string arg; 394 315 395 const char *cpp_in = NULL; 396 397 const char *args[argc + 100]; // leave space for 100 additional cfa command line values 316 const char * cpp_in = nullptr; 317 const char * cpp_out = nullptr; 318 319 const char * args[argc + 100]; // leave space for 100 additional cfa command line values 398 320 int nargs = 1; // number of arguments in args list; 0 => command name 321 const char * cargs[20]; // leave space for 20 additional cfa-cpp command line values 322 int ncargs = 1; // 0 => command name 399 323 400 324 #ifdef __DEBUG_H__ 401 325 cerr << "Stage2" << endl; 402 326 #endif // __DEBUG_H__ 403 checkEnv ( args, nargs ); // arguments passed via environment variables327 checkEnv2( cargs, ncargs ); // arguments passed via environment variables 404 328 #ifdef __DEBUG_H__ 405 329 for ( int i = 1; i < argc; i += 1 ) { … … 430 354 431 355 } else { 432 args[nargs] = argv[i]; // pass the flag along 433 nargs += 1; 356 args[nargs++] = argv[i]; // pass the flag along 434 357 if ( arg == "-o" ) { 435 358 i += 1; 436 args[nargs] = argv[i]; // pass the argument along437 nargs += 1;359 cpp_out = argv[i]; 360 args[nargs++] = argv[i]; // pass the argument along 438 361 #ifdef __DEBUG_H__ 439 362 cerr << "arg:\"" << argv[i] << "\"" << endl; … … 442 365 } // if 443 366 } else { // obtain input and possibly output files 444 if ( cpp_in == NULL) {367 if ( cpp_in == nullptr ) { 445 368 cpp_in = argv[i]; 446 369 #ifdef __DEBUG_H__ 447 370 cerr << "cpp_in:\"" << cpp_in << "\"" << endl; 448 371 #endif // __DEBUG_H__ 372 } else if ( cpp_out == nullptr ) { 373 cpp_out = argv[i]; 374 #ifdef __DEBUG_H__ 375 cerr << "cpp_out:\"" << cpp_out << "\""<< endl; 376 #endif // __DEBUG_H__ 449 377 } else { 450 cerr << "Usage: " << argv[0] << " input-file [output-file] [options]" << endl;378 cerr << "Usage: " << argv[0] << " more than two files specified" << endl; 451 379 exit( EXIT_FAILURE ); 452 380 } // if 453 381 } // if 454 382 } // for 383 384 if ( cpp_in == nullptr ) { 385 cerr << "Usage: " << argv[0] << " missing input file" << endl; 386 exit( EXIT_FAILURE ); 387 } // if 388 if ( cpp_out == nullptr ) { 389 cerr << "Usage: " << argv[0] << " missing output file" << endl; 390 exit( EXIT_FAILURE ); 391 } // if 392 393 // Create a temporary file, if needed, to store output of the cfa-cpp preprocessor. Cannot be created in forked 394 // process because variables tmpname and tmpfilefd are cloned. 395 396 string cfa_cpp_out; 397 398 if ( ! CFA_flag ) { // run compiler ? 399 if ( save_temps ) { 400 cfa_cpp_out = cpp_in; 401 size_t dot = cfa_cpp_out.find_last_of( "." ); 402 if ( dot == string::npos ) { 403 cerr << "CC1 Translator error: stage 2, bad file name " << endl; 404 exit( EXIT_FAILURE ); 405 } // if 406 407 cfa_cpp_out = cfa_cpp_out.substr( 0, dot ) + ".ifa"; 408 if ( creat( cfa_cpp_out.c_str(), 0666 ) == -1 ) { 409 perror( "CC1 Translator error: stage 2, creat" ); 410 exit( EXIT_FAILURE ); 411 } // if 412 } else { 413 tmpfilefd = mkstemps( tmpname, 2 ); 414 if ( tmpfilefd == -1 ) { 415 perror( "CC1 Translator error: stage 2, mkstemp" ); 416 exit( EXIT_FAILURE ); 417 } // if 418 cfa_cpp_out = tmpname; 419 } // if 420 #ifdef __DEBUG_H__ 421 cerr << "cfa_cpp_out: " << cfa_cpp_out << endl; 422 #endif // __DEBUG_H__ 423 } // if 424 425 // If -CFA flag specified, run the cfa-cpp preprocessor on the temporary file, and output is written to standard 426 // output. Otherwise, run the cfa-cpp preprocessor on the temporary file and save the result into the output file. 427 428 if ( fork() == 0 ) { // child runs CFA 429 cargs[0] = ( *new string( installlibdir + "cfa-cpp" ) ).c_str(); 430 431 cargs[ncargs++] = cpp_in; 432 433 if ( CFA_flag ) { // run cfa-cpp ? 434 if ( o_file.size() != 0 ) { // location for output 435 cargs[ncargs++] = ( *new string( o_file.c_str() ) ).c_str(); 436 } // if 437 } else { 438 cargs[ncargs++] = cfa_cpp_out.c_str(); 439 } // if 440 cargs[ncargs] = nullptr; // terminate argument list 441 442 #ifdef __DEBUG_H__ 443 for ( int i = 0; cargs[i] != nullptr; i += 1 ) { 444 cerr << cargs[i] << " "; 445 } // for 446 cerr << endl; 447 #endif // __DEBUG_H__ 448 449 execvp( cargs[0], (char * const *)cargs ); // should not return 450 perror( "CC1 Translator error: stage 2, execvp" ); 451 exit( EXIT_FAILURE ); 452 } // if 453 454 wait( &code ); // wait for child to finish 455 456 if ( WIFSIGNALED(code) ) { // child failed ? 457 rmtmpfile(); // remove tmpname 458 cerr << "CC1 Translator error: stage 2, child failed " << WTERMSIG(code) << endl; 459 exit( EXIT_FAILURE ); 460 } // if 461 462 if ( CFA_flag ) { // no tmpfile created 463 exit( WEXITSTATUS( code ) ); // stop regardless of success or failure 464 } // if 465 466 #ifdef __DEBUG_H__ 467 cerr << "return code from cfa-cpp:" << WEXITSTATUS(code) << endl; 468 #endif // __DEBUG_H__ 469 470 if ( WEXITSTATUS(code) ) { // child error ? 471 rmtmpfile(); // remove tmpname 472 exit( WEXITSTATUS( code ) ); // do not continue 473 } // if 455 474 456 475 #ifdef __DEBUG_H__ … … 459 478 cerr << " " << args[i]; 460 479 } // for 461 cerr << endl; 462 if ( cpp_in != NULL ) cerr << " " << cpp_in; 463 #endif // __DEBUG_H__ 464 465 args[0] = compiler_name.c_str(); 466 args[nargs] = "-S"; // only compile and put assembler output in specified file 467 nargs += 1; 468 args[nargs] = cpp_in; 469 nargs += 1; 470 args[nargs] = NULL; // terminate argument list 471 472 #ifdef __DEBUG_H__ 473 cerr << "stage2 nargs: " << nargs << endl; 474 for ( int i = 0; args[i] != NULL; i += 1 ) { 475 cerr << args[i] << " "; 476 } // for 477 cerr << endl; 478 #endif // __DEBUG_H__ 479 480 execvp( args[0], (char * const *)args ); // should not return 481 perror( "CFA Translator error: cpp level, execvp" ); 482 exit( EXIT_FAILURE ); // tell gcc not to go any further 480 cerr << " " << cpp_in << endl; 481 #endif // __DEBUG_H__ 482 483 if ( fork() == 0 ) { // child runs CFA 484 args[0] = compiler_path.c_str(); 485 args[nargs++] = "-S"; // only compile and put assembler output in specified file 486 if ( save_temps ) { // make gcc accept .ifa suffix 487 args[nargs++] = "-x"; 488 args[nargs++] = "cpp-output"; 489 } // if 490 args[nargs++] = cfa_cpp_out.c_str(); 491 args[nargs] = nullptr; // terminate argument list 492 493 #ifdef __DEBUG_H__ 494 cerr << "stage2 nargs: " << nargs << endl; 495 for ( int i = 0; args[i] != nullptr; i += 1 ) { 496 cerr << args[i] << " "; 497 } // for 498 cerr << endl; 499 #endif // __DEBUG_H__ 500 501 execvp( args[0], (char * const *)args ); // should not return 502 perror( "CC1 Translator error: stage 2, execvp" ); 503 exit( EXIT_FAILURE ); // tell gcc not to go any further 504 } // if 505 506 wait( &code ); // wait for child to finish 507 508 if ( WIFSIGNALED(code) ) { // child failed ? 509 rmtmpfile(); // remove tmpname 510 cerr << "CC1 Translator error: stage 2, child failed " << WTERMSIG(code) << endl; 511 exit( EXIT_FAILURE ); 512 } // if 513 514 #ifdef __DEBUG_H__ 515 cerr << "return code from gcc cc1:" << WEXITSTATUS(code) << endl; 516 #endif // __DEBUG_H__ 517 518 rmtmpfile(); // remove tmpname 519 exit( WEXITSTATUS( code ) ); // stop regardless of success or failure 483 520 } // Stage2 484 521 485 522 523 // This program is called twice because of the -no-integrated-cpp. The calls are differentiated by the first 524 // command-line argument. The first call replaces the traditional cpp pass to preprocess the C program. The second call 525 // is to the compiler, which is broken into two steps: preprocess again with cfa-cpp and then call gcc to compile the 526 // doubly preprocessed program. 527 486 528 int main( const int argc, const char * const argv[], __attribute__((unused)) const char * const env[] ) { 487 529 #ifdef __DEBUG_H__ 488 for ( int i = 0; env[i] != NULL; i += 1 ) {530 for ( int i = 0; env[i] != nullptr; i += 1 ) { 489 531 cerr << env[i] << endl; 490 532 } // for 491 533 #endif // __DEBUG_H__ 492 534 493 string arg = argv[1]; 535 signal( SIGINT, sigTermHandler ); 536 signal( SIGTERM, sigTermHandler ); 537 538 string arg( argv[1] ); 494 539 495 540 // Currently, stage 1 starts with flag -E and stage 2 with flag -fpreprocessed. -
driver/cfa.cc
rf9bf142 r330d933 10 10 // Created On : Tue Aug 20 13:44:49 2002 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Sun Feb 10 08:28:09201913 // Update Count : 28112 // Last Modified On : Fri Aug 23 16:27:07 2019 13 // Update Count : 411 14 14 // 15 15 … … 20 20 #include <string> // STL version 21 21 #include <string.h> // strcmp 22 #include <algorithm> // find 22 23 23 24 #include <sys/types.h> … … 32 33 using std::to_string; 33 34 34 35 35 //#define __DEBUG_H__ 36 36 37 37 38 bool prefix( string arg, string pre ) { 38 void Putenv( char * argv[], string arg ) { 39 static int flags = 0; // environment variables must have unique names 40 41 if ( putenv( (char *)( *new string( string( "__CFA_FLAG" + to_string( flags++ ) + "__=" ) + arg ) ).c_str() ) ) { 42 cerr << argv[0] << " error, cannot set environment variable." << endl; 43 exit( EXIT_FAILURE ); 44 } // if 45 } // Putenv 46 47 48 bool prefix( const string & arg, const string & pre ) { // check if string has prefix 39 49 return arg.substr( 0, pre.size() ) == pre; 40 50 } // prefix 41 51 42 enum { NumSuffixes = 2 }; 43 const string suffixes[NumSuffixes] = { "cfa", "hfa", }; 44 45 bool suffix( string arg, const char * args[], int & nargs ) { 46 //std::cerr << arg << std::endl; 52 bool suffix( const string & arg ) { // check if string has suffix 53 enum { NumSuffixes = 3 }; 54 static const string suffixes[NumSuffixes] = { "cfa", "hfa", "ifa" }; 55 47 56 size_t dot = arg.find_last_of( "." ); 48 //std::cerr << dot << " " << (dot != string::npos ? arg.substr( dot + 1 ) : "fred" ) << std::endl;49 57 if ( dot == string::npos ) return false; 50 string sx = arg.substr( dot + 1 ); 51 for ( int i = 0; i < NumSuffixes; i += 1 ) { 52 if ( sx == suffixes[i] ) { 53 args[nargs] = "-x"; 54 nargs += 1; 55 args[nargs] = "c"; 56 nargs += 1; 57 return true; 58 } // if 59 } // for 58 const string * end = suffixes + NumSuffixes; 59 return std::find( suffixes, end, arg.substr( dot + 1 ) ) != end; 60 } // suffix 61 62 63 static inline bool dirExists( const string & path ) { // check if directory exists 64 struct stat info; 65 if ( stat( path.c_str(), &info ) != 0 ) return false; 66 if ( info.st_mode & S_IFDIR ) return true; 60 67 return false; 61 } // suffix 62 63 64 void shuffle( const char *args[], int S, int E, int N ) { 65 // S & E index 1 passed the end so adjust with -1 66 #ifdef __DEBUG_H__ 67 cerr << "shuffle:" << S << " " << E << " " << N << endl; 68 #endif // __DEBUG_H__ 69 for ( int j = E-1 + N; j > S-1 + N; j -=1 ) { 70 #ifdef __DEBUG_H__ 71 cerr << "\t" << j << " " << j-N << endl; 72 #endif // __DEBUG_H__ 73 args[j] = args[j-N]; 74 } // for 75 } // shuffle 76 77 static inline bool dirExists(const string & path) { 78 struct stat info; 79 if(stat( path.c_str(), &info ) != 0) 80 return false; 81 else if(info.st_mode & S_IFDIR) 82 return true; 83 else 84 return false; 85 } //dirExists 86 87 68 } // dirExists 69 70 71 #define xstr(s) str(s) 88 72 #define str(s) #s 89 73 90 int main( int argc, char * argv[] ) {74 int main( int argc, char * argv[] ) { 91 75 string Version( CFA_VERSION_LONG ); // current version number from CONFIG 92 string Major( str( CFA_VERSION_MAJOR ) ), Minor( str( CFA_VERSION_MINOR ) ), Patch(str( CFA_VERSION_PATCH ) );76 string Major( xstr( CFA_VERSION_MAJOR ) ), Minor( xstr( CFA_VERSION_MINOR ) ), Patch( xstr( CFA_VERSION_PATCH ) ); 93 77 94 78 string installincdir( CFA_INCDIR ); // fixed location of include files … … 104 88 string compiler_name; // name of C compiler 105 89 106 bool nonoptarg = false; // indicates non-option argument specified 107 bool link = true; // linking as well as compiling 90 bool x_flag = false; // -x flag 91 bool nonoptarg = false; // no non-option arguments specified, i.e., no file names 92 bool link = true; // link stage occurring 108 93 bool verbose = false; // -v flag 109 bool quiet = false; // -quiet flag110 bool debug = true; // -debug flag111 bool nolib = false; // -nolib flag112 bool help = false; // -help flag94 bool quiet = false; // -quiet flag 95 bool debug = true; // -debug flag 96 bool nolib = false; // -nolib flag 97 bool help = false; // -help flag 113 98 bool CFA_flag = false; // -CFA flag 114 99 bool cpp_flag = false; // -E or -M flag, preprocessor only … … 116 101 bool noincstd_flag = false; // -no-include-stdhdr= flag 117 102 bool debugging __attribute(( unused )) = false; // -g flag 118 bool m32 = false; // -m32 flag 119 bool m64 = false; // -m64 flag 120 bool intree = false; 103 bool m32 = false; // -m32 flag 104 bool m64 = false; // -m64 flag 105 bool intree = false; // build in tree 106 int o_file = 0; // -o filename position 121 107 122 108 const char *args[argc + 100]; // cfa command line values, plus some space for additional flags … … 142 128 143 129 if ( arg == "-Xlinker" || arg == "-o" ) { 144 args[nargs] = argv[i]; // pass the argument along 145 nargs += 1; 130 args[nargs++] = argv[i]; // pass argument along 146 131 i += 1; 147 132 if ( i == argc ) continue; // next argument available ? 148 args[nargs ] = argv[i]; // pass theargument along149 nargs += 1;133 args[nargs++] = argv[i]; // pass argument along 134 if ( arg == "-o" ) o_file = i; // remember file 150 135 } else if ( arg == "-XCFA" ) { // CFA pass through 151 136 i += 1; 152 args[nargs] = ( *new string( string("-D__CFA_FLAG__=") + argv[i] ) ).c_str(); 153 nargs += 1; 137 Putenv( argv, argv[i] ); 154 138 155 139 // CFA specific arguments … … 158 142 CFA_flag = true; // strip the -CFA flag 159 143 link = false; 160 args[nargs] = "-E"; // replace the argument with -E 161 nargs += 1; 144 args[nargs++] = "-fsyntax-only"; // stop after stage 2 162 145 } else if ( arg == "-debug" ) { 163 146 debug = true; // strip the debug flag 164 147 } else if ( arg == "-nodebug" ) { 165 debug = false; // strip the debug flag148 debug = false; // strip the nodebug flag 166 149 } else if ( arg == "-nolib" ) { 167 150 nolib = true; // strip the nodebug flag … … 183 166 if ( i == argc ) continue; // next argument available ? 184 167 compiler_path = argv[i]; 185 if ( putenv( (char *)( *new string( string( "__CFA_COMPILER__=" ) + argv[i]) ).c_str() ) != 0 ) { 186 cerr << argv[0] << " error, cannot set environment variable." << endl; 187 exit( EXIT_FAILURE ); 188 } // if 168 Putenv( argv, arg + "=" + argv[i] ); 189 169 190 170 // C specific arguments … … 192 172 } else if ( arg == "-v" ) { 193 173 verbose = true; // verbosity required 194 args[nargs] = argv[i]; // pass the argument along 195 nargs += 1; 174 args[nargs++] = argv[i]; // pass argument along 196 175 } else if ( arg == "-g" ) { 197 176 debugging = true; // symbolic debugging required 198 args[nargs] = argv[i]; // pass the argument along 199 nargs += 1; 177 args[nargs++] = argv[i]; // pass argument along 178 } else if ( arg == "-save-temps" ) { 179 args[nargs++] = argv[i]; // pass argument along 180 Putenv( argv, arg ); // save cfa-cpp output 181 } else if ( prefix( arg, "-x" ) ) { // file suffix ? 182 string lang; 183 args[nargs++] = argv[i]; // pass argument along 184 if ( arg.length() == 2 ) { // separate argument ? 185 i += 1; 186 if ( i == argc ) continue; // next argument available ? 187 lang = argv[i]; 188 args[nargs++] = argv[i]; // pass argument along 189 } else { 190 lang = arg.substr( 2 ); 191 } // if 192 x_flag = lang != "none"; 200 193 } else if ( prefix( arg, "-std=" ) || prefix( arg, "--std=" ) ) { 201 194 std_flag = true; // -std=XX provided 202 args[nargs] = argv[i]; // pass the argument along 203 nargs += 1; 195 args[nargs++] = argv[i]; // pass argument along 204 196 } else if ( arg == "-w" ) { 205 args[nargs] = argv[i]; // pass the argument along 206 nargs += 1; 207 args[nargs] = ( *new string( string("-D__CFA_FLAG__=") + arg ) ).c_str(); // add the argument for cfa-cpp 208 nargs += 1; 197 args[nargs++] = argv[i]; // pass argument along 198 Putenv( argv, arg ); 209 199 } else if ( prefix( arg, "-W" ) ) { // check before next tests 210 200 if ( arg == "-Werror" || arg == "-Wall" ) { 211 args[nargs] = argv[i]; // pass the argument along 212 nargs += 1; 213 args[nargs] = ( *new string( string("-D__CFA_FLAG__=") + arg ) ).c_str(); // add the argument for cfa-cpp 214 nargs += 1; 201 args[nargs++] = argv[i]; // pass argument along 202 Putenv( argv, argv[i] ); 215 203 } else { 216 204 unsigned int adv = prefix( arg, "-Wno-" ) ? 5 : 2; 217 args[nargs] = argv[i]; // conditionally pass theargument along218 const char * warning = argv[i] + adv; 205 args[nargs] = argv[i]; // conditionally pass argument along 206 const char * warning = argv[i] + adv; // extract warning 219 207 if ( SemanticWarning_Exist( warning ) ) { // replace the argument for cfa-cpp 220 args[nargs] = ( *new string( string("-D__CFA_FLAG__=") + arg ) ).c_str();208 Putenv( argv, arg ); 221 209 } // if 222 210 nargs += 1; … … 224 212 } else if ( prefix( arg, "-B" ) ) { 225 213 Bprefix = arg.substr(2); // strip the -B flag 226 args[nargs] = ( *new string( string("-D__GCC_BPREFIX__=") + Bprefix ) ).c_str(); 227 nargs += 1; 228 } else if ( prefix( arg, "-b" ) ) { 229 if ( arg.length() == 2 ) { // separate argument ? 230 i += 1; 231 if ( i == argc ) continue; // next argument available ? 232 arg += argv[i]; // concatenate argument 233 } // if 234 // later versions of gcc require the -b option to appear at the start of the command line 235 shuffle( args, sargs, nargs, 1 ); // make room at front of argument list 236 args[sargs] = ( *new string( arg ) ).c_str(); // pass the argument along 237 if ( putenv( (char *)( *new string( string( "__GCC_MACHINE__=" ) + arg ) ).c_str() ) != 0 ) { 238 cerr << argv[0] << " error, cannot set environment variable." << endl; 239 exit( EXIT_FAILURE ); 240 } // if 241 sargs += 1; 242 nargs += 1; 243 } else if ( prefix( arg, "-V" ) ) { 244 if ( arg.length() == 2 ) { // separate argument ? 245 i += 1; 246 if ( i == argc ) continue; // next argument available ? 247 arg += argv[i]; // concatenate argument 248 } // if 249 // later versions of gcc require the -V option to appear at the start of the command line 250 shuffle( args, sargs, nargs, 1 ); // make room at front of argument list 251 args[sargs] = ( *new string( arg ) ).c_str(); // pass the argument along 252 if ( putenv( (char *)( *new string( string( "__GCC_VERSION__=" ) + arg ) ).c_str() ) != 0 ) { 253 cerr << argv[0] << " error, cannot set environment variable." << endl; 254 exit( EXIT_FAILURE ); 255 } // if 256 sargs += 1; 257 nargs += 1; 214 args[nargs++] = ( *new string( string("-D__GCC_BPREFIX__=") + Bprefix ) ).c_str(); 258 215 } else if ( arg == "-c" || arg == "-S" || arg == "-E" || arg == "-M" || arg == "-MM" ) { 259 args[nargs] = argv[i]; // pass the argument along 260 nargs += 1; 216 args[nargs++] = argv[i]; // pass argument along 261 217 if ( arg == "-E" || arg == "-M" || arg == "-MM" ) { 262 218 cpp_flag = true; // cpp only … … 265 221 } else if ( arg[1] == 'l' ) { 266 222 // if the user specifies a library, load it after user code 267 libs[nlibs] = argv[i]; 268 nlibs += 1; 223 libs[nlibs++] = argv[i]; 269 224 } else if ( arg == "-m32" ) { 270 225 m32 = true; 271 226 m64 = false; 272 args[nargs] = argv[i]; 273 nargs += 1; 227 args[nargs++] = argv[i]; 274 228 } else if ( arg == "-m64" ) { 275 229 m64 = true; 276 230 m32 = false; 277 args[nargs] = argv[i]; 278 nargs += 1; 231 args[nargs++] = argv[i]; 279 232 } else { 280 233 // concatenate any other arguments 281 args[nargs] = argv[i]; 282 nargs += 1; 234 args[nargs++] = argv[i]; 283 235 } // if 284 236 } else { 285 bool cfa = suffix( arg, args, nargs ); // check suffix 286 args[nargs] = argv[i]; // concatenate file 287 nargs += 1; 288 if ( cfa ) { 289 args[nargs] = "-x"; 290 nargs += 1; 291 args[nargs] = "none"; 292 nargs += 1; 237 bool cfa = suffix( arg ); // check suffix 238 if ( ! x_flag && cfa ) { // no explicit suffix and cfa suffix ? 239 args[nargs++] = "-x"; 240 args[nargs++] = "c"; 241 } // if 242 args[nargs++] = argv[i]; // concatenate files 243 if ( ! x_flag && cfa ) { // no explicit suffix and cfa suffix ? 244 args[nargs++] = "-x"; 245 args[nargs++] = "none"; 293 246 } // if 294 247 nonoptarg = true; … … 296 249 } // for 297 250 298 args[nargs] = "-x"; // turn off language299 nargs += 1;300 args[nargs] = "none";301 nargs += 1;302 303 251 #ifdef __x86_64__ 304 args[nargs] = "-mcx16"; // allow double-wide CAA 305 nargs += 1; 252 args[nargs++] = "-mcx16"; // allow double-wide CAA 306 253 #endif // __x86_64__ 307 254 … … 314 261 #endif // __DEBUG_H__ 315 262 263 // -E flag stops at cc1 stage 1, so cfa-cpp in cc1 stage 2 is never executed. 316 264 if ( cpp_flag && CFA_flag ) { 317 265 cerr << argv[0] << " error, cannot use -E and -CFA flags together." << endl; … … 320 268 321 269 // add the CFA include-library paths, which allow direct access to header files without directory qualification 322 if( !intree ) { 323 args[nargs] = "-I" CFA_INCDIR; 324 nargs += 1; 270 if ( ! intree ) { 271 args[nargs++] = "-I" CFA_INCDIR; 325 272 if ( ! noincstd_flag ) { // do not use during build 326 args[nargs] = "-I" CFA_INCDIR "stdhdr"; 327 nargs += 1; 273 args[nargs++] = "-I" CFA_INCDIR "stdhdr"; 328 274 } // if 329 args[nargs] = "-I" CFA_INCDIR "concurrency"; 330 nargs += 1; 331 args[nargs] = "-I" CFA_INCDIR "containers"; 332 nargs += 1; 333 } else { 334 args[nargs] = "-I" TOP_SRCDIR "libcfa/src"; 335 nargs += 1; 275 args[nargs++] = "-I" CFA_INCDIR "concurrency"; 276 args[nargs++] = "-I" CFA_INCDIR "containers"; 277 } else { 278 args[nargs++] = "-I" TOP_SRCDIR "libcfa/src"; 336 279 if ( ! noincstd_flag ) { // do not use during build 337 args[nargs] = "-I" TOP_SRCDIR "libcfa/src" "/stdhdr"; 338 nargs += 1; 280 args[nargs++] = "-I" TOP_SRCDIR "libcfa/src" "/stdhdr"; 339 281 } // if 340 args[nargs] = "-I" TOP_SRCDIR "libcfa/src" "/concurrency"; 341 nargs += 1; 342 args[nargs] = "-I" TOP_SRCDIR "libcfa/src" "/containers"; 343 nargs += 1; 344 } 282 args[nargs++] = "-I" TOP_SRCDIR "libcfa/src" "/concurrency"; 283 args[nargs++] = "-I" TOP_SRCDIR "libcfa/src" "/containers"; 284 } // if 345 285 346 286 // add stdbool to get defines for bool/true/false 347 args[nargs] = "-imacros"; 348 nargs += 1; 349 args[nargs] = "stdbool.h"; 350 nargs += 1; 287 args[nargs++] = "-imacros"; 288 args[nargs++] = "stdbool.h"; 351 289 352 290 string libbase; 353 if ( !intree ) {291 if ( ! intree ) { 354 292 libbase = CFA_LIBDIR; 355 293 } else { 356 294 libbase = TOP_BUILDDIR "libcfa/"; 357 args[nargs] = "-D__CFA_FLAG__=-t"; 358 nargs += 1; 359 } 360 361 string arch = m32 ? CFA_32_CPU : (m64 ? CFA_64_CPU : CFA_DEFAULT_CPU); 295 Putenv( argv, "-t" ); 296 } // if 297 298 string arch( m32 ? CFA_32_CPU : (m64 ? CFA_64_CPU : CFA_DEFAULT_CPU) ); 362 299 if ( ! m32 && ! m64 ) { 363 300 if ( arch == "x86" ) { 364 args[nargs] = "-m32"; 365 nargs += 1; 301 args[nargs++] = "-m32"; 366 302 } else if ( arch == "x64" ) { 367 args[nargs] = "-m64"; 368 nargs += 1; 303 args[nargs++] = "-m64"; 369 304 } // if 370 305 } // if 371 const char * config = nolib ? "nolib" : (debug ? "debug": "nodebug"); 372 string libdir = libbase + arch + "-" + config; 373 374 if ( ! nolib && ! dirExists( libdir ) ) { 375 cerr << argv[0] << " internal error, configuration " << config << " not installed." << endl; 376 cerr << "Was looking for " << libdir << endl; 377 libdir = libbase + arch + "-" + "nolib"; 378 } // if 379 306 307 string libdir( libbase + arch + "-" + (nolib ? "nolib" : (debug ? "debug": "nodebug")) ); 380 308 if ( ! dirExists( libdir ) ) { 381 cerr << argv[0] << " internal error, cannot find prelude directory." << endl; 382 cerr << "Was looking for " << libdir << endl; 309 cerr << argv[0] << " internal error, cannot find prelude directory " << libdir << endl; 383 310 exit( EXIT_FAILURE ); 384 311 } // if 385 312 386 args[nargs] = ( *new string( string("-D__CFA_FLAG__=--prelude-dir=" ) + libdir + (intree ? "/prelude" : "")) ).c_str();387 nargs += 1;388 389 313 for ( int i = 0; i < nlibs; i += 1 ) { // copy non-user libraries after all user libraries 390 args[nargs] = libs[i]; 391 nargs += 1; 314 args[nargs++] = libs[i]; 392 315 } // for 393 316 394 317 if ( link ) { 395 args[nargs] = "-Xlinker"; 396 nargs += 1; 397 args[nargs] = "--undefined=__cfaabi_dbg_bits_write"; 398 nargs += 1; 399 args[nargs] = "-Xlinker"; 400 nargs += 1; 401 args[nargs] = "--undefined=__cfaabi_interpose_startup"; 402 nargs += 1; 403 args[nargs] = "-Xlinker"; 404 nargs += 1; 405 args[nargs] = "--undefined=__cfaabi_appready_startup"; 406 nargs += 1; 318 args[nargs++] = "-Xlinker"; 319 args[nargs++] = "--undefined=__cfaabi_dbg_bits_write"; 320 args[nargs++] = "-Xlinker"; 321 args[nargs++] = "--undefined=__cfaabi_interpose_startup"; 322 args[nargs++] = "-Xlinker"; 323 args[nargs++] = "--undefined=__cfaabi_appready_startup"; 407 324 408 325 // include the cfa library in case it's needed 409 args[nargs] = ( *new string( string("-L" ) + libdir + (intree ? "/src/.libs" : "")) ).c_str(); 410 nargs += 1; 411 args[nargs] = ( *new string( string("-Wl,-rpath," ) + libdir + (intree ? "/src/.libs" : "")) ).c_str(); 412 nargs += 1; 413 args[nargs] = "-Wl,--push-state,--as-needed"; 414 nargs += 1; 415 args[nargs] = "-lcfathread"; 416 nargs += 1; 417 args[nargs] = "-Wl,--pop-state"; 418 nargs += 1; 419 args[nargs] = "-lcfa"; 420 nargs += 1; 421 args[nargs] = "-lpthread"; 422 nargs += 1; 423 args[nargs] = "-ldl"; 424 nargs += 1; 425 args[nargs] = "-lrt"; 426 nargs += 1; 427 args[nargs] = "-lm"; 428 nargs += 1; 429 } // if 430 431 // Add exception flags (unconditionally) 432 args[nargs] = "-fexceptions"; 433 nargs += 1; 434 435 // add the correct set of flags based on the type of compile this is 436 437 args[nargs] = ( *new string( string("-D__CFA_MAJOR__=") + Major ) ).c_str(); 438 nargs += 1; 439 args[nargs] = ( *new string( string("-D__CFA_MINOR__=") + Minor ) ).c_str(); 440 nargs += 1; 441 args[nargs] = ( *new string( string("-D__CFA_PATCH__=") + Patch ) ).c_str(); 442 nargs += 1; 443 args[nargs] = "-D__CFA__"; 444 nargs += 1; 445 args[nargs] = "-D__CFORALL__"; 446 nargs += 1; 447 args[nargs] = "-D__cforall"; 448 nargs += 1; 326 args[nargs++] = ( *new string( string("-L" ) + libdir + (intree ? "/src/.libs" : "")) ).c_str(); 327 args[nargs++] = ( *new string( string("-Wl,-rpath," ) + libdir + (intree ? "/src/.libs" : "")) ).c_str(); 328 args[nargs++] = "-Wl,--push-state,--as-needed"; 329 args[nargs++] = "-lcfathread"; 330 args[nargs++] = "-Wl,--pop-state"; 331 args[nargs++] = "-lcfa"; 332 args[nargs++] = "-lpthread"; 333 args[nargs++] = "-ldl"; 334 args[nargs++] = "-lrt"; 335 args[nargs++] = "-lm"; 336 } // if 337 338 args[nargs++] = "-fexceptions"; // add exception flags (unconditionally) 339 340 // add flags based on the type of compile 341 342 args[nargs++] = ( *new string( string("-D__CFA_MAJOR__=") + Major ) ).c_str(); 343 args[nargs++] = ( *new string( string("-D__CFA_MINOR__=") + Minor ) ).c_str(); 344 args[nargs++] = ( *new string( string("-D__CFA_PATCH__=") + Patch ) ).c_str(); 345 args[nargs++] = "-D__CFA__"; 346 args[nargs++] = "-D__CFORALL__"; 347 args[nargs++] = "-D__cforall"; 449 348 450 349 if ( cpp_flag ) { 451 args[nargs] = "-D__CPP__"; 452 nargs += 1; 453 } // if 454 455 shuffle( args, sargs, nargs, 1 ); // make room at front of argument list 456 nargs += 1; 350 args[nargs++] = "-D__CPP__"; 351 } // if 352 457 353 if ( CFA_flag ) { 458 args[sargs] = "-D__CFA_FLAG__=-N"; 459 args[nargs] = "-D__CFA_PREPROCESS_"; 460 nargs += 1; 461 } else { 462 args[sargs] = "-D__CFA_FLAG__=-L"; 463 } // if 464 sargs += 1; 354 Putenv( argv, "-N" ); 355 Putenv( argv, "-CFA" ); 356 // -CFA implies cc1 stage 2, but gcc does not pass the -o file to this stage because it believe the file is for 357 // the linker. Hence, the -o file is explicit passed to cc1 stage 2 and used as cfa-cpp's output file. 358 if ( o_file ) Putenv( argv, string( "-o=" ) + argv[o_file] ); 359 } else { 360 Putenv( argv, "-L" ); 361 } // if 362 363 Putenv( argv, "--prelude-dir=" + libdir + (intree ? "/prelude" : "") ); 465 364 466 365 if ( debug ) { 467 366 heading += " (debug)"; 468 args[nargs] = "-D__CFA_DEBUG__"; 469 nargs += 1; 367 args[nargs++] = "-D__CFA_DEBUG__"; 470 368 } else { 471 369 heading += " (no debug)"; … … 475 373 Bprefix = ! intree ? installlibdir : srcdriverdir; 476 374 if ( Bprefix[Bprefix.length() - 1] != '/' ) Bprefix += '/'; 477 args[nargs] = ( *new string( string("-D__GCC_BPREFIX__=") + Bprefix ) ).c_str(); 478 nargs += 1; 479 } // if 480 481 args[nargs] = "-Xlinker"; // used by backtrace 482 nargs += 1; 483 args[nargs] = "-export-dynamic"; 484 nargs += 1; 375 args[nargs++] = ( *new string( string("-D__GCC_BPREFIX__=") + Bprefix ) ).c_str(); 376 } // if 377 378 args[nargs++] = "-Xlinker"; // used by backtrace 379 args[nargs++] = "-export-dynamic"; 485 380 486 381 // execute the compilation command … … 496 391 497 392 if ( prefix( compiler_name, "gcc" ) ) { // allow suffix on gcc name 498 args[nargs] = "-no-integrated-cpp"; 499 nargs += 1; 500 args[nargs] = "-Wno-deprecated"; 501 nargs += 1; 502 #ifdef HAVE_CAST_FUNCTION_TYPE 503 args[nargs] = "-Wno-cast-function-type"; 504 nargs += 1; 505 #endif // HAVE_CAST_FUNCTION_TYPE 393 args[nargs++] = "-no-integrated-cpp"; 394 args[nargs++] = "-Wno-deprecated"; 395 #ifdef HAVE_CAST_FUNCTION_TYPE 396 args[nargs++] = "-Wno-cast-function-type"; 397 #endif // HAVE_CAST_FUNCTION_TYPE 506 398 if ( ! std_flag ) { // default c11, if none specified 507 args[nargs] = "-std=gnu11"; 508 nargs += 1; 399 args[nargs++] = "-std=gnu11"; 509 400 } // if 510 args[nargs] = "-fgnu89-inline"; 511 nargs += 1; 512 args[nargs] = "-D__int8_t_defined"; // prevent gcc type-size attributes 513 nargs += 1; 514 args[nargs] = ( *new string( string("-B") + Bprefix ) ).c_str(); 515 nargs += 1; 401 args[nargs++] = "-fgnu89-inline"; 402 args[nargs++] = "-D__int8_t_defined"; // prevent gcc type-size attributes 403 args[nargs++] = ( *new string( string("-B") + Bprefix ) ).c_str(); 516 404 } else { 517 405 cerr << argv[0] << " error, compiler \"" << compiler_name << "\" unsupported." << endl; … … 519 407 } // if 520 408 521 args[nargs] = NULL; // terminate with NULL409 args[nargs] = nullptr; // terminate 522 410 523 411 #ifdef __DEBUG_H__ 524 412 cerr << "nargs: " << nargs << endl; 525 413 cerr << "args:" << endl; 526 for ( int i = 0; args[i] != NULL; i += 1 ) {414 for ( int i = 0; args[i] != nullptr; i += 1 ) { 527 415 cerr << " \"" << args[i] << "\"" << endl; 528 416 } // for … … 546 434 if ( argc == 2 ) exit( EXIT_SUCCESS ); // if only the -v flag is specified, do not invoke gcc 547 435 548 for ( int i = 0; args[i] != NULL; i += 1 ) {436 for ( int i = 0; args[i] != nullptr; i += 1 ) { 549 437 cerr << args[i] << " "; 550 438 } // for … … 560 448 561 449 execvp( args[0], (char *const *)args ); // should not return 562 perror( "CFA Translator error: cfa level,execvp" );450 perror( "CFA Translator error: execvp" ); 563 451 exit( EXIT_FAILURE ); 564 452 } // main -
libcfa/src/Makefile.am
rf9bf142 r330d933 26 26 VPATH += :../prelude 27 27 28 gdbwaittarget="" 29 28 30 # AM_CFLAGS for all cfa source 29 31 # AM_CFAFLAGS for only cfa source 30 32 # use -no-include-stdhdr to prevent rebuild cycles 31 33 # The built sources must not depend on the installed headers 32 AM_CFAFLAGS = -quiet -in-tree -I$(srcdir)/stdhdr @CONFIG_CFAFLAGS@34 AM_CFAFLAGS = -quiet -in-tree -I$(srcdir)/stdhdr $(if $(findstring ${gdbwaittarget}, ${@}), -XCFA --gdb) @CONFIG_CFAFLAGS@ 33 35 AM_CFLAGS = -g -Wall -Wno-unused-function -fPIC @ARCH_FLAGS@ @CONFIG_CFLAGS@ 34 36 AM_CCASFLAGS = -g -Wall -Wno-unused-function @ARCH_FLAGS@ @CONFIG_CFLAGS@ -
libcfa/src/Makefile.in
rf9bf142 r330d933 435 435 am__v_UPP_1 = 436 436 lib_LTLIBRARIES = libcfa.la libcfathread.la 437 gdbwaittarget = "" 437 438 438 439 # AM_CFLAGS for all cfa source … … 440 441 # use -no-include-stdhdr to prevent rebuild cycles 441 442 # The built sources must not depend on the installed headers 442 AM_CFAFLAGS = -quiet -in-tree -I$(srcdir)/stdhdr @CONFIG_CFAFLAGS@443 AM_CFAFLAGS = -quiet -in-tree -I$(srcdir)/stdhdr $(if $(findstring ${gdbwaittarget}, ${@}), -XCFA --gdb) @CONFIG_CFAFLAGS@ 443 444 AM_CFLAGS = -g -Wall -Wno-unused-function -fPIC @ARCH_FLAGS@ @CONFIG_CFLAGS@ 444 445 AM_CCASFLAGS = -g -Wall -Wno-unused-function @ARCH_FLAGS@ @CONFIG_CFLAGS@ -
longrun_tests/Makefile.in
rf9bf142 r330d933 365 365 CYGPATH_W = @CYGPATH_W@ 366 366 DEFS = @DEFS@ 367 DEMANGLER = @DEMANGLER@ 367 368 DEPDIR = @DEPDIR@ 368 369 DLLTOOL = @DLLTOOL@ … … 390 391 LIBCFA_TARGET_DIRS = @LIBCFA_TARGET_DIRS@ 391 392 LIBCFA_TARGET_MAKEFILES = @LIBCFA_TARGET_MAKEFILES@ 393 LIBDEMANGLE = @LIBDEMANGLE@ 392 394 LIBOBJS = @LIBOBJS@ 393 395 LIBS = @LIBS@ -
src/BasicTypes-gen.cc
rf9bf142 r330d933 295 295 // cout << code.str(); 296 296 297 297 298 // TEMPORARY DURING CHANGE OVER 299 #define TypeAST TOP_SRCDIR "src/AST/Type.hpp" 300 resetInput( file, TypeAST, buffer, code, str ); 301 302 if ( (start = str.find( STARTMK )) == string::npos ) Abort( "start", TypeAST ); 303 start += sizeof( STARTMK ); // includes newline 304 code << str.substr( 0, start ); 305 306 code << "\t" << BYMK << endl; 307 code << "\tenum Kind {" << endl; 308 for ( int r = 0; r < NUMBER_OF_BASIC_TYPES; r += 1 ) { 309 code << "\t\t" << graph[r].name << "," << endl; 310 } // for 311 code << "\t\tNUMBER_OF_BASIC_TYPES" << endl; 312 code << "\t} kind;" << endl; 313 code << "\t"; // indentation for end marker 314 315 if ( (start = str.find( ENDMK, start + 1 )) == string::npos ) Abort( "end", TypeAST ); 316 code << str.substr( start ); 317 318 output( file, TypeAST, code ); 319 // cout << code.str(); 320 321 298 322 #define ConversionCost TOP_SRCDIR "src/ResolvExpr/ConversionCost.cc" 299 323 resetInput( file, ConversionCost, buffer, code, str ); … … 310 334 code << right << setw(30) << graph[c].type << left; 311 335 } else if ( graph[c].rank != graph[c + 2].rank ) { 312 code << string( 10, ' ' ) << setw(25) << graph[c].type << setw(25) <<graph[c + 1].type;336 code << string( 10, ' ' ) << setw(25) << graph[c].type << graph[c + 1].type; 313 337 c += 1; 314 338 } else { 315 code << setw(20) << graph[c].type << setw(20) << graph[c + 1].type << setw(20) <<graph[c + 2].type;339 code << setw(20) << graph[c].type << setw(20) << graph[c + 1].type << graph[c + 2].type; 316 340 c += 2; 317 341 } // if … … 328 352 code << "\t" << BYMK << endl; 329 353 code << "\tstatic const int costMatrix[BasicType::NUMBER_OF_BASIC_TYPES][BasicType::NUMBER_OF_BASIC_TYPES] = { // path length from root to node" << endl 330 << "\t\t/* ";354 << "\t\t/* "; 331 355 for ( int r = 0; r < NUMBER_OF_BASIC_TYPES; r += 1 ) { // titles 332 356 code << setw(5) << graph[r].abbrev; … … 334 358 code << " */" << endl; 335 359 for ( int r = 0; r < NUMBER_OF_BASIC_TYPES; r += 1 ) { // costs 336 code << "\t\t/* " << setw(6) << graph[r].abbrev << "*/ {";360 code << "\t\t/* " << setw(6) << graph[r].abbrev << " */ {"; 337 361 for ( int c = 0; c < NUMBER_OF_BASIC_TYPES; c += 1 ) { 338 362 code << setw(4) << costMatrix[r][c] << ","; … … 353 377 code << "\t" << BYMK << endl; 354 378 code << "\tstatic const int signMatrix[BasicType::NUMBER_OF_BASIC_TYPES][BasicType::NUMBER_OF_BASIC_TYPES] = { // number of sign changes in safe conversion" << endl 355 << "\t\t/* ";379 << "\t\t/* "; 356 380 for ( int r = 0; r < NUMBER_OF_BASIC_TYPES; r += 1 ) { // titles 357 381 code << setw(5) << graph[r].abbrev; … … 359 383 code << " */" << endl; 360 384 for ( int r = 0; r < NUMBER_OF_BASIC_TYPES; r += 1 ) { // costs 361 code << "\t\t/* " << setw(6) << graph[r].abbrev << "*/ {";385 code << "\t\t/* " << setw(6) << graph[r].abbrev << " */ {"; 362 386 for ( int c = 0; c < NUMBER_OF_BASIC_TYPES; c += 1 ) { 363 387 code << setw(4) << signMatrix[r][c] << ","; … … 395 419 code << "*/" << endl; 396 420 for ( int r = 0; r < NUMBER_OF_BASIC_TYPES; r += 1 ) { // costs 397 code << "\t\t\t\t {\n\t\t/* " << setw(6) << graph[r].abbrev << "*/";421 code << "\t\t\t\t {\n\t\t/* " << setw(6) << graph[r].abbrev << " */"; 398 422 for ( int c = 0; c < NUMBER_OF_BASIC_TYPES; c += 1 ) { 399 423 string s = string{"BT "} + graph[commonTypeMatrix[r][c]].name; -
src/GenPoly/Box.cc
rf9bf142 r330d933 725 725 if ( ! needsBoxing( param, arg->result, exprTyVars, env ) ) return; 726 726 727 if ( arg-> result->get_lvalue() ) {727 if ( arg->get_lvalue() ) { 728 728 // argument expression may be CFA lvalue, but not C lvalue -- apply generalizedLvalue transformations. 729 729 // if ( VariableExpr * varExpr = dynamic_cast< VariableExpr * >( arg ) ) { -
src/GenPoly/Lvalue.cc
rf9bf142 r330d933 363 363 int diff = depth1 - depth2; 364 364 365 if ( diff > 0 && ! srcType->get_lvalue() ) {365 if ( diff > 0 && ! castExpr->arg->get_lvalue() ) { 366 366 // rvalue to reference conversion -- introduce temporary 367 367 // know that reference depth of cast argument is 0, need to introduce n temporaries for reference depth of n, e.g. … … 407 407 ret = new AddressExpr( ret ); 408 408 } 409 if ( srcType->get_lvalue() && ! ResolvExpr::typesCompatible( srcType, strict_dynamic_cast<ReferenceType *>( destType )->base, SymTab::Indexer() ) ) {409 if ( castExpr->arg->get_lvalue() && ! ResolvExpr::typesCompatible( srcType, strict_dynamic_cast<ReferenceType *>( destType )->base, SymTab::Indexer() ) ) { 410 410 // must keep cast if cast-to type is different from the actual type 411 411 castExpr->arg = ret; -
src/Makefile.am
rf9bf142 r330d933 11 11 ## Created On : Sun May 31 08:51:46 2015 12 12 ## Last Modified By : Peter A. Buhr 13 ## Last Modified On : Fri Feb 15 09:44:09201914 ## Update Count : 9 713 ## Last Modified On : Mon Aug 5 12:57:46 2019 14 ## Update Count : 98 15 15 ############################################################################### 16 16 … … 55 55 $(addprefix $(srcdir)/, ResolvExpr/ConversionCost.cc ResolvExpr/CommonType.cc SymTab/ManglerCommon.cc) : $(srcdir)/SynTree/Type.h 56 56 57 $(srcdir)/ SynTree/Type.h: BasicTypes-gen.cc57 $(srcdir)/AST/Type.hpp : BasicTypes-gen.cc 58 58 ${AM_V_GEN}${CXXCOMPILE} $< -o BasicTypes-gen -Wall -Wextra 59 59 @./BasicTypes-gen … … 62 62 # put into lib for now 63 63 cfa_cpplibdir = $(CFA_LIBDIR) 64 cfa_cpplib_PROGRAMS = ../driver/cfa-cpp demangler 64 cfa_cpplib_PROGRAMS = ../driver/cfa-cpp $(DEMANGLER) 65 EXTRA_PROGRAMS = demangler 65 66 ___driver_cfa_cpp_SOURCES = $(SRC) 66 67 ___driver_cfa_cpp_LDADD = -ldl $(LIBPROFILER) $(LIBTCMALLOC) … … 74 75 demangler_LDADD = libdemangle.a -ldl # yywrap 75 76 76 noinst_LIBRARIES = libdemangle.a 77 noinst_LIBRARIES = $(LIBDEMANGLE) 78 EXTRA_LIBRARIES = libdemangle.a 77 79 libdemangle_a_SOURCES = $(SRCDEMANGLE) 78 80 -
src/Makefile.in
rf9bf142 r330d933 141 141 build_triplet = @build@ 142 142 host_triplet = @host@ 143 cfa_cpplib_PROGRAMS = ../driver/cfa-cpp$(EXEEXT) demangler$(EXEEXT) 143 cfa_cpplib_PROGRAMS = ../driver/cfa-cpp$(EXEEXT) $(DEMANGLER) 144 EXTRA_PROGRAMS = demangler$(EXEEXT) 144 145 subdir = src 145 146 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 … … 230 231 SynTree/Initializer.$(OBJEXT) \ 231 232 SynTree/TypeSubstitution.$(OBJEXT) SynTree/Attribute.$(OBJEXT) \ 232 SynTree/DeclReplacer.$(OBJEXT) 233 SynTree/DeclReplacer.$(OBJEXT) SynTree/TopLvalue.$(OBJEXT) 233 234 am__objects_8 = CompilationState.$(OBJEXT) $(am__objects_1) \ 234 235 $(am__objects_2) Concurrency/Keywords.$(OBJEXT) \ … … 427 428 CYGPATH_W = @CYGPATH_W@ 428 429 DEFS = @DEFS@ 430 DEMANGLER = @DEMANGLER@ 429 431 DEPDIR = @DEPDIR@ 430 432 DLLTOOL = @DLLTOOL@ … … 452 454 LIBCFA_TARGET_DIRS = @LIBCFA_TARGET_DIRS@ 453 455 LIBCFA_TARGET_MAKEFILES = @LIBCFA_TARGET_MAKEFILES@ 456 LIBDEMANGLE = @LIBDEMANGLE@ 454 457 LIBOBJS = @LIBOBJS@ 455 458 LIBS = @LIBS@ … … 691 694 SynTree/TypeSubstitution.cc \ 692 695 SynTree/Attribute.cc \ 693 SynTree/DeclReplacer.cc 696 SynTree/DeclReplacer.cc \ 697 SynTree/TopLvalue.cc 694 698 695 699 … … 703 707 demangler_SOURCES = SymTab/demangler.cc # test driver for the demangler, also useful as a sanity check that libdemangle.a is complete 704 708 demangler_LDADD = libdemangle.a -ldl # yywrap 705 noinst_LIBRARIES = libdemangle.a 709 noinst_LIBRARIES = $(LIBDEMANGLE) 710 EXTRA_LIBRARIES = libdemangle.a 706 711 libdemangle_a_SOURCES = $(SRCDEMANGLE) 707 712 all: $(BUILT_SOURCES) … … 1019 1024 SynTree/DeclReplacer.$(OBJEXT): SynTree/$(am__dirstamp) \ 1020 1025 SynTree/$(DEPDIR)/$(am__dirstamp) 1026 SynTree/TopLvalue.$(OBJEXT): SynTree/$(am__dirstamp) \ 1027 SynTree/$(DEPDIR)/$(am__dirstamp) 1021 1028 Tuples/$(am__dirstamp): 1022 1029 @$(MKDIR_P) Tuples … … 1329 1336 @AMDEP_TRUE@@am__include@ @am__quote@SynTree/$(DEPDIR)/ReferenceType.Po@am__quote@ 1330 1337 @AMDEP_TRUE@@am__include@ @am__quote@SynTree/$(DEPDIR)/Statement.Po@am__quote@ 1338 @AMDEP_TRUE@@am__include@ @am__quote@SynTree/$(DEPDIR)/TopLvalue.Po@am__quote@ 1331 1339 @AMDEP_TRUE@@am__include@ @am__quote@SynTree/$(DEPDIR)/TupleExpr.Po@am__quote@ 1332 1340 @AMDEP_TRUE@@am__include@ @am__quote@SynTree/$(DEPDIR)/TupleType.Po@am__quote@ … … 1662 1670 $(addprefix $(srcdir)/, ResolvExpr/ConversionCost.cc ResolvExpr/CommonType.cc SymTab/ManglerCommon.cc) : $(srcdir)/SynTree/Type.h 1663 1671 1664 $(srcdir)/ SynTree/Type.h: BasicTypes-gen.cc1672 $(srcdir)/AST/Type.hpp : BasicTypes-gen.cc 1665 1673 ${AM_V_GEN}${CXXCOMPILE} $< -o BasicTypes-gen -Wall -Wextra 1666 1674 @./BasicTypes-gen -
src/Parser/ExpressionNode.cc
rf9bf142 r330d933 10 10 // Created On : Sat May 16 13:17:07 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Sun Mar 10 16:10:32201913 // Update Count : 97 612 // Last Modified On : Sun Aug 4 20:57:55 2019 13 // Update Count : 978 14 14 // 15 15 … … 109 109 110 110 Expression * build_constantInteger( string & str ) { 111 static const BasicType::Kind kind[2][ 7] = {111 static const BasicType::Kind kind[2][6] = { 112 112 // short (h) must be before char (hh) because shorter type has the longer suffix 113 113 { BasicType::ShortSignedInt, BasicType::SignedChar, BasicType::SignedInt, BasicType::LongSignedInt, BasicType::LongLongSignedInt, BasicType::SignedInt128, }, -
src/Parser/lex.ll
rf9bf142 r330d933 10 10 * Created On : Sat Sep 22 08:58:10 2001 11 11 * Last Modified By : Peter A. Buhr 12 * Last Modified On : Thu Jul 25 22:08:32201913 * Update Count : 71 612 * Last Modified On : Sun Aug 4 20:53:47 2019 13 * Update Count : 719 14 14 */ 15 15 … … 273 273 __inline__ { KEYWORD_RETURN(INLINE); } // GCC 274 274 int { KEYWORD_RETURN(INT); } 275 int128 { KEYWORD_RETURN(INT128); } // CFA 275 276 __int128 { KEYWORD_RETURN(INT128); } // GCC 276 int128{ KEYWORD_RETURN(INT128); } // GCC277 __int128_t { KEYWORD_RETURN(INT128); } // GCC 277 278 __label__ { KEYWORD_RETURN(LABEL); } // GCC 278 279 long { KEYWORD_RETURN(LONG); } … … 313 314 __typeof__ { KEYWORD_RETURN(TYPEOF); } // GCC 314 315 union { KEYWORD_RETURN(UNION); } 316 __uint128_t { KEYWORD_RETURN(UINT128); } // GCC 315 317 unsigned { KEYWORD_RETURN(UNSIGNED); } 316 318 __builtin_va_list { KEYWORD_RETURN(VALIST); } // GCC -
src/Parser/parser.yy
rf9bf142 r330d933 10 10 // Created On : Sat Sep 1 20:22:55 2001 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Thu Jul 25 22:31:38201913 // Update Count : 43 5912 // Last Modified On : Sun Aug 4 21:48:23 2019 13 // Update Count : 4364 14 14 // 15 15 … … 268 268 %token VOID CHAR SHORT INT LONG FLOAT DOUBLE SIGNED UNSIGNED 269 269 %token BOOL COMPLEX IMAGINARY // C99 270 %token INT128 uuFLOAT80 uuFLOAT128// GCC270 %token INT128 UINT128 uuFLOAT80 uuFLOAT128 // GCC 271 271 %token uFLOAT16 uFLOAT32 uFLOAT32X uFLOAT64 uFLOAT64X uFLOAT128 // GCC 272 272 %token ZERO_T ONE_T // CFA … … 1826 1826 | INT128 1827 1827 { $$ = DeclarationNode::newBasicType( DeclarationNode::Int128 ); } 1828 | UINT128 1829 { $$ = DeclarationNode::newBasicType( DeclarationNode::Int128 )->addType( DeclarationNode::newSignedNess( DeclarationNode::Unsigned ) ); } 1828 1830 | FLOAT 1829 1831 { $$ = DeclarationNode::newBasicType( DeclarationNode::Float ); } -
src/ResolvExpr/AlternativeFinder.cc
rf9bf142 r330d933 9 9 // Author : Richard C. Bilson 10 10 // Created On : Sat May 16 23:52:08 2015 11 // Last Modified By : Peter A. Buhr12 // Last Modified On : Thu Jul 25 22:37:46201913 // Update Count : 3 711 // Last Modified By : Andrew Beach 12 // Last Modified On : Thu Aug 8 16:35:00 2019 13 // Update Count : 38 14 14 // 15 15 … … 377 377 } 378 378 379 Cost computeConversionCost( Type * actualType, Type * formalType, const SymTab::Indexer &indexer, const TypeEnvironment & env ) { 379 Cost computeConversionCost( Type * actualType, Type * formalType, bool actualIsLvalue, 380 const SymTab::Indexer &indexer, const TypeEnvironment & env ) { 380 381 PRINT( 381 382 std::cerr << std::endl << "converting "; … … 387 388 std::cerr << std::endl; 388 389 ) 389 Cost convCost = conversionCost( actualType, formalType, indexer, env );390 Cost convCost = conversionCost( actualType, formalType, actualIsLvalue, indexer, env ); 390 391 PRINT( 391 392 std::cerr << std::endl << "cost is " << convCost << std::endl; … … 402 403 403 404 Cost computeExpressionConversionCost( Expression *& actualExpr, Type * formalType, const SymTab::Indexer &indexer, const TypeEnvironment & env ) { 404 Cost convCost = computeConversionCost( actualExpr->result, formalType, indexer, env ); 405 Cost convCost = computeConversionCost( 406 actualExpr->result, formalType, actualExpr->get_lvalue(), indexer, env ); 405 407 406 408 // if there is a non-zero conversion cost, ignoring poly cost, then the expression requires conversion. … … 1135 1137 bool isLvalue( Expression *expr ) { 1136 1138 // xxx - recurse into tuples? 1137 return expr->result && ( expr-> result->get_lvalue() || dynamic_cast< ReferenceType * >( expr->result ) );1139 return expr->result && ( expr->get_lvalue() || dynamic_cast< ReferenceType * >( expr->result ) ); 1138 1140 } 1139 1141 … … 1186 1188 assert( toType ); 1187 1189 toType = resolveTypeof( toType, indexer ); 1190 assert(!dynamic_cast<TypeofType *>(toType)); 1188 1191 SymTab::validateType( toType, &indexer ); 1189 1192 adjustExprType( toType, env, indexer ); … … 1212 1215 unify( castExpr->result, alt.expr->result, alt.env, needAssertions, 1213 1216 haveAssertions, openVars, indexer ); 1214 Cost thisCost = castCost( alt.expr->result, castExpr->result, indexer,1215 alt.env );1217 Cost thisCost = castCost( alt.expr->result, castExpr->result, alt.expr->get_lvalue(), 1218 indexer, alt.env ); 1216 1219 PRINT( 1217 1220 std::cerr << "working on cast with result: " << castExpr->result << std::endl; … … 1640 1643 // xxx - do some inspecting on this line... why isn't result bound to initAlt.type? 1641 1644 1642 Cost thisCost = castCost( alt.expr->result, toType, indexer, newEnv ); 1645 Cost thisCost = castCost( alt.expr->result, toType, alt.expr->get_lvalue(), 1646 indexer, newEnv ); 1643 1647 if ( thisCost != Cost::infinity ) { 1644 1648 // count one safe conversion for each value that is thrown away -
src/ResolvExpr/CastCost.cc
rf9bf142 r330d933 9 9 // Author : Richard C. Bilson 10 10 // Created On : Sun May 17 06:57:43 2015 11 // Last Modified By : Peter A. Buhr12 // Last Modified On : T ue Feb 2 15:34:36 201613 // Update Count : 711 // Last Modified By : Andrew Beach 12 // Last Modified On : Thu Aug 8 16:12:00 2019 13 // Update Count : 8 14 14 // 15 15 … … 37 37 struct CastCost_old : public ConversionCost { 38 38 public: 39 CastCost_old( const Type * dest, const SymTab::Indexer &indexer, const TypeEnvironment &env, CostFunction costFunc ); 39 CastCost_old( const Type * dest, bool srcIsLvalue, 40 const SymTab::Indexer &indexer, const TypeEnvironment &env, CostFunction costFunc ); 40 41 41 42 using ConversionCost::previsit; … … 45 46 }; 46 47 47 Cost castCost( const Type * src, const Type * dest, const SymTab::Indexer &indexer, const TypeEnvironment &env ) { 48 Cost castCost( const Type * src, const Type * dest, bool srcIsLvalue, 49 const SymTab::Indexer &indexer, const TypeEnvironment &env ) { 48 50 if ( const TypeInstType * destAsTypeInst = dynamic_cast< const TypeInstType * >( dest ) ) { 49 51 if ( const EqvClass * eqvClass = env.lookup( destAsTypeInst->name ) ) { 50 52 if ( eqvClass->type ) { 51 return castCost( src, eqvClass->type, indexer, env );53 return castCost( src, eqvClass->type, srcIsLvalue, indexer, env ); 52 54 } else { 53 55 return Cost::infinity; … … 57 59 const TypeDecl * type = strict_dynamic_cast< const TypeDecl * >( namedType ); 58 60 if ( type->base ) { 59 return castCost( src, type->base, indexer, env ) + Cost::safe;61 return castCost( src, type->base, srcIsLvalue, indexer, env ) + Cost::safe; 60 62 } // if 61 63 } // if … … 78 80 } else if ( const ReferenceType * refType = dynamic_cast< const ReferenceType * > ( dest ) ) { 79 81 PRINT( std::cerr << "conversionCost: dest is reference" << std::endl; ) 80 return convertToReferenceCost( src, refType, indexer, env, [](const Type * t1, const Type * t2, const SymTab::Indexer & indexer, const TypeEnvironment & env ) {82 return convertToReferenceCost( src, refType, srcIsLvalue, indexer, env, [](const Type * t1, const Type * t2, const SymTab::Indexer & indexer, const TypeEnvironment & env ) { 81 83 return ptrsCastable( t1, t2, env, indexer ); 82 84 }); 83 85 } else { 84 86 PassVisitor<CastCost_old> converter( 85 dest, indexer, env,86 (Cost (*)( const Type *, const Type *, const SymTab::Indexer &, const TypeEnvironment & ))87 dest, srcIsLvalue, indexer, env, 88 (Cost (*)( const Type *, const Type *, bool, const SymTab::Indexer &, const TypeEnvironment & )) 87 89 castCost ); 88 90 src->accept( converter ); … … 96 98 } 97 99 98 CastCost_old::CastCost_old( const Type * dest, const SymTab::Indexer &indexer, const TypeEnvironment &env, CostFunction costFunc ) 99 : ConversionCost( dest, indexer, env, costFunc ) { 100 CastCost_old::CastCost_old( const Type * dest, bool srcIsLvalue, 101 const SymTab::Indexer &indexer, const TypeEnvironment &env, CostFunction costFunc ) 102 : ConversionCost( dest, srcIsLvalue, indexer, env, costFunc ) { 100 103 } 101 104 … … 106 109 cost = Cost::unsafe; 107 110 } else { 108 cost = conversionCost( basicType, dest, indexer, env );111 cost = conversionCost( basicType, dest, srcIsLvalue, indexer, env ); 109 112 } // if 110 113 } -
src/ResolvExpr/CommonType.cc
rf9bf142 r330d933 190 190 */ 191 191 { 192 /* B */ BT Bool, BT Char, BT SignedChar, BT UnsignedChar, BT ShortSignedInt, BT ShortUnsignedInt,192 /* B */ BT Bool, BT Char, BT SignedChar, BT UnsignedChar, BT ShortSignedInt, BT ShortUnsignedInt, 193 193 BT SignedInt, BT UnsignedInt, BT LongSignedInt, BT LongUnsignedInt, BT LongLongSignedInt, BT LongLongUnsignedInt, 194 194 BT SignedInt128, BT UnsignedInt128, BT uFloat16, BT uFloat16Complex, BT uFloat32, BT uFloat32Complex, … … 198 198 }, 199 199 { 200 /* C */ BT Char, BT Char, BT SignedChar, BT UnsignedChar, BT ShortSignedInt, BT ShortUnsignedInt,200 /* C */ BT Char, BT Char, BT SignedChar, BT UnsignedChar, BT ShortSignedInt, BT ShortUnsignedInt, 201 201 BT SignedInt, BT UnsignedInt, BT LongSignedInt, BT LongUnsignedInt, BT LongLongSignedInt, BT LongLongUnsignedInt, 202 202 BT SignedInt128, BT UnsignedInt128, BT uFloat16, BT uFloat16Complex, BT uFloat32, BT uFloat32Complex, … … 206 206 }, 207 207 { 208 /* SC */ BT SignedChar, BT SignedChar, BT SignedChar, BT UnsignedChar, BT ShortSignedInt, BT ShortUnsignedInt,208 /* SC */ BT SignedChar, BT SignedChar, BT SignedChar, BT UnsignedChar, BT ShortSignedInt, BT ShortUnsignedInt, 209 209 BT SignedInt, BT UnsignedInt, BT LongSignedInt, BT LongUnsignedInt, BT LongLongSignedInt, BT LongLongUnsignedInt, 210 210 BT SignedInt128, BT UnsignedInt128, BT uFloat16, BT uFloat16Complex, BT uFloat32, BT uFloat32Complex, … … 214 214 }, 215 215 { 216 /* UC */ BT UnsignedChar, BT UnsignedChar, BT UnsignedChar, BT UnsignedChar, BT ShortSignedInt, BT ShortUnsignedInt,216 /* UC */ BT UnsignedChar, BT UnsignedChar, BT UnsignedChar, BT UnsignedChar, BT ShortSignedInt, BT ShortUnsignedInt, 217 217 BT SignedInt, BT UnsignedInt, BT LongSignedInt, BT LongUnsignedInt, BT LongLongSignedInt, BT LongLongUnsignedInt, 218 218 BT SignedInt128, BT UnsignedInt128, BT uFloat16, BT uFloat16Complex, BT uFloat32, BT uFloat32Complex, … … 222 222 }, 223 223 { 224 /* SI */ BT ShortSignedInt, BT ShortSignedInt, BT ShortSignedInt, BT ShortSignedInt, BT ShortSignedInt, BT ShortUnsignedInt,224 /* SI */ BT ShortSignedInt, BT ShortSignedInt, BT ShortSignedInt, BT ShortSignedInt, BT ShortSignedInt, BT ShortUnsignedInt, 225 225 BT SignedInt, BT UnsignedInt, BT LongSignedInt, BT LongUnsignedInt, BT LongLongSignedInt, BT LongLongUnsignedInt, 226 226 BT SignedInt128, BT UnsignedInt128, BT uFloat16, BT uFloat16Complex, BT uFloat32, BT uFloat32Complex, … … 230 230 }, 231 231 { 232 /* SUI */ BT ShortUnsignedInt, BT ShortUnsignedInt, BT ShortUnsignedInt, BT ShortUnsignedInt, BT ShortUnsignedInt, BT ShortUnsignedInt,232 /* SUI */ BT ShortUnsignedInt, BT ShortUnsignedInt, BT ShortUnsignedInt, BT ShortUnsignedInt, BT ShortUnsignedInt, BT ShortUnsignedInt, 233 233 BT SignedInt, BT UnsignedInt, BT LongSignedInt, BT LongUnsignedInt, BT LongLongSignedInt, BT LongLongUnsignedInt, 234 234 BT SignedInt128, BT UnsignedInt128, BT uFloat16, BT uFloat16Complex, BT uFloat32, BT uFloat32Complex, … … 238 238 }, 239 239 { 240 /* I */ BT SignedInt, BT SignedInt, BT SignedInt, BT SignedInt, BT SignedInt, BT SignedInt,240 /* I */ BT SignedInt, BT SignedInt, BT SignedInt, BT SignedInt, BT SignedInt, BT SignedInt, 241 241 BT SignedInt, BT UnsignedInt, BT LongSignedInt, BT LongUnsignedInt, BT LongLongSignedInt, BT LongLongUnsignedInt, 242 242 BT SignedInt128, BT UnsignedInt128, BT uFloat16, BT uFloat16Complex, BT uFloat32, BT uFloat32Complex, … … 246 246 }, 247 247 { 248 /* UI */ BT UnsignedInt, BT UnsignedInt, BT UnsignedInt, BT UnsignedInt, BT UnsignedInt, BT UnsignedInt,248 /* UI */ BT UnsignedInt, BT UnsignedInt, BT UnsignedInt, BT UnsignedInt, BT UnsignedInt, BT UnsignedInt, 249 249 BT UnsignedInt, BT UnsignedInt, BT LongSignedInt, BT LongUnsignedInt, BT LongLongSignedInt, BT LongLongUnsignedInt, 250 250 BT SignedInt128, BT UnsignedInt128, BT uFloat16, BT uFloat16Complex, BT uFloat32, BT uFloat32Complex, … … 254 254 }, 255 255 { 256 /* LI */ BT LongSignedInt, BT LongSignedInt, BT LongSignedInt, BT LongSignedInt, BT LongSignedInt, BT LongSignedInt,256 /* LI */ BT LongSignedInt, BT LongSignedInt, BT LongSignedInt, BT LongSignedInt, BT LongSignedInt, BT LongSignedInt, 257 257 BT LongSignedInt, BT LongSignedInt, BT LongSignedInt, BT LongUnsignedInt, BT LongLongSignedInt, BT LongLongUnsignedInt, 258 258 BT SignedInt128, BT UnsignedInt128, BT uFloat16, BT uFloat16Complex, BT uFloat32, BT uFloat32Complex, … … 262 262 }, 263 263 { 264 /* LUI */ BT LongUnsignedInt, BT LongUnsignedInt, BT LongUnsignedInt, BT LongUnsignedInt, BT LongUnsignedInt, BT LongUnsignedInt,264 /* LUI */ BT LongUnsignedInt, BT LongUnsignedInt, BT LongUnsignedInt, BT LongUnsignedInt, BT LongUnsignedInt, BT LongUnsignedInt, 265 265 BT LongUnsignedInt, BT LongUnsignedInt, BT LongUnsignedInt, BT LongUnsignedInt, BT LongLongSignedInt, BT LongLongUnsignedInt, 266 266 BT SignedInt128, BT UnsignedInt128, BT uFloat16, BT uFloat16Complex, BT uFloat32, BT uFloat32Complex, … … 270 270 }, 271 271 { 272 /* LLI */ BT LongLongSignedInt, BT LongLongSignedInt, BT LongLongSignedInt, BT LongLongSignedInt, BT LongLongSignedInt, BT LongLongSignedInt,272 /* LLI */ BT LongLongSignedInt, BT LongLongSignedInt, BT LongLongSignedInt, BT LongLongSignedInt, BT LongLongSignedInt, BT LongLongSignedInt, 273 273 BT LongLongSignedInt, BT LongLongSignedInt, BT LongLongSignedInt, BT LongLongSignedInt, BT LongLongSignedInt, BT LongLongUnsignedInt, 274 274 BT SignedInt128, BT UnsignedInt128, BT uFloat16, BT uFloat16Complex, BT uFloat32, BT uFloat32Complex, … … 278 278 }, 279 279 { 280 /* LLUI */ BT LongLongUnsignedInt, BT LongLongUnsignedInt, BT LongLongUnsignedInt, BT LongLongUnsignedInt, BT LongLongUnsignedInt, BT LongLongUnsignedInt,280 /* LLUI */ BT LongLongUnsignedInt, BT LongLongUnsignedInt, BT LongLongUnsignedInt, BT LongLongUnsignedInt, BT LongLongUnsignedInt, BT LongLongUnsignedInt, 281 281 BT LongLongUnsignedInt, BT LongLongUnsignedInt, BT LongLongUnsignedInt, BT LongLongUnsignedInt, BT LongLongUnsignedInt, BT LongLongUnsignedInt, 282 282 BT SignedInt128, BT UnsignedInt128, BT uFloat16, BT uFloat16Complex, BT uFloat32, BT uFloat32Complex, … … 286 286 }, 287 287 { 288 /* IB */ BT SignedInt128, BT SignedInt128, BT SignedInt128, BT SignedInt128, BT SignedInt128, BT SignedInt128,288 /* IB */ BT SignedInt128, BT SignedInt128, BT SignedInt128, BT SignedInt128, BT SignedInt128, BT SignedInt128, 289 289 BT SignedInt128, BT SignedInt128, BT SignedInt128, BT SignedInt128, BT SignedInt128, BT SignedInt128, 290 290 BT SignedInt128, BT UnsignedInt128, BT uFloat16, BT uFloat16Complex, BT uFloat32, BT uFloat32Complex, … … 294 294 }, 295 295 { 296 /* UIB */ BT UnsignedInt128, BT UnsignedInt128, BT UnsignedInt128, BT UnsignedInt128, BT UnsignedInt128, BT UnsignedInt128,296 /* UIB */ BT UnsignedInt128, BT UnsignedInt128, BT UnsignedInt128, BT UnsignedInt128, BT UnsignedInt128, BT UnsignedInt128, 297 297 BT UnsignedInt128, BT UnsignedInt128, BT UnsignedInt128, BT UnsignedInt128, BT UnsignedInt128, BT UnsignedInt128, 298 298 BT UnsignedInt128, BT UnsignedInt128, BT uFloat16, BT uFloat16Complex, BT uFloat32, BT uFloat32Complex, … … 302 302 }, 303 303 { 304 /* _FH */ BT uFloat16, BT uFloat16, BT uFloat16, BT uFloat16, BT uFloat16, BT uFloat16,304 /* _FH */ BT uFloat16, BT uFloat16, BT uFloat16, BT uFloat16, BT uFloat16, BT uFloat16, 305 305 BT uFloat16, BT uFloat16, BT uFloat16, BT uFloat16, BT uFloat16, BT uFloat16, 306 306 BT uFloat16, BT uFloat16, BT uFloat16, BT uFloat16Complex, BT uFloat32, BT uFloat32Complex, … … 310 310 }, 311 311 { 312 /* _FH */ BT uFloat16Complex, BT uFloat16Complex, BT uFloat16Complex, BT uFloat16Complex, BT uFloat16Complex, BT uFloat16Complex,312 /* _FH */ BT uFloat16Complex, BT uFloat16Complex, BT uFloat16Complex, BT uFloat16Complex, BT uFloat16Complex, BT uFloat16Complex, 313 313 BT uFloat16Complex, BT uFloat16Complex, BT uFloat16Complex, BT uFloat16Complex, BT uFloat16Complex, BT uFloat16Complex, 314 314 BT uFloat16Complex, BT uFloat16Complex, BT uFloat16Complex, BT uFloat16Complex, BT uFloat32Complex, BT uFloat32Complex, … … 318 318 }, 319 319 { 320 /* _F */ BT uFloat32, BT uFloat32, BT uFloat32, BT uFloat32, BT uFloat32, BT uFloat32,320 /* _F */ BT uFloat32, BT uFloat32, BT uFloat32, BT uFloat32, BT uFloat32, BT uFloat32, 321 321 BT uFloat32, BT uFloat32, BT uFloat32, BT uFloat32, BT uFloat32, BT uFloat32, 322 322 BT uFloat32, BT uFloat32, BT uFloat32, BT uFloat32Complex, BT uFloat32, BT uFloat32Complex, … … 326 326 }, 327 327 { 328 /* _FC */ BT uFloat32Complex, BT uFloat32Complex, BT uFloat32Complex, BT uFloat32Complex, BT uFloat32Complex, BT uFloat32Complex,328 /* _FC */ BT uFloat32Complex, BT uFloat32Complex, BT uFloat32Complex, BT uFloat32Complex, BT uFloat32Complex, BT uFloat32Complex, 329 329 BT uFloat32Complex, BT uFloat32Complex, BT uFloat32Complex, BT uFloat32Complex, BT uFloat32Complex, BT uFloat32Complex, 330 330 BT uFloat32Complex, BT uFloat32Complex, BT uFloat32Complex, BT uFloat32Complex, BT uFloat32Complex, BT uFloat32Complex, … … 334 334 }, 335 335 { 336 /* F */ BT Float, BT Float, BT Float, BT Float, BT Float, BT Float,336 /* F */ BT Float, BT Float, BT Float, BT Float, BT Float, BT Float, 337 337 BT Float, BT Float, BT Float, BT Float, BT Float, BT Float, 338 338 BT Float, BT Float, BT Float, BT FloatComplex, BT Float, BT FloatComplex, … … 342 342 }, 343 343 { 344 /* FC */ BT FloatComplex, BT FloatComplex, BT FloatComplex, BT FloatComplex, BT FloatComplex, BT FloatComplex,344 /* FC */ BT FloatComplex, BT FloatComplex, BT FloatComplex, BT FloatComplex, BT FloatComplex, BT FloatComplex, 345 345 BT FloatComplex, BT FloatComplex, BT FloatComplex, BT FloatComplex, BT FloatComplex, BT FloatComplex, 346 346 BT FloatComplex, BT FloatComplex, BT FloatComplex, BT FloatComplex, BT FloatComplex, BT FloatComplex, … … 350 350 }, 351 351 { 352 /* _FX */ BT uFloat32x, BT uFloat32x, BT uFloat32x, BT uFloat32x, BT uFloat32x, BT uFloat32x,352 /* _FX */ BT uFloat32x, BT uFloat32x, BT uFloat32x, BT uFloat32x, BT uFloat32x, BT uFloat32x, 353 353 BT uFloat32x, BT uFloat32x, BT uFloat32x, BT uFloat32x, BT uFloat32x, BT uFloat32x, 354 354 BT uFloat32x, BT uFloat32x, BT uFloat32x, BT uFloat32xComplex, BT uFloat32x, BT uFloat32xComplex, … … 358 358 }, 359 359 { 360 /* _FXC */ BT uFloat32xComplex, BT uFloat32xComplex, BT uFloat32xComplex, BT uFloat32xComplex, BT uFloat32xComplex, BT uFloat32xComplex,360 /* _FXC */ BT uFloat32xComplex, BT uFloat32xComplex, BT uFloat32xComplex, BT uFloat32xComplex, BT uFloat32xComplex, BT uFloat32xComplex, 361 361 BT uFloat32xComplex, BT uFloat32xComplex, BT uFloat32xComplex, BT uFloat32xComplex, BT uFloat32xComplex, BT uFloat32xComplex, 362 362 BT uFloat32xComplex, BT uFloat32xComplex, BT uFloat32xComplex, BT uFloat32xComplex, BT uFloat32xComplex, BT uFloat32xComplex, … … 366 366 }, 367 367 { 368 /* FD */ BT uFloat64, BT uFloat64, BT uFloat64, BT uFloat64, BT uFloat64, BT uFloat64,368 /* FD */ BT uFloat64, BT uFloat64, BT uFloat64, BT uFloat64, BT uFloat64, BT uFloat64, 369 369 BT uFloat64, BT uFloat64, BT uFloat64, BT uFloat64, BT uFloat64, BT uFloat64, 370 370 BT uFloat64, BT uFloat64, BT uFloat64, BT uFloat64Complex, BT uFloat64, BT uFloat64Complex, … … 374 374 }, 375 375 { 376 /* _FDC */ BT uFloat64Complex, BT uFloat64Complex, BT uFloat64Complex, BT uFloat64Complex, BT uFloat64Complex, BT uFloat64Complex,376 /* _FDC */ BT uFloat64Complex, BT uFloat64Complex, BT uFloat64Complex, BT uFloat64Complex, BT uFloat64Complex, BT uFloat64Complex, 377 377 BT uFloat64Complex, BT uFloat64Complex, BT uFloat64Complex, BT uFloat64Complex, BT uFloat64Complex, BT uFloat64Complex, 378 378 BT uFloat64Complex, BT uFloat64Complex, BT uFloat64Complex, BT uFloat64Complex, BT uFloat64Complex, BT uFloat64Complex, … … 382 382 }, 383 383 { 384 /* D */ BT Double, BT Double, BT Double, BT Double, BT Double, BT Double,384 /* D */ BT Double, BT Double, BT Double, BT Double, BT Double, BT Double, 385 385 BT Double, BT Double, BT Double, BT Double, BT Double, BT Double, 386 386 BT Double, BT Double, BT Double, BT DoubleComplex, BT Double, BT DoubleComplex, … … 390 390 }, 391 391 { 392 /* DC */ BT DoubleComplex, BT DoubleComplex, BT DoubleComplex, BT DoubleComplex, BT DoubleComplex, BT DoubleComplex,392 /* DC */ BT DoubleComplex, BT DoubleComplex, BT DoubleComplex, BT DoubleComplex, BT DoubleComplex, BT DoubleComplex, 393 393 BT DoubleComplex, BT DoubleComplex, BT DoubleComplex, BT DoubleComplex, BT DoubleComplex, BT DoubleComplex, 394 394 BT DoubleComplex, BT DoubleComplex, BT DoubleComplex, BT DoubleComplex, BT DoubleComplex, BT DoubleComplex, … … 398 398 }, 399 399 { 400 /* F80X */ BT uFloat64x, BT uFloat64x, BT uFloat64x, BT uFloat64x, BT uFloat64x, BT uFloat64x,400 /* F80X */ BT uFloat64x, BT uFloat64x, BT uFloat64x, BT uFloat64x, BT uFloat64x, BT uFloat64x, 401 401 BT uFloat64x, BT uFloat64x, BT uFloat64x, BT uFloat64x, BT uFloat64x, BT uFloat64x, 402 402 BT uFloat64x, BT uFloat64x, BT uFloat64x, BT uFloat64xComplex, BT uFloat64x, BT uFloat64xComplex, … … 406 406 }, 407 407 { 408 /* _FDXC */ BT uFloat64xComplex, BT uFloat64xComplex, BT uFloat64xComplex, BT uFloat64xComplex, BT uFloat64xComplex, BT uFloat64xComplex,408 /* _FDXC */ BT uFloat64xComplex, BT uFloat64xComplex, BT uFloat64xComplex, BT uFloat64xComplex, BT uFloat64xComplex, BT uFloat64xComplex, 409 409 BT uFloat64xComplex, BT uFloat64xComplex, BT uFloat64xComplex, BT uFloat64xComplex, BT uFloat64xComplex, BT uFloat64xComplex, 410 410 BT uFloat64xComplex, BT uFloat64xComplex, BT uFloat64xComplex, BT uFloat64xComplex, BT uFloat64xComplex, BT uFloat64xComplex, … … 414 414 }, 415 415 { 416 /* F80*/ BT uuFloat80, BT uuFloat80, BT uuFloat80, BT uuFloat80, BT uuFloat80, BT uuFloat80,416 /* F80 */ BT uuFloat80, BT uuFloat80, BT uuFloat80, BT uuFloat80, BT uuFloat80, BT uuFloat80, 417 417 BT uuFloat80, BT uuFloat80, BT uuFloat80, BT uuFloat80, BT uuFloat80, BT uuFloat80, 418 418 BT uuFloat80, BT uuFloat80, BT uuFloat80, BT uFloat64xComplex, BT uuFloat80, BT uFloat64xComplex, … … 422 422 }, 423 423 { 424 /* _FB */ BT uFloat128, BT uFloat128, BT uFloat128, BT uFloat128, BT uFloat128, BT uFloat128,424 /* _FB */ BT uFloat128, BT uFloat128, BT uFloat128, BT uFloat128, BT uFloat128, BT uFloat128, 425 425 BT uFloat128, BT uFloat128, BT uFloat128, BT uFloat128, BT uFloat128, BT uFloat128, 426 426 BT uFloat128, BT uFloat128, BT uFloat128, BT uFloat128Complex, BT uFloat128, BT uFloat128Complex, … … 430 430 }, 431 431 { 432 /* _FLDC */ BT uFloat128Complex, BT uFloat128Complex, BT uFloat128Complex, BT uFloat128Complex, BT uFloat128Complex, BT uFloat128Complex,432 /* _FLDC */ BT uFloat128Complex, BT uFloat128Complex, BT uFloat128Complex, BT uFloat128Complex, BT uFloat128Complex, BT uFloat128Complex, 433 433 BT uFloat128Complex, BT uFloat128Complex, BT uFloat128Complex, BT uFloat128Complex, BT uFloat128Complex, BT uFloat128Complex, 434 434 BT uFloat128Complex, BT uFloat128Complex, BT uFloat128Complex, BT uFloat128Complex, BT uFloat128Complex, BT uFloat128Complex, … … 438 438 }, 439 439 { 440 /* FB */ BT uuFloat128, BT uuFloat128, BT uuFloat128, BT uuFloat128, BT uuFloat128, BT uuFloat128,440 /* FB */ BT uuFloat128, BT uuFloat128, BT uuFloat128, BT uuFloat128, BT uuFloat128, BT uuFloat128, 441 441 BT uuFloat128, BT uuFloat128, BT uuFloat128, BT uuFloat128, BT uuFloat128, BT uuFloat128, 442 442 BT uuFloat128, BT uuFloat128, BT uuFloat128, BT uFloat128Complex, BT uuFloat128, BT uFloat128Complex, … … 446 446 }, 447 447 { 448 /* LD */ BT LongDouble, BT LongDouble, BT LongDouble, BT LongDouble, BT LongDouble, BT LongDouble,448 /* LD */ BT LongDouble, BT LongDouble, BT LongDouble, BT LongDouble, BT LongDouble, BT LongDouble, 449 449 BT LongDouble, BT LongDouble, BT LongDouble, BT LongDouble, BT LongDouble, BT LongDouble, 450 450 BT LongDouble, BT LongDouble, BT LongDouble, BT LongDoubleComplex, BT LongDouble, BT LongDoubleComplex, … … 454 454 }, 455 455 { 456 /* LDC */ BT LongDoubleComplex, BT LongDoubleComplex, BT LongDoubleComplex, BT LongDoubleComplex, BT LongDoubleComplex, BT LongDoubleComplex,456 /* LDC */ BT LongDoubleComplex, BT LongDoubleComplex, BT LongDoubleComplex, BT LongDoubleComplex, BT LongDoubleComplex, BT LongDoubleComplex, 457 457 BT LongDoubleComplex, BT LongDoubleComplex, BT LongDoubleComplex, BT LongDoubleComplex, BT LongDoubleComplex, BT LongDoubleComplex, 458 458 BT LongDoubleComplex, BT LongDoubleComplex, BT LongDoubleComplex, BT LongDoubleComplex, BT LongDoubleComplex, BT LongDoubleComplex, … … 462 462 }, 463 463 { 464 /* _FBX */ BT uFloat128x, BT uFloat128x, BT uFloat128x, BT uFloat128x, BT uFloat128x, BT uFloat128x,464 /* _FBX */ BT uFloat128x, BT uFloat128x, BT uFloat128x, BT uFloat128x, BT uFloat128x, BT uFloat128x, 465 465 BT uFloat128x, BT uFloat128x, BT uFloat128x, BT uFloat128x, BT uFloat128x, BT uFloat128x, 466 466 BT uFloat128x, BT uFloat128x, BT uFloat128x, BT uFloat128xComplex, BT uFloat128x, BT uFloat128xComplex, -
src/ResolvExpr/ConversionCost.cc
rf9bf142 r330d933 10 10 // Created On : Sun May 17 07:06:19 2015 11 11 // Last Modified By : Andrew Beach 12 // Last Modified On : Mon Jun 24 13:33:00 201913 // Update Count : 2 612 // Last Modified On : Mon Aug 12 10:21:00 2019 13 // Update Count : 27 14 14 // 15 15 … … 46 46 #endif 47 47 48 Cost conversionCost( const Type * src, const Type * dest, const SymTab::Indexer &indexer, const TypeEnvironment &env ) { 48 Cost conversionCost( const Type * src, const Type * dest, bool srcIsLvalue, 49 const SymTab::Indexer &indexer, const TypeEnvironment &env ) { 49 50 if ( const TypeInstType * destAsTypeInst = dynamic_cast< const TypeInstType * >( dest ) ) { 50 51 PRINT( std::cerr << "type inst " << destAsTypeInst->name; ) 51 52 if ( const EqvClass * eqvClass = env.lookup( destAsTypeInst->name ) ) { 52 53 if ( eqvClass->type ) { 53 return conversionCost( src, eqvClass->type, indexer, env );54 return conversionCost( src, eqvClass->type, srcIsLvalue, indexer, env ); 54 55 } else { 55 56 return Cost::infinity; … … 61 62 assert( type ); 62 63 if ( type->base ) { 63 return conversionCost( src, type->base, indexer, env ) + Cost::safe; 64 return conversionCost( src, type->base, srcIsLvalue, indexer, env ) 65 + Cost::safe; 64 66 } // if 65 67 } // if … … 81 83 } else if ( const ReferenceType * refType = dynamic_cast< const ReferenceType * > ( dest ) ) { 82 84 PRINT( std::cerr << "conversionCost: dest is reference" << std::endl; ) 83 return convertToReferenceCost( src, refType, indexer, env, [](const Type * const t1, const Type * t2, const SymTab::Indexer &, const TypeEnvironment & env ){85 return convertToReferenceCost( src, refType, srcIsLvalue, indexer, env, [](const Type * const t1, const Type * t2, const SymTab::Indexer &, const TypeEnvironment & env ){ 84 86 return ptrsAssignable( t1, t2, env ); 85 87 }); 86 88 } else { 87 89 PassVisitor<ConversionCost> converter( 88 dest, indexer, env,89 (Cost (*)(const Type *, const Type *, const SymTab::Indexer&, const TypeEnvironment&))90 dest, srcIsLvalue, indexer, env, 91 (Cost (*)(const Type *, const Type *, bool, const SymTab::Indexer&, const TypeEnvironment&)) 90 92 conversionCost ); 91 93 src->accept( converter ); … … 98 100 } 99 101 100 Cost convertToReferenceCost( const Type * src, const Type * dest, int diff, const SymTab::Indexer & indexer, const TypeEnvironment & env, PtrsFunction func ) { 102 static Cost convertToReferenceCost( const Type * src, const Type * dest, bool srcIsLvalue, 103 int diff, const SymTab::Indexer & indexer, const TypeEnvironment & env, PtrsFunction func ) { 101 104 PRINT( std::cerr << "convert to reference cost... diff " << diff << " " << src << " / " << dest << std::endl; ) 102 105 if ( diff > 0 ) { 103 106 // TODO: document this 104 Cost cost = convertToReferenceCost( strict_dynamic_cast< const ReferenceType * >( src )->base, dest, diff-1, indexer, env, func ); 107 Cost cost = convertToReferenceCost( 108 strict_dynamic_cast< const ReferenceType * >( src )->base, dest, srcIsLvalue, 109 diff-1, indexer, env, func ); 105 110 cost.incReference(); 106 111 return cost; 107 112 } else if ( diff < -1 ) { 108 113 // TODO: document this 109 Cost cost = convertToReferenceCost( src, strict_dynamic_cast< const ReferenceType * >( dest )->base, diff+1, indexer, env, func ); 114 Cost cost = convertToReferenceCost( 115 src, strict_dynamic_cast< const ReferenceType * >( dest )->base, srcIsLvalue, 116 diff+1, indexer, env, func ); 110 117 cost.incReference(); 111 118 return cost; … … 138 145 PRINT( std::cerr << "reference to rvalue conversion" << std::endl; ) 139 146 PassVisitor<ConversionCost> converter( 140 dest, indexer, env,141 (Cost (*)(const Type *, const Type *, const SymTab::Indexer&, const TypeEnvironment&))147 dest, srcIsLvalue, indexer, env, 148 (Cost (*)(const Type *, const Type *, bool, const SymTab::Indexer&, const TypeEnvironment&)) 142 149 conversionCost ); 143 150 src->accept( converter ); … … 150 157 if ( typesCompatibleIgnoreQualifiers( src, destAsRef->base, indexer, env ) ) { 151 158 PRINT( std::cerr << "converting compatible base type" << std::endl; ) 152 if ( src->get_lvalue() ) { 159 assert( src->get_lvalue() == srcIsLvalue ); 160 if ( srcIsLvalue ) { 153 161 PRINT( 154 162 std::cerr << "lvalue to reference conversion" << std::endl; … … 178 186 } 179 187 180 Cost convertToReferenceCost( const Type * src, const ReferenceType * dest, const SymTab::Indexer & indexer, const TypeEnvironment & env, PtrsFunction func ) { 188 Cost convertToReferenceCost( const Type * src, const ReferenceType * dest, bool srcIsLvalue, 189 const SymTab::Indexer & indexer, const TypeEnvironment & env, PtrsFunction func ) { 181 190 int sdepth = src->referenceDepth(), ddepth = dest->referenceDepth(); 182 Cost cost = convertToReferenceCost( src, dest, s depth-ddepth, indexer, env, func );191 Cost cost = convertToReferenceCost( src, dest, srcIsLvalue, sdepth-ddepth, indexer, env, func ); 183 192 PRINT( std::cerr << "convertToReferenceCost result: " << cost << std::endl; ) 184 193 return cost; 185 194 } 186 195 187 ConversionCost::ConversionCost( const Type * dest, const SymTab::Indexer &indexer, const TypeEnvironment &env, CostFunction costFunc )188 : dest( dest ), indexer( indexer ), cost( Cost::infinity ), env( env ), costFunc( costFunc ) {196 ConversionCost::ConversionCost( const Type * dest, bool srcIsLvalue, const SymTab::Indexer &indexer, const TypeEnvironment &env, CostFunction costFunc ) 197 : dest( dest ), srcIsLvalue( srcIsLvalue ), indexer( indexer ), cost( Cost::infinity ), env( env ), costFunc( costFunc ) { 189 198 } 190 199 … … 217 226 // GENERATED BY BasicTypes-gen.cc 218 227 static const int costMatrix[BasicType::NUMBER_OF_BASIC_TYPES][BasicType::NUMBER_OF_BASIC_TYPES] = { // path length from root to node 219 /* 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 */220 /* B */ { 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 15, 15, 16, 17, 16, 18, 17, },221 /* C */ { -1, 0, 1, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 15, 16, 15, 17, 16, },222 /* SC */ { -1, -1, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 15, 16, 15, 17, 16, },223 /* UC */ { -1, -1, -1, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 15, 16, 15, 17, 16, },224 /* SI */ { -1, -1, -1, -1, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 15, 14, 16, 15, },225 /* SUI */ { -1, -1, -1, -1, -1, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 15, 14, 16, 15, },226 /* I */ { -1, -1, -1, -1, -1, -1, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 14, 13, 15, 14, },227 /* UI */ { -1, -1, -1, -1, -1, -1, -1, 0, 1, 1, 2, 2, 3, 3, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 14, 13, 15, 14, },228 /* LI */ { -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 13, 12, 14, 13, },229 /* LUI */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 1, 2, 2, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 13, 12, 14, 13, },230 /* LLI */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 12, 11, 13, 12, },231 /* LLUI */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 1, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 12, 11, 13, 12, },232 /* IB */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 11, 10, 12, 11, },233 /* UIB */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 11, 10, 12, 11, },234 /* _FH */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 10, 9, 11, 10, },235 /* _FH */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, 1, -1, 2, -1, 3, -1, 4, -1, 5, -1, 6, -1, -1, 7, -1, -1, 8, -1, 9, },236 /* _F */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 9, 8, 10, 9, },237 /* _FC */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, 1, -1, 2, -1, 3, -1, 4, -1, 5, -1, -1, 6, -1, -1, 7, -1, 8, },238 /* F */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 8, 7, 9, 8, },239 /* FC */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, 1, -1, 2, -1, 3, -1, 4, -1, -1, 5, -1, -1, 6, -1, 7, },240 /* _FX */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 7, 6, 8, 7, },241 /* _FXC */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, 1, -1, 2, -1, 3, -1, -1, 4, -1, -1, 5, -1, 6, },242 /* FD */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 6, 5, 7, 6, },243 /* _FDC */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, 1, -1, 2, -1, -1, 3, -1, -1, 4, -1, 5, },244 /* D */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 1, 2, 2, 3, 3, 4, 5, 4, 6, 5, },245 /* DC */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, 1, -1, -1, 2, -1, -1, 3, -1, 4, },246 /* F80X */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 1, 2, 2, 3, 4, 3, 5, 4, },247 /* _FDXC */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, -1, 1, -1, -1, 2, -1, 3, },248 /* F80*/ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, 0, 1, 2, 2, 3, 3, 4, 4, },249 /* _FB */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 1, 2, 2, 3, 3, },250 /* _FLDC */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, -1, 1, -1, 2, },251 /* FB */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, 0, 1, 2, 2, 3, },252 /* LD */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 1, 2, },253 /* LDC */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, 1, },254 /* _FBX */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, },228 /* 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 */ 229 /* B */ { 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 15, 15, 16, 17, 16, 18, 17, }, 230 /* C */ { -1, 0, 1, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 15, 16, 15, 17, 16, }, 231 /* SC */ { -1, -1, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 15, 16, 15, 17, 16, }, 232 /* UC */ { -1, -1, -1, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 15, 16, 15, 17, 16, }, 233 /* SI */ { -1, -1, -1, -1, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 15, 14, 16, 15, }, 234 /* SUI */ { -1, -1, -1, -1, -1, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 15, 14, 16, 15, }, 235 /* I */ { -1, -1, -1, -1, -1, -1, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 14, 13, 15, 14, }, 236 /* UI */ { -1, -1, -1, -1, -1, -1, -1, 0, 1, 1, 2, 2, 3, 3, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 14, 13, 15, 14, }, 237 /* LI */ { -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 13, 12, 14, 13, }, 238 /* LUI */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 1, 2, 2, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 13, 12, 14, 13, }, 239 /* LLI */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 12, 11, 13, 12, }, 240 /* LLUI */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 1, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 12, 11, 13, 12, }, 241 /* IB */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 11, 10, 12, 11, }, 242 /* UIB */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 11, 10, 12, 11, }, 243 /* _FH */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 10, 9, 11, 10, }, 244 /* _FH */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, 1, -1, 2, -1, 3, -1, 4, -1, 5, -1, 6, -1, -1, 7, -1, -1, 8, -1, 9, }, 245 /* _F */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 9, 8, 10, 9, }, 246 /* _FC */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, 1, -1, 2, -1, 3, -1, 4, -1, 5, -1, -1, 6, -1, -1, 7, -1, 8, }, 247 /* F */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 8, 7, 9, 8, }, 248 /* FC */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, 1, -1, 2, -1, 3, -1, 4, -1, -1, 5, -1, -1, 6, -1, 7, }, 249 /* _FX */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 7, 6, 8, 7, }, 250 /* _FXC */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, 1, -1, 2, -1, 3, -1, -1, 4, -1, -1, 5, -1, 6, }, 251 /* FD */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 6, 5, 7, 6, }, 252 /* _FDC */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, 1, -1, 2, -1, -1, 3, -1, -1, 4, -1, 5, }, 253 /* D */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 1, 2, 2, 3, 3, 4, 5, 4, 6, 5, }, 254 /* DC */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, 1, -1, -1, 2, -1, -1, 3, -1, 4, }, 255 /* F80X */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 1, 2, 2, 3, 4, 3, 5, 4, }, 256 /* _FDXC */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, -1, 1, -1, -1, 2, -1, 3, }, 257 /* F80 */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, 0, 1, 2, 2, 3, 3, 4, 4, }, 258 /* _FB */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 1, 2, 2, 3, 3, }, 259 /* _FLDC */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, -1, 1, -1, 2, }, 260 /* FB */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, 0, 1, 2, 2, 3, }, 261 /* LD */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 1, 2, }, 262 /* LDC */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, 1, }, 263 /* _FBX */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, }, 255 264 /* _FLDXC */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, }, 256 265 }; // costMatrix … … 265 274 // GENERATED BY BasicTypes-gen.cc 266 275 static const int signMatrix[BasicType::NUMBER_OF_BASIC_TYPES][BasicType::NUMBER_OF_BASIC_TYPES] = { // number of sign changes in safe conversion 267 /* 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 */268 /* B */ { 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, },269 /* C */ { -1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, },270 /* SC */ { -1, -1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, },271 /* UC */ { -1, -1, -1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, },272 /* SI */ { -1, -1, -1, -1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, },273 /* SUI */ { -1, -1, -1, -1, -1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, },274 /* I */ { -1, -1, -1, -1, -1, -1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, },275 /* UI */ { -1, -1, -1, -1, -1, -1, -1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, },276 /* LI */ { -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, },277 /* LUI */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, },278 /* LLI */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, },279 /* LLUI */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, },280 /* IB */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, },281 /* UIB */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, },282 /* _FH */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, },283 /* _FH */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, -1, 0, -1, -1, 0, -1, 0, },284 /* _F */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, },285 /* _FC */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, -1, 0, -1, -1, 0, -1, 0, },286 /* F */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, },287 /* FC */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, -1, 0, -1, -1, 0, -1, 0, },288 /* _FX */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, },289 /* _FXC */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, 0, -1, 0, -1, 0, -1, -1, 0, -1, -1, 0, -1, 0, },290 /* FD */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, },291 /* _FDC */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, 0, -1, 0, -1, -1, 0, -1, -1, 0, -1, 0, },292 /* D */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, },293 /* DC */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, 0, -1, -1, 0, -1, -1, 0, -1, 0, },294 /* F80X */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, },295 /* _FDXC */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, -1, 0, -1, -1, 0, -1, 0, },296 /* F80*/ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, },297 /* _FB */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, },298 /* _FLDC */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, -1, 0, -1, 0, },299 /* FB */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, },300 /* LD */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, },301 /* LDC */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, 0, },302 /* _FBX */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, },276 /* 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 */ 277 /* B */ { 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, 278 /* C */ { -1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, 279 /* SC */ { -1, -1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, 280 /* UC */ { -1, -1, -1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, 281 /* SI */ { -1, -1, -1, -1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, 282 /* SUI */ { -1, -1, -1, -1, -1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, 283 /* I */ { -1, -1, -1, -1, -1, -1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, 284 /* UI */ { -1, -1, -1, -1, -1, -1, -1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, 285 /* LI */ { -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, 286 /* LUI */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, 287 /* LLI */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, 288 /* LLUI */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, 289 /* IB */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, 290 /* UIB */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, 291 /* _FH */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, 292 /* _FH */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, -1, 0, -1, -1, 0, -1, 0, }, 293 /* _F */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, 294 /* _FC */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, -1, 0, -1, -1, 0, -1, 0, }, 295 /* F */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, 296 /* FC */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, -1, 0, -1, -1, 0, -1, 0, }, 297 /* _FX */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, 298 /* _FXC */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, 0, -1, 0, -1, 0, -1, -1, 0, -1, -1, 0, -1, 0, }, 299 /* FD */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, 300 /* _FDC */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, 0, -1, 0, -1, -1, 0, -1, -1, 0, -1, 0, }, 301 /* D */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, 302 /* DC */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, 0, -1, -1, 0, -1, -1, 0, -1, 0, }, 303 /* F80X */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, 304 /* _FDXC */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, -1, 0, -1, -1, 0, -1, 0, }, 305 /* F80 */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, 306 /* _FB */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, }, 307 /* _FLDC */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, -1, 0, -1, 0, }, 308 /* FB */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, }, 309 /* LD */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, }, 310 /* LDC */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, 0, }, 311 /* _FBX */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, }, 303 312 /* _FLDXC */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, }, 304 313 }; // signMatrix … … 371 380 // recursively compute conversion cost from T1 to T2. 372 381 // cv can be safely dropped because of 'implicit dereference' behavior. 373 cost = costFunc( refType->base, dest, indexer, env );382 cost = costFunc( refType->base, dest, srcIsLvalue, indexer, env ); 374 383 if ( refType->base->tq == dest->tq ) { 375 384 cost.incReference(); // prefer exact qualifiers … … 403 412 static Type::Qualifiers q; 404 413 static BasicType integer( q, BasicType::SignedInt ); 405 cost = costFunc( &integer, dest, indexer, env ); // safe if dest >= int414 cost = costFunc( &integer, dest, srcIsLvalue, indexer, env ); // safe if dest >= int 406 415 if ( cost < Cost::unsafe ) { 407 416 cost.incSafe(); … … 413 422 void ConversionCost::postvisit( const TypeInstType * inst ) { 414 423 if ( const EqvClass * eqvClass = env.lookup( inst->name ) ) { 415 cost = costFunc( eqvClass->type, dest, indexer, env );424 cost = costFunc( eqvClass->type, dest, srcIsLvalue, indexer, env ); 416 425 } else if ( const TypeInstType * destAsInst = dynamic_cast< const TypeInstType * >( dest ) ) { 417 426 if ( inst->name == destAsInst->name ) { … … 423 432 assert( type ); 424 433 if ( type->base ) { 425 cost = costFunc( type->base, dest, indexer, env ) + Cost::safe;434 cost = costFunc( type->base, dest, srcIsLvalue, indexer, env ) + Cost::safe; 426 435 } // if 427 436 } // if … … 434 443 std::list< Type * >::const_iterator destIt = destAsTuple->types.begin(); 435 444 while ( srcIt != tupleType->types.end() && destIt != destAsTuple->types.end() ) { 436 Cost newCost = costFunc( * srcIt++, * destIt++, indexer, env );445 Cost newCost = costFunc( * srcIt++, * destIt++, srcIsLvalue, indexer, env ); 437 446 if ( newCost == Cost::infinity ) { 438 447 return; … … 534 543 } 535 544 536 Cost convertToReferenceCost( const ast::Type * src, const ast::Type * dst, int diff,537 const ast::SymbolTable & symtab, const ast::TypeEnvironment & env,545 static Cost convertToReferenceCost( const ast::Type * src, const ast::Type * dst, 546 int diff, const ast::SymbolTable & symtab, const ast::TypeEnvironment & env, 538 547 NumCostCalculation func ) { 539 548 if ( 0 < diff ) { -
src/ResolvExpr/ConversionCost.h
rf9bf142 r330d933 10 10 // Created On : Sun May 17 09:37:28 2015 11 11 // Last Modified By : Andrew Beach 12 // Last Modified On : Mon Jun 24 10:00:00 201913 // Update Count : 512 // Last Modified On : Thu Aug 8 16:13:00 2019 13 // Update Count : 6 14 14 // 15 15 … … 33 33 class TypeEnvironment; 34 34 35 typedef std::function<Cost(const Type *, const Type *, const SymTab::Indexer &, const TypeEnvironment &)> CostFunction; 35 typedef std::function<Cost(const Type *, const Type *, bool, 36 const SymTab::Indexer &, const TypeEnvironment &)> CostFunction; 37 36 38 struct ConversionCost : public WithShortCircuiting { 37 39 public: 38 ConversionCost( const Type * dest, const SymTab::Indexer &indexer, const TypeEnvironment &env, CostFunction ); 40 ConversionCost( const Type * dest, bool srcIsLvalue, 41 const SymTab::Indexer &indexer, const TypeEnvironment &env, CostFunction ); 39 42 40 43 Cost get_cost() const { return cost; } … … 59 62 protected: 60 63 const Type * dest; 64 bool srcIsLvalue; 61 65 const SymTab::Indexer &indexer; 62 66 Cost cost; … … 66 70 67 71 typedef std::function<int(const Type *, const Type *, const SymTab::Indexer &, const TypeEnvironment &)> PtrsFunction; 68 Cost convertToReferenceCost( const Type * src, const ReferenceType * dest, const SymTab::Indexer & indexer, const TypeEnvironment & env, PtrsFunction func ); 72 Cost convertToReferenceCost( const Type * src, const ReferenceType * dest, bool srcIsLvalue, 73 const SymTab::Indexer & indexer, const TypeEnvironment & env, PtrsFunction func ); 69 74 70 75 // Some function pointer types, differ in return type. -
src/ResolvExpr/ResolveAssertions.cc
rf9bf142 r330d933 9 9 // Author : Aaron B. Moss 10 10 // Created On : Fri Oct 05 13:46:00 2018 11 // Last Modified By : Peter A. Buhr12 // Last Modified On : Wed Jul 10 16:10:37201913 // Update Count : 211 // Last Modified By : Andrew Beach 12 // Last Modified On : Thu Aug 8 16:47:00 2019 13 // Update Count : 3 14 14 // 15 15 … … 156 156 for ( const auto& assn : x.assns ) { 157 157 // compute conversion cost from satisfying decl to assertion 158 assert( !assn.match.adjType->get_lvalue() ); 158 159 k += computeConversionCost( 159 assn.match.adjType, assn.decl->get_type(), indexer, x.env );160 assn.match.adjType, assn.decl->get_type(), false, indexer, x.env ); 160 161 161 162 // mark vars+specialization cost on function-type assertions -
src/ResolvExpr/typeops.h
rf9bf142 r330d933 9 9 // Author : Richard C. Bilson 10 10 // Created On : Sun May 17 07:28:22 2015 11 // Last Modified By : Peter A. Buhr12 // Last Modified On : Fri Feb 8 09:30:34201913 // Update Count : 411 // Last Modified By : Andrew Beach 12 // Last Modified On : Thu Aug 8 16:36:00 2019 13 // Update Count : 5 14 14 // 15 15 … … 80 80 81 81 // in CastCost.cc 82 Cost castCost( const Type * src, const Type * dest, const SymTab::Indexer & indexer, const TypeEnvironment & env ); 82 Cost castCost( const Type * src, const Type * dest, bool srcIsLvalue, 83 const SymTab::Indexer & indexer, const TypeEnvironment & env ); 83 84 Cost castCost( 84 85 const ast::Type * src, const ast::Type * dst, const ast::SymbolTable & symtab, … … 86 87 87 88 // in ConversionCost.cc 88 Cost conversionCost( const Type * src, const Type * dest, const SymTab::Indexer & indexer, const TypeEnvironment & env ); 89 Cost conversionCost( const Type * src, const Type * dest, bool srcIsLvalue, 90 const SymTab::Indexer & indexer, const TypeEnvironment & env ); 89 91 Cost conversionCost( 90 92 const ast::Type * src, const ast::Type * dst, const ast::SymbolTable & symtab, … … 92 94 93 95 // in AlternativeFinder.cc 94 Cost computeConversionCost( Type * actualType, Type * formalType, 96 Cost computeConversionCost( Type * actualType, Type * formalType, bool actualIsLvalue, 95 97 const SymTab::Indexer & indexer, const TypeEnvironment & env ); 96 98 -
src/SymTab/Validate.cc
rf9bf142 r330d933 9 9 // Author : Richard C. Bilson 10 10 // Created On : Sun May 17 21:50:04 2015 11 // Last Modified By : Peter A. Buhr12 // Last Modified On : Mon Aug 28 13:47:23 201713 // Update Count : 3 5911 // Last Modified By : Andrew Beach 12 // Last Modified On : Wed Aug 7 6:42:00 2019 13 // Update Count : 360 14 14 // 15 15 … … 81 81 #include "SynTree/Label.h" // for operator==, Label 82 82 #include "SynTree/Mutator.h" // for Mutator 83 #include "SynTree/TopLvalue.h" // for assertTopLvalue, clearInnerLvalue 83 84 #include "SynTree/Type.h" // for Type, TypeInstType, EnumInstType 84 85 #include "SynTree/TypeSubstitution.h" // for TypeSubstitution … … 308 309 PassVisitor<FixQualifiedTypes> fixQual; 309 310 311 assertTopLvalue( translationUnit ); 310 312 { 311 313 Stats::Heap::newPass("validate-A"); … … 316 318 acceptAll( translationUnit, epc ); // must happen before VerifyCtorDtorAssign, because void return objects should not exist; before LinkReferenceToTypes_old because it is an indexer and needs correct types for mangling 317 319 } 320 assertTopLvalue( translationUnit ); 318 321 { 319 322 Stats::Heap::newPass("validate-B"); 320 323 Stats::Time::BlockGuard guard("validate-B"); 324 assertTopLvalue( translationUnit ); 321 325 Stats::Time::TimeBlock("Link Reference To Types", [&]() { 322 326 acceptAll( translationUnit, lrt ); // must happen before autogen, because sized flag needs to propagate to generated functions 323 327 }); 328 clearInnerLvalue( translationUnit ); 329 assertTopLvalue( translationUnit ); 324 330 Stats::Time::TimeBlock("Fix Qualified Types", [&]() { 325 331 mutateAll( translationUnit, fixQual ); // must happen after LinkReferenceToTypes_old, because aggregate members are accessed 326 332 }); 333 assertTopLvalue( translationUnit ); 327 334 Stats::Time::TimeBlock("Hoist Structs", [&]() { 328 335 HoistStruct::hoistStruct( translationUnit ); // must happen after EliminateTypedef, so that aggregate typedefs occur in the correct order 329 336 }); 337 assertTopLvalue( translationUnit ); 330 338 Stats::Time::TimeBlock("Eliminate Typedefs", [&]() { 331 339 EliminateTypedef::eliminateTypedef( translationUnit ); // 332 340 }); 333 341 } 342 assertTopLvalue( translationUnit ); 334 343 { 335 344 Stats::Heap::newPass("validate-C"); … … 340 349 InitTweak::fixReturnStatements( translationUnit ); // must happen before autogen 341 350 } 351 assertTopLvalue( translationUnit ); 342 352 { 343 353 Stats::Heap::newPass("validate-D"); 344 354 Stats::Time::BlockGuard guard("validate-D"); 355 assertTopLvalue( translationUnit ); 345 356 Stats::Time::TimeBlock("Apply Concurrent Keywords", [&]() { 346 357 Concurrency::applyKeywords( translationUnit ); 347 358 }); 359 clearInnerLvalue( translationUnit ); 360 assertTopLvalue( translationUnit ); 348 361 Stats::Time::TimeBlock("Forall Pointer Decay", [&]() { 349 362 acceptAll( translationUnit, fpd ); // must happen before autogenerateRoutines, after Concurrency::applyKeywords because uniqueIds must be set on declaration before resolution 350 363 }); 364 assertTopLvalue( translationUnit ); 351 365 Stats::Time::TimeBlock("Hoist Control Declarations", [&]() { 352 366 ControlStruct::hoistControlDecls( translationUnit ); // hoist initialization out of for statements; must happen before autogenerateRoutines 353 367 }); 368 assertTopLvalue( translationUnit ); 354 369 Stats::Time::TimeBlock("Generate Autogen routines", [&]() { 355 370 autogenerateRoutines( translationUnit ); // moved up, used to be below compoundLiteral - currently needs EnumAndPointerDecay_old 356 371 }); 357 } 372 clearInnerLvalue( translationUnit ); 373 } 374 assertTopLvalue( translationUnit ); 358 375 { 359 376 Stats::Heap::newPass("validate-E"); 360 377 Stats::Time::BlockGuard guard("validate-E"); 378 assertTopLvalue( translationUnit ); 361 379 Stats::Time::TimeBlock("Implement Mutex Func", [&]() { 362 380 Concurrency::implementMutexFuncs( translationUnit ); 363 381 }); 382 clearInnerLvalue( translationUnit ); 383 assertTopLvalue( translationUnit ); 364 384 Stats::Time::TimeBlock("Implement Thread Start", [&]() { 365 385 Concurrency::implementThreadStarter( translationUnit ); 366 386 }); 387 assertTopLvalue( translationUnit ); 367 388 Stats::Time::TimeBlock("Compound Literal", [&]() { 368 389 mutateAll( translationUnit, compoundliteral ); 369 390 }); 391 assertTopLvalue( translationUnit ); 370 392 Stats::Time::TimeBlock("Resolve With Expressions", [&]() { 371 393 ResolvExpr::resolveWithExprs( translationUnit ); // must happen before FixObjectType because user-code is resolved and may contain with variables 372 394 }); 373 } 395 clearInnerLvalue( translationUnit ); 396 } 397 assertTopLvalue( translationUnit ); 374 398 { 375 399 Stats::Heap::newPass("validate-F"); 376 400 Stats::Time::BlockGuard guard("validate-F"); 401 assertTopLvalue( translationUnit ); 377 402 Stats::Time::TimeBlock("Fix Object Type", [&]() { 378 403 FixObjectType::fix( translationUnit ); 379 404 }); 405 assertTopLvalue( translationUnit ); 380 406 Stats::Time::TimeBlock("Array Length", [&]() { 381 407 ArrayLength::computeLength( translationUnit ); 382 408 }); 409 clearInnerLvalue( translationUnit ); 410 assertTopLvalue( translationUnit ); 383 411 Stats::Time::TimeBlock("Find Special Declarations", [&]() { 384 412 Validate::findSpecialDecls( translationUnit ); 385 413 }); 414 assertTopLvalue( translationUnit ); 386 415 Stats::Time::TimeBlock("Fix Label Address", [&]() { 387 416 mutateAll( translationUnit, labelAddrFixer ); 388 417 }); 418 assertTopLvalue( translationUnit ); 389 419 Stats::Time::TimeBlock("Handle Attributes", [&]() { 390 420 Validate::handleAttributes( translationUnit ); 391 421 }); 392 422 } 423 assertTopLvalue( translationUnit ); 393 424 } 394 425 -
src/SynTree/AddressExpr.cc
rf9bf142 r330d933 42 42 AddressExpr::AddressExpr( Expression *arg ) : Expression(), arg( arg ) { 43 43 if ( arg->result ) { 44 if ( arg-> result->get_lvalue() ) {44 if ( arg->get_lvalue() ) { 45 45 // lvalue, retains all layers of reference and gains a pointer inside the references 46 46 set_result( addrType( arg->result ) ); -
src/SynTree/ApplicationExpr.cc
rf9bf142 r330d933 9 9 // Author : Richard C. Bilson 10 10 // Created On : Mon May 18 07:44:20 2015 11 // Last Modified By : Rob Schluntz12 // Last Modified On : Tue Apr 26 12:41:06 201613 // Update Count : 411 // Last Modified By : Andrew Beach 12 // Last Modified On : Mon Aug 12 14:28:00 2019 13 // Update Count : 5 14 14 // 15 15 … … 76 76 } 77 77 78 bool ApplicationExpr::get_lvalue() const { 79 return result->get_lvalue(); 80 } 81 78 82 void ApplicationExpr::print( std::ostream &os, Indenter indent ) const { 79 83 os << "Application of" << std::endl << indent+1; -
src/SynTree/BasicType.cc
rf9bf142 r330d933 10 10 // Created On : Mon May 18 07:44:20 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Thu Jan 31 21:37:36201913 // Update Count : 1 212 // Last Modified On : Sun Aug 4 21:07:44 2019 13 // Update Count : 13 14 14 // 15 15 … … 31 31 bool BasicType::isInteger() const { 32 32 return kind <= UnsignedInt128; 33 #if 034 switch ( kind ) {35 case Bool:36 case Char:37 case SignedChar:38 case UnsignedChar:39 case ShortSignedInt:40 case ShortUnsignedInt:41 case SignedInt:42 case UnsignedInt:43 case LongSignedInt:44 case LongUnsignedInt:45 case LongLongSignedInt:46 case LongLongUnsignedInt:47 case SignedInt128:48 case UnsignedInt128:49 return true;50 case Float:51 case Double:52 case LongDouble:53 case FloatComplex:54 case DoubleComplex:55 case LongDoubleComplex:56 case FloatImaginary:57 case DoubleImaginary:58 case LongDoubleImaginary:59 case Float80:60 case Float128:61 return false;62 case NUMBER_OF_BASIC_TYPES:63 assert( false );64 } // switch65 assert( false );66 return false;67 #endif68 33 } 69 34 -
src/SynTree/CommaExpr.cc
rf9bf142 r330d933 9 9 // Author : Richard C. Bilson 10 10 // Created On : Mon May 18 07:44:20 2015 11 // Last Modified By : Rob Schluntz12 // Last Modified On : Mon May 02 15:19:44201613 // Update Count : 111 // Last Modified By : Andrew Beach 12 // Last Modified On : Mon Arg 12 16:11:00 2016 13 // Update Count : 2 14 14 // 15 15 … … 39 39 } 40 40 41 bool CommaExpr::get_lvalue() const { 42 // xxx - as above, shouldn't be an lvalue but that information is used anyways. 43 return result->get_lvalue(); 44 } 45 41 46 void CommaExpr::print( std::ostream &os, Indenter indent ) const { 42 47 os << "Comma Expression:" << std::endl; -
src/SynTree/Expression.cc
rf9bf142 r330d933 9 9 // Author : Richard C. Bilson 10 10 // Created On : Mon May 18 07:44:20 2015 11 // Last Modified By : Peter A. Buhr12 // Last Modified On : Th u Jul 25 22:21:48201913 // Update Count : 6 111 // Last Modified By : Andrew Beach 12 // Last Modified On : Thr Aug 15 13:43:00 2019 13 // Update Count : 64 14 14 // 15 15 … … 63 63 } 64 64 65 bool Expression::get_lvalue() const { 66 assert( !result->get_lvalue() ); 67 return false; 68 } 69 65 70 void Expression::print( std::ostream & os, Indenter indent ) const { 66 71 printInferParams( inferParams, os, indent+1, 0 ); … … 134 139 } 135 140 141 bool VariableExpr::get_lvalue() const { 142 return result->get_lvalue(); 143 } 144 136 145 VariableExpr * VariableExpr::functionPointer( FunctionDecl * func ) { 137 146 VariableExpr * funcExpr = new VariableExpr( func ); … … 265 274 CastExpr::~CastExpr() { 266 275 delete arg; 276 } 277 278 bool CastExpr::get_lvalue() const { 279 return result->get_lvalue(); 267 280 } 268 281 … … 376 389 // don't delete the member declaration, since it points somewhere else in the tree 377 390 delete aggregate; 391 } 392 393 bool MemberExpr::get_lvalue() const { 394 assert( result->get_lvalue() ); 395 return true; 378 396 } 379 397 … … 428 446 } 429 447 448 bool UntypedExpr::get_lvalue() const { 449 return result->get_lvalue(); 450 } 430 451 431 452 void UntypedExpr::print( std::ostream & os, Indenter indent ) const { … … 486 507 delete arg2; 487 508 delete arg3; 509 } 510 511 bool ConditionalExpr::get_lvalue() const { 512 return result->get_lvalue(); 488 513 } 489 514 … … 544 569 } 545 570 571 bool ConstructorExpr::get_lvalue() const { 572 return result->get_lvalue(); 573 } 574 546 575 void ConstructorExpr::print( std::ostream & os, Indenter indent ) const { 547 576 os << "Constructor Expression: " << std::endl << indent+1; … … 561 590 CompoundLiteralExpr::~CompoundLiteralExpr() { 562 591 delete initializer; 592 } 593 594 bool CompoundLiteralExpr::get_lvalue() const { 595 assert( result->get_lvalue() ); 596 return true; 563 597 } 564 598 … … 612 646 result = new VoidType( Type::Qualifiers() ); 613 647 } 648 } 649 bool StmtExpr::get_lvalue() const { 650 return result->get_lvalue(); 614 651 } 615 652 void StmtExpr::print( std::ostream & os, Indenter indent ) const { -
src/SynTree/Expression.h
rf9bf142 r330d933 9 9 // Author : Richard C. Bilson 10 10 // Created On : Mon May 18 07:44:20 2015 11 // Last Modified By : Peter A. Buhr12 // Last Modified On : Th u Jul 25 22:21:44201913 // Update Count : 5 011 // Last Modified By : Andrew Beach 12 // Last Modified On : Thr Aug 15 13:46:00 2019 13 // Update Count : 54 14 14 // 15 15 … … 71 71 const Type * get_result() const { return result; } 72 72 void set_result( Type * newValue ) { result = newValue; } 73 virtual bool get_lvalue() const; 73 74 74 75 TypeSubstitution * get_env() const { return env; } … … 98 99 virtual ~ApplicationExpr(); 99 100 101 bool get_lvalue() const final; 102 100 103 Expression * get_function() const { return function; } 101 104 void set_function( Expression * newValue ) { function = newValue; } … … 120 123 UntypedExpr( const UntypedExpr & other ); 121 124 virtual ~UntypedExpr(); 125 126 bool get_lvalue() const final; 122 127 123 128 Expression * get_function() const { return function; } … … 208 213 virtual ~CastExpr(); 209 214 215 bool get_lvalue() const final; 216 210 217 Expression * get_arg() const { return arg; } 211 218 void set_arg( Expression * newValue ) { arg = newValue; } … … 291 298 virtual ~MemberExpr(); 292 299 300 bool get_lvalue() const final; 301 293 302 DeclarationWithType * get_member() const { return member; } 294 303 void set_member( DeclarationWithType * newValue ) { member = newValue; } … … 313 322 VariableExpr( const VariableExpr & other ); 314 323 virtual ~VariableExpr(); 324 325 bool get_lvalue() const final; 315 326 316 327 DeclarationWithType * get_var() const { return var; } … … 500 511 virtual ~ConditionalExpr(); 501 512 513 bool get_lvalue() const final; 514 502 515 Expression * get_arg1() const { return arg1; } 503 516 void set_arg1( Expression * newValue ) { arg1 = newValue; } … … 524 537 virtual ~CommaExpr(); 525 538 539 bool get_lvalue() const final; 540 526 541 Expression * get_arg1() const { return arg1; } 527 542 void set_arg1( Expression * newValue ) { arg1 = newValue; } … … 610 625 ~ConstructorExpr(); 611 626 627 bool get_lvalue() const final; 628 612 629 Expression * get_callExpr() const { return callExpr; } 613 630 void set_callExpr( Expression * newValue ) { callExpr = newValue; } … … 628 645 CompoundLiteralExpr( const CompoundLiteralExpr & other ); 629 646 virtual ~CompoundLiteralExpr(); 647 648 bool get_lvalue() const final; 630 649 631 650 Initializer * get_initializer() const { return initializer; } … … 686 705 virtual ~TupleExpr(); 687 706 707 bool get_lvalue() const final; 708 688 709 std::list<Expression*>& get_exprs() { return exprs; } 689 710 … … 704 725 TupleIndexExpr( const TupleIndexExpr & other ); 705 726 virtual ~TupleIndexExpr(); 727 728 bool get_lvalue() const final; 706 729 707 730 Expression * get_tuple() const { return tuple; } … … 753 776 StmtExpr( const StmtExpr & other ); 754 777 virtual ~StmtExpr(); 778 779 bool get_lvalue() const final; 755 780 756 781 CompoundStmt * get_statements() const { return statements; } -
src/SynTree/TupleExpr.cc
rf9bf142 r330d933 9 9 // Author : Richard C. Bilson 10 10 // Created On : Mon May 18 07:44:20 2015 11 // Last Modified By : Peter A. Buhr12 // Last Modified On : Fri Mar 17 09:42:29 201713 // Update Count : 311 // Last Modified By : Andrew Beach 12 // Last Modified On : Wed Aug 14 14:34:00 2019 13 // Update Count : 5 14 14 // 15 15 … … 57 57 } 58 58 59 bool TupleExpr::get_lvalue() const { 60 return result->get_lvalue(); 61 } 62 59 63 void TupleExpr::print( std::ostream &os, Indenter indent ) const { 60 64 os << "Tuple:" << std::endl; … … 76 80 TupleIndexExpr::~TupleIndexExpr() { 77 81 delete tuple; 82 } 83 84 bool TupleIndexExpr::get_lvalue() const { 85 assert( result->get_lvalue() ); 86 return true; 78 87 } 79 88 -
src/SynTree/Type.cc
rf9bf142 r330d933 9 9 // Author : Richard C. Bilson 10 10 // Created On : Mon May 18 07:44:20 2015 11 // Last Modified By : Andrew Beach12 // Last Modified On : Fri Jul 12 15:48:00201913 // Update Count : 4 411 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Sun Aug 4 21:05:07 2019 13 // Update Count : 45 14 14 // 15 15 #include "Type.h" … … 24 24 using namespace std; 25 25 26 const char *BasicType::typeNames[] = { 27 #if 0 28 "_Bool", 29 "char", 30 "signed char", 31 "unsigned char", 32 "signed short int", 33 "unsigned short int", 34 "signed int", 35 "unsigned int", 36 "signed long int", 37 "unsigned long int", 38 "signed long long int", 39 "unsigned long long int", 40 "float", 41 "double", 42 "long double", 43 "float _Complex", 44 "double _Complex", 45 "long double _Complex", 46 "float _Imaginary", 47 "double _Imaginary", 48 "long double _Imaginary", 49 "__int128", 50 "unsigned __int128", 51 "__float80", 52 "__float128", 53 "_Float16", 54 "_Float32", 55 "_Float32x", 56 "_Float64", 57 "_Float64x", 58 "_Float128", 59 "_Float128x", 60 "_Float16 _Complex", 61 "_Float32 _Complex", 62 "_Float32x _Complex", 63 "_Float64 _Complex", 64 "_Float64x _Complex", 65 "_Float128 _Complex", 66 "_Float128x _Complex", 67 #endif 26 const char * BasicType::typeNames[] = { 68 27 "_Bool", 69 28 "char", … … 107 66 }; 108 67 static_assert( 109 sizeof(BasicType::typeNames) /sizeof(BasicType::typeNames[0]) == BasicType::NUMBER_OF_BASIC_TYPES,68 sizeof(BasicType::typeNames) / sizeof(BasicType::typeNames[0]) == BasicType::NUMBER_OF_BASIC_TYPES, 110 69 "Each basic type name should have a corresponding kind enum value" 111 70 ); … … 152 111 TypeSubstitution Type::genericSubstitution() const { assertf( false, "Non-aggregate type: %s", toCString( this ) ); } 153 112 154 void Type::print( std::ostream & os, Indenter indent ) const {113 void Type::print( std::ostream & os, Indenter indent ) const { 155 114 if ( ! forall.empty() ) { 156 115 os << "forall" << std::endl; -
src/SynTree/module.mk
rf9bf142 r330d933 49 49 SynTree/TypeSubstitution.cc \ 50 50 SynTree/Attribute.cc \ 51 SynTree/DeclReplacer.cc 51 SynTree/DeclReplacer.cc \ 52 SynTree/TopLvalue.cc 52 53 53 54 SRC += $(SRC_SYNTREE) -
src/main.cc
rf9bf142 r330d933 10 10 // Created On : Fri May 15 23:12:02 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Wed Jun 5 20:35:13201913 // Update Count : 60 112 // Last Modified On : Fri Aug 23 06:50:08 2019 13 // Update Count : 607 14 14 // 15 15 … … 17 17 #include <execinfo.h> // for backtrace, backtrace_symbols 18 18 #include <getopt.h> // for no_argument, optind, geto... 19 #include <signal.h> // for signal, SIGABRT, SIGSEGV20 19 #include <cassert> // for assertf 21 20 #include <cstdio> // for fopen, FILE, fclose, stdin 22 21 #include <cstdlib> // for exit, free, abort, EXIT_F... 22 #include <csignal> // for signal, SIGABRT, SIGSEGV 23 23 #include <cstring> // for index 24 24 #include <fstream> // for ofstream … … 59 59 #include "ResolvExpr/Resolver.h" // for resolve 60 60 #include "SymTab/Validate.h" // for validate 61 #include "SynTree/TopLvalue.h" // for assertTopLvalue, clearInn... 61 62 #include "SynTree/Declaration.h" // for Declaration 62 63 #include "SynTree/Visitor.h" // for acceptAll 63 64 #include "Tuples/Tuples.h" // for expandMemberTuples, expan... 64 65 #include "Virtual/ExpandCasts.h" // for expandCasts 66 65 67 66 68 using namespace std; … … 94 96 DeclarationNode * parseTree = nullptr; // program parse tree 95 97 98 static bool waiting_for_gdb = false; // flag to set cfa-cpp to wait for gdb on start 99 96 100 static std::string PreludeDirector = ""; 97 101 98 static void parse_cmdline( int argc, char *argv[] , const char *& filename);102 static void parse_cmdline( int argc, char *argv[] ); 99 103 static void parse( FILE * input, LinkageSpec::Spec linkage, bool shouldExit = false ); 100 104 static void dump( list< Declaration * > & translationUnit, ostream & out = cout ); … … 165 169 } // sigAbortHandler 166 170 167 168 171 int main( int argc, char * argv[] ) { 169 172 FILE * input; // use FILE rather than istream because yyin is FILE 170 173 ostream * output = & cout; 171 const char * filename = nullptr;172 174 list< Declaration * > translationUnit; 173 175 … … 181 183 // } // for 182 184 183 parse_cmdline( argc, argv , filename );// process command-line arguments185 parse_cmdline( argc, argv ); // process command-line arguments 184 186 CodeGen::FixMain::setReplaceMain( !nomainp ); 187 188 if ( waiting_for_gdb ) { 189 std::cerr << "Waiting for gdb" << std::endl; 190 std::cerr << "run :" << std::endl; 191 std::cerr << " gdb attach " << getpid() << std::endl; 192 raise(SIGSTOP); 193 } // if 185 194 186 195 try { … … 188 197 if ( optind < argc ) { // any commands after the flags ? => input file name 189 198 input = fopen( argv[ optind ], "r" ); 190 assertf( input, "cannot open %s\n", argv[ optind ] ); 191 // if running cfa-cpp directly, might forget to pass -F option (and really shouldn't have to) 192 if ( filename == nullptr ) filename = argv[ optind ]; 193 // prelude filename comes in differently 194 if ( libcfap ) filename = "prelude.cfa"; 199 assertf( input, "cannot open %s because %s\n", argv[ optind ], strerror( errno ) ); 195 200 optind += 1; 196 201 } else { // no input file name 197 202 input = stdin; 198 // if running cfa-cpp directly, might forget to pass -F option. Since this takes from stdin, pass199 // a fake name along200 if ( filename == nullptr ) filename = "stdin";201 203 } // if 202 204 … … 257 259 Stats::Time::StopBlock(); 258 260 261 //std::cerr << "Post-Parse Check" << std::endl; 262 clearInnerLvalue( translationUnit ); 263 assertTopLvalue( translationUnit ); 264 259 265 // add the assignment statement after the initialization of a type parameter 260 266 PASS( "Validate", SymTab::validate( translationUnit, symtabp ) ); … … 275 281 } // if 276 282 283 assertTopLvalue( translationUnit ); 277 284 PASS( "Fix Labels", ControlStruct::fixLabels( translationUnit ) ); 285 assertTopLvalue( translationUnit ); 278 286 PASS( "Fix Names", CodeGen::fixNames( translationUnit ) ); 287 assertTopLvalue( translationUnit ); 279 288 PASS( "Gen Init", InitTweak::genInit( translationUnit ) ); 289 assertTopLvalue( translationUnit ); 280 290 PASS( "Expand Member Tuples" , Tuples::expandMemberTuples( translationUnit ) ); 291 assertTopLvalue( translationUnit ); 281 292 if ( libcfap ) { 282 293 // generate the bodies of cfa library functions … … 302 313 } // if 303 314 315 assertTopLvalue( translationUnit ); 316 304 317 PASS( "Resolve", ResolvExpr::resolve( translationUnit ) ); 305 318 if ( exprp ) { … … 308 321 } // if 309 322 323 clearInnerLvalue( translationUnit ); 324 assertTopLvalue( translationUnit ); 325 310 326 // fix ObjectDecl - replaces ConstructorInit nodes 311 327 PASS( "Fix Init", InitTweak::fix( translationUnit, buildingLibrary() ) ); 328 clearInnerLvalue( translationUnit ); 329 assertTopLvalue( translationUnit ); 312 330 if ( ctorinitp ) { 313 331 dump ( translationUnit ); … … 316 334 317 335 PASS( "Expand Unique Expr", Tuples::expandUniqueExpr( translationUnit ) ); // xxx - is this the right place for this? want to expand ASAP so tha, sequent passes don't need to worry about double-visiting a unique expr - needs to go after InitTweak::fix so that copy constructed return declarations are reused 336 assertTopLvalue( translationUnit ); 318 337 319 338 PASS( "Translate EHM" , ControlStruct::translateEHM( translationUnit ) ); 339 assertTopLvalue( translationUnit ); 320 340 321 341 PASS( "Gen Waitfor" , Concurrency::generateWaitFor( translationUnit ) ); 342 clearInnerLvalue( translationUnit ); 343 assertTopLvalue( translationUnit ); 322 344 323 345 PASS( "Convert Specializations", GenPoly::convertSpecializations( translationUnit ) ); // needs to happen before tuple types are expanded 346 clearInnerLvalue( translationUnit ); 347 assertTopLvalue( translationUnit ); 324 348 325 349 PASS( "Expand Tuples", Tuples::expandTuples( translationUnit ) ); // xxx - is this the right place for this? 350 assertTopLvalue( translationUnit ); 326 351 327 352 if ( tuplep ) { … … 331 356 332 357 PASS( "Virtual Expand Casts", Virtual::expandCasts( translationUnit ) ); // Must come after translateEHM 358 assertTopLvalue( translationUnit ); 333 359 334 360 PASS( "Instantiate Generics", GenPoly::instantiateGeneric( translationUnit ) ); … … 337 363 return EXIT_SUCCESS; 338 364 } // if 365 clearInnerLvalue( translationUnit ); 366 assertTopLvalue( translationUnit ); 339 367 PASS( "Convert L-Value", GenPoly::convertLvalue( translationUnit ) ); 340 368 clearInnerLvalue( translationUnit ); 369 assertTopLvalue( translationUnit ); 341 370 342 371 if ( bboxp ) { … … 345 374 } // if 346 375 PASS( "Box", GenPoly::box( translationUnit ) ); 376 clearInnerLvalue( translationUnit ); 377 assertTopLvalue( translationUnit ); 347 378 348 379 if ( bcodegenp ) { … … 356 387 357 388 CodeTools::fillLocations( translationUnit ); 389 assertTopLvalue( translationUnit ); 358 390 PASS( "Code Gen", CodeGen::generate( translationUnit, *output, ! genproto, prettycodegenp, true, linemarks ) ); 359 391 … … 406 438 407 439 408 static const char optstring[] = ":hlLmNnpP:S:twW:D: F:";440 static const char optstring[] = ":hlLmNnpP:S:twW:D:"; 409 441 410 442 enum { PreludeDir = 128 }; … … 421 453 { "statistics", required_argument, nullptr, 'S' }, 422 454 { "tree", no_argument, nullptr, 't' }, 455 { "gdb", no_argument, nullptr, 'g' }, 423 456 { "", no_argument, nullptr, 0 }, // -w 424 457 { "", no_argument, nullptr, 0 }, // -W 425 458 { "", no_argument, nullptr, 0 }, // -D 426 { "", no_argument, nullptr, 0 }, // -F427 459 { nullptr, 0, nullptr, 0 } 428 460 }; // long_opts … … 439 471 "<directory> prelude directory for debug/nodebug", // no flag 440 472 "<option-list> enable profiling information:\n counters,heap,time,all,none", // -S 441 "build in tree", // -t 473 "building cfa standard lib", // -t 474 "wait for gdb to attach", // -g 442 475 "", // -w 443 476 "", // -W 444 477 "", // -D 445 "", // -F446 478 }; // description 447 479 … … 478 510 479 511 static void usage( char *argv[] ) { 480 cout << "Usage: " << argv[0] << " options are:" << endl;512 cout << "Usage: " << argv[0] << " [options] [input-file (default stdin)] [output-file (default stdout)], where options are:" << endl; 481 513 int i = 0, j = 1; // j skips starting colon 482 514 for ( ; long_opts[i].name != 0 && optstring[j] != '\0'; i += 1, j += 1 ) { … … 504 536 } // usage 505 537 506 static void parse_cmdline( int argc, char * argv[] , const char *& filename) {538 static void parse_cmdline( int argc, char * argv[] ) { 507 539 opterr = 0; // (global) prevent getopt from printing error messages 508 540 … … 550 582 Stats::parse_params( optarg ); 551 583 break; 552 case 't': // build in tree584 case 't': // building cfa stdlib 553 585 treep = true; 586 break; 587 case 'g': // wait for gdb 588 waiting_for_gdb = true; 554 589 break; 555 590 case 'w': // suppress all warnings, hidden … … 575 610 case 'D': // ignore -Dxxx, forwarded by cpp, hidden 576 611 break; 577 case 'F': // source file-name without suffix, hidden578 filename = optarg;579 break;580 612 case '?': // unknown option 581 613 if ( optopt ) { // short option ? -
tests/.expect/gccExtensions.x64.txt
rf9bf142 r330d933 291 291 signed int _X2m2A0A0i_2[((unsigned long int )10)][((unsigned long int )10)]; 292 292 signed int _X2m3A0A0i_2[((unsigned long int )10)][((unsigned long int )10)]; 293 { 294 ((void)(_X12_retval_maini_1=0) /* ?{} */); 295 } 296 297 return _X12_retval_maini_1; 293 void _X4f128Fv_n__2(__int128 _X1in_2); 294 void _X4f128Fv_o__2(unsigned __int128 __anonymous_object0); 295 __int128 _X6i128_0n_2; 296 { 297 ((void)_X4f128Fv_n__2(_X6i128_0n_2)); 298 } 299 300 unsigned __int128 _X6i128_1o_2; 301 { 302 ((void)_X4f128Fv_o__2(_X6i128_1o_2)); 303 } 304 305 __int128 _X6i128_2n_2; 306 { 307 ((void)_X4f128Fv_n__2(_X6i128_2n_2)); 308 } 309 310 unsigned __int128 _X6i128_3o_2; 311 { 312 ((void)_X4f128Fv_o__2(_X6i128_3o_2)); 313 } 314 298 315 { 299 316 ((void)(_X12_retval_maini_1=0) /* ?{} */); -
tests/.expect/gccExtensions.x86.txt
rf9bf142 r330d933 296 296 297 297 return _X12_retval_maini_1; 298 {299 ((void)(_X12_retval_maini_1=0) /* ?{} */);300 }301 302 return _X12_retval_maini_1;303 298 } 304 299 static inline int invoke_main(int argc, char* argv[], char* envp[]) { (void)argc; (void)argv; (void)envp; return _X4mainFi_iPPKc__1((signed int )argc, (const char **)argv); } -
tests/Makefile.am
rf9bf142 r330d933 22 22 debug=yes 23 23 installed=no 24 archiveerrors= 24 25 25 26 INSTALL_FLAGS=-in-tree … … 56 57 #---------------------------------------------------------------------------------------------------------------- 57 58 all-local : 58 @+${TEST_PY} --debug=${debug} --install=${installed} ${concurrent} ${timeouts} ${quick_test}59 @+${TEST_PY} --debug=${debug} --install=${installed} --archive-errors=${archiveerrors} ${concurrent} ${timeouts} ${quick_test} 59 60 60 61 all-tests : 61 @+${TEST_PY} --debug=${debug} --install=${installed} ${concurrent} ${timeouts} --all # '@' => do not echo command (SILENT), '+' => allows recursive make from within python program62 @+${TEST_PY} --debug=${debug} --install=${installed} --archive-errors=${archiveerrors} ${concurrent} ${timeouts} --all # '@' => do not echo command (SILENT), '+' => allows recursive make from within python program 62 63 63 64 clean-local : -
tests/Makefile.in
rf9bf142 r330d933 235 235 CYGPATH_W = @CYGPATH_W@ 236 236 DEFS = @DEFS@ 237 DEMANGLER = @DEMANGLER@ 237 238 DEPDIR = @DEPDIR@ 238 239 DLLTOOL = @DLLTOOL@ … … 260 261 LIBCFA_TARGET_DIRS = @LIBCFA_TARGET_DIRS@ 261 262 LIBCFA_TARGET_MAKEFILES = @LIBCFA_TARGET_MAKEFILES@ 263 LIBDEMANGLE = @LIBDEMANGLE@ 262 264 LIBOBJS = @LIBOBJS@ 263 265 LIBS = @LIBS@ … … 375 377 debug = yes 376 378 installed = no 379 archiveerrors = 377 380 INSTALL_FLAGS = -in-tree 378 381 DEBUG_FLAGS = -debug -O0 … … 768 771 #---------------------------------------------------------------------------------------------------------------- 769 772 all-local : 770 @+${TEST_PY} --debug=${debug} --install=${installed} ${concurrent} ${timeouts} ${quick_test}773 @+${TEST_PY} --debug=${debug} --install=${installed} --archive-errors=${archiveerrors} ${concurrent} ${timeouts} ${quick_test} 771 774 772 775 all-tests : 773 @+${TEST_PY} --debug=${debug} --install=${installed} ${concurrent} ${timeouts} --all # '@' => do not echo command (SILENT), '+' => allows recursive make from within python program776 @+${TEST_PY} --debug=${debug} --install=${installed} --archive-errors=${archiveerrors} ${concurrent} ${timeouts} --all # '@' => do not echo command (SILENT), '+' => allows recursive make from within python program 774 777 775 778 clean-local : -
tests/gccExtensions.cfa
rf9bf142 r330d933 10 10 // Created On : Sun Aug 14 17:28:17 2016 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Tue Nov 6 17:54:20 201813 // Update Count : 1112 // Last Modified On : Mon Aug 5 18:04:37 2019 13 // Update Count : 28 14 14 // 15 15 … … 50 50 51 51 L1: L2: 52 asm goto ( "frob %%r5, %1; jc %l[L1]; mov (%2), %%r5"53 : /* No outputs. */54 : "r"(src), "r"(&dst)55 : "r5", "memory"56 : L1, L2 );52 asm goto ( "frob %%r5, %1; jc %l[L1]; mov (%2), %%r5" 53 : /* No outputs. */ 54 : "r"(src), "r"(&dst) 55 : "r5", "memory" 56 : L1, L2 ); 57 57 58 58 // alternative type/qualifer names … … 110 110 struct __attribute(()) s4 { int i; } x2, y2 __attribute(()); 111 111 112 int m1 113 int m2 112 int m1[10] __attribute(()); 113 int m2[10][10] __attribute(()); 114 114 int __attribute(()) m3 [10][10]; 115 115 // int ( __attribute(()) m4 [10] )[10]; 116 116 117 return 0; 117 // int128 118 119 #if defined( __SIZEOF_INT128__ ) 120 void f128( __int128 i ); 121 void f128( __uint128_t ); 122 123 __int128 i128_0; 124 f128( i128_0 ); 125 unsigned __int128 i128_1; 126 f128( i128_1 ); 127 __int128_t i128_2; 128 f128( i128_2 ); 129 __uint128_t i128_3; 130 f128( i128_3 ); 131 #endif 118 132 } 119 133 -
tests/pybin/settings.py
rf9bf142 r330d933 4 4 from . import tools 5 5 6 global original_path 7 6 8 try : 9 original_path = os.getcwd() 7 10 testpath = os.path.dirname(os.path.abspath(os.path.join(os.getcwd(), sys.argv[0]))) 8 11 sys.path.append(testpath) … … 19 22 class Architecture: 20 23 KnownArchitectures = { 21 'x64' 22 'x86-64' 23 'x86_64' 24 ' aarch64' : 'x64',25 ' x86' : 'x86',24 'x64' : 'x64', 25 'x86-64' : 'x64', 26 'x86_64' : 'x64', 27 'x86' : 'x86', 28 'aarch64' : 'arm', 26 29 'i386' : 'x86', 27 30 'i486' : 'x86', 28 31 'i686' : 'x86', 29 32 'Intel 80386' : 'x86', 30 'arm' 31 'ARM' 33 'arm' : 'arm', 34 'ARM' : 'arm', 32 35 } 33 36 … … 113 116 global timeout 114 117 global output_width 118 global archive 115 119 116 120 dry_run = options.dry_run … … 122 126 timeout = Timeouts(options.timeout, options.global_timeout) 123 127 output_width = 24 128 archive = os.path.abspath(os.path.join(original_path, options.archive_errors)) if options.archive_errors else None 124 129 125 130 -
tests/pybin/tools.py
rf9bf142 r330d933 2 2 import argparse 3 3 import contextlib 4 import datetime 4 5 import fileinput 5 6 import multiprocessing … … 273 274 ################################################################################ 274 275 276 def pretty_now(): 277 ts = time.time() 278 print(ts, file=sys.stderr) 279 return datetime.datetime.fromtimestamp(ts).strftime('%Y-%m-%d_%H:%M:%S') 280 275 281 # check if arguments is yes or no 276 282 def yes_no(string): … … 304 310 return sh('gdb', '-n', path, core, '-batch', '-x', cmd, output=subprocess.PIPE) 305 311 312 def core_archive(dst, name, exe): 313 # Get the files to copy 314 core = os.path.join(os.getcwd(), "core" ) 315 316 # Uncomment if we want timestamps on coredumps 317 # dst = os.path.join(dst, "%s_%s" % (name, pretty_now())) 318 319 # make a directory for this test 320 mkdir(os.path.join(dst, "dir")) 321 322 # moves the files 323 mv( core, os.path.join(dst, "core" ) ) 324 mv( exe , os.path.join(dst, name ) ) 325 326 # return explanatory test 327 return "Archiving %s (executable and core) to %s" % (os.path.relpath(exe, settings.BUILDDIR), os.path.relpath(dst, settings.original_path)) 328 306 329 class Timed: 307 330 def __enter__(self): -
tests/test.py
rf9bf142 r330d933 91 91 parser.add_argument('--all', help='Run all test available', action='store_true') 92 92 parser.add_argument('--regenerate-expected', help='Regenerate the .expect by running the specified tets, can be used with --all option', action='store_true') 93 parser.add_argument('--archive-errors', help='If called with a valid path, on test crashes the test script will copy the core dump and the executable to the specified path.', type=str, default='') 93 94 parser.add_argument('-j', '--jobs', help='Number of tests to run simultaneously', type=int) 94 95 parser.add_argument('--list-comp', help='List all valide arguments', action='store_true') … … 179 180 error = error + info if error else info 180 181 182 if settings.archive: 183 error = error + '\n' + core_archive(settings.archive, test.target(), exe_file) 184 181 185 182 186 … … 295 299 # users may want to simply list the tests 296 300 if options.list_comp : 297 print("-h --help --debug --dry-run --list --arch --all --regenerate-expected -- install --timeout --global-timeout -j --jobs ", end='')301 print("-h --help --debug --dry-run --list --arch --all --regenerate-expected --archive-errors --install --timeout --global-timeout -j --jobs ", end='') 298 302 print(" ".join(map(lambda t: "%s" % (t.target()), tests))) 299 303 -
tools/Makefile.in
rf9bf142 r330d933 225 225 CYGPATH_W = @CYGPATH_W@ 226 226 DEFS = @DEFS@ 227 DEMANGLER = @DEMANGLER@ 227 228 DEPDIR = @DEPDIR@ 228 229 DLLTOOL = @DLLTOOL@ … … 250 251 LIBCFA_TARGET_DIRS = @LIBCFA_TARGET_DIRS@ 251 252 LIBCFA_TARGET_MAKEFILES = @LIBCFA_TARGET_MAKEFILES@ 253 LIBDEMANGLE = @LIBDEMANGLE@ 252 254 LIBOBJS = @LIBOBJS@ 253 255 LIBS = @LIBS@ -
tools/prettyprinter/Makefile.in
rf9bf142 r330d933 254 254 CYGPATH_W = @CYGPATH_W@ 255 255 DEFS = @DEFS@ 256 DEMANGLER = @DEMANGLER@ 256 257 DEPDIR = @DEPDIR@ 257 258 DLLTOOL = @DLLTOOL@ … … 279 280 LIBCFA_TARGET_DIRS = @LIBCFA_TARGET_DIRS@ 280 281 LIBCFA_TARGET_MAKEFILES = @LIBCFA_TARGET_MAKEFILES@ 282 LIBDEMANGLE = @LIBDEMANGLE@ 281 283 LIBOBJS = @LIBOBJS@ 282 284 LIBS = @LIBS@
Note: See TracChangeset
for help on using the changeset viewer.