From f733203dfbd034a6b1aa3eb2cd616437c982c435 Mon Sep 17 00:00:00 2001 From: Sven Gothel <sgothel@jausoft.com> Date: Sun, 17 Jul 2011 16:34:39 +0200 Subject: GlueGen proper size / alignment of primitive and compound types usage [1/2] - Preparation. Currently GlueGen fails for type long (size) and some alignments (see package.html). - The size and alignment values shall be queried at runtime. - Compound alignment needs to follow the described natural alignment (also @runtime). - - Build - add Linux Arm7 (EABI) - junit test - added compound/struct tests, pointing out the shortcomings of current impl. - package.html - Added alignment documentation - remove intptr.cfg - add GluGen types int8_t, int16_t, uint8_t, uint16_t - move MachineDescription* into runtime - Platform - has runtime MachineDescription - moved size, .. to MachineDescription - use enums for OSType, CPUArch and CPUType defined by os.name/os.arch, triggering exception if os/arch is not supported. This avoids Java String comparison and conscious os/arch detection. - MachineDescription: - compile time instances MachineDescription32Bits, MachineDescription64Bits - runtime queried instance MachineDescriptionRuntime - correct size, alignment, page size, .. --- src/java/com/jogamp/gluegen/StructLayout.java | 53 +++++++++++++++------------ 1 file changed, 29 insertions(+), 24 deletions(-) (limited to 'src/java/com/jogamp/gluegen/StructLayout.java') diff --git a/src/java/com/jogamp/gluegen/StructLayout.java b/src/java/com/jogamp/gluegen/StructLayout.java index ea8768f..392e1b1 100644 --- a/src/java/com/jogamp/gluegen/StructLayout.java +++ b/src/java/com/jogamp/gluegen/StructLayout.java @@ -1,5 +1,6 @@ /* * Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved. + * Copyright (c) 2010 JogAmp Community. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are @@ -39,6 +40,7 @@ package com.jogamp.gluegen; +import com.jogamp.common.os.Platform; import com.jogamp.gluegen.cgram.types.*; /** Encapsulates algorithm for laying out data structures. Note that @@ -119,36 +121,39 @@ public class StructLayout { + /** + * <P>See alignment in {@link com.jogamp.common.os.MachineDescription}.</p> + * + * <P>The code is currently used at compile time {@link JavaEmitter#layoutStruct(CompoundType t)} once, + * and code for structs is emitted for generic 32bit and 64bit only {@link JavaEmitter#emitStruct(CompoundType structType, String alternateName)}.</p> + */ public static StructLayout createForCurrentPlatform() { - // Note: this code is replicated in (from?) Platform.java - String os = System.getProperty("os.name").toLowerCase(); - String cpu = System.getProperty("os.arch").toLowerCase(); - if ((os.startsWith("windows") && cpu.equals("x86"))) { - // It appears that Windows uses a packing alignment of 4 bytes in 32-bit mode + final Platform.OSType osType = Platform.getOSType(); + final Platform.CPUArch cpuArch = Platform.getCPUArch(); + + if( ( Platform.OSType.WINDOWS == osType && Platform.CPUArch.X86_32 == cpuArch ) || // It appears that Windows uses a packing alignment of 4 bytes in 32-bit mode + ( Platform.CPUArch.ARM_32 == cpuArch ) + ) { return new StructLayout(0, 4); - } else if ((os.startsWith("windows") && cpu.equals("amd64")) || - (os.startsWith("linux") && cpu.equals("i386")) || - (os.startsWith("linux") && cpu.equals("x86")) || - (os.startsWith("linux") && cpu.equals("amd64")) || - (os.startsWith("linux") && cpu.equals("x86_64")) || - (os.startsWith("linux") && cpu.equals("ia64")) || - (os.startsWith("sunos") && cpu.equals("sparc")) || - (os.startsWith("sunos") && cpu.equals("sparcv9")) || - (os.startsWith("sunos") && cpu.equals("x86")) || - (os.startsWith("sunos") && cpu.equals("amd64")) || - (os.startsWith("mac os") && cpu.equals("ppc")) || - (os.startsWith("mac os") && cpu.equals("i386")) || - (os.startsWith("mac os") && cpu.equals("x86_64")) || - (os.startsWith("freebsd") && cpu.equals("i386")) || - (os.startsWith("freebsd") && cpu.equals("amd64")) || - (os.startsWith("hp-ux") && cpu.equals("pa_risc2.0")) + } else if ((Platform.OSType.WINDOWS == osType && Platform.CPUArch.X86_64 == cpuArch) || + (Platform.OSType.LINUX == osType && Platform.CPUArch.X86_32 == cpuArch) || + (Platform.OSType.LINUX == osType && Platform.CPUArch.X86_64 == cpuArch) || + (Platform.OSType.LINUX == osType && Platform.CPUArch.IA64 == cpuArch) || + (Platform.OSType.SUNOS == osType && Platform.CPUArch.SPARC_32 == cpuArch) || + (Platform.OSType.SUNOS == osType && Platform.CPUArch.SPARCV9_64 == cpuArch) || + (Platform.OSType.SUNOS == osType && Platform.CPUArch.X86_32 == cpuArch) || + (Platform.OSType.SUNOS == osType && Platform.CPUArch.X86_64 == cpuArch) || + (Platform.OSType.MACOS == osType && Platform.CPUArch.PPC == cpuArch) || + (Platform.OSType.MACOS == osType && Platform.CPUArch.X86_32 == cpuArch) || + (Platform.OSType.MACOS == osType && Platform.CPUArch.X86_64 == cpuArch) || + (Platform.OSType.FREEBSD == osType && Platform.CPUArch.X86_32 == cpuArch) || + (Platform.OSType.FREEBSD == osType && Platform.CPUArch.X86_64 == cpuArch) || + (Platform.OSType.HPUX == osType && Platform.CPUArch.PA_RISC2_0 == cpuArch) ) { - // FIXME: make struct alignment configurable? May need to change - // packing rules on a per-type basis? return new StructLayout(0, 8); } else { // FIXME: add more ports - throw new RuntimeException("Please port StructLayout to your OS (" + os + ") and CPU (" + cpu + ")"); + throw new RuntimeException("Please port StructLayout to your OS (" + osType + ") and CPU (" + cpuArch + ")"); } } } -- cgit v1.2.3