Changes in / [330d933:f9bf142]
- Files:
-
- 2 deleted
- 49 edited
-
Jenkins/FullBuild (modified) (1 diff)
-
Jenkinsfile (modified) (3 diffs)
-
Makefile.in (modified) (2 diffs)
-
automake/cfa.m4 (modified) (1 diff)
-
benchmark/Makefile.in (modified) (2 diffs)
-
configure (modified) (7 diffs)
-
configure.ac (modified) (2 diffs)
-
driver/Makefile.in (modified) (2 diffs)
-
driver/cc1.cc (modified) (16 diffs)
-
driver/cfa.cc (modified) (18 diffs)
-
libcfa/src/Makefile.am (modified) (1 diff)
-
libcfa/src/Makefile.in (modified) (2 diffs)
-
longrun_tests/Makefile.in (modified) (2 diffs)
-
src/BasicTypes-gen.cc (modified) (7 diffs)
-
src/GenPoly/Box.cc (modified) (1 diff)
-
src/GenPoly/Lvalue.cc (modified) (2 diffs)
-
src/Makefile.am (modified) (4 diffs)
-
src/Makefile.in (modified) (9 diffs)
-
src/Parser/ExpressionNode.cc (modified) (2 diffs)
-
src/Parser/lex.ll (modified) (3 diffs)
-
src/Parser/parser.yy (modified) (3 diffs)
-
src/ResolvExpr/AlternativeFinder.cc (modified) (8 diffs)
-
src/ResolvExpr/CastCost.cc (modified) (7 diffs)
-
src/ResolvExpr/CommonType.cc (modified) (35 diffs)
-
src/ResolvExpr/ConversionCost.cc (modified) (16 diffs)
-
src/ResolvExpr/ConversionCost.h (modified) (4 diffs)
-
src/ResolvExpr/ResolveAssertions.cc (modified) (2 diffs)
-
src/ResolvExpr/typeops.h (modified) (4 diffs)
-
src/SymTab/Validate.cc (modified) (5 diffs)
-
src/SynTree/AddressExpr.cc (modified) (1 diff)
-
src/SynTree/ApplicationExpr.cc (modified) (2 diffs)
-
src/SynTree/BasicType.cc (modified) (2 diffs)
-
src/SynTree/CommaExpr.cc (modified) (2 diffs)
-
src/SynTree/Expression.cc (modified) (10 diffs)
-
src/SynTree/Expression.h (modified) (14 diffs)
-
src/SynTree/TopLvalue.cc (deleted)
-
src/SynTree/TopLvalue.h (deleted)
-
src/SynTree/TupleExpr.cc (modified) (3 diffs)
-
src/SynTree/Type.cc (modified) (4 diffs)
-
src/SynTree/module.mk (modified) (1 diff)
-
src/main.cc (modified) (23 diffs)
-
tests/.expect/gccExtensions.x64.txt (modified) (1 diff)
-
tests/.expect/gccExtensions.x86.txt (modified) (1 diff)
-
tests/Makefile.am (modified) (2 diffs)
-
tests/Makefile.in (modified) (4 diffs)
-
tests/gccExtensions.cfa (modified) (3 diffs)
-
tests/pybin/settings.py (modified) (4 diffs)
-
tests/pybin/tools.py (modified) (3 diffs)
-
tests/test.py (modified) (3 diffs)
-
tools/Makefile.in (modified) (2 diffs)
-
tools/prettyprinter/Makefile.in (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
Jenkins/FullBuild
r330d933 rf9bf142 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" >135 134 136 135 <p>- Logs ----------------------------------------------------------------</p> -
Jenkinsfile
r330d933 rf9bf142 197 197 if( Settings.Publish && !Settings.RunBenchmark ) { echo 'No results to publish!!!' } 198 198 199 def groupCompile = new PlotGroup('Compilation', ' duration (s) - lower is better', true)200 def groupConcurrency = new PlotGroup('Concurrency', ' duration (n) - lower is better', false)199 def groupCompile = new PlotGroup('Compilation', 'seconds', true) 200 def groupConcurrency = new PlotGroup('Concurrency', 'nanoseconds', false) 201 201 202 202 //Then publish the results 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)')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') 211 211 } 212 212 } … … 466 466 } 467 467 468 def do_plot(boolean new_data, String file, PlotGroup group, boolean relative,String title) {468 def do_plot(boolean new_data, String file, PlotGroup group, String title) { 469 469 470 470 if(new_data) { … … 489 489 exclZero: false, 490 490 keepRecords: false, 491 logarithmic: !relative &&group.log,491 logarithmic: group.log, 492 492 numBuilds: '120', 493 493 useDescr: true, -
Makefile.in
r330d933 rf9bf142 281 281 CYGPATH_W = @CYGPATH_W@ 282 282 DEFS = @DEFS@ 283 DEMANGLER = @DEMANGLER@284 283 DEPDIR = @DEPDIR@ 285 284 DLLTOOL = @DLLTOOL@ … … 307 306 LIBCFA_TARGET_DIRS = @LIBCFA_TARGET_DIRS@ 308 307 LIBCFA_TARGET_MAKEFILES = @LIBCFA_TARGET_MAKEFILES@ 309 LIBDEMANGLE = @LIBDEMANGLE@310 308 LIBOBJS = @LIBOBJS@ 311 309 LIBS = @LIBS@ -
automake/cfa.m4
r330d933 rf9bf142 66 66 "x86-64" ) cannon_arch_name="x64";; 67 67 "x86_64" ) cannon_arch_name="x64";; 68 "aarch64" ) cannon_arch_name=" arm";;68 "aarch64" ) cannon_arch_name="x64";; 69 69 "x86" ) cannon_arch_name="x86";; 70 70 "i386" ) cannon_arch_name="x86";; -
benchmark/Makefile.in
r330d933 rf9bf142 231 231 CYGPATH_W = @CYGPATH_W@ 232 232 DEFS = @DEFS@ 233 DEMANGLER = @DEMANGLER@234 233 DEPDIR = @DEPDIR@ 235 234 DLLTOOL = @DLLTOOL@ … … 257 256 LIBCFA_TARGET_DIRS = @LIBCFA_TARGET_DIRS@ 258 257 LIBCFA_TARGET_MAKEFILES = @LIBCFA_TARGET_MAKEFILES@ 259 LIBDEMANGLE = @LIBDEMANGLE@260 258 LIBOBJS = @LIBOBJS@ 261 259 LIBS = @LIBS@ -
configure
r330d933 rf9bf142 637 637 LIBOBJS 638 638 CFA_BACKEND_CC 639 DEMANGLER640 LIBDEMANGLE641 639 WITH_LIBTCMALLOC_FALSE 642 640 WITH_LIBTCMALLOC_TRUE … … 799 797 with_target_hosts 800 798 enable_gprofiler 801 enable_demangler802 799 enable_dependency_tracking 803 800 enable_shared … … 1460 1457 --disable-silent-rules verbose build output (undo: "make V=0") 1461 1458 --enable-gprofiler whether or not to enable gprofiler tools (if available) 1462 --enable-demangler whether or not to build the demangler (executable and library)1463 1459 --enable-dependency-tracking 1464 1460 do not reject slow dependency extractors … … 3405 3401 3406 3402 3407 # Check whether --enable-demangler was given.3408 if test "${enable_demangler+set}" = set; then :3409 enableval=$enable_demangler; enable_demangler=$enableval3410 else3411 enable_demangler=yes3412 fi3413 3414 3415 3403 TARGET_HOSTS=${target_hosts} 3416 3404 … … 3445 3433 "x86-64" ) cannon_arch_name="x64";; 3446 3434 "x86_64" ) cannon_arch_name="x64";; 3447 "aarch64" ) cannon_arch_name=" arm";;3435 "aarch64" ) cannon_arch_name="x64";; 3448 3436 "x86" ) cannon_arch_name="x86";; 3449 3437 "i386" ) cannon_arch_name="x86";; … … 3487 3475 "x86-64" ) cannon_arch_name="x64";; 3488 3476 "x86_64" ) cannon_arch_name="x64";; 3489 "aarch64" ) cannon_arch_name=" arm";;3477 "aarch64" ) cannon_arch_name="x64";; 3490 3478 "x86" ) cannon_arch_name="x86";; 3491 3479 "i386" ) cannon_arch_name="x86";; … … 16792 16780 16793 16781 16794 # conditionnally build the demangler16795 if test "x$enable_demangler" == xyes; then16796 LIBDEMANGLE="libdemangle.a"16797 DEMANGLER="demangler"16798 else16799 LIBDEMANGLE=""16800 DEMANGLER=""16801 fi16802 16803 16804 16805 16782 # Checks for header files. 16806 16783 for ac_header in libintl.h malloc.h unistd.h -
configure.ac
r330d933 rf9bf142 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 139 135 AC_SUBST(TARGET_HOSTS, ${target_hosts}) 140 136 … … 209 205 AM_CONDITIONAL([WITH_LIBTCMALLOC], [test "x$enable_gprofiler" = "xyes" -a "$HAVE_LIBTCMALLOC" -eq 1]) 210 206 211 # conditionnally build the demangler212 if test "x$enable_demangler" == xyes; then213 LIBDEMANGLE="libdemangle.a"214 DEMANGLER="demangler"215 else216 LIBDEMANGLE=""217 DEMANGLER=""218 fi219 AC_SUBST([LIBDEMANGLE])220 AC_SUBST([DEMANGLER])221 222 207 # Checks for header files. 223 208 AC_CHECK_HEADERS([libintl.h malloc.h unistd.h], [], [echo "Error: Missing required header"; exit 1]) -
driver/Makefile.in
r330d933 rf9bf142 218 218 CYGPATH_W = @CYGPATH_W@ 219 219 DEFS = @DEFS@ 220 DEMANGLER = @DEMANGLER@221 220 DEPDIR = @DEPDIR@ 222 221 DLLTOOL = @DLLTOOL@ … … 244 243 LIBCFA_TARGET_DIRS = @LIBCFA_TARGET_DIRS@ 245 244 LIBCFA_TARGET_MAKEFILES = @LIBCFA_TARGET_MAKEFILES@ 246 LIBDEMANGLE = @LIBDEMANGLE@247 245 LIBOBJS = @LIBOBJS@ 248 246 LIBS = @LIBS@ -
driver/cc1.cc
r330d933 rf9bf142 10 10 // Created On : Fri Aug 26 14:23:51 2005 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Fri Aug 23 15:06:27 201913 // Update Count : 37112 // Last Modified On : Mon Sep 3 16:57:05 2018 13 // Update Count : 125 14 14 // 15 15 … … 19 19 #include <string> 20 20 using std::string; 21 #include <algorithm> // find22 21 #include <cstdio> // stderr, stdout, perror, fprintf 23 22 #include <cstdlib> // getenv, exit, mkstemp 24 23 #include <unistd.h> // execvp, fork, unlink 25 24 #include <sys/wait.h> // wait 26 #include <fcntl.h>27 28 25 29 26 #include "config.h" // configure info … … 33 30 34 31 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 ) { 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 ) { 43 42 return arg.substr( 0, pre.size() ) == pre; 44 43 } // prefix 45 44 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 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; 50 50 size_t dot = arg.find_last_of( "." ); 51 //std::cerr << dot << " " << (dot != string::npos ? arg.substr( dot + 1 ) : "fred" ) << std::endl; 51 52 if ( dot == string::npos ) return; 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 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 57 63 } // suffix 58 64 59 65 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] ); 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; 67 72 #ifdef __DEBUG_H__ 68 cerr << "env arg:\"" << arg<< "\"" << endl;73 cerr << "env arg:\"" << compiler_name << "\"" << endl; 69 74 #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] ); 75 } // if 76 77 value = getenv( "__GCC_MACHINE__" ); 78 if ( value != NULL ) { 79 args[nargs] = ( *new string( value ) ).c_str(); // pass the argument along 86 80 #ifdef __DEBUG_H__ 87 cerr << "env arg:\"" << arg << "\"" << endl;81 cerr << "env arg:\"" << args[nargs] << "\"" << endl; 88 82 #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 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() { 116 98 if ( unlink( tmpname ) == -1 ) { // remove tmpname 117 perror ( "C C1 Translator error: failed, unlink" );118 exit( EXIT_FAILURE ); 119 } // if 120 tmpfilefd = -1; // mark removed99 perror ( "CFA Translator error: cpp failed" ); 100 exit( EXIT_FAILURE ); 101 } // if 102 tmpfilefd = -1; // mark closed 121 103 } // rmtmpfile 122 104 123 105 124 static void sigTermHandler( int ) { // C-c C-c 125 if ( startrm ) return; // return and let rmtmpfile finish, and then program finishes 126 106 void sigTermHandler( __attribute__((unused)) int signal ) { 127 107 if ( tmpfilefd != -1 ) { // RACE, file created ? 128 rmtmpfile(); // remove tmpname129 } // if130 exit( EXIT_FAILURE ); // terminate108 rmtmpfile(); // remove 109 exit( EXIT_FAILURE ); // terminate 110 } // if 131 111 } // sigTermHandler 132 112 133 113 134 staticvoid Stage1( const int argc, const char * const argv[] ) {114 void Stage1( const int argc, const char * const argv[] ) { 135 115 int code; 116 136 117 string arg; 137 138 const char * cpp_in = nullptr; 139 const char * cpp_out = nullptr; 140 118 string bprefix; 119 120 const char *cpp_in = NULL; 121 const char *cpp_out = NULL; 122 123 bool CFA_flag = false; 141 124 bool cpp_flag = false; 142 bool o_flag = false;143 144 const char * args[argc + 100]; // leave space for 100 additional cpp command line values125 const char *o_name = NULL; 126 127 const char *args[argc + 100]; // leave space for 100 additional cpp command line values 145 128 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 values 130 int ncargs = 1; // 0 => command name 131 132 signal( SIGINT, sigTermHandler ); 133 signal( SIGTERM, sigTermHandler ); 146 134 147 135 #ifdef __DEBUG_H__ 148 136 cerr << "Stage1" << endl; 149 137 #endif // __DEBUG_H__ 150 checkEnv 1( args, nargs ); // arguments passed via environment variables138 checkEnv( args, nargs ); // arguments passed via environment variables 151 139 #ifdef __DEBUG_H__ 152 140 for ( int i = 1; i < argc; i += 1 ) { … … 180 168 i += 1; // and the argument 181 169 cpp_flag = true; 182 183 // all other flags 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 184 189 185 190 } else if ( arg == "-o" ) { 186 191 i += 1; 187 o_flag = true; 188 cpp_out = argv[i]; 192 o_name = argv[i]; 189 193 } else { 190 args[nargs++] = argv[i]; // pass the flag along 194 args[nargs] = argv[i]; // pass the flag along 195 nargs += 1; 191 196 // CPP flags with an argument 192 197 if ( arg == "-D" || arg == "-U" || arg == "-I" || arg == "-MF" || arg == "-MT" || arg == "-MQ" || … … 194 199 arg == "-iwithprefix" || arg == "-iwithprefixbefore" || arg == "-isystem" || arg == "-isysroot" ) { 195 200 i += 1; 196 args[nargs++] = argv[i]; // pass the argument along 201 args[nargs] = argv[i]; // pass the argument along 202 nargs += 1; 197 203 #ifdef __DEBUG_H__ 198 204 cerr << "argv[" << i << "]:\"" << argv[i] << "\"" << endl; 199 205 #endif // __DEBUG_H__ 200 206 } else if ( arg == "-MD" || arg == "-MMD" ) { 201 args[nargs++] = "-MF"; // insert before file 207 args[nargs] = "-MF"; // insert before file 208 nargs += 1; 202 209 i += 1; 203 args[nargs++] = argv[i]; // pass the argument along 210 args[nargs] = argv[i]; // pass the argument along 211 nargs += 1; 204 212 #ifdef __DEBUG_H__ 205 213 cerr << "argv[" << i << "]:\"" << argv[i] << "\"" << endl; … … 208 216 } // if 209 217 } else { // obtain input and possibly output files 210 if ( cpp_in == nullptr) {218 if ( cpp_in == NULL ) { 211 219 cpp_in = argv[i]; 212 220 #ifdef __DEBUG_H__ 213 221 cerr << "cpp_in:\"" << cpp_in << "\"" << endl; 214 222 #endif // __DEBUG_H__ 215 } else if ( cpp_out == nullptr) {223 } else if ( cpp_out == NULL ) { 216 224 cpp_out = argv[i]; 217 225 #ifdef __DEBUG_H__ … … 230 238 cerr << " " << args[i]; 231 239 } // for 232 if ( cpp_in != nullptr) cerr << " " << cpp_in;233 if ( cpp_out != nullptr) cerr << " " << cpp_out;240 if ( cpp_in != NULL ) cerr << " " << cpp_in; 241 if ( cpp_out != NULL ) cerr << " " << cpp_out; 234 242 cerr << endl; 235 243 #endif // __DEBUG_H__ 236 244 237 if ( cpp_in == nullptr) {245 if ( cpp_in == NULL ) { 238 246 cerr << "Usage: " << argv[0] << " input-file [output-file] [options]" << endl; 239 247 exit( EXIT_FAILURE ); … … 244 252 // output or -o. The call to cfa has a -E so it does not have to be added to the argument list. 245 253 246 args[0] = compiler_ path.c_str();254 args[0] = compiler_name.c_str(); 247 255 suffix( cpp_in, args, nargs ); // check suffix 248 args[nargs++] = cpp_in; 249 if ( o_flag ) { // location for output 250 args[nargs++] = "-o"; 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; 251 263 } // if 252 args[nargs++] = cpp_out; 253 args[nargs] = nullptr; // terminate argument list 264 args[nargs] = NULL; // terminate argument list 254 265 255 266 #ifdef __DEBUG_H__ 256 267 cerr << "nargs: " << nargs << endl; 257 for ( int i = 0; args[i] != nullptr; i += 1 ) {268 for ( int i = 0; args[i] != NULL; i += 1 ) { 258 269 cerr << args[i] << " "; 259 270 } // for … … 261 272 #endif // __DEBUG_H__ 262 273 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. 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. 269 292 270 293 if ( fork() == 0 ) { // child process ? … … 272 295 // an error (e.g., cannot find include file). Whereas, output is always generated, even when there is an error, 273 296 // when cpp writes to stdout. Hence, stdout is redirected into the temporary file. 274 if ( freopen( cpp_out, "w", stdout ) == nullptr ) { // redirect stdout to output file275 perror( "C C1 Translator error: stage 1, freopen" );297 if ( freopen( tmpname, "w", stdout ) == NULL ) { // redirect stdout to tmpname 298 perror( "CFA Translator error: cpp level, freopen" ); 276 299 exit( EXIT_FAILURE ); 277 300 } // if 278 301 279 args[0] = compiler_ path.c_str();302 args[0] = compiler_name.c_str(); 280 303 suffix( cpp_in, args, nargs ); // check suffix 281 args[nargs++] = cpp_in; // input to cpp 282 args[nargs] = nullptr; // terminate argument list 304 args[nargs] = cpp_in; // input to cpp 305 nargs += 1; 306 args[nargs] = NULL; // terminate argument list 283 307 284 308 #ifdef __DEBUG_H__ 285 309 cerr << "cpp nargs: " << nargs << endl; 286 for ( int i = 0; args[i] != nullptr; i += 1 ) {310 for ( int i = 0; args[i] != NULL; i += 1 ) { 287 311 cerr << args[i] << " "; 288 312 } // for … … 290 314 #endif // __DEBUG_H__ 291 315 292 execvp( args[0], (char * const *)args );// should not return293 perror( "C C1 Translator error: stage 1, execvp" );316 execvp( args[0], (char *const *)args ); // should not return 317 perror( "CFA Translator error: cpp level, execvp" ); 294 318 exit( EXIT_FAILURE ); 295 319 } // if … … 301 325 #endif // __DEBUG_H__ 302 326 327 if ( WIFSIGNALED(code) != 0 ) { // child failed ? 328 rmtmpfile(); // remove tmpname 329 cerr << "CFA Translator error: cpp failed with signal " << WTERMSIG(code) << endl; 330 exit( EXIT_FAILURE ); 331 } // if 332 333 if ( WEXITSTATUS(code) != 0 ) { // child error ? 334 rmtmpfile(); // remove tmpname 335 exit( WEXITSTATUS( code ) ); // do not continue 336 } // if 337 338 // If -CFA flag specified, run the cfa-cpp preprocessor on the temporary file, and output is written to standard 339 // 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 CFA 342 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 } // if 359 cargs[ncargs] = NULL; // terminate argument list 360 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 } // for 366 cerr << endl; 367 #endif // __DEBUG_H__ 368 369 execvp( cargs[0], (char * const *)cargs ); // should not return 370 perror( "CFA Translator error: cpp level, execvp" ); 371 exit( EXIT_FAILURE ); 372 } // if 373 374 wait( &code ); // wait for child to finish 375 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 tmpname 382 303 383 if ( WIFSIGNALED(code) ) { // child failed ? 304 cerr << "C C1 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 gcc384 cerr << "CFA Translator error: cfa-cpp failed with signal " << WTERMSIG(code) << endl; 385 exit( EXIT_FAILURE ); 386 } // if 387 388 exit( WEXITSTATUS(code) ); 309 389 } // Stage1 310 390 311 391 312 static void Stage2( const int argc, const char * const * argv ) { 313 int code; 392 void Stage2( const int argc, const char * const * argv ) { 314 393 string arg; 315 394 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 395 const char *cpp_in = NULL; 396 397 const char *args[argc + 100]; // leave space for 100 additional cfa command line values 320 398 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 values322 int ncargs = 1; // 0 => command name323 399 324 400 #ifdef __DEBUG_H__ 325 401 cerr << "Stage2" << endl; 326 402 #endif // __DEBUG_H__ 327 checkEnv 2( cargs, ncargs ); // arguments passed via environment variables403 checkEnv( args, nargs ); // arguments passed via environment variables 328 404 #ifdef __DEBUG_H__ 329 405 for ( int i = 1; i < argc; i += 1 ) { … … 354 430 355 431 } else { 356 args[nargs++] = argv[i]; // pass the flag along 432 args[nargs] = argv[i]; // pass the flag along 433 nargs += 1; 357 434 if ( arg == "-o" ) { 358 435 i += 1; 359 cpp_out = argv[i];360 args[nargs++] = argv[i]; // pass the argument along436 args[nargs] = argv[i]; // pass the argument along 437 nargs += 1; 361 438 #ifdef __DEBUG_H__ 362 439 cerr << "arg:\"" << argv[i] << "\"" << endl; … … 365 442 } // if 366 443 } else { // obtain input and possibly output files 367 if ( cpp_in == nullptr) {444 if ( cpp_in == NULL ) { 368 445 cpp_in = argv[i]; 369 446 #ifdef __DEBUG_H__ 370 447 cerr << "cpp_in:\"" << cpp_in << "\"" << endl; 371 448 #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__377 449 } else { 378 cerr << "Usage: " << argv[0] << " more than two files specified" << endl;450 cerr << "Usage: " << argv[0] << " input-file [output-file] [options]" << endl; 379 451 exit( EXIT_FAILURE ); 380 452 } // if … … 382 454 } // for 383 455 384 if ( cpp_in == nullptr ) {385 cerr << "Usage: " << argv[0] << " missing input file" << endl;386 exit( EXIT_FAILURE );387 } // if388 if ( cpp_out == nullptr ) {389 cerr << "Usage: " << argv[0] << " missing output file" << endl;390 exit( EXIT_FAILURE );391 } // if392 393 // Create a temporary file, if needed, to store output of the cfa-cpp preprocessor. Cannot be created in forked394 // 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 } // if406 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 } // if412 } else {413 tmpfilefd = mkstemps( tmpname, 2 );414 if ( tmpfilefd == -1 ) {415 perror( "CC1 Translator error: stage 2, mkstemp" );416 exit( EXIT_FAILURE );417 } // if418 cfa_cpp_out = tmpname;419 } // if420 #ifdef __DEBUG_H__421 cerr << "cfa_cpp_out: " << cfa_cpp_out << endl;422 #endif // __DEBUG_H__423 } // if424 425 // If -CFA flag specified, run the cfa-cpp preprocessor on the temporary file, and output is written to standard426 // 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 CFA429 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 output435 cargs[ncargs++] = ( *new string( o_file.c_str() ) ).c_str();436 } // if437 } else {438 cargs[ncargs++] = cfa_cpp_out.c_str();439 } // if440 cargs[ncargs] = nullptr; // terminate argument list441 442 #ifdef __DEBUG_H__443 for ( int i = 0; cargs[i] != nullptr; i += 1 ) {444 cerr << cargs[i] << " ";445 } // for446 cerr << endl;447 #endif // __DEBUG_H__448 449 execvp( cargs[0], (char * const *)cargs ); // should not return450 perror( "CC1 Translator error: stage 2, execvp" );451 exit( EXIT_FAILURE );452 } // if453 454 wait( &code ); // wait for child to finish455 456 if ( WIFSIGNALED(code) ) { // child failed ?457 rmtmpfile(); // remove tmpname458 cerr << "CC1 Translator error: stage 2, child failed " << WTERMSIG(code) << endl;459 exit( EXIT_FAILURE );460 } // if461 462 if ( CFA_flag ) { // no tmpfile created463 exit( WEXITSTATUS( code ) ); // stop regardless of success or failure464 } // if465 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 tmpname472 exit( WEXITSTATUS( code ) ); // do not continue473 } // if474 475 456 #ifdef __DEBUG_H__ 476 457 cerr << "args:"; … … 478 459 cerr << " " << args[i]; 479 460 } // for 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 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 520 483 } // Stage2 521 484 522 485 523 // This program is called twice because of the -no-integrated-cpp. The calls are differentiated by the first524 // command-line argument. The first call replaces the traditional cpp pass to preprocess the C program. The second call525 // is to the compiler, which is broken into two steps: preprocess again with cfa-cpp and then call gcc to compile the526 // doubly preprocessed program.527 528 486 int main( const int argc, const char * const argv[], __attribute__((unused)) const char * const env[] ) { 529 487 #ifdef __DEBUG_H__ 530 for ( int i = 0; env[i] != nullptr; i += 1 ) {488 for ( int i = 0; env[i] != NULL; i += 1 ) { 531 489 cerr << env[i] << endl; 532 490 } // for 533 491 #endif // __DEBUG_H__ 534 492 535 signal( SIGINT, sigTermHandler ); 536 signal( SIGTERM, sigTermHandler ); 537 538 string arg( argv[1] ); 493 string arg = argv[1]; 539 494 540 495 // Currently, stage 1 starts with flag -E and stage 2 with flag -fpreprocessed. -
driver/cfa.cc
r330d933 rf9bf142 10 10 // Created On : Tue Aug 20 13:44:49 2002 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Fri Aug 23 16:27:07201913 // Update Count : 41112 // Last Modified On : Sun Feb 10 08:28:09 2019 13 // Update Count : 281 14 14 // 15 15 … … 20 20 #include <string> // STL version 21 21 #include <string.h> // strcmp 22 #include <algorithm> // find23 22 24 23 #include <sys/types.h> … … 33 32 using std::to_string; 34 33 34 35 35 //#define __DEBUG_H__ 36 36 37 37 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 38 bool prefix( string arg, string pre ) { 49 39 return arg.substr( 0, pre.size() ) == pre; 50 40 } // prefix 51 41 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 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; 56 47 size_t dot = arg.find_last_of( "." ); 48 //std::cerr << dot << " " << (dot != string::npos ? arg.substr( dot + 1 ) : "fred" ) << std::endl; 57 49 if ( dot == string::npos ) return false; 58 const string * end = suffixes + NumSuffixes; 59 return std::find( suffixes, end, arg.substr( dot + 1 ) ) != end; 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 60 return false; 60 61 } // suffix 61 62 62 63 63 static inline bool dirExists( const string & path ) { // check if directory exists 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) { 64 78 struct stat info; 65 if ( stat( path.c_str(), &info ) != 0 ) return false; 66 if ( info.st_mode & S_IFDIR ) return true; 67 return false; 68 } // dirExists 69 70 71 #define xstr(s) str(s) 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 72 88 #define str(s) #s 73 89 74 int main( int argc, char * argv[] ) {90 int main( int argc, char *argv[] ) { 75 91 string Version( CFA_VERSION_LONG ); // current version number from CONFIG 76 string Major( xstr( CFA_VERSION_MAJOR ) ), Minor( xstr( CFA_VERSION_MINOR ) ), Patch( xstr( CFA_VERSION_PATCH ) );92 string Major( str( CFA_VERSION_MAJOR ) ), Minor( str( CFA_VERSION_MINOR ) ), Patch( str( CFA_VERSION_PATCH ) ); 77 93 78 94 string installincdir( CFA_INCDIR ); // fixed location of include files … … 88 104 string compiler_name; // name of C compiler 89 105 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 106 bool nonoptarg = false; // indicates non-option argument specified 107 bool link = true; // linking as well as compiling 93 108 bool verbose = false; // -v flag 94 bool quiet = false; // -quiet flag95 bool debug = true; // -debug flag96 bool nolib = false; // -nolib flag97 bool help = false; // -help flag109 bool quiet = false; // -quiet flag 110 bool debug = true; // -debug flag 111 bool nolib = false; // -nolib flag 112 bool help = false; // -help flag 98 113 bool CFA_flag = false; // -CFA flag 99 114 bool cpp_flag = false; // -E or -M flag, preprocessor only … … 101 116 bool noincstd_flag = false; // -no-include-stdhdr= flag 102 117 bool debugging __attribute(( unused )) = false; // -g flag 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 118 bool m32 = false; // -m32 flag 119 bool m64 = false; // -m64 flag 120 bool intree = false; 107 121 108 122 const char *args[argc + 100]; // cfa command line values, plus some space for additional flags … … 128 142 129 143 if ( arg == "-Xlinker" || arg == "-o" ) { 130 args[nargs++] = argv[i]; // pass argument along 144 args[nargs] = argv[i]; // pass the argument along 145 nargs += 1; 131 146 i += 1; 132 147 if ( i == argc ) continue; // next argument available ? 133 args[nargs ++] = argv[i]; // passargument along134 if ( arg == "-o" ) o_file = i; // remember file148 args[nargs] = argv[i]; // pass the argument along 149 nargs += 1; 135 150 } else if ( arg == "-XCFA" ) { // CFA pass through 136 151 i += 1; 137 Putenv( argv, argv[i] ); 152 args[nargs] = ( *new string( string("-D__CFA_FLAG__=") + argv[i] ) ).c_str(); 153 nargs += 1; 138 154 139 155 // CFA specific arguments … … 142 158 CFA_flag = true; // strip the -CFA flag 143 159 link = false; 144 args[nargs++] = "-fsyntax-only"; // stop after stage 2 160 args[nargs] = "-E"; // replace the argument with -E 161 nargs += 1; 145 162 } else if ( arg == "-debug" ) { 146 163 debug = true; // strip the debug flag 147 164 } else if ( arg == "-nodebug" ) { 148 debug = false; // strip the nodebug flag165 debug = false; // strip the debug flag 149 166 } else if ( arg == "-nolib" ) { 150 167 nolib = true; // strip the nodebug flag … … 166 183 if ( i == argc ) continue; // next argument available ? 167 184 compiler_path = argv[i]; 168 Putenv( argv, arg + "=" + 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 169 189 170 190 // C specific arguments … … 172 192 } else if ( arg == "-v" ) { 173 193 verbose = true; // verbosity required 174 args[nargs++] = argv[i]; // pass argument along 194 args[nargs] = argv[i]; // pass the argument along 195 nargs += 1; 175 196 } else if ( arg == "-g" ) { 176 197 debugging = true; // symbolic debugging required 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 198 args[nargs] = argv[i]; // pass the argument along 199 nargs += 1; 200 } else if ( prefix( arg, "-std=" ) || prefix( arg, "--std=" ) ) { 201 std_flag = true; // -std=XX provided 202 args[nargs] = argv[i]; // pass the argument along 203 nargs += 1; 204 } 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; 209 } else if ( prefix( arg, "-W" ) ) { // check before next tests 210 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; 215 } else { 216 unsigned int adv = prefix( arg, "-Wno-" ) ? 5 : 2; 217 args[nargs] = argv[i]; // conditionally pass the argument along 218 const char * warning = argv[i] + adv; // extract warning 219 if ( SemanticWarning_Exist( warning ) ) { // replace the argument for cfa-cpp 220 args[nargs] = ( *new string( string("-D__CFA_FLAG__=") + arg ) ).c_str(); 221 } // if 222 nargs += 1; 223 } // if 224 } else if ( prefix( arg, "-B" ) ) { 225 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" ) ) { 184 229 if ( arg.length() == 2 ) { // separate argument ? 185 230 i += 1; 186 231 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"; 193 } else if ( prefix( arg, "-std=" ) || prefix( arg, "--std=" ) ) { 194 std_flag = true; // -std=XX provided 195 args[nargs++] = argv[i]; // pass argument along 196 } else if ( arg == "-w" ) { 197 args[nargs++] = argv[i]; // pass argument along 198 Putenv( argv, arg ); 199 } else if ( prefix( arg, "-W" ) ) { // check before next tests 200 if ( arg == "-Werror" || arg == "-Wall" ) { 201 args[nargs++] = argv[i]; // pass argument along 202 Putenv( argv, argv[i] ); 203 } else { 204 unsigned int adv = prefix( arg, "-Wno-" ) ? 5 : 2; 205 args[nargs] = argv[i]; // conditionally pass argument along 206 const char * warning = argv[i] + adv; // extract warning 207 if ( SemanticWarning_Exist( warning ) ) { // replace the argument for cfa-cpp 208 Putenv( argv, arg ); 209 } // if 210 nargs += 1; 211 } // if 212 } else if ( prefix( arg, "-B" ) ) { 213 Bprefix = arg.substr(2); // strip the -B flag 214 args[nargs++] = ( *new string( string("-D__GCC_BPREFIX__=") + Bprefix ) ).c_str(); 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; 215 258 } else if ( arg == "-c" || arg == "-S" || arg == "-E" || arg == "-M" || arg == "-MM" ) { 216 args[nargs++] = argv[i]; // pass argument along 259 args[nargs] = argv[i]; // pass the argument along 260 nargs += 1; 217 261 if ( arg == "-E" || arg == "-M" || arg == "-MM" ) { 218 262 cpp_flag = true; // cpp only … … 221 265 } else if ( arg[1] == 'l' ) { 222 266 // if the user specifies a library, load it after user code 223 libs[nlibs++] = argv[i]; 267 libs[nlibs] = argv[i]; 268 nlibs += 1; 224 269 } else if ( arg == "-m32" ) { 225 270 m32 = true; 226 271 m64 = false; 227 args[nargs++] = argv[i]; 272 args[nargs] = argv[i]; 273 nargs += 1; 228 274 } else if ( arg == "-m64" ) { 229 275 m64 = true; 230 276 m32 = false; 231 args[nargs++] = argv[i]; 277 args[nargs] = argv[i]; 278 nargs += 1; 232 279 } else { 233 280 // concatenate any other arguments 234 args[nargs++] = argv[i]; 281 args[nargs] = argv[i]; 282 nargs += 1; 235 283 } // if 236 284 } else { 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"; 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; 246 293 } // if 247 294 nonoptarg = true; … … 249 296 } // for 250 297 298 args[nargs] = "-x"; // turn off language 299 nargs += 1; 300 args[nargs] = "none"; 301 nargs += 1; 302 251 303 #ifdef __x86_64__ 252 args[nargs++] = "-mcx16"; // allow double-wide CAA 304 args[nargs] = "-mcx16"; // allow double-wide CAA 305 nargs += 1; 253 306 #endif // __x86_64__ 254 307 … … 261 314 #endif // __DEBUG_H__ 262 315 263 // -E flag stops at cc1 stage 1, so cfa-cpp in cc1 stage 2 is never executed.264 316 if ( cpp_flag && CFA_flag ) { 265 317 cerr << argv[0] << " error, cannot use -E and -CFA flags together." << endl; … … 268 320 269 321 // add the CFA include-library paths, which allow direct access to header files without directory qualification 270 if ( ! intree ) { 271 args[nargs++] = "-I" CFA_INCDIR; 322 if( !intree ) { 323 args[nargs] = "-I" CFA_INCDIR; 324 nargs += 1; 272 325 if ( ! noincstd_flag ) { // do not use during build 273 args[nargs++] = "-I" CFA_INCDIR "stdhdr"; 326 args[nargs] = "-I" CFA_INCDIR "stdhdr"; 327 nargs += 1; 274 328 } // if 275 args[nargs++] = "-I" CFA_INCDIR "concurrency"; 276 args[nargs++] = "-I" CFA_INCDIR "containers"; 329 args[nargs] = "-I" CFA_INCDIR "concurrency"; 330 nargs += 1; 331 args[nargs] = "-I" CFA_INCDIR "containers"; 332 nargs += 1; 277 333 } else { 278 args[nargs++] = "-I" TOP_SRCDIR "libcfa/src"; 334 args[nargs] = "-I" TOP_SRCDIR "libcfa/src"; 335 nargs += 1; 279 336 if ( ! noincstd_flag ) { // do not use during build 280 args[nargs++] = "-I" TOP_SRCDIR "libcfa/src" "/stdhdr"; 337 args[nargs] = "-I" TOP_SRCDIR "libcfa/src" "/stdhdr"; 338 nargs += 1; 281 339 } // if 282 args[nargs++] = "-I" TOP_SRCDIR "libcfa/src" "/concurrency"; 283 args[nargs++] = "-I" TOP_SRCDIR "libcfa/src" "/containers"; 284 } // 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 } 285 345 286 346 // add stdbool to get defines for bool/true/false 287 args[nargs++] = "-imacros"; 288 args[nargs++] = "stdbool.h"; 347 args[nargs] = "-imacros"; 348 nargs += 1; 349 args[nargs] = "stdbool.h"; 350 nargs += 1; 289 351 290 352 string libbase; 291 if ( !intree ) {353 if( !intree ) { 292 354 libbase = CFA_LIBDIR; 293 355 } else { 294 356 libbase = TOP_BUILDDIR "libcfa/"; 295 Putenv( argv, "-t" ); 296 } // if 297 298 string arch( m32 ? CFA_32_CPU : (m64 ? CFA_64_CPU : CFA_DEFAULT_CPU) ); 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); 299 362 if ( ! m32 && ! m64 ) { 300 363 if ( arch == "x86" ) { 301 args[nargs++] = "-m32"; 364 args[nargs] = "-m32"; 365 nargs += 1; 302 366 } else if ( arch == "x64" ) { 303 args[nargs++] = "-m64"; 367 args[nargs] = "-m64"; 368 nargs += 1; 304 369 } // if 305 370 } // if 306 307 string libdir( libbase + arch + "-" + (nolib ? "nolib" : (debug ? "debug": "nodebug")) ); 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 308 380 if ( ! dirExists( libdir ) ) { 309 cerr << argv[0] << " internal error, cannot find prelude directory " << libdir << endl; 381 cerr << argv[0] << " internal error, cannot find prelude directory." << endl; 382 cerr << "Was looking for " << libdir << endl; 310 383 exit( EXIT_FAILURE ); 311 384 } // if 312 385 386 args[nargs] = ( *new string( string("-D__CFA_FLAG__=--prelude-dir=" ) + libdir + (intree ? "/prelude" : "")) ).c_str(); 387 nargs += 1; 388 313 389 for ( int i = 0; i < nlibs; i += 1 ) { // copy non-user libraries after all user libraries 314 args[nargs++] = libs[i]; 390 args[nargs] = libs[i]; 391 nargs += 1; 315 392 } // for 316 393 317 394 if ( link ) { 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"; 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; 324 407 325 408 // include the cfa library in case it's needed 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"; 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; 348 449 349 450 if ( cpp_flag ) { 350 args[nargs++] = "-D__CPP__"; 351 } // if 352 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; 353 457 if ( CFA_flag ) { 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] ); 458 args[sargs] = "-D__CFA_FLAG__=-N"; 459 args[nargs] = "-D__CFA_PREPROCESS_"; 460 nargs += 1; 359 461 } else { 360 Putenv( argv, "-L" ); 361 } // if 362 363 Putenv( argv, "--prelude-dir=" + libdir + (intree ? "/prelude" : "") ); 462 args[sargs] = "-D__CFA_FLAG__=-L"; 463 } // if 464 sargs += 1; 364 465 365 466 if ( debug ) { 366 467 heading += " (debug)"; 367 args[nargs++] = "-D__CFA_DEBUG__"; 468 args[nargs] = "-D__CFA_DEBUG__"; 469 nargs += 1; 368 470 } else { 369 471 heading += " (no debug)"; … … 373 475 Bprefix = ! intree ? installlibdir : srcdriverdir; 374 476 if ( Bprefix[Bprefix.length() - 1] != '/' ) Bprefix += '/'; 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"; 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; 380 485 381 486 // execute the compilation command … … 391 496 392 497 if ( prefix( compiler_name, "gcc" ) ) { // allow suffix on gcc name 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 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 398 506 if ( ! std_flag ) { // default c11, if none specified 399 args[nargs++] = "-std=gnu11"; 507 args[nargs] = "-std=gnu11"; 508 nargs += 1; 400 509 } // if 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(); 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; 404 516 } else { 405 517 cerr << argv[0] << " error, compiler \"" << compiler_name << "\" unsupported." << endl; … … 407 519 } // if 408 520 409 args[nargs] = nullptr; // terminate521 args[nargs] = NULL; // terminate with NULL 410 522 411 523 #ifdef __DEBUG_H__ 412 524 cerr << "nargs: " << nargs << endl; 413 525 cerr << "args:" << endl; 414 for ( int i = 0; args[i] != nullptr; i += 1 ) {526 for ( int i = 0; args[i] != NULL; i += 1 ) { 415 527 cerr << " \"" << args[i] << "\"" << endl; 416 528 } // for … … 434 546 if ( argc == 2 ) exit( EXIT_SUCCESS ); // if only the -v flag is specified, do not invoke gcc 435 547 436 for ( int i = 0; args[i] != nullptr; i += 1 ) {548 for ( int i = 0; args[i] != NULL; i += 1 ) { 437 549 cerr << args[i] << " "; 438 550 } // for … … 448 560 449 561 execvp( args[0], (char *const *)args ); // should not return 450 perror( "CFA Translator error: execvp" );562 perror( "CFA Translator error: cfa level, execvp" ); 451 563 exit( EXIT_FAILURE ); 452 564 } // main -
libcfa/src/Makefile.am
r330d933 rf9bf142 26 26 VPATH += :../prelude 27 27 28 gdbwaittarget=""29 30 28 # AM_CFLAGS for all cfa source 31 29 # AM_CFAFLAGS for only cfa source 32 30 # use -no-include-stdhdr to prevent rebuild cycles 33 31 # The built sources must not depend on the installed headers 34 AM_CFAFLAGS = -quiet -in-tree -I$(srcdir)/stdhdr $(if $(findstring ${gdbwaittarget}, ${@}), -XCFA --gdb)@CONFIG_CFAFLAGS@32 AM_CFAFLAGS = -quiet -in-tree -I$(srcdir)/stdhdr @CONFIG_CFAFLAGS@ 35 33 AM_CFLAGS = -g -Wall -Wno-unused-function -fPIC @ARCH_FLAGS@ @CONFIG_CFLAGS@ 36 34 AM_CCASFLAGS = -g -Wall -Wno-unused-function @ARCH_FLAGS@ @CONFIG_CFLAGS@ -
libcfa/src/Makefile.in
r330d933 rf9bf142 435 435 am__v_UPP_1 = 436 436 lib_LTLIBRARIES = libcfa.la libcfathread.la 437 gdbwaittarget = ""438 437 439 438 # AM_CFLAGS for all cfa source … … 441 440 # use -no-include-stdhdr to prevent rebuild cycles 442 441 # The built sources must not depend on the installed headers 443 AM_CFAFLAGS = -quiet -in-tree -I$(srcdir)/stdhdr $(if $(findstring ${gdbwaittarget}, ${@}), -XCFA --gdb)@CONFIG_CFAFLAGS@442 AM_CFAFLAGS = -quiet -in-tree -I$(srcdir)/stdhdr @CONFIG_CFAFLAGS@ 444 443 AM_CFLAGS = -g -Wall -Wno-unused-function -fPIC @ARCH_FLAGS@ @CONFIG_CFLAGS@ 445 444 AM_CCASFLAGS = -g -Wall -Wno-unused-function @ARCH_FLAGS@ @CONFIG_CFLAGS@ -
longrun_tests/Makefile.in
r330d933 rf9bf142 365 365 CYGPATH_W = @CYGPATH_W@ 366 366 DEFS = @DEFS@ 367 DEMANGLER = @DEMANGLER@368 367 DEPDIR = @DEPDIR@ 369 368 DLLTOOL = @DLLTOOL@ … … 391 390 LIBCFA_TARGET_DIRS = @LIBCFA_TARGET_DIRS@ 392 391 LIBCFA_TARGET_MAKEFILES = @LIBCFA_TARGET_MAKEFILES@ 393 LIBDEMANGLE = @LIBDEMANGLE@394 392 LIBOBJS = @LIBOBJS@ 395 393 LIBS = @LIBS@ -
src/BasicTypes-gen.cc
r330d933 rf9bf142 295 295 // cout << code.str(); 296 296 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 297 322 298 #define ConversionCost TOP_SRCDIR "src/ResolvExpr/ConversionCost.cc" 323 299 resetInput( file, ConversionCost, buffer, code, str ); … … 334 310 code << right << setw(30) << graph[c].type << left; 335 311 } else if ( graph[c].rank != graph[c + 2].rank ) { 336 code << string( 10, ' ' ) << setw(25) << graph[c].type << graph[c + 1].type;312 code << string( 10, ' ' ) << setw(25) << graph[c].type << setw(25) << graph[c + 1].type; 337 313 c += 1; 338 314 } else { 339 code << setw(20) << graph[c].type << setw(20) << graph[c + 1].type << graph[c + 2].type;315 code << setw(20) << graph[c].type << setw(20) << graph[c + 1].type << setw(20) << graph[c + 2].type; 340 316 c += 2; 341 317 } // if … … 352 328 code << "\t" << BYMK << endl; 353 329 code << "\tstatic const int costMatrix[BasicType::NUMBER_OF_BASIC_TYPES][BasicType::NUMBER_OF_BASIC_TYPES] = { // path length from root to node" << endl 354 << "\t\t/* ";330 << "\t\t/* "; 355 331 for ( int r = 0; r < NUMBER_OF_BASIC_TYPES; r += 1 ) { // titles 356 332 code << setw(5) << graph[r].abbrev; … … 358 334 code << " */" << endl; 359 335 for ( int r = 0; r < NUMBER_OF_BASIC_TYPES; r += 1 ) { // costs 360 code << "\t\t/* " << setw(6) << graph[r].abbrev << "*/ {";336 code << "\t\t/*" << setw(6) << graph[r].abbrev << "*/ {"; 361 337 for ( int c = 0; c < NUMBER_OF_BASIC_TYPES; c += 1 ) { 362 338 code << setw(4) << costMatrix[r][c] << ","; … … 377 353 code << "\t" << BYMK << endl; 378 354 code << "\tstatic const int signMatrix[BasicType::NUMBER_OF_BASIC_TYPES][BasicType::NUMBER_OF_BASIC_TYPES] = { // number of sign changes in safe conversion" << endl 379 << "\t\t/* ";355 << "\t\t/* "; 380 356 for ( int r = 0; r < NUMBER_OF_BASIC_TYPES; r += 1 ) { // titles 381 357 code << setw(5) << graph[r].abbrev; … … 383 359 code << " */" << endl; 384 360 for ( int r = 0; r < NUMBER_OF_BASIC_TYPES; r += 1 ) { // costs 385 code << "\t\t/* " << setw(6) << graph[r].abbrev << "*/ {";361 code << "\t\t/*" << setw(6) << graph[r].abbrev << "*/ {"; 386 362 for ( int c = 0; c < NUMBER_OF_BASIC_TYPES; c += 1 ) { 387 363 code << setw(4) << signMatrix[r][c] << ","; … … 419 395 code << "*/" << endl; 420 396 for ( int r = 0; r < NUMBER_OF_BASIC_TYPES; r += 1 ) { // costs 421 code << "\t\t\t\t {\n\t\t/* " << setw(6) << graph[r].abbrev << "*/";397 code << "\t\t\t\t {\n\t\t/*" << setw(6) << graph[r].abbrev << "*/"; 422 398 for ( int c = 0; c < NUMBER_OF_BASIC_TYPES; c += 1 ) { 423 399 string s = string{"BT "} + graph[commonTypeMatrix[r][c]].name; -
src/GenPoly/Box.cc
r330d933 rf9bf142 725 725 if ( ! needsBoxing( param, arg->result, exprTyVars, env ) ) return; 726 726 727 if ( arg-> get_lvalue() ) {727 if ( arg->result->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
r330d933 rf9bf142 363 363 int diff = depth1 - depth2; 364 364 365 if ( diff > 0 && ! castExpr->arg->get_lvalue() ) {365 if ( diff > 0 && ! srcType->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 ( castExpr->arg->get_lvalue() && ! ResolvExpr::typesCompatible( srcType, strict_dynamic_cast<ReferenceType *>( destType )->base, SymTab::Indexer() ) ) {409 if ( srcType->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
r330d933 rf9bf142 11 11 ## Created On : Sun May 31 08:51:46 2015 12 12 ## Last Modified By : Peter A. Buhr 13 ## Last Modified On : Mon Aug 5 12:57:46201914 ## Update Count : 9 813 ## Last Modified On : Fri Feb 15 09:44:09 2019 14 ## Update Count : 97 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)/ AST/Type.hpp: BasicTypes-gen.cc57 $(srcdir)/SynTree/Type.h : 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) 65 EXTRA_PROGRAMS = demangler 64 cfa_cpplib_PROGRAMS = ../driver/cfa-cpp demangler 66 65 ___driver_cfa_cpp_SOURCES = $(SRC) 67 66 ___driver_cfa_cpp_LDADD = -ldl $(LIBPROFILER) $(LIBTCMALLOC) … … 75 74 demangler_LDADD = libdemangle.a -ldl # yywrap 76 75 77 noinst_LIBRARIES = $(LIBDEMANGLE) 78 EXTRA_LIBRARIES = libdemangle.a 76 noinst_LIBRARIES = libdemangle.a 79 77 libdemangle_a_SOURCES = $(SRCDEMANGLE) 80 78 -
src/Makefile.in
r330d933 rf9bf142 141 141 build_triplet = @build@ 142 142 host_triplet = @host@ 143 cfa_cpplib_PROGRAMS = ../driver/cfa-cpp$(EXEEXT) $(DEMANGLER) 144 EXTRA_PROGRAMS = demangler$(EXEEXT) 143 cfa_cpplib_PROGRAMS = ../driver/cfa-cpp$(EXEEXT) demangler$(EXEEXT) 145 144 subdir = src 146 145 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 … … 231 230 SynTree/Initializer.$(OBJEXT) \ 232 231 SynTree/TypeSubstitution.$(OBJEXT) SynTree/Attribute.$(OBJEXT) \ 233 SynTree/DeclReplacer.$(OBJEXT) SynTree/TopLvalue.$(OBJEXT)232 SynTree/DeclReplacer.$(OBJEXT) 234 233 am__objects_8 = CompilationState.$(OBJEXT) $(am__objects_1) \ 235 234 $(am__objects_2) Concurrency/Keywords.$(OBJEXT) \ … … 428 427 CYGPATH_W = @CYGPATH_W@ 429 428 DEFS = @DEFS@ 430 DEMANGLER = @DEMANGLER@431 429 DEPDIR = @DEPDIR@ 432 430 DLLTOOL = @DLLTOOL@ … … 454 452 LIBCFA_TARGET_DIRS = @LIBCFA_TARGET_DIRS@ 455 453 LIBCFA_TARGET_MAKEFILES = @LIBCFA_TARGET_MAKEFILES@ 456 LIBDEMANGLE = @LIBDEMANGLE@457 454 LIBOBJS = @LIBOBJS@ 458 455 LIBS = @LIBS@ … … 694 691 SynTree/TypeSubstitution.cc \ 695 692 SynTree/Attribute.cc \ 696 SynTree/DeclReplacer.cc \ 697 SynTree/TopLvalue.cc 693 SynTree/DeclReplacer.cc 698 694 699 695 … … 707 703 demangler_SOURCES = SymTab/demangler.cc # test driver for the demangler, also useful as a sanity check that libdemangle.a is complete 708 704 demangler_LDADD = libdemangle.a -ldl # yywrap 709 noinst_LIBRARIES = $(LIBDEMANGLE) 710 EXTRA_LIBRARIES = libdemangle.a 705 noinst_LIBRARIES = libdemangle.a 711 706 libdemangle_a_SOURCES = $(SRCDEMANGLE) 712 707 all: $(BUILT_SOURCES) … … 1024 1019 SynTree/DeclReplacer.$(OBJEXT): SynTree/$(am__dirstamp) \ 1025 1020 SynTree/$(DEPDIR)/$(am__dirstamp) 1026 SynTree/TopLvalue.$(OBJEXT): SynTree/$(am__dirstamp) \1027 SynTree/$(DEPDIR)/$(am__dirstamp)1028 1021 Tuples/$(am__dirstamp): 1029 1022 @$(MKDIR_P) Tuples … … 1336 1329 @AMDEP_TRUE@@am__include@ @am__quote@SynTree/$(DEPDIR)/ReferenceType.Po@am__quote@ 1337 1330 @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@1339 1331 @AMDEP_TRUE@@am__include@ @am__quote@SynTree/$(DEPDIR)/TupleExpr.Po@am__quote@ 1340 1332 @AMDEP_TRUE@@am__include@ @am__quote@SynTree/$(DEPDIR)/TupleType.Po@am__quote@ … … 1670 1662 $(addprefix $(srcdir)/, ResolvExpr/ConversionCost.cc ResolvExpr/CommonType.cc SymTab/ManglerCommon.cc) : $(srcdir)/SynTree/Type.h 1671 1663 1672 $(srcdir)/ AST/Type.hpp: BasicTypes-gen.cc1664 $(srcdir)/SynTree/Type.h : BasicTypes-gen.cc 1673 1665 ${AM_V_GEN}${CXXCOMPILE} $< -o BasicTypes-gen -Wall -Wextra 1674 1666 @./BasicTypes-gen -
src/Parser/ExpressionNode.cc
r330d933 rf9bf142 10 10 // Created On : Sat May 16 13:17:07 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Sun Aug 4 20:57:55201913 // Update Count : 97 812 // Last Modified On : Sun Mar 10 16:10:32 2019 13 // Update Count : 976 14 14 // 15 15 … … 109 109 110 110 Expression * build_constantInteger( string & str ) { 111 static const BasicType::Kind kind[2][ 6] = {111 static const BasicType::Kind kind[2][7] = { 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
r330d933 rf9bf142 10 10 * Created On : Sat Sep 22 08:58:10 2001 11 11 * Last Modified By : Peter A. Buhr 12 * Last Modified On : Sun Aug 4 20:53:47201913 * Update Count : 71 912 * Last Modified On : Thu Jul 25 22:08:32 2019 13 * Update Count : 716 14 14 */ 15 15 … … 273 273 __inline__ { KEYWORD_RETURN(INLINE); } // GCC 274 274 int { KEYWORD_RETURN(INT); } 275 int128 { KEYWORD_RETURN(INT128); } // CFA276 275 __int128 { KEYWORD_RETURN(INT128); } // GCC 277 __int128_t{ KEYWORD_RETURN(INT128); } // GCC276 int128 { KEYWORD_RETURN(INT128); } // GCC 278 277 __label__ { KEYWORD_RETURN(LABEL); } // GCC 279 278 long { KEYWORD_RETURN(LONG); } … … 314 313 __typeof__ { KEYWORD_RETURN(TYPEOF); } // GCC 315 314 union { KEYWORD_RETURN(UNION); } 316 __uint128_t { KEYWORD_RETURN(UINT128); } // GCC317 315 unsigned { KEYWORD_RETURN(UNSIGNED); } 318 316 __builtin_va_list { KEYWORD_RETURN(VALIST); } // GCC -
src/Parser/parser.yy
r330d933 rf9bf142 10 10 // Created On : Sat Sep 1 20:22:55 2001 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Sun Aug 4 21:48:23201913 // Update Count : 43 6412 // Last Modified On : Thu Jul 25 22:31:38 2019 13 // Update Count : 4359 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 UINT128 uuFLOAT80 uuFLOAT128// GCC270 %token INT128 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 | UINT1281829 { $$ = DeclarationNode::newBasicType( DeclarationNode::Int128 )->addType( DeclarationNode::newSignedNess( DeclarationNode::Unsigned ) ); }1830 1828 | FLOAT 1831 1829 { $$ = DeclarationNode::newBasicType( DeclarationNode::Float ); } -
src/ResolvExpr/AlternativeFinder.cc
r330d933 rf9bf142 9 9 // Author : Richard C. Bilson 10 10 // Created On : Sat May 16 23:52:08 2015 11 // Last Modified By : Andrew Beach12 // Last Modified On : Thu Aug 8 16:35:00201913 // Update Count : 3 811 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Thu Jul 25 22:37:46 2019 13 // Update Count : 37 14 14 // 15 15 … … 377 377 } 378 378 379 Cost computeConversionCost( Type * actualType, Type * formalType, bool actualIsLvalue, 380 const SymTab::Indexer &indexer, const TypeEnvironment & env ) { 379 Cost computeConversionCost( Type * actualType, Type * formalType, const SymTab::Indexer &indexer, const TypeEnvironment & env ) { 381 380 PRINT( 382 381 std::cerr << std::endl << "converting "; … … 388 387 std::cerr << std::endl; 389 388 ) 390 Cost convCost = conversionCost( actualType, formalType, actualIsLvalue,indexer, env );389 Cost convCost = conversionCost( actualType, formalType, indexer, env ); 391 390 PRINT( 392 391 std::cerr << std::endl << "cost is " << convCost << std::endl; … … 403 402 404 403 Cost computeExpressionConversionCost( Expression *& actualExpr, Type * formalType, const SymTab::Indexer &indexer, const TypeEnvironment & env ) { 405 Cost convCost = computeConversionCost( 406 actualExpr->result, formalType, actualExpr->get_lvalue(), indexer, env ); 404 Cost convCost = computeConversionCost( actualExpr->result, formalType, indexer, env ); 407 405 408 406 // if there is a non-zero conversion cost, ignoring poly cost, then the expression requires conversion. … … 1137 1135 bool isLvalue( Expression *expr ) { 1138 1136 // xxx - recurse into tuples? 1139 return expr->result && ( expr-> get_lvalue() || dynamic_cast< ReferenceType * >( expr->result ) );1137 return expr->result && ( expr->result->get_lvalue() || dynamic_cast< ReferenceType * >( expr->result ) ); 1140 1138 } 1141 1139 … … 1188 1186 assert( toType ); 1189 1187 toType = resolveTypeof( toType, indexer ); 1190 assert(!dynamic_cast<TypeofType *>(toType));1191 1188 SymTab::validateType( toType, &indexer ); 1192 1189 adjustExprType( toType, env, indexer ); … … 1215 1212 unify( castExpr->result, alt.expr->result, alt.env, needAssertions, 1216 1213 haveAssertions, openVars, indexer ); 1217 Cost thisCost = castCost( alt.expr->result, castExpr->result, alt.expr->get_lvalue(),1218 indexer,alt.env );1214 Cost thisCost = castCost( alt.expr->result, castExpr->result, indexer, 1215 alt.env ); 1219 1216 PRINT( 1220 1217 std::cerr << "working on cast with result: " << castExpr->result << std::endl; … … 1643 1640 // xxx - do some inspecting on this line... why isn't result bound to initAlt.type? 1644 1641 1645 Cost thisCost = castCost( alt.expr->result, toType, alt.expr->get_lvalue(), 1646 indexer, newEnv ); 1642 Cost thisCost = castCost( alt.expr->result, toType, indexer, newEnv ); 1647 1643 if ( thisCost != Cost::infinity ) { 1648 1644 // count one safe conversion for each value that is thrown away -
src/ResolvExpr/CastCost.cc
r330d933 rf9bf142 9 9 // Author : Richard C. Bilson 10 10 // Created On : Sun May 17 06:57:43 2015 11 // Last Modified By : Andrew Beach12 // Last Modified On : T hu Aug 8 16:12:00 201913 // Update Count : 811 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Tue Feb 2 15:34:36 2016 13 // Update Count : 7 14 14 // 15 15 … … 37 37 struct CastCost_old : public ConversionCost { 38 38 public: 39 CastCost_old( const Type * dest, bool srcIsLvalue, 40 const SymTab::Indexer &indexer, const TypeEnvironment &env, CostFunction costFunc ); 39 CastCost_old( const Type * dest, const SymTab::Indexer &indexer, const TypeEnvironment &env, CostFunction costFunc ); 41 40 42 41 using ConversionCost::previsit; … … 46 45 }; 47 46 48 Cost castCost( const Type * src, const Type * dest, bool srcIsLvalue, 49 const SymTab::Indexer &indexer, const TypeEnvironment &env ) { 47 Cost castCost( const Type * src, const Type * dest, const SymTab::Indexer &indexer, const TypeEnvironment &env ) { 50 48 if ( const TypeInstType * destAsTypeInst = dynamic_cast< const TypeInstType * >( dest ) ) { 51 49 if ( const EqvClass * eqvClass = env.lookup( destAsTypeInst->name ) ) { 52 50 if ( eqvClass->type ) { 53 return castCost( src, eqvClass->type, srcIsLvalue,indexer, env );51 return castCost( src, eqvClass->type, indexer, env ); 54 52 } else { 55 53 return Cost::infinity; … … 59 57 const TypeDecl * type = strict_dynamic_cast< const TypeDecl * >( namedType ); 60 58 if ( type->base ) { 61 return castCost( src, type->base, srcIsLvalue,indexer, env ) + Cost::safe;59 return castCost( src, type->base, indexer, env ) + Cost::safe; 62 60 } // if 63 61 } // if … … 80 78 } else if ( const ReferenceType * refType = dynamic_cast< const ReferenceType * > ( dest ) ) { 81 79 PRINT( std::cerr << "conversionCost: dest is reference" << std::endl; ) 82 return convertToReferenceCost( src, refType, srcIsLvalue,indexer, env, [](const Type * t1, const Type * t2, const SymTab::Indexer & indexer, const TypeEnvironment & env ) {80 return convertToReferenceCost( src, refType, indexer, env, [](const Type * t1, const Type * t2, const SymTab::Indexer & indexer, const TypeEnvironment & env ) { 83 81 return ptrsCastable( t1, t2, env, indexer ); 84 82 }); 85 83 } else { 86 84 PassVisitor<CastCost_old> converter( 87 dest, srcIsLvalue,indexer, env,88 (Cost (*)( const Type *, const Type *, bool,const SymTab::Indexer &, const TypeEnvironment & ))85 dest, indexer, env, 86 (Cost (*)( const Type *, const Type *, const SymTab::Indexer &, const TypeEnvironment & )) 89 87 castCost ); 90 88 src->accept( converter ); … … 98 96 } 99 97 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 ) { 98 CastCost_old::CastCost_old( const Type * dest, const SymTab::Indexer &indexer, const TypeEnvironment &env, CostFunction costFunc ) 99 : ConversionCost( dest, indexer, env, costFunc ) { 103 100 } 104 101 … … 109 106 cost = Cost::unsafe; 110 107 } else { 111 cost = conversionCost( basicType, dest, srcIsLvalue,indexer, env );108 cost = conversionCost( basicType, dest, indexer, env ); 112 109 } // if 113 110 } -
src/ResolvExpr/CommonType.cc
r330d933 rf9bf142 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
r330d933 rf9bf142 10 10 // Created On : Sun May 17 07:06:19 2015 11 11 // Last Modified By : Andrew Beach 12 // Last Modified On : Mon Aug 12 10:21:00 201913 // Update Count : 2 712 // Last Modified On : Mon Jun 24 13:33:00 2019 13 // Update Count : 26 14 14 // 15 15 … … 46 46 #endif 47 47 48 Cost conversionCost( const Type * src, const Type * dest, bool srcIsLvalue, 49 const SymTab::Indexer &indexer, const TypeEnvironment &env ) { 48 Cost conversionCost( const Type * src, const Type * dest, const SymTab::Indexer &indexer, const TypeEnvironment &env ) { 50 49 if ( const TypeInstType * destAsTypeInst = dynamic_cast< const TypeInstType * >( dest ) ) { 51 50 PRINT( std::cerr << "type inst " << destAsTypeInst->name; ) 52 51 if ( const EqvClass * eqvClass = env.lookup( destAsTypeInst->name ) ) { 53 52 if ( eqvClass->type ) { 54 return conversionCost( src, eqvClass->type, srcIsLvalue,indexer, env );53 return conversionCost( src, eqvClass->type, indexer, env ); 55 54 } else { 56 55 return Cost::infinity; … … 62 61 assert( type ); 63 62 if ( type->base ) { 64 return conversionCost( src, type->base, srcIsLvalue, indexer, env ) 65 + Cost::safe; 63 return conversionCost( src, type->base, indexer, env ) + Cost::safe; 66 64 } // if 67 65 } // if … … 83 81 } else if ( const ReferenceType * refType = dynamic_cast< const ReferenceType * > ( dest ) ) { 84 82 PRINT( std::cerr << "conversionCost: dest is reference" << std::endl; ) 85 return convertToReferenceCost( src, refType, srcIsLvalue,indexer, env, [](const Type * const t1, const Type * t2, const SymTab::Indexer &, const TypeEnvironment & env ){83 return convertToReferenceCost( src, refType, indexer, env, [](const Type * const t1, const Type * t2, const SymTab::Indexer &, const TypeEnvironment & env ){ 86 84 return ptrsAssignable( t1, t2, env ); 87 85 }); 88 86 } else { 89 87 PassVisitor<ConversionCost> converter( 90 dest, srcIsLvalue,indexer, env,91 (Cost (*)(const Type *, const Type *, bool,const SymTab::Indexer&, const TypeEnvironment&))88 dest, indexer, env, 89 (Cost (*)(const Type *, const Type *, const SymTab::Indexer&, const TypeEnvironment&)) 92 90 conversionCost ); 93 91 src->accept( converter ); … … 100 98 } 101 99 102 static Cost convertToReferenceCost( const Type * src, const Type * dest, bool srcIsLvalue, 103 int diff, const SymTab::Indexer & indexer, const TypeEnvironment & env, PtrsFunction func ) { 100 Cost convertToReferenceCost( const Type * src, const Type * dest, int diff, const SymTab::Indexer & indexer, const TypeEnvironment & env, PtrsFunction func ) { 104 101 PRINT( std::cerr << "convert to reference cost... diff " << diff << " " << src << " / " << dest << std::endl; ) 105 102 if ( diff > 0 ) { 106 103 // TODO: document this 107 Cost cost = convertToReferenceCost( 108 strict_dynamic_cast< const ReferenceType * >( src )->base, dest, srcIsLvalue, 109 diff-1, indexer, env, func ); 104 Cost cost = convertToReferenceCost( strict_dynamic_cast< const ReferenceType * >( src )->base, dest, diff-1, indexer, env, func ); 110 105 cost.incReference(); 111 106 return cost; 112 107 } else if ( diff < -1 ) { 113 108 // TODO: document this 114 Cost cost = convertToReferenceCost( 115 src, strict_dynamic_cast< const ReferenceType * >( dest )->base, srcIsLvalue, 116 diff+1, indexer, env, func ); 109 Cost cost = convertToReferenceCost( src, strict_dynamic_cast< const ReferenceType * >( dest )->base, diff+1, indexer, env, func ); 117 110 cost.incReference(); 118 111 return cost; … … 145 138 PRINT( std::cerr << "reference to rvalue conversion" << std::endl; ) 146 139 PassVisitor<ConversionCost> converter( 147 dest, srcIsLvalue,indexer, env,148 (Cost (*)(const Type *, const Type *, bool,const SymTab::Indexer&, const TypeEnvironment&))140 dest, indexer, env, 141 (Cost (*)(const Type *, const Type *, const SymTab::Indexer&, const TypeEnvironment&)) 149 142 conversionCost ); 150 143 src->accept( converter ); … … 157 150 if ( typesCompatibleIgnoreQualifiers( src, destAsRef->base, indexer, env ) ) { 158 151 PRINT( std::cerr << "converting compatible base type" << std::endl; ) 159 assert( src->get_lvalue() == srcIsLvalue ); 160 if ( srcIsLvalue ) { 152 if ( src->get_lvalue() ) { 161 153 PRINT( 162 154 std::cerr << "lvalue to reference conversion" << std::endl; … … 186 178 } 187 179 188 Cost convertToReferenceCost( const Type * src, const ReferenceType * dest, bool srcIsLvalue, 189 const SymTab::Indexer & indexer, const TypeEnvironment & env, PtrsFunction func ) { 180 Cost convertToReferenceCost( const Type * src, const ReferenceType * dest, const SymTab::Indexer & indexer, const TypeEnvironment & env, PtrsFunction func ) { 190 181 int sdepth = src->referenceDepth(), ddepth = dest->referenceDepth(); 191 Cost cost = convertToReferenceCost( src, dest, s rcIsLvalue, sdepth-ddepth, indexer, env, func );182 Cost cost = convertToReferenceCost( src, dest, sdepth-ddepth, indexer, env, func ); 192 183 PRINT( std::cerr << "convertToReferenceCost result: " << cost << std::endl; ) 193 184 return cost; 194 185 } 195 186 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 ) {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 ) { 198 189 } 199 190 … … 226 217 // GENERATED BY BasicTypes-gen.cc 227 218 static const int costMatrix[BasicType::NUMBER_OF_BASIC_TYPES][BasicType::NUMBER_OF_BASIC_TYPES] = { // path length from root to node 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, },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, }, 264 255 /* _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, }, 265 256 }; // costMatrix … … 274 265 // GENERATED BY BasicTypes-gen.cc 275 266 static const int signMatrix[BasicType::NUMBER_OF_BASIC_TYPES][BasicType::NUMBER_OF_BASIC_TYPES] = { // number of sign changes in safe conversion 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, },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, }, 312 303 /* _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, }, 313 304 }; // signMatrix … … 380 371 // recursively compute conversion cost from T1 to T2. 381 372 // cv can be safely dropped because of 'implicit dereference' behavior. 382 cost = costFunc( refType->base, dest, srcIsLvalue,indexer, env );373 cost = costFunc( refType->base, dest, indexer, env ); 383 374 if ( refType->base->tq == dest->tq ) { 384 375 cost.incReference(); // prefer exact qualifiers … … 412 403 static Type::Qualifiers q; 413 404 static BasicType integer( q, BasicType::SignedInt ); 414 cost = costFunc( &integer, dest, srcIsLvalue,indexer, env ); // safe if dest >= int405 cost = costFunc( &integer, dest, indexer, env ); // safe if dest >= int 415 406 if ( cost < Cost::unsafe ) { 416 407 cost.incSafe(); … … 422 413 void ConversionCost::postvisit( const TypeInstType * inst ) { 423 414 if ( const EqvClass * eqvClass = env.lookup( inst->name ) ) { 424 cost = costFunc( eqvClass->type, dest, srcIsLvalue,indexer, env );415 cost = costFunc( eqvClass->type, dest, indexer, env ); 425 416 } else if ( const TypeInstType * destAsInst = dynamic_cast< const TypeInstType * >( dest ) ) { 426 417 if ( inst->name == destAsInst->name ) { … … 432 423 assert( type ); 433 424 if ( type->base ) { 434 cost = costFunc( type->base, dest, srcIsLvalue,indexer, env ) + Cost::safe;425 cost = costFunc( type->base, dest, indexer, env ) + Cost::safe; 435 426 } // if 436 427 } // if … … 443 434 std::list< Type * >::const_iterator destIt = destAsTuple->types.begin(); 444 435 while ( srcIt != tupleType->types.end() && destIt != destAsTuple->types.end() ) { 445 Cost newCost = costFunc( * srcIt++, * destIt++, srcIsLvalue,indexer, env );436 Cost newCost = costFunc( * srcIt++, * destIt++, indexer, env ); 446 437 if ( newCost == Cost::infinity ) { 447 438 return; … … 543 534 } 544 535 545 static Cost convertToReferenceCost( const ast::Type * src, const ast::Type * dst,546 int diff,const ast::SymbolTable & symtab, const ast::TypeEnvironment & env,536 Cost convertToReferenceCost( const ast::Type * src, const ast::Type * dst, int diff, 537 const ast::SymbolTable & symtab, const ast::TypeEnvironment & env, 547 538 NumCostCalculation func ) { 548 539 if ( 0 < diff ) { -
src/ResolvExpr/ConversionCost.h
r330d933 rf9bf142 10 10 // Created On : Sun May 17 09:37:28 2015 11 11 // Last Modified By : Andrew Beach 12 // Last Modified On : Thu Aug 8 16:13:00 201913 // Update Count : 612 // Last Modified On : Mon Jun 24 10:00:00 2019 13 // Update Count : 5 14 14 // 15 15 … … 33 33 class TypeEnvironment; 34 34 35 typedef std::function<Cost(const Type *, const Type *, bool, 36 const SymTab::Indexer &, const TypeEnvironment &)> CostFunction; 37 35 typedef std::function<Cost(const Type *, const Type *, const SymTab::Indexer &, const TypeEnvironment &)> CostFunction; 38 36 struct ConversionCost : public WithShortCircuiting { 39 37 public: 40 ConversionCost( const Type * dest, bool srcIsLvalue, 41 const SymTab::Indexer &indexer, const TypeEnvironment &env, CostFunction ); 38 ConversionCost( const Type * dest, const SymTab::Indexer &indexer, const TypeEnvironment &env, CostFunction ); 42 39 43 40 Cost get_cost() const { return cost; } … … 62 59 protected: 63 60 const Type * dest; 64 bool srcIsLvalue;65 61 const SymTab::Indexer &indexer; 66 62 Cost cost; … … 70 66 71 67 typedef std::function<int(const Type *, const Type *, const SymTab::Indexer &, const TypeEnvironment &)> PtrsFunction; 72 Cost convertToReferenceCost( const Type * src, const ReferenceType * dest, bool srcIsLvalue, 73 const SymTab::Indexer & indexer, const TypeEnvironment & env, PtrsFunction func ); 68 Cost convertToReferenceCost( const Type * src, const ReferenceType * dest, const SymTab::Indexer & indexer, const TypeEnvironment & env, PtrsFunction func ); 74 69 75 70 // Some function pointer types, differ in return type. -
src/ResolvExpr/ResolveAssertions.cc
r330d933 rf9bf142 9 9 // Author : Aaron B. Moss 10 10 // Created On : Fri Oct 05 13:46:00 2018 11 // Last Modified By : Andrew Beach12 // Last Modified On : Thu Aug 8 16:47:00201913 // Update Count : 311 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Wed Jul 10 16:10:37 2019 13 // Update Count : 2 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() );159 158 k += computeConversionCost( 160 assn.match.adjType, assn.decl->get_type(), false,indexer, x.env );159 assn.match.adjType, assn.decl->get_type(), indexer, x.env ); 161 160 162 161 // mark vars+specialization cost on function-type assertions -
src/ResolvExpr/typeops.h
r330d933 rf9bf142 9 9 // Author : Richard C. Bilson 10 10 // Created On : Sun May 17 07:28:22 2015 11 // Last Modified By : Andrew Beach12 // Last Modified On : Thu Aug 8 16:36:00201913 // Update Count : 511 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Fri Feb 8 09:30:34 2019 13 // Update Count : 4 14 14 // 15 15 … … 80 80 81 81 // in CastCost.cc 82 Cost castCost( const Type * src, const Type * dest, bool srcIsLvalue, 83 const SymTab::Indexer & indexer, const TypeEnvironment & env ); 82 Cost castCost( const Type * src, const Type * dest, const SymTab::Indexer & indexer, const TypeEnvironment & env ); 84 83 Cost castCost( 85 84 const ast::Type * src, const ast::Type * dst, const ast::SymbolTable & symtab, … … 87 86 88 87 // in ConversionCost.cc 89 Cost conversionCost( const Type * src, const Type * dest, bool srcIsLvalue, 90 const SymTab::Indexer & indexer, const TypeEnvironment & env ); 88 Cost conversionCost( const Type * src, const Type * dest, const SymTab::Indexer & indexer, const TypeEnvironment & env ); 91 89 Cost conversionCost( 92 90 const ast::Type * src, const ast::Type * dst, const ast::SymbolTable & symtab, … … 94 92 95 93 // in AlternativeFinder.cc 96 Cost computeConversionCost( Type * actualType, Type * formalType, bool actualIsLvalue,94 Cost computeConversionCost( Type * actualType, Type * formalType, 97 95 const SymTab::Indexer & indexer, const TypeEnvironment & env ); 98 96 -
src/SymTab/Validate.cc
r330d933 rf9bf142 9 9 // Author : Richard C. Bilson 10 10 // Created On : Sun May 17 21:50:04 2015 11 // Last Modified By : Andrew Beach12 // Last Modified On : Wed Aug 7 6:42:00 201913 // Update Count : 3 6011 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Mon Aug 28 13:47:23 2017 13 // Update Count : 359 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, clearInnerLvalue84 83 #include "SynTree/Type.h" // for Type, TypeInstType, EnumInstType 85 84 #include "SynTree/TypeSubstitution.h" // for TypeSubstitution … … 309 308 PassVisitor<FixQualifiedTypes> fixQual; 310 309 311 assertTopLvalue( translationUnit );312 310 { 313 311 Stats::Heap::newPass("validate-A"); … … 318 316 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 319 317 } 320 assertTopLvalue( translationUnit );321 318 { 322 319 Stats::Heap::newPass("validate-B"); 323 320 Stats::Time::BlockGuard guard("validate-B"); 324 assertTopLvalue( translationUnit );325 321 Stats::Time::TimeBlock("Link Reference To Types", [&]() { 326 322 acceptAll( translationUnit, lrt ); // must happen before autogen, because sized flag needs to propagate to generated functions 327 323 }); 328 clearInnerLvalue( translationUnit );329 assertTopLvalue( translationUnit );330 324 Stats::Time::TimeBlock("Fix Qualified Types", [&]() { 331 325 mutateAll( translationUnit, fixQual ); // must happen after LinkReferenceToTypes_old, because aggregate members are accessed 332 326 }); 333 assertTopLvalue( translationUnit );334 327 Stats::Time::TimeBlock("Hoist Structs", [&]() { 335 328 HoistStruct::hoistStruct( translationUnit ); // must happen after EliminateTypedef, so that aggregate typedefs occur in the correct order 336 329 }); 337 assertTopLvalue( translationUnit );338 330 Stats::Time::TimeBlock("Eliminate Typedefs", [&]() { 339 331 EliminateTypedef::eliminateTypedef( translationUnit ); // 340 332 }); 341 333 } 342 assertTopLvalue( translationUnit );343 334 { 344 335 Stats::Heap::newPass("validate-C"); … … 349 340 InitTweak::fixReturnStatements( translationUnit ); // must happen before autogen 350 341 } 351 assertTopLvalue( translationUnit );352 342 { 353 343 Stats::Heap::newPass("validate-D"); 354 344 Stats::Time::BlockGuard guard("validate-D"); 355 assertTopLvalue( translationUnit );356 345 Stats::Time::TimeBlock("Apply Concurrent Keywords", [&]() { 357 346 Concurrency::applyKeywords( translationUnit ); 358 347 }); 359 clearInnerLvalue( translationUnit );360 assertTopLvalue( translationUnit );361 348 Stats::Time::TimeBlock("Forall Pointer Decay", [&]() { 362 349 acceptAll( translationUnit, fpd ); // must happen before autogenerateRoutines, after Concurrency::applyKeywords because uniqueIds must be set on declaration before resolution 363 350 }); 364 assertTopLvalue( translationUnit );365 351 Stats::Time::TimeBlock("Hoist Control Declarations", [&]() { 366 352 ControlStruct::hoistControlDecls( translationUnit ); // hoist initialization out of for statements; must happen before autogenerateRoutines 367 353 }); 368 assertTopLvalue( translationUnit );369 354 Stats::Time::TimeBlock("Generate Autogen routines", [&]() { 370 355 autogenerateRoutines( translationUnit ); // moved up, used to be below compoundLiteral - currently needs EnumAndPointerDecay_old 371 356 }); 372 clearInnerLvalue( translationUnit ); 373 } 374 assertTopLvalue( translationUnit ); 357 } 375 358 { 376 359 Stats::Heap::newPass("validate-E"); 377 360 Stats::Time::BlockGuard guard("validate-E"); 378 assertTopLvalue( translationUnit );379 361 Stats::Time::TimeBlock("Implement Mutex Func", [&]() { 380 362 Concurrency::implementMutexFuncs( translationUnit ); 381 363 }); 382 clearInnerLvalue( translationUnit );383 assertTopLvalue( translationUnit );384 364 Stats::Time::TimeBlock("Implement Thread Start", [&]() { 385 365 Concurrency::implementThreadStarter( translationUnit ); 386 366 }); 387 assertTopLvalue( translationUnit );388 367 Stats::Time::TimeBlock("Compound Literal", [&]() { 389 368 mutateAll( translationUnit, compoundliteral ); 390 369 }); 391 assertTopLvalue( translationUnit );392 370 Stats::Time::TimeBlock("Resolve With Expressions", [&]() { 393 371 ResolvExpr::resolveWithExprs( translationUnit ); // must happen before FixObjectType because user-code is resolved and may contain with variables 394 372 }); 395 clearInnerLvalue( translationUnit ); 396 } 397 assertTopLvalue( translationUnit ); 373 } 398 374 { 399 375 Stats::Heap::newPass("validate-F"); 400 376 Stats::Time::BlockGuard guard("validate-F"); 401 assertTopLvalue( translationUnit );402 377 Stats::Time::TimeBlock("Fix Object Type", [&]() { 403 378 FixObjectType::fix( translationUnit ); 404 379 }); 405 assertTopLvalue( translationUnit );406 380 Stats::Time::TimeBlock("Array Length", [&]() { 407 381 ArrayLength::computeLength( translationUnit ); 408 382 }); 409 clearInnerLvalue( translationUnit );410 assertTopLvalue( translationUnit );411 383 Stats::Time::TimeBlock("Find Special Declarations", [&]() { 412 384 Validate::findSpecialDecls( translationUnit ); 413 385 }); 414 assertTopLvalue( translationUnit );415 386 Stats::Time::TimeBlock("Fix Label Address", [&]() { 416 387 mutateAll( translationUnit, labelAddrFixer ); 417 388 }); 418 assertTopLvalue( translationUnit );419 389 Stats::Time::TimeBlock("Handle Attributes", [&]() { 420 390 Validate::handleAttributes( translationUnit ); 421 391 }); 422 392 } 423 assertTopLvalue( translationUnit );424 393 } 425 394 -
src/SynTree/AddressExpr.cc
r330d933 rf9bf142 42 42 AddressExpr::AddressExpr( Expression *arg ) : Expression(), arg( arg ) { 43 43 if ( arg->result ) { 44 if ( arg-> get_lvalue() ) {44 if ( arg->result->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
r330d933 rf9bf142 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 : Mon Aug 12 14:28:00 201913 // Update Count : 511 // Last Modified By : Rob Schluntz 12 // Last Modified On : Tue Apr 26 12:41:06 2016 13 // Update Count : 4 14 14 // 15 15 … … 76 76 } 77 77 78 bool ApplicationExpr::get_lvalue() const {79 return result->get_lvalue();80 }81 82 78 void ApplicationExpr::print( std::ostream &os, Indenter indent ) const { 83 79 os << "Application of" << std::endl << indent+1; -
src/SynTree/BasicType.cc
r330d933 rf9bf142 10 10 // Created On : Mon May 18 07:44:20 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Sun Aug 4 21:07:44201913 // Update Count : 1 312 // Last Modified On : Thu Jan 31 21:37:36 2019 13 // Update Count : 12 14 14 // 15 15 … … 31 31 bool BasicType::isInteger() const { 32 32 return kind <= UnsignedInt128; 33 #if 0 34 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 } // switch 65 assert( false ); 66 return false; 67 #endif 33 68 } 34 69 -
src/SynTree/CommaExpr.cc
r330d933 rf9bf142 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 : Mon Arg 12 16:11:00201613 // Update Count : 211 // Last Modified By : Rob Schluntz 12 // Last Modified On : Mon May 02 15:19:44 2016 13 // Update Count : 1 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 46 41 void CommaExpr::print( std::ostream &os, Indenter indent ) const { 47 42 os << "Comma Expression:" << std::endl; -
src/SynTree/Expression.cc
r330d933 rf9bf142 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 : Th r Aug 15 13:43:00201913 // Update Count : 6 411 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Thu Jul 25 22:21:48 2019 13 // Update Count : 61 14 14 // 15 15 … … 63 63 } 64 64 65 bool Expression::get_lvalue() const {66 assert( !result->get_lvalue() );67 return false;68 }69 70 65 void Expression::print( std::ostream & os, Indenter indent ) const { 71 66 printInferParams( inferParams, os, indent+1, 0 ); … … 139 134 } 140 135 141 bool VariableExpr::get_lvalue() const {142 return result->get_lvalue();143 }144 145 136 VariableExpr * VariableExpr::functionPointer( FunctionDecl * func ) { 146 137 VariableExpr * funcExpr = new VariableExpr( func ); … … 274 265 CastExpr::~CastExpr() { 275 266 delete arg; 276 }277 278 bool CastExpr::get_lvalue() const {279 return result->get_lvalue();280 267 } 281 268 … … 389 376 // don't delete the member declaration, since it points somewhere else in the tree 390 377 delete aggregate; 391 }392 393 bool MemberExpr::get_lvalue() const {394 assert( result->get_lvalue() );395 return true;396 378 } 397 379 … … 446 428 } 447 429 448 bool UntypedExpr::get_lvalue() const {449 return result->get_lvalue();450 }451 430 452 431 void UntypedExpr::print( std::ostream & os, Indenter indent ) const { … … 507 486 delete arg2; 508 487 delete arg3; 509 }510 511 bool ConditionalExpr::get_lvalue() const {512 return result->get_lvalue();513 488 } 514 489 … … 569 544 } 570 545 571 bool ConstructorExpr::get_lvalue() const {572 return result->get_lvalue();573 }574 575 546 void ConstructorExpr::print( std::ostream & os, Indenter indent ) const { 576 547 os << "Constructor Expression: " << std::endl << indent+1; … … 590 561 CompoundLiteralExpr::~CompoundLiteralExpr() { 591 562 delete initializer; 592 }593 594 bool CompoundLiteralExpr::get_lvalue() const {595 assert( result->get_lvalue() );596 return true;597 563 } 598 564 … … 646 612 result = new VoidType( Type::Qualifiers() ); 647 613 } 648 }649 bool StmtExpr::get_lvalue() const {650 return result->get_lvalue();651 614 } 652 615 void StmtExpr::print( std::ostream & os, Indenter indent ) const { -
src/SynTree/Expression.h
r330d933 rf9bf142 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 : Th r Aug 15 13:46:00201913 // Update Count : 5 411 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Thu Jul 25 22:21:44 2019 13 // Update Count : 50 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;74 73 75 74 TypeSubstitution * get_env() const { return env; } … … 99 98 virtual ~ApplicationExpr(); 100 99 101 bool get_lvalue() const final;102 103 100 Expression * get_function() const { return function; } 104 101 void set_function( Expression * newValue ) { function = newValue; } … … 123 120 UntypedExpr( const UntypedExpr & other ); 124 121 virtual ~UntypedExpr(); 125 126 bool get_lvalue() const final;127 122 128 123 Expression * get_function() const { return function; } … … 213 208 virtual ~CastExpr(); 214 209 215 bool get_lvalue() const final;216 217 210 Expression * get_arg() const { return arg; } 218 211 void set_arg( Expression * newValue ) { arg = newValue; } … … 298 291 virtual ~MemberExpr(); 299 292 300 bool get_lvalue() const final;301 302 293 DeclarationWithType * get_member() const { return member; } 303 294 void set_member( DeclarationWithType * newValue ) { member = newValue; } … … 322 313 VariableExpr( const VariableExpr & other ); 323 314 virtual ~VariableExpr(); 324 325 bool get_lvalue() const final;326 315 327 316 DeclarationWithType * get_var() const { return var; } … … 511 500 virtual ~ConditionalExpr(); 512 501 513 bool get_lvalue() const final;514 515 502 Expression * get_arg1() const { return arg1; } 516 503 void set_arg1( Expression * newValue ) { arg1 = newValue; } … … 537 524 virtual ~CommaExpr(); 538 525 539 bool get_lvalue() const final;540 541 526 Expression * get_arg1() const { return arg1; } 542 527 void set_arg1( Expression * newValue ) { arg1 = newValue; } … … 625 610 ~ConstructorExpr(); 626 611 627 bool get_lvalue() const final;628 629 612 Expression * get_callExpr() const { return callExpr; } 630 613 void set_callExpr( Expression * newValue ) { callExpr = newValue; } … … 645 628 CompoundLiteralExpr( const CompoundLiteralExpr & other ); 646 629 virtual ~CompoundLiteralExpr(); 647 648 bool get_lvalue() const final;649 630 650 631 Initializer * get_initializer() const { return initializer; } … … 705 686 virtual ~TupleExpr(); 706 687 707 bool get_lvalue() const final;708 709 688 std::list<Expression*>& get_exprs() { return exprs; } 710 689 … … 725 704 TupleIndexExpr( const TupleIndexExpr & other ); 726 705 virtual ~TupleIndexExpr(); 727 728 bool get_lvalue() const final;729 706 730 707 Expression * get_tuple() const { return tuple; } … … 776 753 StmtExpr( const StmtExpr & other ); 777 754 virtual ~StmtExpr(); 778 779 bool get_lvalue() const final;780 755 781 756 CompoundStmt * get_statements() const { return statements; } -
src/SynTree/TupleExpr.cc
r330d933 rf9bf142 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 : Wed Aug 14 14:34:00 201913 // Update Count : 511 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Fri Mar 17 09:42:29 2017 13 // Update Count : 3 14 14 // 15 15 … … 57 57 } 58 58 59 bool TupleExpr::get_lvalue() const {60 return result->get_lvalue();61 }62 63 59 void TupleExpr::print( std::ostream &os, Indenter indent ) const { 64 60 os << "Tuple:" << std::endl; … … 80 76 TupleIndexExpr::~TupleIndexExpr() { 81 77 delete tuple; 82 }83 84 bool TupleIndexExpr::get_lvalue() const {85 assert( result->get_lvalue() );86 return true;87 78 } 88 79 -
src/SynTree/Type.cc
r330d933 rf9bf142 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 : Sun Aug 4 21:05:07201913 // Update Count : 4 511 // Last Modified By : Andrew Beach 12 // Last Modified On : Fri Jul 12 15:48:00 2019 13 // Update Count : 44 14 14 // 15 15 #include "Type.h" … … 24 24 using namespace std; 25 25 26 const char * BasicType::typeNames[] = { 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 27 68 "_Bool", 28 69 "char", … … 66 107 }; 67 108 static_assert( 68 sizeof(BasicType::typeNames) /sizeof(BasicType::typeNames[0]) == BasicType::NUMBER_OF_BASIC_TYPES,109 sizeof(BasicType::typeNames)/sizeof(BasicType::typeNames[0]) == BasicType::NUMBER_OF_BASIC_TYPES, 69 110 "Each basic type name should have a corresponding kind enum value" 70 111 ); … … 111 152 TypeSubstitution Type::genericSubstitution() const { assertf( false, "Non-aggregate type: %s", toCString( this ) ); } 112 153 113 void Type::print( std::ostream & os, Indenter indent ) const {154 void Type::print( std::ostream &os, Indenter indent ) const { 114 155 if ( ! forall.empty() ) { 115 156 os << "forall" << std::endl; -
src/SynTree/module.mk
r330d933 rf9bf142 49 49 SynTree/TypeSubstitution.cc \ 50 50 SynTree/Attribute.cc \ 51 SynTree/DeclReplacer.cc \ 52 SynTree/TopLvalue.cc 51 SynTree/DeclReplacer.cc 53 52 54 53 SRC += $(SRC_SYNTREE) -
src/main.cc
r330d933 rf9bf142 10 10 // Created On : Fri May 15 23:12:02 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Fri Aug 23 06:50:08201913 // Update Count : 60 712 // Last Modified On : Wed Jun 5 20:35:13 2019 13 // Update Count : 601 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, SIGSEGV 19 20 #include <cassert> // for assertf 20 21 #include <cstdio> // for fopen, FILE, fclose, stdin 21 22 #include <cstdlib> // for exit, free, abort, EXIT_F... 22 #include <csignal> // for signal, SIGABRT, SIGSEGV23 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...62 61 #include "SynTree/Declaration.h" // for Declaration 63 62 #include "SynTree/Visitor.h" // for acceptAll 64 63 #include "Tuples/Tuples.h" // for expandMemberTuples, expan... 65 64 #include "Virtual/ExpandCasts.h" // for expandCasts 66 67 65 68 66 using namespace std; … … 96 94 DeclarationNode * parseTree = nullptr; // program parse tree 97 95 98 static bool waiting_for_gdb = false; // flag to set cfa-cpp to wait for gdb on start99 100 96 static std::string PreludeDirector = ""; 101 97 102 static void parse_cmdline( int argc, char *argv[] );98 static void parse_cmdline( int argc, char *argv[], const char *& filename ); 103 99 static void parse( FILE * input, LinkageSpec::Spec linkage, bool shouldExit = false ); 104 100 static void dump( list< Declaration * > & translationUnit, ostream & out = cout ); … … 169 165 } // sigAbortHandler 170 166 167 171 168 int main( int argc, char * argv[] ) { 172 169 FILE * input; // use FILE rather than istream because yyin is FILE 173 170 ostream * output = & cout; 171 const char * filename = nullptr; 174 172 list< Declaration * > translationUnit; 175 173 … … 183 181 // } // for 184 182 185 parse_cmdline( argc, argv );// process command-line arguments183 parse_cmdline( argc, argv, filename ); // process command-line arguments 186 184 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 } // if194 185 195 186 try { … … 197 188 if ( optind < argc ) { // any commands after the flags ? => input file name 198 189 input = fopen( argv[ optind ], "r" ); 199 assertf( input, "cannot open %s because %s\n", argv[ optind ], strerror( errno ) ); 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"; 200 195 optind += 1; 201 196 } else { // no input file name 202 197 input = stdin; 198 // if running cfa-cpp directly, might forget to pass -F option. Since this takes from stdin, pass 199 // a fake name along 200 if ( filename == nullptr ) filename = "stdin"; 203 201 } // if 204 202 … … 259 257 Stats::Time::StopBlock(); 260 258 261 //std::cerr << "Post-Parse Check" << std::endl;262 clearInnerLvalue( translationUnit );263 assertTopLvalue( translationUnit );264 265 259 // add the assignment statement after the initialization of a type parameter 266 260 PASS( "Validate", SymTab::validate( translationUnit, symtabp ) ); … … 281 275 } // if 282 276 283 assertTopLvalue( translationUnit );284 277 PASS( "Fix Labels", ControlStruct::fixLabels( translationUnit ) ); 285 assertTopLvalue( translationUnit );286 278 PASS( "Fix Names", CodeGen::fixNames( translationUnit ) ); 287 assertTopLvalue( translationUnit );288 279 PASS( "Gen Init", InitTweak::genInit( translationUnit ) ); 289 assertTopLvalue( translationUnit );290 280 PASS( "Expand Member Tuples" , Tuples::expandMemberTuples( translationUnit ) ); 291 assertTopLvalue( translationUnit );292 281 if ( libcfap ) { 293 282 // generate the bodies of cfa library functions … … 313 302 } // if 314 303 315 assertTopLvalue( translationUnit );316 317 304 PASS( "Resolve", ResolvExpr::resolve( translationUnit ) ); 318 305 if ( exprp ) { … … 321 308 } // if 322 309 323 clearInnerLvalue( translationUnit );324 assertTopLvalue( translationUnit );325 326 310 // fix ObjectDecl - replaces ConstructorInit nodes 327 311 PASS( "Fix Init", InitTweak::fix( translationUnit, buildingLibrary() ) ); 328 clearInnerLvalue( translationUnit );329 assertTopLvalue( translationUnit );330 312 if ( ctorinitp ) { 331 313 dump ( translationUnit ); … … 334 316 335 317 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 );337 318 338 319 PASS( "Translate EHM" , ControlStruct::translateEHM( translationUnit ) ); 339 assertTopLvalue( translationUnit );340 320 341 321 PASS( "Gen Waitfor" , Concurrency::generateWaitFor( translationUnit ) ); 342 clearInnerLvalue( translationUnit );343 assertTopLvalue( translationUnit );344 322 345 323 PASS( "Convert Specializations", GenPoly::convertSpecializations( translationUnit ) ); // needs to happen before tuple types are expanded 346 clearInnerLvalue( translationUnit );347 assertTopLvalue( translationUnit );348 324 349 325 PASS( "Expand Tuples", Tuples::expandTuples( translationUnit ) ); // xxx - is this the right place for this? 350 assertTopLvalue( translationUnit );351 326 352 327 if ( tuplep ) { … … 356 331 357 332 PASS( "Virtual Expand Casts", Virtual::expandCasts( translationUnit ) ); // Must come after translateEHM 358 assertTopLvalue( translationUnit );359 333 360 334 PASS( "Instantiate Generics", GenPoly::instantiateGeneric( translationUnit ) ); … … 363 337 return EXIT_SUCCESS; 364 338 } // if 365 clearInnerLvalue( translationUnit );366 assertTopLvalue( translationUnit );367 339 PASS( "Convert L-Value", GenPoly::convertLvalue( translationUnit ) ); 368 clearInnerLvalue( translationUnit ); 369 assertTopLvalue( translationUnit ); 340 370 341 371 342 if ( bboxp ) { … … 374 345 } // if 375 346 PASS( "Box", GenPoly::box( translationUnit ) ); 376 clearInnerLvalue( translationUnit );377 assertTopLvalue( translationUnit );378 347 379 348 if ( bcodegenp ) { … … 387 356 388 357 CodeTools::fillLocations( translationUnit ); 389 assertTopLvalue( translationUnit );390 358 PASS( "Code Gen", CodeGen::generate( translationUnit, *output, ! genproto, prettycodegenp, true, linemarks ) ); 391 359 … … 438 406 439 407 440 static const char optstring[] = ":hlLmNnpP:S:twW:D: ";408 static const char optstring[] = ":hlLmNnpP:S:twW:D:F:"; 441 409 442 410 enum { PreludeDir = 128 }; … … 453 421 { "statistics", required_argument, nullptr, 'S' }, 454 422 { "tree", no_argument, nullptr, 't' }, 455 { "gdb", no_argument, nullptr, 'g' },456 423 { "", no_argument, nullptr, 0 }, // -w 457 424 { "", no_argument, nullptr, 0 }, // -W 458 425 { "", no_argument, nullptr, 0 }, // -D 426 { "", no_argument, nullptr, 0 }, // -F 459 427 { nullptr, 0, nullptr, 0 } 460 428 }; // long_opts … … 471 439 "<directory> prelude directory for debug/nodebug", // no flag 472 440 "<option-list> enable profiling information:\n counters,heap,time,all,none", // -S 473 "building cfa standard lib", // -t 474 "wait for gdb to attach", // -g 441 "build in tree", // -t 475 442 "", // -w 476 443 "", // -W 477 444 "", // -D 445 "", // -F 478 446 }; // description 479 447 … … 510 478 511 479 static void usage( char *argv[] ) { 512 cout << "Usage: " << argv[0] << " [options] [input-file (default stdin)] [output-file (default stdout)], whereoptions are:" << endl;480 cout << "Usage: " << argv[0] << " options are:" << endl; 513 481 int i = 0, j = 1; // j skips starting colon 514 482 for ( ; long_opts[i].name != 0 && optstring[j] != '\0'; i += 1, j += 1 ) { … … 536 504 } // usage 537 505 538 static void parse_cmdline( int argc, char * argv[] ) {506 static void parse_cmdline( int argc, char * argv[], const char *& filename ) { 539 507 opterr = 0; // (global) prevent getopt from printing error messages 540 508 … … 582 550 Stats::parse_params( optarg ); 583 551 break; 584 case 't': // build ing cfa stdlib552 case 't': // build in tree 585 553 treep = true; 586 break;587 case 'g': // wait for gdb588 waiting_for_gdb = true;589 554 break; 590 555 case 'w': // suppress all warnings, hidden … … 610 575 case 'D': // ignore -Dxxx, forwarded by cpp, hidden 611 576 break; 577 case 'F': // source file-name without suffix, hidden 578 filename = optarg; 579 break; 612 580 case '?': // unknown option 613 581 if ( optopt ) { // short option ? -
tests/.expect/gccExtensions.x64.txt
r330d933 rf9bf142 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 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 293 { 294 ((void)(_X12_retval_maini_1=0) /* ?{} */); 295 } 296 297 return _X12_retval_maini_1; 315 298 { 316 299 ((void)(_X12_retval_maini_1=0) /* ?{} */); -
tests/.expect/gccExtensions.x86.txt
r330d933 rf9bf142 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; 298 303 } 299 304 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
r330d933 rf9bf142 22 22 debug=yes 23 23 installed=no 24 archiveerrors=25 24 26 25 INSTALL_FLAGS=-in-tree … … 57 56 #---------------------------------------------------------------------------------------------------------------- 58 57 all-local : 59 @+${TEST_PY} --debug=${debug} --install=${installed} --archive-errors=${archiveerrors}${concurrent} ${timeouts} ${quick_test}58 @+${TEST_PY} --debug=${debug} --install=${installed} ${concurrent} ${timeouts} ${quick_test} 60 59 61 60 all-tests : 62 @+${TEST_PY} --debug=${debug} --install=${installed} --archive-errors=${archiveerrors}${concurrent} ${timeouts} --all # '@' => do not echo command (SILENT), '+' => allows recursive make from within python program61 @+${TEST_PY} --debug=${debug} --install=${installed} ${concurrent} ${timeouts} --all # '@' => do not echo command (SILENT), '+' => allows recursive make from within python program 63 62 64 63 clean-local : -
tests/Makefile.in
r330d933 rf9bf142 235 235 CYGPATH_W = @CYGPATH_W@ 236 236 DEFS = @DEFS@ 237 DEMANGLER = @DEMANGLER@238 237 DEPDIR = @DEPDIR@ 239 238 DLLTOOL = @DLLTOOL@ … … 261 260 LIBCFA_TARGET_DIRS = @LIBCFA_TARGET_DIRS@ 262 261 LIBCFA_TARGET_MAKEFILES = @LIBCFA_TARGET_MAKEFILES@ 263 LIBDEMANGLE = @LIBDEMANGLE@264 262 LIBOBJS = @LIBOBJS@ 265 263 LIBS = @LIBS@ … … 377 375 debug = yes 378 376 installed = no 379 archiveerrors =380 377 INSTALL_FLAGS = -in-tree 381 378 DEBUG_FLAGS = -debug -O0 … … 771 768 #---------------------------------------------------------------------------------------------------------------- 772 769 all-local : 773 @+${TEST_PY} --debug=${debug} --install=${installed} --archive-errors=${archiveerrors}${concurrent} ${timeouts} ${quick_test}770 @+${TEST_PY} --debug=${debug} --install=${installed} ${concurrent} ${timeouts} ${quick_test} 774 771 775 772 all-tests : 776 @+${TEST_PY} --debug=${debug} --install=${installed} --archive-errors=${archiveerrors}${concurrent} ${timeouts} --all # '@' => do not echo command (SILENT), '+' => allows recursive make from within python program773 @+${TEST_PY} --debug=${debug} --install=${installed} ${concurrent} ${timeouts} --all # '@' => do not echo command (SILENT), '+' => allows recursive make from within python program 777 774 778 775 clean-local : -
tests/gccExtensions.cfa
r330d933 rf9bf142 10 10 // Created On : Sun Aug 14 17:28:17 2016 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Mon Aug 5 18:04:37 201913 // Update Count : 2812 // Last Modified On : Tue Nov 6 17:54:20 2018 13 // Update Count : 11 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 [10] __attribute(());113 int m2 [10][10] __attribute(());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 // 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 117 return 0; 132 118 } 133 119 -
tests/pybin/settings.py
r330d933 rf9bf142 4 4 from . import tools 5 5 6 global original_path7 8 6 try : 9 original_path = os.getcwd()10 7 testpath = os.path.dirname(os.path.abspath(os.path.join(os.getcwd(), sys.argv[0]))) 11 8 sys.path.append(testpath) … … 22 19 class Architecture: 23 20 KnownArchitectures = { 24 'x64' : 'x64',25 'x86-64' : 'x64',26 'x86_64' : 'x64',27 ' x86' : 'x86',28 ' aarch64' : 'arm',21 'x64' : 'x64', 22 'x86-64' : 'x64', 23 'x86_64' : 'x64', 24 'aarch64' : 'x64', 25 'x86' : 'x86', 29 26 'i386' : 'x86', 30 27 'i486' : 'x86', 31 28 'i686' : 'x86', 32 29 'Intel 80386' : 'x86', 33 'arm' : 'arm',34 'ARM' : 'arm',30 'arm' : 'arm', 31 'ARM' : 'arm', 35 32 } 36 33 … … 116 113 global timeout 117 114 global output_width 118 global archive119 115 120 116 dry_run = options.dry_run … … 126 122 timeout = Timeouts(options.timeout, options.global_timeout) 127 123 output_width = 24 128 archive = os.path.abspath(os.path.join(original_path, options.archive_errors)) if options.archive_errors else None129 124 130 125 -
tests/pybin/tools.py
r330d933 rf9bf142 2 2 import argparse 3 3 import contextlib 4 import datetime5 4 import fileinput 6 5 import multiprocessing … … 274 273 ################################################################################ 275 274 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 281 275 # check if arguments is yes or no 282 276 def yes_no(string): … … 310 304 return sh('gdb', '-n', path, core, '-batch', '-x', cmd, output=subprocess.PIPE) 311 305 312 def core_archive(dst, name, exe):313 # Get the files to copy314 core = os.path.join(os.getcwd(), "core" )315 316 # Uncomment if we want timestamps on coredumps317 # dst = os.path.join(dst, "%s_%s" % (name, pretty_now()))318 319 # make a directory for this test320 mkdir(os.path.join(dst, "dir"))321 322 # moves the files323 mv( core, os.path.join(dst, "core" ) )324 mv( exe , os.path.join(dst, name ) )325 326 # return explanatory test327 return "Archiving %s (executable and core) to %s" % (os.path.relpath(exe, settings.BUILDDIR), os.path.relpath(dst, settings.original_path))328 329 306 class Timed: 330 307 def __enter__(self): -
tests/test.py
r330d933 rf9bf142 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='')94 93 parser.add_argument('-j', '--jobs', help='Number of tests to run simultaneously', type=int) 95 94 parser.add_argument('--list-comp', help='List all valide arguments', action='store_true') … … 180 179 error = error + info if error else info 181 180 182 if settings.archive:183 error = error + '\n' + core_archive(settings.archive, test.target(), exe_file)184 185 181 186 182 … … 299 295 # users may want to simply list the tests 300 296 if options.list_comp : 301 print("-h --help --debug --dry-run --list --arch --all --regenerate-expected -- archive-errors --install --timeout --global-timeout -j --jobs ", end='')297 print("-h --help --debug --dry-run --list --arch --all --regenerate-expected --install --timeout --global-timeout -j --jobs ", end='') 302 298 print(" ".join(map(lambda t: "%s" % (t.target()), tests))) 303 299 -
tools/Makefile.in
r330d933 rf9bf142 225 225 CYGPATH_W = @CYGPATH_W@ 226 226 DEFS = @DEFS@ 227 DEMANGLER = @DEMANGLER@228 227 DEPDIR = @DEPDIR@ 229 228 DLLTOOL = @DLLTOOL@ … … 251 250 LIBCFA_TARGET_DIRS = @LIBCFA_TARGET_DIRS@ 252 251 LIBCFA_TARGET_MAKEFILES = @LIBCFA_TARGET_MAKEFILES@ 253 LIBDEMANGLE = @LIBDEMANGLE@254 252 LIBOBJS = @LIBOBJS@ 255 253 LIBS = @LIBS@ -
tools/prettyprinter/Makefile.in
r330d933 rf9bf142 254 254 CYGPATH_W = @CYGPATH_W@ 255 255 DEFS = @DEFS@ 256 DEMANGLER = @DEMANGLER@257 256 DEPDIR = @DEPDIR@ 258 257 DLLTOOL = @DLLTOOL@ … … 280 279 LIBCFA_TARGET_DIRS = @LIBCFA_TARGET_DIRS@ 281 280 LIBCFA_TARGET_MAKEFILES = @LIBCFA_TARGET_MAKEFILES@ 282 LIBDEMANGLE = @LIBDEMANGLE@283 281 LIBOBJS = @LIBOBJS@ 284 282 LIBS = @LIBS@
Note:
See TracChangeset
for help on using the changeset viewer.