g++ on the UnixPC (Actually a general SystemV bug + fix)
Ron Guilmette
rfg at ics.uci.edu
Sun Dec 31 10:34:14 AEST 1989
In article <JEFFL.89Dec29225441 at berick.uucp> jeffl at berick.uucp writes:
>I am attempting to port g++ 1.36.1 to the UnixPC. I have gotten
>it to compile, but when I feed it the following source, it gives
>me error messages. (The same version of g++ running on a sun
>gives the correct results.)
>
>
> class x {
> public:
> x() {}
> ~x() {}
> };
>
> int main(int argc, char *argv[])
> {
> x y;
>
> return(0);
> }
>
>When I run g++, I get the following results:
>
>berick!jeffl(users) 141> g++ -v testit.cc
>gcc version 1.36.1- (based on GCC 1.36)
> /usr/local/lib/gcc-cpp -+ -v -undef -D__GNUC__ -D__GNUG__ -D__cplusplus -Dmc68k -Dunix -Dunixpc -D__mc68k__ -D__unix__ -D__unixpc__ testit.cc /usr/tmp/cca13036.cpp
>GNU CPP version 1.36
> /usr/local/lib/gcc-cc1plus /usr/tmp/cca13036.cpp -quiet -dumpbase testit.cc -version -o /usr/tmp/cca13036.s
>GNU C++ version 1.36.1- (based on GCC 1.36) (68k, SGS/AT&T unixpc syntax) compiled by GNU C version 1.36.
>default target switches:
>testit.cc: In method x::x ():
>testit.cc:4: parse error at null character
...
First let me point out that gnu.g++ is *not* the right place to be posting
bug reports! Please post bug reports (or questions about possible bugs)
to gnu.g++.bug instead.
Now on to your problem.
There is a general problem with SystemV-based systems which tends to
result in error messages of the form `parse error at null character'.
The problem is that the standard SystemV setvbuf() routine is brain-
dammaged. This *only* causes problems when the compiler is attempting
to inline-expand very small function bodies (such as the constructor
for class x shown above, which is being quietly inlined at the point at
which the object `y' is declared).
I have tried to fix-up the code in cplus-lex.c in a general way that should
prevent this problem from arising on most types of SystemV-based systems.
The following patches implement my fixes for a hacked-up version of g++
1.36.1. (Your line numbers may vary).
I hope that these patches will be incorporated into g++ 1.36.2. This is
fairly important because right now, g++ is broken for most SystemV's.
Somebody should check however to see that I didn't break the code for
hp9000's (which appear to be a special case).
Thanks to Andrew Klossner @ Tektronix for pointing out the brain-dammage
in setvbuf() on USG. Comments in the patches describe the nature of the
brain-dammage in more detail.
Enjoy,
// rfg
diff -rc2 1.36.1-/cplus-lex.c 1.36.1+/cplus-lex.c
*** 1.36.1-/cplus-lex.c Thu Nov 2 23:14:34 1989
--- 1.36.1+/cplus-lex.c Fri Nov 24 17:53:57 1989
***************
*** 980,1000 ****
pending_inlines = pending_inlines->next;
finput = finput2;
! #if defined(i386) && !defined(sequent) && !defined(sun386)
! finput2->_ptr = finput2->_base = t->buf;
! _bufend(finput2) = t->buf + t->len;
! finput2->_flag = _IOFBF | _IOREAD;
! finput2->_cnt = t->len - 1;
! #else
! #ifndef hp9000s300
! #ifdef USG_STDIO
setvbuf(finput2,t->buf,_IOFBF,t->len);
finput2->_cnt = t->len-1;
#else
setbuffer (finput2, t->buf, t->len);
finput2->_cnt = finput2->_bufsiz - 1;
- #endif /* USG_STDIO */
- #else
- setvbuf(finput2,t->buf,_IOFBF,t->len);
- finput2->_cnt = t->len-1;
#endif
#endif
--- 980,1003 ----
pending_inlines = pending_inlines->next;
finput = finput2;
!
! #if defined(hp9000s300)
! /* The hp9000 has a working setvbuf() routine. */
setvbuf(finput2,t->buf,_IOFBF,t->len);
finput2->_cnt = t->len-1;
#else
+ #if defined(USG) || defined(DGUX)
+ /* The standard SystemV code has a broken version of the setvbuf()
+ routine. IF you try to setvbuf to a buffer which is shorter
+ than 8 bytes, then the standard USG setvbuf() will ignore the
+ request and malloc its own buffer. This totally screws up things
+ for g++, so don't use setvbuf() on USG systems. */
+ finput2->_ptr = finput2->_base = (unsigned char *) t->buf;
+ _bufend(finput2) = (unsigned char *) t->buf + t->len;
+ finput2->_flag = _IOFBF | _IOREAD;
+ finput2->_cnt = t->len - 1;
+ #else
+ /* Typical BSD systems can use setbuffer. */
setbuffer (finput2, t->buf, t->len);
finput2->_cnt = finput2->_bufsiz - 1;
#endif
#endif
***************
*** 2078,2098 ****
end of this function. */
pending_inlines = pending_inlines->next;
! #if defined(i386) && !defined(sequent) && !defined(sun386)
! finput2->_ptr = finput2->_base = t->buf;
! _bufend(finput2) = t->buf + t->len;
! finput2->_flag = _IOFBF | _IOREAD;
! finput2->_cnt = t->len - 1;
! #else
! #ifndef hp9000s300
! #ifdef USG_STDIO
setvbuf(finput2,t->buf,_IOFBF,t->len);
finput2->_cnt = t->len-1;
#else
setbuffer (finput2, t->buf, t->len);
finput2->_cnt = finput2->_bufsiz - 1;
- #endif /* USG_STDIO */
- #else
- setvbuf(finput2,t->buf,_IOFBF,t->len);
- finput2->_cnt = t->len-1;
#endif
#endif
--- 2081,2100 ----
end of this function. */
pending_inlines = pending_inlines->next;
! #if defined(hp9000s300)
! /* The hp900s300 has a working setvbuf() routine. */
setvbuf(finput2,t->buf,_IOFBF,t->len);
finput2->_cnt = t->len-1;
#else
+ #if defined(USG) || defined (DGUX)
+ /* The standard USG setvbuf() routine screws up if the buffer
+ you give it is smaller that 8 bytes, so don't use it. */
+ finput2->_ptr = finput2->_base = (unsigned char *) t->buf;
+ _bufend(finput2) = (unsigned char *) t->buf + t->len;
+ finput2->_flag = _IOFBF | _IOREAD;
+ finput2->_cnt = t->len - 1;
+ #else
+ /* The typical BSD system can use setbuffer */
setbuffer (finput2, t->buf, t->len);
finput2->_cnt = finput2->_bufsiz - 1;
#endif
#endif
More information about the Unix-pc.general
mailing list