On Tue, Feb 19, 2013 at 06:52:34AM -0800, m...@freebsd.org wrote: > On Tue, Feb 19, 2013 at 5:11 AM, Borja Marcos <bor...@sarenet.es> wrote: > > > > Hello, > > > > I'm really sorry if this is a stupid question, but as far as I know, > > u_int64_t defined in /usr/include/sys/types.h should *always* be > > a 64 bit unsigned integer, right? > > > > Seems there's a bug (or I need more and stronger coffee). Compiling a > > program on a 64 bit system with -m32 gets the 64 bit integer types wrong. > > > > % cat tachin.c > > #include <sys/types.h> > > #include <stdio.h> > > > > > > main() > > { > > printf("sizeof uint64_t = %d\n", sizeof(uint64_t)); > > printf("sizeof u_int64_t = %d\n", sizeof(u_int64_t)); > > } > > > > > > > > uname -a > > FreeBSD splunk 9.1-RELEASE FreeBSD 9.1-RELEASE #14: Wed Jan 23 17:24:05 CET > > 2013 root@splunk:/usr/obj/usr/src/sys/SPLUNK amd64 > > > > % gcc -o tachin tachin.c > > % ./tachin > > sizeof uint64_t = 8 > > sizeof u_int64_t = 8 > > > > % ./tachin > > sizeof uint64_t = 4 <======= WRONG!! > > sizeof u_int64_t = 4 <======= WRONG!! > > > > The same happens with clang. > > > > % clang -m32 -o tachin tachin.c > > tachin.c:5:1: warning: type specifier missing, defaults to 'int' > > [-Wimplicit-int] > > main() > > ^~~~ > > 1 warning generated. > > % ./tachin > > sizeof uint64_t = 4 <======= WRONG!! > > sizeof u_int64_t = 4 <======= WRONG!! > > > > > > if I do the same on a i386 system (8.2-RELEASE, but it should be > > irrelevant) the u_int64 types have the correct size. > > > > %gcc -o tachin tachin.c > > %./tachin > > sizeof uint64_t = 8 > > sizeof u_int64_t = 8 > > > > > > > > > > > > Am I missing anything? Seems like a too stupid problem to be a real bug. > > Sorry if I am wrong. > > > > Last I knew -m32 still wasn't quite supported on 9.1. This is fixed > in CURRENT. The problem in in the machine-dependent headers. > sys/types.h includes sys/_types.h which includes machine/_types.h. > But the machine alias can only point to one place; it's the amd64 > headers since you're running the amd64 kernel. > sys/amd64/include/_types.h defines __uint64_t as unsigned long, which > is correct in 64-bit mode but wrong in 32-bit mode. > > On CURRENT there is a merge x86/_types.h which uses #ifdef guards to > define __uint64_t as unsigned long or unsigned long long, depending on > __LP64__, so that the size is correct on a 32-bit compiler invocation.
Yes, but there are still some unconverted headers, mostly related to the machine context and signal handlers. Quick look: machine/sigframe.h (probably not much useful for usermode) machine/ucontext.h machine/frame.h (again, usermode most likely does not need it) machine/signal.h machine/elf.h libm machdep headers.
pgpSY1dpkwpFP.pgp
Description: PGP signature