roger@banzai.UUCP (Roger Florkowski) (02/08/89)
Diffs to shcc. The problem is in combining multiple .c files in a -c usage line. Example: shcc -c -O -I/usr/local/include -Dunixpc file1.c file2.c file3.c file4.c file1.c: shcc: Can't find /lib/optim file1.c: file2.c: shcc: Can't find /lib/optim file1.c: file2.c: file3.c: shcc: Can't find /lib/optim file1.c: file2.c: file3.c: file4.c: shcc: Can't find /lib/optim The cause: shcc doesn't quarantee an ending 0 its argv vectors. Therefor the execp line can end up with trailing garbage. The Affected files. load.c more verbose. Changes in call to callsys(). options.c Added room for trailing 0. passes.c made it always call AddArg() when it is adding arguments to internal argv arrays. This quarantees that numarg for that argv will be correct. Made changes in call to callsys(). shcc.c Added argc to callsys(). This tells us where to put the trailing 0. Made it more verbose. It now shows the programs it is execing and the arguments that it is passing off. ==================== diffs start here ====================================== diff -c shcc.orig/load.c shcc/load.c *** shcc.orig/load.c Tue Feb 7 17:12:09 1989 --- shcc/load.c Sat Jan 21 04:27:56 1989 *************** *** 49,56 **** extern char *strcpy(), *strcat(), *tempnam(); extern int strlen(), unlink(); - if( verbose ) - (void) printf( "Loading ...\n" ); /* * Finish of arguments on the tail end --- 49,54 ---- *************** *** 60,65 **** --- 58,65 ---- /* * Only one ld(1) pass */ + if( verbose ) + (void) printf( "Loading ...\n" ); argc = FIRSTLD; while( argc < ldinargc ) ldoutargv = AddArg( ldinargv[argc++], ldoutargv, *************** *** 110,116 **** path = stralloc( strlen(ldpath) + strlen(ld) ); (void) strcat( strcpy( path, ldpath ), ld ); ! if( callsys( path, &ldoutargv[argc] ) ) exitstatus = 1; } else { --- 110,116 ---- path = stralloc( strlen(ldpath) + strlen(ld) ); (void) strcat( strcpy( path, ldpath ), ld ); ! if( callsys( path, &ldoutargv[argc], ldoutargc - argc) ) exitstatus = 1; } else { *************** *** 118,123 **** --- 118,125 ---- * Two pass version */ + if( verbose ) + (void) printf( "Loading first pass ...\n" ); if( debug ) ldinargv = AddArg( "-lg", ldinargv, &ldinargc, &ldinmax ); *************** *** 148,159 **** path = stralloc( strlen(ldpath) + strlen(ld) ); (void) strcat( strcpy( path, ldpath ), ld ); ! if( callsys( path, &ldinargv[argc] ) ) { exitstatus = 1; } else { /* * Second ld(1) pass */ if( !givenifile ) { tmp[ numtmp++ ] = ifile = tempnam( TMPDIR, TMPFX ); } --- 150,163 ---- path = stralloc( strlen(ldpath) + strlen(ld) ); (void) strcat( strcpy( path, ldpath ), ld ); ! if( callsys( path, &ldinargv[argc], ldinargc - argc ) ) { exitstatus = 1; } else { /* * Second ld(1) pass */ + if( verbose ) + (void) printf( "Resolving symbols ...\n" ); if( !givenifile ) { tmp[ numtmp++ ] = ifile = tempnam( TMPDIR, TMPFX ); } *************** *** 173,179 **** } ldoutargv[argc] = ld; ! if( callsys( path, &ldoutargv[argc] ) ) exitstatus = 1; } } --- 177,183 ---- } ldoutargv[argc] = ld; ! if( callsys( path, &ldoutargv[argc], ldoutargc - argc)) exitstatus = 1; } } diff -c shcc.orig/options.c shcc/options.c *** shcc.orig/options.c Tue Feb 7 17:12:04 1989 --- shcc/options.c Sat Jan 21 02:46:47 1989 *************** *** 271,284 **** if( argv ) { free( (char *) argv ); argv = (char **) realloc( (char *) argv, ! (*max * sizeof(char *)) ); } else { ! argv = (char **) malloc( (*max * sizeof(char *)) ); } if( !argv ) fatal( 1, "out of memory(AddArg)" ); } argv[ (*argc)++ ] = arg; return( argv ); } --- 271,285 ---- if( argv ) { free( (char *) argv ); argv = (char **) realloc( (char *) argv, ! (*max * sizeof(char *)) + 1 ); } else { ! argv = (char **) malloc( (*max * sizeof(char *)) + 1 ); } if( !argv ) fatal( 1, "out of memory(AddArg)" ); } argv[ (*argc)++ ] = arg; + argv[ (*argc) ] = NULL; /* guarantee an ending zero */ return( argv ); } diff -c shcc.orig/passes.c shcc/passes.c *** shcc.orig/passes.c Tue Feb 7 17:12:07 1989 --- shcc/passes.c Sat Jan 21 04:27:33 1989 *************** *** 167,190 **** */ if( passes & COMPILE ) { ! if( fpu == 68881 ) ! ccom = ccom2081; ! else if( cpu == 68020 ) ! ccom = ccom20; ! ccomin = ccomargc++; ! ccomout = ccomargc++; ! if( profile ) ! ccomargv = AddArg( "-XP", ccomargv, &ccomargc, &ccommax ); ! if( Kflag ) ! ccomargv = AddArg( "-XK", ccomargv, &ccomargc, &ccommax ); ! ccomargv = AddArg( NULL, ccomargv, &ccomargc, &ccommax ); ! ccomargv[ccomin] = cppargv[cppout]; ! if( passes & (OPTIMIZE|ASSEMBLE) ) { ! ccomargv[ccomout] = tempnam( TMPDIR, TMPFX ); ! tmp[ numtmp++ ] = ccomargv[ccomout]; ! } } /* --- 167,188 ---- */ if( passes & COMPILE ) { ! if( fpu == 68881 ) ! ccom = ccom2081; ! else if( cpu == 68020 ) ! ccom = ccom20; ! if( profile ) ! ccomargv = AddArg( "-XP", ccomargv, &ccomargc, &ccommax ); ! if( Kflag ) ! ccomargv = AddArg( "-XK", ccomargv, &ccomargc, &ccommax ); ! ccomin = ccomargc; ! ccomargv = AddArg( cppargv[cppout], ccomargv, &ccomargc, &ccommax ); ! ccomout = ccomargc; ! if( passes & (OPTIMIZE|ASSEMBLE) ) ! ccomargv = AddArg ((tmp[numtmp++] = tempnam (TMPDIR, TMPFX)), ! ccomargv, &ccomargc, &ccommax); } /* *************** *** 192,205 **** */ if( passes & OPTIMIZE ) { ! optimargv = AddArg( NULL, optimargv, &optimargc, &optimmax ); ! optimin = 1; ! optimout = 2; ! optimargv[optimin] = ccomargv[ccomout]; ! if( passes & ASSEMBLE ) { ! optimargv[optimout] = tempnam( TMPDIR, TMPFX ); ! tmp[ numtmp++ ] = optimargv[optimout]; ! } } /* --- 190,202 ---- */ if( passes & OPTIMIZE ) { ! optimin = optimargc; ! optimargv = AddArg( ccomargv[ccomout], optimargv, ! &optimargc, &optimmax ); ! optimout = optimargc; ! if( passes & ASSEMBLE ) ! optimargv = AddArg ((tmp[numtmp++] = tempnam (TMPDIR, TMPFX)), ! optimargv, &optimargc, &optimmax); } /* *************** *** 273,279 **** path = stralloc( strlen(cpppath) + strlen(cpp) ); (void) strcat( strcpy( path, cpppath ), cpp ); cppargv[0] = cpp; ! if( callsys( path, cppargv ) ) { reqdpasses = 0; passes &= ~LOAD; exitstatus = 1; --- 270,276 ---- path = stralloc( strlen(cpppath) + strlen(cpp) ); (void) strcat( strcpy( path, cpppath ), cpp ); cppargv[0] = cpp; ! if( callsys( path, cppargv, cppargc ) ) { reqdpasses = 0; passes &= ~LOAD; exitstatus = 1; *************** *** 293,299 **** path = stralloc( strlen(ccompath) + strlen(ccom) ); (void) strcat( strcpy( path, ccompath ), ccom ); ccomargv[0] = ccom; ! if( callsys( path, ccomargv ) ) { reqdpasses = 0; passes &= ~LOAD; exitstatus = 1; --- 290,296 ---- path = stralloc( strlen(ccompath) + strlen(ccom) ); (void) strcat( strcpy( path, ccompath ), ccom ); ccomargv[0] = ccom; ! if( callsys( path, ccomargv, ccomargc ) ) { reqdpasses = 0; passes &= ~LOAD; exitstatus = 1; *************** *** 313,319 **** path = stralloc( strlen(optimpath) + strlen(optim) ); (void) strcat( strcpy( path, optimpath ), optim ); optimargv[0] = optim; ! if( callsys( path, optimargv ) ) { reqdpasses = 0; passes &= ~LOAD; exitstatus = 1; --- 310,316 ---- path = stralloc( strlen(optimpath) + strlen(optim) ); (void) strcat( strcpy( path, optimpath ), optim ); optimargv[0] = optim; ! if( callsys( path, optimargv, optimargc ) ) { reqdpasses = 0; passes &= ~LOAD; exitstatus = 1; *************** *** 331,337 **** path = stralloc( strlen(aspath) + strlen(as) ); (void) strcat( strcpy( path, aspath ), as ); asargv[0] = as; ! if( callsys( path, asargv ) ) { reqdpasses = 0; passes &= ~LOAD; exitstatus = 1; --- 328,334 ---- path = stralloc( strlen(aspath) + strlen(as) ); (void) strcat( strcpy( path, aspath ), as ); asargv[0] = as; ! if( callsys( path, asargv, asargc ) ) { reqdpasses = 0; passes &= ~LOAD; exitstatus = 1; diff -c shcc.orig/shcc.c shcc/shcc.c *** shcc.orig/shcc.c Tue Feb 7 17:12:00 1989 --- shcc/shcc.c Sat Jan 21 04:16:06 1989 *************** *** 214,222 **** */ int ! callsys( path, argv ) char *path; char **argv; { int pid; int status; --- 214,223 ---- */ int ! callsys( path, argv, argc ) char *path; char **argv; + int argc; /* the number of arguments we expect ot pass off */ { int pid; int status; *************** *** 223,252 **** extern int errno; extern int fork(), execv(), wait(); if( display ) { ! status = 0; ! (void) printf( "callsys %s:", path ); ! while(*argv) ! (void) printf( " '%s'", *argv++ ); ! (void) putchar( '\n' ); ! } else { ! pid = fork(); ! switch( pid ) { ! case -1: ! fatal( 1, "No more processes" ); ! break; ! case 0: ! (void) execv( path, argv ); ! fatal( 1, "Can't find %s", path ); ! break; ! default: ! status = 1; ! while( wait( &status ) == -1 && errno == EINTR ) ! ; ! break; ! } } return( status ); } --- 224,262 ---- extern int errno; extern int fork(), execv(), wait(); + argv[argc] = NULL; /* guarantee ending NULL */ if( display ) { ! status = 0; ! (void) printf( "callsys %s:", path ); ! while(*argv) ! (void) printf( " '%s'", *argv++ ); ! (void) putchar( '\n' ); ! return(status); } + if (verbose){ + char **arg; + arg = argv + 1; /* increment past program name */ + (void) printf ("\t%s", path); + while(*arg) + (void) printf ( " %s", *arg++ ); + (void) putchar( '\n' ); + } + pid = fork(); + switch( pid ) { + case -1: + fatal( 1, "No more processes" ); + break; + case 0: + (void) execv( path, argv ); + fatal( 1, "Can't find %s", path ); + break; + default: + status = 1; + while( wait( &status ) == -1 && errno == EINTR ) + ; + break; + } return( status ); } -- Roger Florkowski {uunet!uvm-gen, attmail}!banzai!roger The People's Computer Company `Revolutionary Programming'