Conversion of pointers to integers and vice versa; pointer tagging
David Malcolm
dmalcolm@redhat.com
Tue Jan 1 00:00:00 GMT 2019
On Tue, 2019-01-01 at 12:00 +0100, Marc Nieper-WiÃkirchen wrote:
> Implementations of languages with garbage collection and dynamic
> typing often employ the concept of tagged pointers. Unused bits of a
> pointer representation are used to distinguish between pointers to
> different types or between pointers and immediate values.
>
> Implementing such a language with libgccjit raises a couple of
> questions:
>
> 1) libgccjit has currently only a limited set of type-casting
> expressions. In particular, there is no type-casting expression
> between an integer type (e.g. uintptr_t) and a pointer type defined.
>
> Are there technical reasons for that or is that just an area where
> libgccjit still has to be complemented?
In general, I've chosen to require the user to explicitly supply any
casting that's needed, out of a desire to catch problems early.
gcc_jit_context_new_cast only supports a few conversions. IIRC this
was to simplify the internal implementation; perhaps more conversions
could be allowed.
> I guess, a workaround could be to use union types à la
>
> union {
> uintptr_t i;
> void *p;
> }
>
> everywhere.
That ought to work.
> 2) For pointer tagging, one needs to know which bits in the integer
> representation of a pointer are unused. Does GCC make the guarantee
> that on all supported platforms a pointer aligned on a 2^d-byte
> boundary has its lower d bits zeroed?
I don't know if we "guarantee" it, but it ought to work.
> Is pointer arithmetic compatible
> with the arithmetic on the underlying integer type? (I know that ISO
> C
> does not make these guarantees, but we are talking about a particular
> implementation here.)
C pointer arithmetic is done in terms of the number of units of the
underlying type, so there's a scale factor involved. I can't remember
what libgccjit does here off the top of my head.
> 3) One may want to use bit fields when implementing tags. The
> documentation for libgccjit seems to be silent on bit fields in
> structures. Is this feature on the TODO list?
It wasn't on the TODO list, as it hadn't occurred to me, but it does
seem like a missing feature.
> Thanks!
>
> -- Marc
>
> P.S.: A Happy New Year to everyone!
...and to you
Dave
More information about the Jit
mailing list