Re: [PATCH 1/2] Add C99-style constructor macros for specific-sized integers

Sam Ravnborg
2008-03-03T12:40:46Z

On Mon, Mar 03, 2008 at 11:43:10AM +0000, Russell King wrote:
> On Mon, Mar 03, 2008 at 10:57:32AM +0000, David Howells wrote:
> > H. Peter Anvin <hpa@zytor.com> wrote:
> >
> > > +#define S8_C(x) x
> > > +#define U8_C(x) x ## U
> > > +#define S16_C(x) x
> > > +#define U16_C(x) x ## U
> > > +#define S32_C(x) x
> > > +#define U32_C(x) x ## U
> > > +#define S64_C(x) x ## LL
> > > +#define U64_C(x) x ## ULL
> >
> > And #if defined(__ASSEMBLY__), just splat x through as is.
>
> We already have something like this on ARM - include/asm-arm/memory.h
>
> /*
> * Allow for constants defined here to be used from assembly code
> * by prepending the UL suffix only with actual C code compilation.
> */
> #ifndef __ASSEMBLY__
> #define UL(x) (x##UL)
> #else
> #define UL(x) (x)
> #endif

And in linux/const.h we have yet another variant:
/* Some constant macros are used in both assembler and
* C code. Therefore we cannot annotate them always with
* 'UL' and other type specifiers unilaterally. We
* use the following macros to deal with this.
*
* Similarly, _AT() will cast an expression with a type in C, but
* leave it unchanged in asm.
*/

#ifdef __ASSEMBLY__
#define _AC(X,Y) X
#define _AT(T,X) X
#else
#define __AC(X,Y) (X##Y)
#define _AC(X,Y) __AC(X,Y)
#define _AT(T,X) ((T)(X))
#endif

Not as typestrict as hpa's and arm's version but
used in a few placed already.

Sam