[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