diff options
author | Sven Gothel <[email protected]> | 2015-02-02 00:22:29 +0100 |
---|---|---|
committer | Sven Gothel <[email protected]> | 2015-02-02 00:22:29 +0100 |
commit | 7db9df61142694965b50f2e0553d4c9e5668439b (patch) | |
tree | 411c69a61d0f693acd55a65f458a2d2b75b84db8 /src/java/com/jogamp/gluegen/cgram | |
parent | 234819d531cdf20842cd0b3302935b187b2012d6 (diff) |
Bug 1126 - Remove static query requirement of MachineDescriptor, find matching StaticConfig at runtime; Fix PPC (Bug 1056) and MIPSLE (Bug 1014) issues.
Currently the StaticConfig is being queried
via the key[OSType, CPUType ..]
as pre-determined by Java properties or the ELF parser.
This adds complication to maintain different platforms
and the key query might not even be sufficient.
The MachineDescriptor's StaticConfig only purpose shall be
to speed-up native data size and offset/alignment retrieval.
This is done by using the StaticConfig index within
all StaticConfig[]s as a lookup-index for the precomputed
struct's size and offset tables.
+++
Solution:
Rename: MachineDescriptor -> MachineDataInfo
Rename: MachineDescriptorRuntime -> MachineDataInfoRuntime
After having defined os.and.arch (OSType, CPUType and ABIType)
w/ the optional help of the now self containing ELF Reader (Bug 1125),
the native gluegen-rt library gets loaded enabling JNI methods.
It is satisfactory to retrieve MachineDataInfo
at runtime w/ JNI and find the matching/compatible StaticConfig.
Only in case none is found, the program needs to abort.
Otherwise the found MachineDataInfo.StaticConfig and MachineDataInfo
are stored for further use (see above).
This removes above complication and key to StaticConfig mapping.
New platforms simply need to add a new unique entry into the
StaticConfig[] table.
++
Also fixes Bug 1056 (PPC), thanks to tmancill [@] debian [.] org,
and Bug 1014 (MIPSLE), thanks to Dejan Latinovic.
Parts of the patch for Bug 1014 from Dejan Latinovic are included.
also solved by this change set.
Diffstat (limited to 'src/java/com/jogamp/gluegen/cgram')
4 files changed, 63 insertions, 48 deletions
diff --git a/src/java/com/jogamp/gluegen/cgram/types/Field.java b/src/java/com/jogamp/gluegen/cgram/types/Field.java index afaeade..858d81a 100644 --- a/src/java/com/jogamp/gluegen/cgram/types/Field.java +++ b/src/java/com/jogamp/gluegen/cgram/types/Field.java @@ -39,7 +39,7 @@ package com.jogamp.gluegen.cgram.types; -import com.jogamp.common.os.MachineDescription; +import com.jogamp.common.os.MachineDataInfo; /** Represents a field in a struct or union. */ @@ -83,8 +83,8 @@ public class Field { public SizeThunk getOffset() { return offset; } /** Offset, in bytes, of this field in the containing data structure - given the specified MachineDescription. */ - public long getOffset(final MachineDescription machDesc) { return offset.computeSize(machDesc); } + given the specified MachineDataInfo. */ + public long getOffset(final MachineDataInfo machDesc) { return offset.computeSize(machDesc); } /** Sets the offset of this field in the containing data structure. */ public void setOffset(final SizeThunk offset) { this.offset = offset; } diff --git a/src/java/com/jogamp/gluegen/cgram/types/SizeThunk.java b/src/java/com/jogamp/gluegen/cgram/types/SizeThunk.java index c13e5d5..9843d6b 100644 --- a/src/java/com/jogamp/gluegen/cgram/types/SizeThunk.java +++ b/src/java/com/jogamp/gluegen/cgram/types/SizeThunk.java @@ -40,7 +40,7 @@ package com.jogamp.gluegen.cgram.types; -import com.jogamp.common.os.MachineDescription; +import com.jogamp.common.os.MachineDataInfo; /** Provides a level of indirection between the definition of a type's size and the absolute value of this size. Necessary when @@ -64,104 +64,104 @@ public abstract class SizeThunk implements Cloneable { public final boolean hasFixedNativeSize() { return fixedNativeSize; } - public abstract long computeSize(MachineDescription machDesc); - public abstract long computeAlignment(MachineDescription machDesc); + public abstract long computeSize(MachineDataInfo machDesc); + public abstract long computeAlignment(MachineDataInfo machDesc); public static final SizeThunk INT8 = new SizeThunk(true) { @Override - public long computeSize(final MachineDescription machDesc) { + public long computeSize(final MachineDataInfo machDesc) { return machDesc.int8SizeInBytes(); } @Override - public long computeAlignment(final MachineDescription machDesc) { + public long computeAlignment(final MachineDataInfo machDesc) { return machDesc.int8AlignmentInBytes(); } }; public static final SizeThunk INT16 = new SizeThunk(true) { @Override - public long computeSize(final MachineDescription machDesc) { + public long computeSize(final MachineDataInfo machDesc) { return machDesc.int16SizeInBytes(); } @Override - public long computeAlignment(final MachineDescription machDesc) { + public long computeAlignment(final MachineDataInfo machDesc) { return machDesc.int16AlignmentInBytes(); } }; public static final SizeThunk INT32 = new SizeThunk(true) { @Override - public long computeSize(final MachineDescription machDesc) { + public long computeSize(final MachineDataInfo machDesc) { return machDesc.int32SizeInBytes(); } @Override - public long computeAlignment(final MachineDescription machDesc) { + public long computeAlignment(final MachineDataInfo machDesc) { return machDesc.int32AlignmentInBytes(); } }; public static final SizeThunk INTxx = new SizeThunk(false) { @Override - public long computeSize(final MachineDescription machDesc) { + public long computeSize(final MachineDataInfo machDesc) { return machDesc.intSizeInBytes(); } @Override - public long computeAlignment(final MachineDescription machDesc) { + public long computeAlignment(final MachineDataInfo machDesc) { return machDesc.intAlignmentInBytes(); } }; public static final SizeThunk LONG = new SizeThunk(false) { @Override - public long computeSize(final MachineDescription machDesc) { + public long computeSize(final MachineDataInfo machDesc) { return machDesc.longSizeInBytes(); } @Override - public long computeAlignment(final MachineDescription machDesc) { + public long computeAlignment(final MachineDataInfo machDesc) { return machDesc.longAlignmentInBytes(); } }; public static final SizeThunk INT64 = new SizeThunk(true) { @Override - public long computeSize(final MachineDescription machDesc) { + public long computeSize(final MachineDataInfo machDesc) { return machDesc.int64SizeInBytes(); } @Override - public long computeAlignment(final MachineDescription machDesc) { + public long computeAlignment(final MachineDataInfo machDesc) { return machDesc.int64AlignmentInBytes(); } }; public static final SizeThunk FLOAT = new SizeThunk(true) { @Override - public long computeSize(final MachineDescription machDesc) { + public long computeSize(final MachineDataInfo machDesc) { return machDesc.floatSizeInBytes(); } @Override - public long computeAlignment(final MachineDescription machDesc) { + public long computeAlignment(final MachineDataInfo machDesc) { return machDesc.floatAlignmentInBytes(); } }; public static final SizeThunk DOUBLE = new SizeThunk(true) { @Override - public long computeSize(final MachineDescription machDesc) { + public long computeSize(final MachineDataInfo machDesc) { return machDesc.doubleSizeInBytes(); } @Override - public long computeAlignment(final MachineDescription machDesc) { + public long computeAlignment(final MachineDataInfo machDesc) { return machDesc.doubleAlignmentInBytes(); } }; public static final SizeThunk POINTER = new SizeThunk(false) { @Override - public long computeSize(final MachineDescription machDesc) { + public long computeSize(final MachineDataInfo machDesc) { return machDesc.pointerSizeInBytes(); } @Override - public long computeAlignment(final MachineDescription machDesc) { + public long computeAlignment(final MachineDataInfo machDesc) { return machDesc.pointerAlignmentInBytes(); } }; @@ -172,11 +172,11 @@ public abstract class SizeThunk implements Cloneable { final SizeThunk thunk2) { return new SizeThunk(false) { @Override - public long computeSize(final MachineDescription machDesc) { + public long computeSize(final MachineDataInfo machDesc) { return thunk1.computeSize(machDesc) + thunk2.computeSize(machDesc); } @Override - public long computeAlignment(final MachineDescription machDesc) { + public long computeAlignment(final MachineDataInfo machDesc) { final long thunk1A = thunk1.computeAlignment(machDesc); final long thunk2A = thunk2.computeAlignment(machDesc); return ( thunk1A > thunk2A ) ? thunk1A : thunk2A ; @@ -188,11 +188,11 @@ public abstract class SizeThunk implements Cloneable { final SizeThunk thunk2) { return new SizeThunk(false) { @Override - public long computeSize(final MachineDescription machDesc) { + public long computeSize(final MachineDataInfo machDesc) { return thunk1.computeSize(machDesc) * thunk2.computeSize(machDesc); } @Override - public long computeAlignment(final MachineDescription machDesc) { + public long computeAlignment(final MachineDataInfo machDesc) { final long thunk1A = thunk1.computeAlignment(machDesc); final long thunk2A = thunk2.computeAlignment(machDesc); return ( thunk1A > thunk2A ) ? thunk1A : thunk2A ; @@ -204,22 +204,37 @@ public abstract class SizeThunk implements Cloneable { final SizeThunk alignmentThunk) { return new SizeThunk(false) { @Override - public long computeSize(final MachineDescription machDesc) { - // x % 2n == x & (2n - 1) - // remainder = net_size & ( alignment - 1 ) - // padding = alignment - remainder ; - // aligned_size = net_size + padding ; + public long computeSize(final MachineDataInfo machDesc) { + /** + * padding = ( alignment - ( net_size % alignment ) ) % alignment ; + * aligned_size = net_size + padding ; + * + * With x % 2n == x & (2n - 1) + * + * Either: + * remainder = net_size & ( alignment - 1 ) + * padding = ( remainder > 0 ) ? alignment - remainder ; + * aligned_size = net_size + padding ; + * + * Or: + * padding = ( alignment - ( net_size & ( alignment - 1 ) ) ) & ( alignment - 1 ); + * aligned_size = net_size + padding ; + * + */ - final long size = offsetThunk.computeSize(machDesc); + final long net_size = offsetThunk.computeSize(machDesc); final long alignment = alignmentThunk.computeAlignment(machDesc); - final long remainder = size & ( alignment - 1 ) ; + /** + final long remainder = net_size & ( alignment - 1 ) ; final long padding = (remainder > 0) ? alignment - remainder : 0; - return size + padding; + */ + final long padding = ( alignment - ( net_size & ( alignment - 1 ) ) ) & ( alignment - 1 ); + return net_size + padding; } @Override - public long computeAlignment(final MachineDescription machDesc) { + public long computeAlignment(final MachineDataInfo machDesc) { final long thunk1A = offsetThunk.computeAlignment(machDesc); final long thunk2A = alignmentThunk.computeAlignment(machDesc); return ( thunk1A > thunk2A ) ? thunk1A : thunk2A ; @@ -231,11 +246,11 @@ public abstract class SizeThunk implements Cloneable { final SizeThunk thunk2) { return new SizeThunk(false) { @Override - public long computeSize(final MachineDescription machDesc) { + public long computeSize(final MachineDataInfo machDesc) { return Math.max(thunk1.computeSize(machDesc), thunk2.computeSize(machDesc)); } @Override - public long computeAlignment(final MachineDescription machDesc) { + public long computeAlignment(final MachineDataInfo machDesc) { final long thunk1A = thunk1.computeAlignment(machDesc); final long thunk2A = thunk2.computeAlignment(machDesc); return ( thunk1A > thunk2A ) ? thunk1A : thunk2A ; @@ -246,11 +261,11 @@ public abstract class SizeThunk implements Cloneable { public static SizeThunk constant(final int constant) { return new SizeThunk(false) { @Override - public long computeSize(final MachineDescription machDesc) { + public long computeSize(final MachineDataInfo machDesc) { return constant; } @Override - public long computeAlignment(final MachineDescription machDesc) { + public long computeAlignment(final MachineDataInfo machDesc) { return 1; // no alignment for constants } }; diff --git a/src/java/com/jogamp/gluegen/cgram/types/StructLayout.java b/src/java/com/jogamp/gluegen/cgram/types/StructLayout.java index 9d1a293..86f1ae1 100644 --- a/src/java/com/jogamp/gluegen/cgram/types/StructLayout.java +++ b/src/java/com/jogamp/gluegen/cgram/types/StructLayout.java @@ -40,7 +40,7 @@ package com.jogamp.gluegen.cgram.types; -import com.jogamp.common.os.MachineDescription; +import com.jogamp.common.os.MachineDataInfo; import com.jogamp.gluegen.GlueGen; /** Encapsulates algorithm for laying out data structures. Note that @@ -67,9 +67,9 @@ public class StructLayout { SizeThunk curOffset = SizeThunk.constant(baseOffset); SizeThunk maxSize = SizeThunk.constant(0); - final MachineDescription dbgMD; + final MachineDataInfo dbgMD; if( GlueGen.debug() ) { - dbgMD = MachineDescription.StaticConfig.LP64_UNIX.md; + dbgMD = MachineDataInfo.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 63890a1..28ba6b4 100644 --- a/src/java/com/jogamp/gluegen/cgram/types/Type.java +++ b/src/java/com/jogamp/gluegen/cgram/types/Type.java @@ -42,7 +42,7 @@ package com.jogamp.gluegen.cgram.types; import java.util.List; -import com.jogamp.common.os.MachineDescription; +import com.jogamp.common.os.MachineDataInfo; /** Models a C type. Primitive types include int, float, and double. All types have an associated name. Structs and unions are @@ -112,7 +112,7 @@ public abstract class Type implements Cloneable { { long _mdSize = -1; try { - _mdSize = size.computeSize(MachineDescription.StaticConfig.LP64_UNIX.md); + _mdSize = size.computeSize(MachineDataInfo.StaticConfig.LP64_UNIX.md); } catch (final Exception e) {} mdSize = _mdSize; } @@ -180,8 +180,8 @@ public abstract class Type implements Cloneable { /** SizeThunk which computes size of this type in bytes. */ public SizeThunk getSize() { return size; } - /** Size of this type in bytes according to the given MachineDescription. */ - public long getSize(final MachineDescription machDesc) { + /** Size of this type in bytes according to the given MachineDataInfo. */ + public long getSize(final MachineDataInfo machDesc) { final SizeThunk thunk = getSize(); if (thunk == null) { throw new RuntimeException("No size set for type \"" + getName() + "\""); |