diff --git a/src/main/java/org/openjdk/jextract/JextractTool.java b/src/main/java/org/openjdk/jextract/JextractTool.java index 4f3c92a0..4e41e922 100644 --- a/src/main/java/org/openjdk/jextract/JextractTool.java +++ b/src/main/java/org/openjdk/jextract/JextractTool.java @@ -484,6 +484,12 @@ private int run(String[] args) { builder.addClangArg("-I" + System.getProperty("user.dir")); + // 64 bit mode on AIX + if (System.getProperty("os.name").toLowerCase().contains("aix")) { + builder.addClangArg("-m64"); + builder.addClangArg("-DAIX_NATURAL_ALIGN=1"); + } + if (optionSet.nonOptionArguments().isEmpty()) { printOptionError(logger.format("expected.atleast.one.header")); return OPTION_ERROR; diff --git a/src/main/java/org/openjdk/jextract/impl/ClassSourceBuilder.java b/src/main/java/org/openjdk/jextract/impl/ClassSourceBuilder.java index 7c1ae3a7..cfd6e9fa 100644 --- a/src/main/java/org/openjdk/jextract/impl/ClassSourceBuilder.java +++ b/src/main/java/org/openjdk/jextract/impl/ClassSourceBuilder.java @@ -259,7 +259,7 @@ private String primitiveLayoutString(Primitive primitiveType, long align) { case Long -> alignIfNeeded(runtimeHelperName() + ".C_LONG", TypeImpl.IS_WINDOWS ? 4 : 8, align); case LongLong -> alignIfNeeded(runtimeHelperName() + ".C_LONG_LONG", 8, align); case Float -> alignIfNeeded(runtimeHelperName() + ".C_FLOAT", 4, align); - case Double -> alignIfNeeded(runtimeHelperName() + ".C_DOUBLE", 8, align); + case Double -> alignIfNeeded(runtimeHelperName() + ".C_DOUBLE", TypeImpl.IS_AIX ? 4 : 8, align); case LongDouble -> TypeImpl.IS_WINDOWS ? alignIfNeeded(runtimeHelperName() + ".C_LONG_DOUBLE", 8, align) : paddingLayoutString(8, 0); diff --git a/src/main/java/org/openjdk/jextract/impl/TypeImpl.java b/src/main/java/org/openjdk/jextract/impl/TypeImpl.java index 24184f57..cdef2245 100644 --- a/src/main/java/org/openjdk/jextract/impl/TypeImpl.java +++ b/src/main/java/org/openjdk/jextract/impl/TypeImpl.java @@ -43,6 +43,7 @@ public abstract class TypeImpl implements Type { public static final boolean IS_WINDOWS = System.getProperty("os.name").startsWith("Windows"); + public static final boolean IS_AIX = System.getProperty("os.name").startsWith("AIX"); @Override public boolean isErroneous() { diff --git a/test/jtreg/generator/testStruct/struct.h b/test/jtreg/generator/testStruct/struct.h index 07cbd7da..9c4e3124 100644 --- a/test/jtreg/generator/testStruct/struct.h +++ b/test/jtreg/generator/testStruct/struct.h @@ -31,6 +31,10 @@ extern "C" { #define EXPORT #endif +#ifdef AIX_NATURAL_ALIGN +#pragma align(natural) +#endif + typedef struct Point { int x; int y; diff --git a/test/lib/testlib/JextractToolRunner.java b/test/lib/testlib/JextractToolRunner.java index d6dc9336..170f577e 100644 --- a/test/lib/testlib/JextractToolRunner.java +++ b/test/lib/testlib/JextractToolRunner.java @@ -56,6 +56,7 @@ public class JextractToolRunner { public static final boolean IS_WINDOWS = System.getProperty("os.name").startsWith("Windows"); public static final boolean IS_LINUX = System.getProperty("os.name").equals("Linux"); public static final boolean IS_AARCH64 = System.getProperty("os.arch").equals("aarch64"); + public static final boolean IS_AIX = System.getProperty("os.name").equals("AIX"); public static final ValueLayout.OfBoolean C_BOOL = ValueLayout.JAVA_BOOLEAN; public static final ValueLayout.OfByte C_CHAR = ValueLayout.JAVA_BYTE; diff --git a/test/testng/org/openjdk/jextract/test/toolprovider/examples.h b/test/testng/org/openjdk/jextract/test/toolprovider/examples.h index 8fcb1706..fcffd421 100644 --- a/test/testng/org/openjdk/jextract/test/toolprovider/examples.h +++ b/test/testng/org/openjdk/jextract/test/toolprovider/examples.h @@ -27,6 +27,10 @@ #define EXPORT #endif +#ifdef AIX_NATURAL_ALIGN +#pragma align(natural) +#endif + #define macro_byte (char) 1 #define macro_short (short) 1 #define macro_int 1 @@ -79,4 +83,4 @@ enum { enum_anon_0, enum_anon_1, enum_anon_2, -}; \ No newline at end of file +}; diff --git a/test/testng/org/openjdk/jextract/test/toolprovider/nestedAnonOffset/TestNestedAnonOffset.java b/test/testng/org/openjdk/jextract/test/toolprovider/nestedAnonOffset/TestNestedAnonOffset.java index 2fe582cf..e9ff5110 100644 --- a/test/testng/org/openjdk/jextract/test/toolprovider/nestedAnonOffset/TestNestedAnonOffset.java +++ b/test/testng/org/openjdk/jextract/test/toolprovider/nestedAnonOffset/TestNestedAnonOffset.java @@ -91,7 +91,7 @@ public void testBaz() { StructLayout layout = (StructLayout) findLayout(baz); assertEquals(layout.memberLayouts().get(0), C_CHAR.withName("c")); // Note here: on some platforms, the bitfield needs to be aligned and requires more padding - int paddingBytes = (IS_WINDOWS || (IS_LINUX && IS_AARCH64)) ? 11 : 8; + int paddingBytes = (IS_WINDOWS || (IS_LINUX && IS_AARCH64) || IS_AIX) ? 11 : 8; assertEquals(layout.memberLayouts().get(1), MemoryLayout.paddingLayout(paddingBytes)); }