Subject: glibc v1.09 problems
To: None <netbsd-bugs@NetBSD.ORG, netbsd-users@NetBSD.ORG, current-users@NetBSD.ORG,>
From: Mathew Patton <patton@unix1.sysnet.net>
List: netbsd-bugs
Date: 03/20/1996 22:43:59
I applogize to those who read bugs,users, and current as I've posted to 
all three but I think all three groups will derive some benefit.

I posted a question on -users about getting libstdc++.a for NetBSD v1.1 and 
was told by quite a few people to upgrade to -current since gcc 2.7.2 was 
more or less supported at that level.

Unfortunately that wasn't a real option so I bullheadedly compiled gcc 
2.7.2 on my NetBSD 1.1 box.  That was easy.  The fun started with an 
attempt to 
build glibc v1.09. (this is where -current people might be interested)

Turns out there are 4 problems with v1.09 that require a little fixing.

1) The NetBSD compile (actually i386-unknown-netbsd1.1) of gcc 2.7.2 does 
not support 
the symbols __NORETURN and __CONSTVALUE (note the case).  For 
__NORETURN, NetBSD uses __dead which remaps to __volatile.  That detail 
aside, note the following quote in glibc v1.09's misc/sys/cdefs.h file 
(lines 32-40 shortened and paraphrased):
/* ... In versions 2.5 and 2.6, the '__attribute__' syntax used below 
does not work properly */
1. #if __GNUC__ < 2 or < 2.5
2. #define __NORETURN __volatile
3. #define __CONSTVALUE __const
4. #elif __GNUC__ >2 or __GNUC_MINOR__ >= 7 /* Faith */ <---- note this,
5. #define __NORETURN __attribute__ ((__volatile__))
6. #define __CONSTVALUE __attribute__ ((__const__))
7. #else
8. #define __NORETURN
9. #define __CONSTVALUE
10.#endif

Line #4 is not only wrong, the 'OR' should be an 'AND' for the logic 
indicated in the comments to be acted upon but also the 'faith' appears 
to be a bit wishful.  Now it just may be that gcc 2.7.2 under Netbsd was 
not done correctly.  I don't have access to other platforms to see if 
this holds true.  In either case, gcc can not parse functions that are 
declared: void __NORETURN foo(...).  And there are a bunch of these in 
glibc files.  A change of the middle section to:

#define __NORETURN __volatile
#define __CONSTVALUE __const

works fine as far as I can tell.

2) conflicting deffinitions of sys_errlist[];
stdio.h in NetBSD calls for:
	extern const char *const sys_errlist[];
while glibc's stdio.h calls for:
	extern char *sys_errlist[];

I don't know which is more 'correct' but either way, this becomes a small 
but tangible porting issue.

3) possible logic error in glibc's stddef.h
Line 135-7 reads:
#if !(defined (__GNUG__) && defined (size_t))
#typedef __SIZE_TYPE__ size_t;
#endif

I have no idea where __GNUG__ comes from but be that as it may, I think
the 'size_t' in the #if statement should be '__size_t'.  I could be way 
wrong on this.

4) And now for the biggie which has 2 related parts.
When one of glibc's files includes <stdio.h> (which is in 
turn ./stdio/stdio.h) 
and which in turn loads ./stddef.h for the very first time, size_t does not 
get defined DESPITE the

#define __need_size_t
#include <stddef.h>

located in the stdio.h file.  Apparently with all the bizare #ifdef cases 
in stddef.h this particular sequence of includes does not set a flag 
correctly.  I havent' determined which one is the culprit as I don't know 
enough about the origin/use of these variables.  However, if stddef.h is 
first included (with __need_size_t defined) and then later stdio.h is 
included 
there is no problem.  I believe adequate proof is available by comparing the
./stdio/vfprintf.d and ./stdio/vprintf.d or ./stdio/vsnprintf.d files.

Of particular note is that vfprintf.d shows stddef.h included long before 
stdio.h, and has no problems compiling.  The latter two cases, 
however, include stdio.h first which in turn includes stddef.h and gcc  
proceeds to blow up with "can't parse errors" in stdio.h saying 'size_t' 
is unknown.

For part2 of this problem, I noticed that vfprintf.c, __vfscanf.c, and 
printf_fp.c in the stdio/ directory include <localinfo.h> whereas the others 
don't.  What is 
the rationalle for not including localinfo.h in the others?  in order to 
solve part1, I've tenativly modified each non-compiling file to include 
<localinfo.h> before <stdio.h> is included.  Amazingly, no problems pop 
up regarding 'size_t' being undefined.


I hope the above information proves useful in fixing the bugs or if they 
aren't 'bugs' proves useful to those doing teh porting of glibc v1.09 to 
NetBSD.  I will be happy to entertain further questions / comments as needed.