Date: Fri, 7 Sep 2007 05:03:10 -0700 From: Luigi Rizzo <rizzo@icir.org> To: Giorgos Keramidas <keramida@ceid.upatras.gr> Cc: current@freebsd.org Subject: Re: how to tell 64 vs 32 bit architecture ? Message-ID: <20070907050310.A94579@xorpc.icir.org> In-Reply-To: <20070907115021.GA2718@kobe.laptop>; from keramida@ceid.upatras.gr on Fri, Sep 07, 2007 at 02:50:21PM %2B0300 References: <20070906111028.A83649@xorpc.icir.org> <20070906222647.GB2737@kobe.laptop> <20070907000950.A91211@xorpc.icir.org> <20070907115021.GA2718@kobe.laptop>
next in thread | previous in thread | raw e-mail | index | archive | help
On Fri, Sep 07, 2007 at 02:50:21PM +0300, Giorgos Keramidas wrote: > On 2007-09-07 00:09, Luigi Rizzo <rizzo@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@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? i need to do this: #ifdef BUILT_FOR_64BIT_POINTERS #define MY_MAGIC 0xdeadbeefd00de123 /* 64 bit */ #else #define MY_MAGIC 0xdeadbeef /* 32 bit */ If you know of a way to implement this without preprocessor magic, i am all ears. If the values were simpler (eg all ones or so) i could have used ~((unitptr_t)0) but this is not the case here cheers luigi
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20070907050310.A94579>