Jan Beulich writes ("Re: [PATCH v9 1/5] xen: introduce ptrdiff_t, fix 
uintptr_t"):
> On 12.02.19 at 02:13, <sstabell...@kernel.org> wrote:
> > -typedef unsigned int __attribute__((__mode__(__pointer__))) uintptr_t;
> > +typedef unsigned long __attribute__((__mode__(__pointer__))) uintptr_t;
> 
> I don't understand this change: The mode attribute discards any width
> association derived from the specified base type.

I looked for the reference documentation for the semantics of
__attribute__((__mode__(__pointer__))).  I found this in my GCC 6
manual:

  'mode (MODE)'
       This attribute specifies the data type for the
       declaration--whichever type corresponds to the mode MODE.  This in
       effect lets you request an integer or floating-point type according
       to its width.

       You may also specify a mode of 'byte' or '__byte__' to indicate the
       mode corresponding to a one-byte integer, 'word' or '__word__' for
       the mode of a one-word integer, and 'pointer' or '__pointer__' for
       the mode used to represent pointers.

This wording is extremely obscure, especially when read in the context
of C's insane pointer provenance rules and compiler authors' insane
interpretations of those rules.

If our goal is to avoid malicious compiler optimisation nonsense we
should not use a feature like this whose semantics might be taken to
imply that the things are really pointers.


> > +typedef long ptrdiff_t;
> 
> FTR I'm unconvinced of this, or the need to use uintptr_t in the first
> place in the macros you introduce: The entire UNIX world implies
> sizeof(long) == sizeof(void*) afaik.

Please provide a reference for this assertion about sizeof(long).

Looking at http://www.unix.org/whitepapers/64bit.html LLP64 (32-bit
long, 64-bit long long, 64-bit void*) was at least contemplated in
some circles, although I haven't been able to find any Unix-like
examples besides Minix, which runs on machines with 16-bit pointers
(and its longs have to be >=32-bit).

> But if we really want to have ptrdiff_t, then I think we should either
> follow the uintptr_t model and use attribute((mode())), or we should
> leverage the compiler's __PTRDIFF_TYPE__ (and then also
> __UINTPTR_TYPE__ for uintptr_t, at least if available - not sure what
> its availability depends on, but it's conditional in gcc's
> c_stddef_cpp_builtins()).

It is not unusual for porting something like Xen to a new architecture
to involve writing a short header file with these kind of type
definitions.  I don't know why we couldn't take that approach.

Ian.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xenproject.org
https://lists.xenproject.org/mailman/listinfo/xen-devel

Reply via email to