On Fri, 13 Oct 2023 14:48:51 GMT, Martin Doerr <mdo...@openjdk.org> wrote:

>> Discussed this a bit with Maurizio. There are a few things to consider:
>> 
>> - `cannonicalLayouts` allows for just a single mapping from type name to 
>> layout. I think `double` should map to the 8-byte aligned layout. (the same 
>> alignment you get from `_Alignof(double)` in C).
>> - We have to relax the checking done by the linker on AIX. Maybe change 
>> `AbstractLinker::checkLayoutRecursive` call some `checkStructMemberLayout` 
>> method, that by default just calls `checkLayoutRecursive`, but which the AIX 
>> linker can override to implement its special rules for doubles.
>> - We need a small spec update to allow for struct field layouts that are not 
>> canonical layouts. I'll take a stab at that, and then get back to you.
>
> Thanks for your outstanding support! I'm awaiting feedback from IBM and a 
> solution for the subtask https://bugs.openjdk.org/browse/JDK-8317799. There 
> shouldn't be much work to be done after that, I guess.

So, your proposal should look like this?

diff --git 
a/src/java.base/share/classes/jdk/internal/foreign/abi/AbstractLinker.java 
b/src/java.base/share/classes/jdk/internal/foreign/abi/AbstractLinker.java
index dbd9a3f67a4..ec1639938e8 100644
--- a/src/java.base/share/classes/jdk/internal/foreign/abi/AbstractLinker.java
+++ b/src/java.base/share/classes/jdk/internal/foreign/abi/AbstractLinker.java
@@ -180,6 +180,11 @@ private void checkLayout(MemoryLayout layout) {
         }
     }
 
+    // Platforms can override.
+    protected MemoryLayout processGroupLayoutMember(MemoryLayout member, long 
offset) {
+        return member;
+    }
+
     private void checkLayoutRecursive(MemoryLayout layout) {
         if (layout instanceof ValueLayout vl) {
             checkSupported(vl);
@@ -191,6 +196,7 @@ private void checkLayoutRecursive(MemoryLayout layout) {
                 // check element offset before recursing so that an error 
points at the
                 // outermost layout first
                 checkMemberOffset(sl, member, lastUnpaddedOffset, offset);
+                member = processGroupLayoutMember(member, offset);
                 checkLayoutRecursive(member);
 
                 offset += member.byteSize();
diff --git 
a/src/java.base/share/classes/jdk/internal/foreign/abi/ppc64/aix/AixPPC64Linker.java
 
b/src/java.base/share/classes/jdk/internal/foreign/abi/ppc64/aix/AixPPC64Linker.java
index c24d2553ec0..ddd4049c814 100644
--- 
a/src/java.base/share/classes/jdk/internal/foreign/abi/ppc64/aix/AixPPC64Linker.java
+++ 
b/src/java.base/share/classes/jdk/internal/foreign/abi/ppc64/aix/AixPPC64Linker.java
@@ -46,7 +46,7 @@ public final class AixPPC64Linker extends AbstractLinker {
     static {
         HashMap<String, MemoryLayout> layouts = new HashMap<>();
         layouts.putAll(SharedUtils.canonicalLayouts(ValueLayout.JAVA_LONG, 
ValueLayout.JAVA_LONG, ValueLayout.JAVA_INT));
-        layouts.put("double", ValueLayout.JAVA_DOUBLE.withByteAlignment(4));
+        layouts.put("double4bytealigned", 
ValueLayout.JAVA_DOUBLE.withByteAlignment(4));
         CANONICAL_LAYOUTS = Map.copyOf(layouts);
     }
 
@@ -81,4 +81,13 @@ protected ByteOrder linkerByteOrder() {
     public Map<String, MemoryLayout> canonicalLayouts() {
         return CANONICAL_LAYOUTS;
     }
+
+    @Override
+    protected MemoryLayout processGroupLayoutMember(MemoryLayout member, long 
offset) {
+        // Change alignment of double members to 4 except at the beginning.
+        if ((offset > 0) && (member instanceof ValueLayout vl && vl.carrier() 
== double.class)) {
+            return ValueLayout.JAVA_DOUBLE.withByteAlignment(4);
+        }
+        return member;
+    }
 }

That will require AIX specific changes in the tests which use double values in 
structures. Should we use the `double4bytealigned` only on AIX in these tests 
or what do you suggest?

-------------

PR Review Comment: https://git.openjdk.org/jdk/pull/16179#discussion_r1359400910

Reply via email to