David: this is the email I was talking about in my other email. Here's the updated patch. By the way, I find the usage of NUM_GCC_JIT_TYPES brittle. Would it be better to switch to a new enum value for that instead? See comments below. Le jeudi 20 mai 2021 à 15:25 -0400, David Malcolm a écrit : > On Tue, 2021-05-18 at 14:53 +0200, Jakub Jelinek via Jit wrote: > > On Tue, May 18, 2021 at 08:23:56AM -0400, Antoni Boucher via Gcc- > > patches wrote: > > > Hello. > > > This patch add support for sized integer types. > > > Maybe it should check whether the size of a byte for the current > > > platform is 8 bits and do other checks so that they're only > > > available > > > when it makes sense. > > > What do you think? > > > > Not a review, just a comment.  The 128-bit integral types are > > available > > only on some targets, the test e.g. the C/C++ FE do for those is > > targetm.scalar_mode_supported_p (TImode) > > and so even libgccjit shouldn't provide those types > > unconditionally. > > Similarly for the tests (though it could be guarded with e.g > > #ifdef __SIZEOF_INT128__ > > in that case). > > Also, while currently all in tree targets have BITS_PER_UNIT 8 and > > therefore QImode is 8-bit, HImode 16-bit, SImode 32-bit and DImode > > 64- > > bit, > > in the past and maybe in he future there can be targets that could > > have > > e.g. 16-bit or 32-bit QImode and then there wouldn't be any > > uint8_t/int8_t > > and int16_t would be intQImode_type_node etc. > >   uint16_type_node = make_or_reuse_type (16, 1); > >   uint32_type_node = make_or_reuse_type (32, 1); > >   uint64_type_node = make_or_reuse_type (64, 1); > >   if (targetm.scalar_mode_supported_p (TImode)) > >     uint128_type_node = make_or_reuse_type (128, 1); > > are always with the given precisions, perhaps jit should use > > signed_type_for (uint16_type_node) etc.? > > I seem to have mislaid Antoni's original email (sorry), so I'll reply > to Jakub's. > > > 2021-05-18  Antoni Boucher  > > > >     gcc/jit/ > >             PR target/95325 > >             * jit-playback.c: Add support for the sized integer > > types. > >             * jit-recording.c: Add support for the sized integer > > types. > >             * libgccjit.h (GCC_JIT_TYPE_UINT8_T, > > GCC_JIT_TYPE_UINT16_T, > >             GCC_JIT_TYPE_UINT32_T, GCC_JIT_TYPE_UINT64_T, > >             GCC_JIT_TYPE_UINT128_T, GCC_JIT_TYPE_INT8_T, > > GCC_JIT_TYPE_INT16_T, > >             GCC_JIT_TYPE_INT32_T, GCC_JIT_TYPE_INT64_T, > > GCC_JIT_TYPE_INT128_T): > >             New enum variants for gcc_jit_types. > >     gcc/testsuite/ > >             PR target/95325 > >             * jit.dg/test-types.c: Add tests for sized integer > > types. > > First a high-level question, why not use (or extend) > gcc_jit_context_get_int_type instead? If I remember correctly, I believe I had some issues with this function, like having it return sometimes long long, and other times long for the same size. Maybe that was an issue with a global variable not cleaned up. > > Do we really need to extend enum gcc_jit_types?  Is this a quality- > of- > life thing for users of the library? > > That said, recording::context::get_int_type is currently a bit of a > hack, and maybe could probably be improved by using the new enum > values > the patch adds. > > IIRC, libgccjit.c does type-checking by comparing recording::type > pointer values; does this patch gives us multiple equivalent types > that > ought to compare as equal? > > If a user gets a type via GCC_JIT_TYPE_INT and gets "another" type > via > GCC_JIT_TYPE_INT32_T and they happen to be the same on the current > target, should libgccjit complain if you use "int" when you meant > "int32_t", or accept it? I updated the function compatible_types to make them compare as equal. I believe that it's not used everywhere though, so a cast will be necessary in some cases. > > Various comments inline below... > > > diff --git a/gcc/jit/jit-playback.c b/gcc/jit/jit-playback.c > > index c6136301243..40630aa1ab8 100644 > > --- a/gcc/jit/jit-playback.c > > +++ b/gcc/jit/jit-playback.c > > @@ -193,6 +193,27 @@ get_tree_node_for_type (enum gcc_jit_types > > type_) > >      case GCC_JIT_TYPE_UNSIGNED_INT: > >        return unsigned_type_node; > >   > > +    case GCC_JIT_TYPE_UINT8_T: > > +      return unsigned_intQI_type_node; > > +    case GCC_JIT_TYPE_UINT16_T: > > +      return uint16_type_node; > > +    case GCC_JIT_TYPE_UINT32_T: > > +      return uint32_type_node; > > +    case GCC_JIT_TYPE_UINT64_T: > > +      return uint64_type_node; > > +    case GCC_JIT_TYPE_UINT128_T: > > +      return uint128_type_node; > > +    case GCC_JIT_TYPE_INT8_T: > > +      return intQI_type_node; > > +    case GCC_JIT_TYPE_INT16_T: > > +      return intHI_type_node; > > +    case GCC_JIT_TYPE_INT32_T: > > +      return intSI_type_node; > > +    case GCC_JIT_TYPE_INT64_T: > > +      return intDI_type_node; > > +    case GCC_JIT_TYPE_INT128_T: > > +      return intTI_type_node; > > + > > Jakub has already commented that 128 bit types might not be > available. > > Ideally we'd report that they're not available as soon as the user > tries to use them, in gcc_jit_context_get_type, but unfortunately it > looks like the test requires us to use > targetm.scalar_mode_supported_p, > and that requires us to hold the jit mutex and thus be at playback > time. > > So I think get_tree_node_for_type should take a context, and add an > error on the context if there's a failure, returning NULL. > playback::context::get_type is the only caller currently and has > handling for an unrecognized value, so I think that logic needs to be > moved to get_tree_node_for_type so that the user can distinguish > between unrecognized types versus types that are unsupported on this > target. > > > > diff --git a/gcc/jit/jit-recording.c b/gcc/jit/jit-recording.c > > index 117ff70114c..b67ae8bfb78 100644 > > --- a/gcc/jit/jit-recording.c > > +++ b/gcc/jit/jit-recording.c > > @@ -2247,6 +2247,18 @@ recording::memento_of_get_type::get_size () > >      case GCC_JIT_TYPE_UNSIGNED_LONG_LONG: > >        size = LONG_LONG_TYPE_SIZE; > >        break; > > +    case GCC_JIT_TYPE_UINT8_T: > > +    case GCC_JIT_TYPE_UINT16_T: > > +    case GCC_JIT_TYPE_UINT32_T: > > +    case GCC_JIT_TYPE_UINT64_T: > > +    case GCC_JIT_TYPE_UINT128_T: > > +    case GCC_JIT_TYPE_INT8_T: > > +    case GCC_JIT_TYPE_INT16_T: > > +    case GCC_JIT_TYPE_INT32_T: > > +    case GCC_JIT_TYPE_INT64_T: > > +    case GCC_JIT_TYPE_INT128_T: > > +      size = 128; > > +      break; > > This gives 128 bits as the size for all of these types, which seems > wrong. > > >      case GCC_JIT_TYPE_FLOAT: > >        size = FLOAT_TYPE_SIZE; > >        break; > >      case GCC_JIT_TYPE_FLOAT: > > > diff --git a/gcc/jit/libgccjit.h b/gcc/jit/libgccjit.h > > index 5c722c2c57f..5d88033a2ab 100644 > > --- a/gcc/jit/libgccjit.h > > +++ b/gcc/jit/libgccjit.h > > @@ -548,6 +548,17 @@ enum gcc_jit_types > >    GCC_JIT_TYPE_LONG_LONG, /* signed */ > >    GCC_JIT_TYPE_UNSIGNED_LONG_LONG, > >   > > +  GCC_JIT_TYPE_UINT8_T, > > +  GCC_JIT_TYPE_UINT16_T, > > +  GCC_JIT_TYPE_UINT32_T, > > +  GCC_JIT_TYPE_UINT64_T, > > +  GCC_JIT_TYPE_UINT128_T, > > +  GCC_JIT_TYPE_INT8_T, > > +  GCC_JIT_TYPE_INT16_T, > > +  GCC_JIT_TYPE_INT32_T, > > +  GCC_JIT_TYPE_INT64_T, > > +  GCC_JIT_TYPE_INT128_T, > > + > >    /* Floating-point types  */ > >   > >    GCC_JIT_TYPE_FLOAT, > > The patch adds the new enum values between existing values of enum > gcc_jit_types, effectively changing the ABI, since e.g. the numerical > value of GCC_JIT_TYPE_FLOAT changes with this, and there's no way of > telling which enum values a binary linked against libgccjit.so is > going > to supply when it calls into libgccjit. > > If we're going to extend the enum, the new values need to be added to > the end, extending the ABI rather than changing it. Fixed. > > I don't think the patch provides a way to detect that the client code > is using the new ABI and thus mark it in the metadata.  I'm not sure > how to do that. Now this patch adds new functions. Does that solve this issue? > > > diff --git a/gcc/testsuite/jit.dg/test-types.c > > b/gcc/testsuite/jit.dg/test-types.c > > index 8debcd7eb82..9c66284f193 100644 > > --- a/gcc/testsuite/jit.dg/test-types.c > > +++ b/gcc/testsuite/jit.dg/test-types.c > > [...snip...] > > The tests seem reasonable, but as noted by Jakub the 128-bit support > needs to be conditionalized. > > Hope this is constructive > Dave >