diff options
author | Sven Gothel <[email protected]> | 2015-01-30 21:15:45 +0100 |
---|---|---|
committer | Sven Gothel <[email protected]> | 2015-01-30 21:15:45 +0100 |
commit | 0deceee37d943faa7c34971388863a27f395d6a5 (patch) | |
tree | 8bbdba69305671c6764b4796d022f9c5e6c49c43 | |
parent | 12feaa7d3b1544098f684d851e3caff1ec88cbc8 (diff) |
Bug 1122: Refine AArch64 and OSType/32Bit incl. MachineDescription
Android:
- Detect ABIType.EABI_GNU_ARMHF via 'armeabi-v7a-hard'
Platform.CPUType:
- contains is32Bit now
MachineDescription:
- Rename *x86_64_unix* -> *lp64_unix*, reflecting universal __LP64__ mode
- Remove is32Bit, which is determined by CPUType
7 files changed, 64 insertions, 100 deletions
diff --git a/src/java/com/jogamp/common/os/AndroidVersion.java b/src/java/com/jogamp/common/os/AndroidVersion.java index 0e30602..f727a47 100644 --- a/src/java/com/jogamp/common/os/AndroidVersion.java +++ b/src/java/com/jogamp/common/os/AndroidVersion.java @@ -91,7 +91,8 @@ public class AndroidVersion { } else if( cpuABI.equals("aarch64") || cpuABI.startsWith("arm64") ) { return CPUType.ARM64; - } else if( cpuABI.equals("armeabi-v7a") ) { + } else if( cpuABI.equals("armeabi-v7a") || + cpuABI.equals("armeabi-v7a-hard") ) { return CPUType.ARMv7; } else if( cpuABI.equals("armeabi") || cpuABI.startsWith("arm") ) { // last 32bit chance .. @@ -107,13 +108,18 @@ public class AndroidVersion { private static final ABIType getABITypeImpl(final CPUType cpuType, final String cpuABI) { if( null == cpuType || null == cpuABI ) { return null; - } else if( CPUFamily.ARM != cpuType.family ) { + } else if( CPUFamily.ARM == cpuType.family ) { + if( CPUType.ARM64 == cpuType || + CPUType.ARMv8_A == cpuType ) { + return ABIType.EABI_AARCH64; + } else if( cpuABI.equals("armeabi-v7a-hard") ) { + return ABIType.EABI_GNU_ARMHF; + } else { + return ABIType.EABI_GNU_ARMEL; + } + } else { return ABIType.GENERIC_ABI; - } else if( CPUType.ARM64 == cpuType || - CPUType.ARMv8_A == cpuType ) { - return ABIType.EABI_AARCH64; } - return ABIType.EABI_GNU_ARMEL; // FIXME: How will they name ABIType.EABI_GNU_ARMHF } static { diff --git a/src/java/com/jogamp/common/os/MachineDescription.java b/src/java/com/jogamp/common/os/MachineDescription.java index a9a46b2..98093d0 100644 --- a/src/java/com/jogamp/common/os/MachineDescription.java +++ b/src/java/com/jogamp/common/os/MachineDescription.java @@ -51,7 +51,7 @@ public class MachineDescription { private final static int[] size_x86_32_unix = { 4, 4, 4, 8, 12, 4, 4096 }; private final static int[] size_x86_32_macos = { 4, 4, 4, 8, 16, 4, 4096 }; private final static int[] size_x86_32_windows = { 4, 4, 4, 8, 12, 4, 4096 }; - private final static int[] size_x86_64_unix = { 4, 8, 4, 8, 16, 8, 4096 }; + private final static int[] size_lp64_unix = { 4, 8, 4, 8, 16, 8, 4096 }; private final static int[] size_x86_64_windows = { 4, 4, 4, 8, 16, 8, 4096 }; private final static int[] size_sparc_32_sunos = { 4, 4, 4, 8, 16, 4, 8192 }; @@ -60,7 +60,7 @@ public class MachineDescription { private final static int[] align_x86_32_unix = { 1, 2, 4, 4, 4, 4, 4, 4, 4, 4 }; private final static int[] align_x86_32_macos = { 1, 2, 4, 4, 4, 4, 4, 4, 16, 4 }; private final static int[] align_x86_32_windows = { 1, 2, 4, 8, 4, 4, 4, 8, 4, 4 }; - private final static int[] align_x86_64_unix = { 1, 2, 4, 8, 4, 8, 4, 8, 16, 8 }; + private final static int[] align_lp64_unix = { 1, 2, 4, 8, 4, 8, 4, 8, 16, 8 }; private final static int[] align_x86_64_windows = { 1, 2, 4, 8, 4, 4, 4, 8, 16, 8 }; private final static int[] align_sparc_32_sunos = { 1, 2, 4, 8, 4, 4, 4, 8, 8, 4 }; @@ -69,8 +69,8 @@ public class MachineDescription { ARMle_EABI(true, size_armeabi, align_armeabi), /** {@link Platform.CPUType#X86_32} Little Endian Unix */ X86_32_UNIX(true, size_x86_32_unix, align_x86_32_unix), - /** {@link Platform.CPUType#X86_64} Little Endian Unix, {@link Platform.CPUType#ARM64} EABI Little Endian */ - X86_64_UNIX(true, size_x86_64_unix, align_x86_64_unix), + /** LP64 Unix, e.g.: {@link Platform.CPUType#X86_64} Little Endian Unix, {@link Platform.CPUType#ARM64} EABI Little Endian, ... */ + LP64_UNIX(true, size_lp64_unix, align_lp64_unix), /** {@link Platform.CPUType#X86_32} Little Endian MacOS (Special case gcc4/OSX) */ X86_32_MACOS(true, size_x86_32_macos, align_x86_32_macos), /** {@link Platform.CPUType#X86_32} Little Endian Windows */ @@ -136,7 +136,6 @@ public class MachineDescription { final private int ldoubleSizeInBytes; final private int pointerSizeInBytes; final private int pageSizeInBytes; - final private boolean is32Bit; final private int int8AlignmentInBytes; final private int int16AlignmentInBytes; @@ -180,7 +179,6 @@ public class MachineDescription { this.ldoubleSizeInBytes = ldoubleSizeInBytes; this.pointerSizeInBytes = pointerSizeInBytes; this.pageSizeInBytes = pageSizeInBytes; - this.is32Bit = 4 == pointerSizeInBytes; this.int8AlignmentInBytes = int8AlignmentInBytes; this.int16AlignmentInBytes = int16AlignmentInBytes; @@ -208,20 +206,6 @@ public class MachineDescription { return littleEndian; } - /** - * Returns true if this JVM/ARCH is 32bit. - */ - public final boolean is32Bit() { - return is32Bit; - } - - /** - * Returns true if this JVM/ARCH is 64bit. - */ - public final boolean is64Bit() { - return !is32Bit; - } - public final int intSizeInBytes() { return intSizeInBytes; } public final int longSizeInBytes() { return longSizeInBytes; } public final int int8SizeInBytes() { return int8SizeInBytes; } @@ -292,7 +276,6 @@ public class MachineDescription { doubleSizeInBytes == md.doubleSizeInBytes && ldoubleSizeInBytes == md.ldoubleSizeInBytes && pointerSizeInBytes == md.pointerSizeInBytes && - is32Bit == md.is32Bit && int8AlignmentInBytes == md.int8AlignmentInBytes && int16AlignmentInBytes == md.int16AlignmentInBytes && @@ -310,7 +293,7 @@ public class MachineDescription { if(null==sb) { sb = new StringBuilder(); } - sb.append("MachineDescription: runtimeValidated ").append(isRuntimeValidated()).append(", littleEndian ").append(isLittleEndian()).append(", 32Bit ").append(is32Bit()).append(", primitive size / alignment:").append(PlatformPropsImpl.NEWLINE); + sb.append("MachineDescription: runtimeValidated ").append(isRuntimeValidated()).append(", littleEndian ").append(isLittleEndian()).append(", 32Bit ").append(4 == pointerAlignmentInBytes).append(", primitive size / alignment:").append(PlatformPropsImpl.NEWLINE); sb.append(" int8 ").append(int8SizeInBytes) .append(" / ").append(int8AlignmentInBytes); sb.append(", int16 ").append(int16SizeInBytes) .append(" / ").append(int16AlignmentInBytes).append(Platform.getNewline()); sb.append(" int ").append(intSizeInBytes) .append(" / ").append(intAlignmentInBytes); diff --git a/src/java/com/jogamp/common/os/Platform.java b/src/java/com/jogamp/common/os/Platform.java index 5b3befa..0d00a9a 100644 --- a/src/java/com/jogamp/common/os/Platform.java +++ b/src/java/com/jogamp/common/os/Platform.java @@ -92,42 +92,44 @@ public class Platform extends PlatformPropsImpl { public enum CPUType { /** X86 32bit */ - X86_32( CPUFamily.X86, 0x0001), + X86_32( CPUFamily.X86, 0x0001, true), /** X86 64bit */ - X86_64( CPUFamily.X86, 0x0002), - /** ARM default */ - ARM( CPUFamily.ARM, 0x0000), + X86_64( CPUFamily.X86, 0x0002, false), + /** ARM 32bit default */ + ARM( CPUFamily.ARM, 0x0000, true), /** ARM7EJ, ARM9E, ARM10E, XScale */ - ARMv5( CPUFamily.ARM, 0x0001), + ARMv5( CPUFamily.ARM, 0x0001, true), /** ARM11 */ - ARMv6( CPUFamily.ARM, 0x0002), + ARMv6( CPUFamily.ARM, 0x0002, true), /** ARM Cortex */ - ARMv7( CPUFamily.ARM, 0x0004), + ARMv7( CPUFamily.ARM, 0x0004, true), /** ARM64 default (64bit) */ - ARM64( CPUFamily.ARM, 0x0008), - /** ARM AArch64 (64bit) and AArch32 (32bit) */ - ARMv8_A( CPUFamily.ARM, 0x0010), - /** PPC default */ - PPC( CPUFamily.PPC, 0x0000), + ARM64( CPUFamily.ARM, 0x0008, false), + /** ARM AArch64 (64bit) */ + ARMv8_A( CPUFamily.ARM, 0x0010, false), + /** PPC 32bit default */ + PPC( CPUFamily.PPC, 0x0000, true), /** SPARC 32bit */ - SPARC_32( CPUFamily.SPARC, 0x0001), + SPARC_32( CPUFamily.SPARC, 0x0001, true), /** SPARC 64bit */ - SPARCV9_64(CPUFamily.SPARC, 0x0002), + SPARCV9_64(CPUFamily.SPARC, 0x0002, false), /** MIPS 32bit */ - MIPS_32( CPUFamily.MIPS, 0x0001), + MIPS_32( CPUFamily.MIPS, 0x0001, true), /** MIPS 64bit */ - MIPS_64( CPUFamily.MIPS, 0x0002), - /** Itanium default */ - IA64( CPUFamily.IA64, 0x0000), - /** PA_RISC2_0 */ - PA_RISC2_0(CPUFamily.PA_RISC, 0x0001); + MIPS_64( CPUFamily.MIPS, 0x0002, false), + /** Itanium 64bit default */ + IA64( CPUFamily.IA64, 0x0000, false), + /** PA_RISC2_0 64bit */ + PA_RISC2_0(CPUFamily.PA_RISC, 0x0001, false); public final int id; public final CPUFamily family; + public final boolean is32Bit; - CPUType(final CPUFamily type, final int id){ + CPUType(final CPUFamily type, final int id, final boolean is32Bit){ this.family = type; this.id = id; + this.is32Bit = is32Bit; } public CPUFamily getFamily() { return family; } @@ -170,8 +172,6 @@ public class Platform extends PlatformPropsImpl { private static final MachineDescription machineDescription; - private static final boolean is32Bit; - /** <code>true</code> if AWT is available and not in headless mode, otherwise <code>false</code>. */ public static final boolean AWT_AVAILABLE; @@ -244,7 +244,6 @@ public class Platform extends PlatformPropsImpl { } } machineDescription = md; - is32Bit = machineDescription.is32Bit(); } private Platform() {} @@ -340,6 +339,22 @@ public class Platform extends PlatformPropsImpl { } /** + * Returns true if this JVM/ARCH is 32bit. + * <p>Shortcut to {@link #getCPUType()}.{@link CPUType#is32Bit is32Bit}</p> + */ + public static boolean is32Bit() { + return CPU_ARCH.is32Bit; // used very often + } + + /** + * Returns true if this JVM/ARCH is 64bit. + * <p>Shortcut to !{@link #getCPUType()}.{@link CPUType#is32Bit is32Bit}</p> + */ + public static boolean is64Bit() { + return !CPU_ARCH.is32Bit; // used very often + } + + /** * Returns the ABI type. * <p> * In case of {@link CPUFamily#ARM}, the value is determined by parsing the <i>Elf Headers</i> of the running VM. @@ -412,24 +427,6 @@ public class Platform extends PlatformPropsImpl { } /** - * Returns true if this JVM/ARCH is 32bit. - * <p>Shortcut to {@link #getMachineDescription()}.{@link MachineDescription#is32Bit() is32Bit()}</p> - */ - public static boolean is32Bit() { - // return Platform.machineDescription.is32Bit(); - return Platform.is32Bit; // used very often - } - - /** - * Returns true if this JVM/ARCH is 64bit. - * <p>Shortcut to {@link #getMachineDescription()}.{@link MachineDescription#is32Bit() is64Bit()}</p> - */ - public static boolean is64Bit() { - // return Platform.machineDescription.is64Bit(); - return !Platform.is32Bit; // used very often - } - - /** * Returns the MachineDescription of the running machine. */ public static MachineDescription getMachineDescription() { diff --git a/src/java/com/jogamp/gluegen/JavaEmitter.java b/src/java/com/jogamp/gluegen/JavaEmitter.java index 93ef696..7e5ce51 100644 --- a/src/java/com/jogamp/gluegen/JavaEmitter.java +++ b/src/java/com/jogamp/gluegen/JavaEmitter.java @@ -100,7 +100,7 @@ public class JavaEmitter implements GlueEmitter { private PrintWriter javaWriter; // Emits either interface or, in AllStatic mode, everything private PrintWriter javaImplWriter; // Only used in non-AllStatic modes for impl class private PrintWriter cWriter; - private final MachineDescription machDescJava = MachineDescription.StaticConfig.X86_64_UNIX.md; + private final MachineDescription machDescJava = MachineDescription.StaticConfig.LP64_UNIX.md; private final MachineDescription.StaticConfig[] machDescTargetConfigs = MachineDescription.StaticConfig.values(); protected final static Logger LOG = Logger.getLogger(JavaEmitter.class.getPackage().getName()); diff --git a/src/java/com/jogamp/gluegen/cgram/types/StructLayout.java b/src/java/com/jogamp/gluegen/cgram/types/StructLayout.java index e3ed7c2..9d1a293 100644 --- a/src/java/com/jogamp/gluegen/cgram/types/StructLayout.java +++ b/src/java/com/jogamp/gluegen/cgram/types/StructLayout.java @@ -69,7 +69,7 @@ public class StructLayout { final MachineDescription dbgMD; if( GlueGen.debug() ) { - dbgMD = MachineDescription.StaticConfig.X86_64_UNIX.md; + dbgMD = MachineDescription.StaticConfig.LP64_UNIX.md; System.err.printf("SL.__: o %03d, s %03d, t %s{%d}%n", curOffset.computeSize(dbgMD), 0, t, t.getNumFields()); } else { dbgMD = null; diff --git a/src/java/com/jogamp/gluegen/cgram/types/Type.java b/src/java/com/jogamp/gluegen/cgram/types/Type.java index 32f48a6..63890a1 100644 --- a/src/java/com/jogamp/gluegen/cgram/types/Type.java +++ b/src/java/com/jogamp/gluegen/cgram/types/Type.java @@ -112,7 +112,7 @@ public abstract class Type implements Cloneable { { long _mdSize = -1; try { - _mdSize = size.computeSize(MachineDescription.StaticConfig.X86_64_UNIX.md); + _mdSize = size.computeSize(MachineDescription.StaticConfig.LP64_UNIX.md); } catch (final Exception e) {} mdSize = _mdSize; } diff --git a/src/java/jogamp/common/os/MachineDescriptionRuntime.java b/src/java/jogamp/common/os/MachineDescriptionRuntime.java index c45aeb7..8df29f6 100644 --- a/src/java/jogamp/common/os/MachineDescriptionRuntime.java +++ b/src/java/jogamp/common/os/MachineDescriptionRuntime.java @@ -71,30 +71,8 @@ public class MachineDescriptionRuntime { } } - private static boolean isCPUArch32Bit(final Platform.CPUType cpuType) throws RuntimeException { - switch( cpuType ) { - case X86_32: - case ARM: - case ARMv5: - case ARMv6: - case ARMv7: - case SPARC_32: - case PPC: - return true; - case X86_64: - case ARM64: - case ARMv8_A: - case IA64: - case SPARCV9_64: - case PA_RISC2_0: - return false; - default: - throw new RuntimeException("Please port CPU detection (32/64 bit) to your platform (" + PlatformPropsImpl.OS_lower + "/" + PlatformPropsImpl.ARCH_lower + "("+PlatformPropsImpl.CPU_ARCH+"))"); - } - } - private static MachineDescription.StaticConfig get(final Platform.OSType osType, final Platform.CPUType cpuType, final boolean littleEndian) { - if( isCPUArch32Bit(cpuType) ) { + if( cpuType.is32Bit ) { if( cpuType.getFamily() == Platform.CPUFamily.ARM && littleEndian) { return StaticConfig.ARMle_EABI; } else if( osType == Platform.OSType.WINDOWS ) { @@ -109,12 +87,12 @@ public class MachineDescriptionRuntime { } return StaticConfig.X86_32_UNIX; } else { - if( cpuType.getFamily() == Platform.CPUFamily.ARM && littleEndian) { - return StaticConfig.X86_64_UNIX; - } else if( osType == Platform.OSType.WINDOWS ) { + if( osType == Platform.OSType.WINDOWS ) { return StaticConfig.X86_64_WINDOWS; + } else { + // for all 64bit unix types (x86_64, aarch64, ..) + return StaticConfig.LP64_UNIX; } - return StaticConfig.X86_64_UNIX; } } |