josw@mcvax.uucp (Jos Warmer) (07/25/86)
I have just managed to make a port to SUN3 (SUN 3/75, running Sun UNIX 4.2 release 3.0). Thanks for all the suggestions about how to port C++, they were very helpfull and I couldn't have done without them. There are however some special fixes needed for the SUN3, which I have not seen before on the net, so I will summarize them: --------------------------------------------------------------------- strlen: On a VAX strlen can handle nil-argument and delivers the value 0. On the SUN strlen can't handle a nil-argument and a segmentation violation occurs. To fix this change every call to strlen into a call to sun_strlen. Add the next line as the first line to cfront.h: #define strlen(string) sun_strlen(string) and add a new procedure sun_strlen at the end of main.c: #undef strlen int sun_strlen(char* s) { if( s == 0 ) { return 0; } else { return strlen(s); } } The #undef is needed to stop sun_strlen from calling itself recursively. The C library function fputs also uses strlen, so it can not handle nil-arguments too. Fputs and fprintf are used in the macros putst and putstring in token.h. To fix this redefine these macros in token.h into : #define putstring(s) ( s == 0 ? 0 : fputs(s,out_file) ) #define putst(ss) ( ss == 0 ? 0 : fprintf(out_file,"%s ",ss) ) --------------------------------------------------------------------- BUG in lex.c: The cfront program assumes that cpp lines are of the form: # <nr> "<filename>"<NL> where <nr> is a number <filename> is the name of a source file <NL> is the newline character '\n' There may be no characters between the last quote(") and the newline character. If there are such characters you get the following error message: un expected eol on # line Which is a strange message anyway, because this error is reported only if cfront does not find a newline character. On the SUN3 cpp puts a space after the last quote, and sometimes even a number. I don't know the meaning of this number, but it makes cfront creating this error message and it stops compiling. The fix I made is to ignore everything between the last quote and the newline character. The change is made in src/lex.c. This is the diff file: diff lex.c.original lex.c.fixed 950c950 < if (get(c) != '\n') error("unX eol on # line"); --- > while (get(c) != '\n') ; --------------------------------------------------------------------- BUG in simpl.c: Problem with de-refencing nil pointer. The next file makes the C++ compiler dump core on the SUN3. On our VAX11/780 running Unix4.3BSD it produces the warning: "a.c", line 7: warning: maybe no value returned from hoi() This error occurs when there is a return statement between "{" and "}" and after the final "}" follows a ";". a.c: int hoi() { { return(9); } ; } The remedy is to delete the final ";". This problem isn't really fixed, because I don't know where the nil pointer comes from. It only gives an internal error with a line number instead of dumping core. Here is the diff file: diff simpl.c.original simpl.c.fixed 540a541,545 > Pexpr Pexpr_tmp = tail->e; > if( Pexpr_tmp == 0 ){ > error('i',"fct.simpl() deref nil"); > } > The error report of the fixed compiler is: "a.c", line 7: internal <<cfront 10/10/85>> error: fct.simpl() deref nil --------------------------------------------------------------------- -- Jos Warmer, josw@mcvax.UUCP