[foreign] RFR 8217664: jextract should check for error code returns from Type::getOffsetOf and Type::size

Jorn Vernee jbvernee at xs4all.nl
Thu Jan 24 13:04:44 UTC 2019


Hi,

jextract uses libclang functions to query the size of a type and offset 
of a field. The returned values are used for instance in layout 
calculations. But, these functions can also return error codes and there 
is currently no check for them. They are happily being used in the 
layout calculations, and this can cause some strange errors, or in some 
cases incorrect layouts are generated. To give an example:

     struct Foo {
         int x;
         void *list_of_data[];
     };

The expected layout of this struct (which uses an incomplete/flexible 
array field) should be `[i32x32[0u64]]` but jextract instead generates 
`[i32[0u64]x32]`. This particular case is due to a bug in libclang where 
requesting the offset of a field in a type with a flexible array member 
always returns an incomplete type error, even though getting the offset 
of each fields should be possible. This error code (-2) is then used in 
the layout calculations and yields the incorrect result.

So I've added checking to the returned value of Type::size and 
Type::getOffsetOf and throwing an exception in case an error code is 
returned. I'm also explicitly checking for the flexible array case and 
throwing a UOE in that case. This also means I had to disable the 
flexible array jextract test [1]. The test was passing, but at least on 
Windows the wrong layout was being generated. Since we can not reliably 
compute padding for types with flexible arrays using the current method, 
I think it's better to throw an exception for now until we can find a 
workaround for this bug in libclang, or the bug gets fixed.

Using a type with a flexible/incomplete array member in the binder 
should still be fine of course, so I've added a separate test for that.

Please review the following.

Bug: https://bugs.openjdk.java.net/browse/JDK-8217664
Webrev: 
http://cr.openjdk.java.net/~jvernee/panama/webrevs/8217664/webrev.00/

Thanks,
Jorn

[1] : 
http://hg.openjdk.java.net/panama/dev/file/c40a5a6dc24d/test/jdk/com/sun/tools/jextract/testStruct/struct.h#l85


More information about the panama-dev mailing list