[foreign] RFR: record padding is not emitted correctly
Maurizio Cimadamore
maurizio.cimadamore at oracle.com
Thu Jun 14 14:37:59 UTC 2018
Hi,
this is an overhaul of how jextract adds padding to record layouts - the
general strategy is this:
1) make sure that fields are emitted at the correct expected offset, if
not , add prefix padding
2) make sure that record size matches the expected one, if not add
trailing padding
Note that (1) should onlyy apply to structs, not unions, as for unions,
you always restart from the base offset for each field; so, assumption
is, base offset should already be in sync because of outer padding (if
needed).
To get there, the Utils::getRecordLayoutInternal now does a recursive
walk, as anonymous nested records must join the dance too.
I also did a followup fix on the patch that Sundar sent yesterday; in
short, using Utils:getIdentifier doesn't always work. For typedefs it
does the right thing, but for anonymous records it just gives a random
blob of text mentioning the source location; I tweaked this so that if I
see that the output contains '::', I generate a synthetic string
"anon$xyz", where xyz is the offset in the source for that anon record.
I also noted that when structs contain incomplete arrays (e.g.flexible
array members), clang fails to return correct offset for anything inside
the struct, and returns -2 instead. Right now I'm accepting it (as did
the old impl, and the one in the nicl branch), but I believe it would be
better to punt with an exception (after all the generated layout will be
all wrong) - but if I do so, the StructTest, which contains an
incomplete array, will fail. Opinions?
Webrev:
http://cr.openjdk.java.net/~mcimadamore/panama/padding_layout/
Cheers
Maurizio
More information about the panama-dev
mailing list