Subject: Re: couple of toolchain questions
To: der Mouse <mouse@Rodents.Montreal.QC.CA>
From: None <itojun@iijlab.net>
List: tech-userlevel
Date: 06/19/2002 00:14:58
>> there seem to be pointer-casting bug (or portability issue) in
>> GNU toolchain. they try to cast void * (or whatever pointer) to
>> unsigned long long, under certain configuration, and it fails to
>> compile.
>Is there any guarantee that _any_ integer type is large enough to hold
>a pointer without loss of information? I'm pretty sure there isn't in
>second-edition K&R C (which is fairly close to the first ANSI/ISO C)...
intptr_t and uintptr_t are there, as suggested previously. i'm not
sure if these types are widely available on various platforms.
>> void *p;
>> unsigned long long x;
>> x = (unsigned long long)p;
>> i've modified my local tree as below, basically doing:
>> x = (unsigned long long)(unsigned long)p;
>Are there machines where pointers are larger than long but not as large
>as long long? If so, that loses information unnecessarily....
at this moment, sizeof(void *) == sizeof(int), or
sizeof(void *) == sizeof(long) for all supported archs.
i encountered this while making full-feature libbfd on i386.
bfd_vma (bfd virtual memory address?) is 64bit, which is
"unsigned long long". void * is 32bit on i386. and there are
code like below which caused the problem:
bfd_vma x;
void *p;
x = (bfd_vma)p;
itojun
itojun[starfruit:~/NetBSD/src/sys] grep uintptr_t arch/*/include/*.h | grep typedef|rev |sort |rev
arch/x86_64/include/int_types.h:typedef unsigned long __uintptr_t;
arch/i386/include/int_types.h:typedef unsigned long __uintptr_t;
arch/hppa/include/int_types.h:typedef unsigned long __uintptr_t;
arch/pc532/include/int_types.h:typedef unsigned int __uintptr_t;
arch/sh3/include/int_types.h:typedef unsigned int __uintptr_t;
arch/powerpc/include/int_types.h:typedef unsigned int __uintptr_t;
arch/m68k/include/int_types.h:typedef unsigned int __uintptr_t;
arch/arm/include/int_types.h:typedef unsigned int __uintptr_t;
arch/mips/include/int_types.h:typedef unsigned int __uintptr_t;
arch/vax/include/int_types.h:typedef unsigned int __uintptr_t;
arch/vax/include/int_types.h:typedef unsigned long int __uintptr_t;
arch/sparc64/include/int_types.h:typedef unsigned long int __uintptr_t;
arch/alpha/include/int_types.h:typedef unsigned long int __uintptr_t;
arch/sparc/include/int_types.h:typedef unsigned long int __uintptr_t;
arch/arm/include/int_types.h:typedef unsigned long int __uintptr_t;