RFR: 8340205: Native linker allows MemoryLayout consisting of only PaddingLayout [v8]
Jorn Vernee
jvernee at openjdk.org
Mon Nov 4 12:26:36 UTC 2024
On Mon, 4 Nov 2024 08:11:27 GMT, Per Minborg <pminborg at openjdk.org> wrote:
>> This PR prevents sequence layout with padding to be used with the Linker.
>
> Per Minborg has updated the pull request with a new target base due to a merge or a rebase. The incremental webrev excludes the unrelated changes brought in by the merge/rebase. The pull request contains 17 additional commits since the last revision:
>
> - Rephrase liker arg requirements
> - Merge branch 'master' into linker-padding-layout-only
> - Add rule checkings in AbstractLinker and add tests
> - Merge branch 'master' into linker-padding-layout-only
> - Update Linker docs
> - Merge branch 'master' into linker-padding-layout-only
> - Reword doce
> - Add to specification and refine detection of PL GLs
> - Add specific message for group layouts with only padding layouts
> - Merge branch 'master' into linker-padding-layout-only
> - ... and 7 more: https://git.openjdk.org/jdk/compare/7d8aec13...0f4e93ff
src/java.base/share/classes/java/lang/foreign/Linker.java line 245:
> 243: * <p>
> 244: * A native linker only supports function descriptors whose argument/return layouts are
> 245: * <em>well-formed</em> layouts. More formally, a layout `L`is well-formed if:
Suggestion:
* <em>well-formed</em> layouts. More formally, a layout `L` is well-formed if:
src/java.base/share/classes/java/lang/foreign/Linker.java line 271:
> 269: * </ul>
> 270: * <p>
> 271: * Well-formed layouts in function descriptions consumed by a native linker constitutes
Suggestion:
* Well-formed layouts in function descriptions consumed by a native linker constitute
src/java.base/share/classes/java/lang/foreign/Linker.java line 278:
> 276: * member layouts, as well as avoiding padding at the end of the struct layout.
> 277: * For example:
> 278: * {@snippet lang = java:
Pre-existing, but, AFAIK "allows to avoid" only works when there is an object between 'allows' and 'to', e.g. "allows _a client_ to avoid".
src/java.base/share/classes/jdk/internal/foreign/abi/AbstractLinker.java line 224:
> 222:
> 223: // check elements are not all padding layouts and for trailing padding
> 224: static private void checkGroup(GroupLayout gl, long maxUnpaddedOffset) {
Suggestion:
private static void checkGroup(GroupLayout gl, long maxUnpaddedOffset) {
src/java.base/share/classes/jdk/internal/foreign/abi/AbstractLinker.java line 259:
> 257: }
> 258:
> 259: static void assertIsAlignedBy(GroupLayout gl, long index, PaddingLayout padding, MemoryLayout element) {
Suggestion:
private static void assertIsAlignedBy(GroupLayout gl, long index, PaddingLayout padding, MemoryLayout element) {
src/java.base/share/classes/jdk/internal/foreign/abi/AbstractLinker.java line 270:
> 268: " does not align the element " + element +
> 269: " (at byte offset " + pos + ")" + inMessage(gl));
> 270: }
What happens here if an element is already aligned, and `padding.byteSize() == element.byteAlignment()`? e.g. `MemoryLayout.structLayout(MemoryLayout.paddingLayout(4), ValueLayout.JAVA_INT)`?
src/java.base/share/classes/jdk/internal/foreign/abi/AbstractLinker.java line 273:
> 271: }
> 272:
> 273: static String inMessage(GroupLayout gl) {
Suggestion:
private static String inMessage(GroupLayout gl) {
src/java.base/share/classes/jdk/internal/foreign/abi/AbstractLinker.java line 282:
> 280: // checks both that there is no excess padding between 'memberLayout' and
> 281: // the previous layout
> 282: static private void checkMemberOffset(StructLayout parent, MemoryLayout memberLayout,
Suggestion:
private static void checkMemberOffset(StructLayout parent, MemoryLayout memberLayout,
test/jdk/java/foreign/TestLinker.java line 183:
> 181:
> 182: var fd = FunctionDescriptor.of(struct, struct, struct);
> 183: assertThrows(IllegalArgumentException.class, () ->linker.downcallHandle(fd));
Suggestion:
assertThrows(IllegalArgumentException.class, () -> linker.downcallHandle(fd));
-------------
PR Review Comment: https://git.openjdk.org/jdk/pull/21041#discussion_r1827569106
PR Review Comment: https://git.openjdk.org/jdk/pull/21041#discussion_r1827585098
PR Review Comment: https://git.openjdk.org/jdk/pull/21041#discussion_r1827646537
PR Review Comment: https://git.openjdk.org/jdk/pull/21041#discussion_r1827630470
PR Review Comment: https://git.openjdk.org/jdk/pull/21041#discussion_r1827632076
PR Review Comment: https://git.openjdk.org/jdk/pull/21041#discussion_r1827636857
PR Review Comment: https://git.openjdk.org/jdk/pull/21041#discussion_r1827637004
PR Review Comment: https://git.openjdk.org/jdk/pull/21041#discussion_r1827639797
PR Review Comment: https://git.openjdk.org/jdk/pull/21041#discussion_r1827643127
More information about the core-libs-dev
mailing list