how to tell 64 vs 32 bit architecture ?

Giorgos Keramidas keramida at ceid.upatras.gr
Fri Sep 7 04:51:15 PDT 2007


On 2007-09-07 00:09, Luigi Rizzo <rizzo at icir.org> wrote:
>On Fri, Sep 07, 2007 at 01:26:47AM +0300, Giorgos Keramidas wrote:
>>On 2007-09-06 11:10, Luigi Rizzo <rizzo at icir.org> wrote:
>>> hi,
>>> i was wondering what is the proper way to tell a 64 vs 32 bit
>>> architecture.
>>>
>>> I see that some code in sys/ uses  ' #ifdef __LP64__ ' but i am not
>>> sure if this is generic enough (ie not gcc or FreeBSD specific),
>>> and also suitable for userland (i.e. works on linux or other platforms
>>> as well).
>>
>> This is usually needed to differentiate between a feature "X" which
>> behaves differently in amd64 vs. i386 vs. sparc vs. sparc64, etc.
>
> i am actually looking at pointer sizes, as i need to do some pointer
> manipulation going through intptr_t, and need to know that in the
> preprocessor because some constants need to be 32 or 64 bit depending
> on that, and are not trivial (i.e. not 0, 1 or something i can build
> with size-agnostic expressions)

An intptr_t can safely hold any void pointer value, and C99 says:

%     7.18.1.4 Integer types capable of holding object pointers
%
% 1   The following type designates a signed integer type with the
%     property that any valid pointer to void can be converted to
%     this type, then converted back to pointer to void, and the
%     result will compare equal to the original pointer:
%
%         intptr_t

What sort of manipulation?  Can this sort of manipulation be written in
a way that uses sizeof(intptr_t) instead of 4, 8, or preprocessor magic?

If not, then I can't think of any cross-compiler and cross-platform way
to check in the preprocessor, and you may have to resort to custom
checks (i.e. like those written in autoconf scripts) :-(

- Giorgos



More information about the freebsd-current mailing list