summaryrefslogtreecommitdiffstats
path: root/src/classes/com/sun/gluegen/cgram
diff options
context:
space:
mode:
Diffstat (limited to 'src/classes/com/sun/gluegen/cgram')
-rw-r--r--src/classes/com/sun/gluegen/cgram/HeaderParser.g52
-rw-r--r--src/classes/com/sun/gluegen/cgram/types/ArrayType.java4
-rw-r--r--src/classes/com/sun/gluegen/cgram/types/CompoundType.java6
-rw-r--r--src/classes/com/sun/gluegen/cgram/types/DoubleType.java2
-rw-r--r--src/classes/com/sun/gluegen/cgram/types/EnumType.java12
-rw-r--r--src/classes/com/sun/gluegen/cgram/types/Field.java23
-rw-r--r--src/classes/com/sun/gluegen/cgram/types/FloatType.java2
-rw-r--r--src/classes/com/sun/gluegen/cgram/types/FunctionType.java2
-rw-r--r--src/classes/com/sun/gluegen/cgram/types/IntType.java4
-rw-r--r--src/classes/com/sun/gluegen/cgram/types/PointerType.java6
-rw-r--r--src/classes/com/sun/gluegen/cgram/types/PrimitiveType.java2
-rwxr-xr-xsrc/classes/com/sun/gluegen/cgram/types/SizeThunk.java171
-rw-r--r--src/classes/com/sun/gluegen/cgram/types/Type.java18
-rw-r--r--src/classes/com/sun/gluegen/cgram/types/VoidType.java2
14 files changed, 238 insertions, 68 deletions
diff --git a/src/classes/com/sun/gluegen/cgram/HeaderParser.g b/src/classes/com/sun/gluegen/cgram/HeaderParser.g
index 212e56091..78ba5c54a 100644
--- a/src/classes/com/sun/gluegen/cgram/HeaderParser.g
+++ b/src/classes/com/sun/gluegen/cgram/HeaderParser.g
@@ -56,17 +56,6 @@ options {
/** Name assigned to a anonymous EnumType (e.g., "enum { ... }"). */
public static final String ANONYMOUS_ENUM_NAME = "<anonymous>";
- /** Set the machine description for this HeaderParser. Must be
- done before parsing. */
- public void setMachineDescription(MachineDescription machDesc) {
- this.machDesc = machDesc;
- }
-
- /** Returns the MachineDescription this HeaderParser uses. */
- public MachineDescription machineDescription() {
- return machDesc;
- }
-
/** Set the dictionary mapping typedef names to types for this
HeaderParser. Must be done before parsing. */
public void setTypedefDictionary(TypeDictionary dict) {
@@ -130,7 +119,7 @@ options {
int cvAttrs) {
CompoundType t = (CompoundType) structDictionary.get(typeName);
if (t == null) {
- t = new CompoundType(null, -1, kind, cvAttrs);
+ t = new CompoundType(null, null, kind, cvAttrs);
t.setStructName(typeName);
structDictionary.put(typeName, t);
}
@@ -207,7 +196,6 @@ options {
}
}
- private MachineDescription machDesc;
private boolean doDeclaration; // Used to only process function typedefs
private String declId;
private List parameters;
@@ -242,7 +230,7 @@ options {
private void processDeclaration(Type returnType) {
if (doDeclaration) {
- FunctionSymbol sym = new FunctionSymbol(declId, new FunctionType(null, -1, returnType, 0));
+ FunctionSymbol sym = new FunctionSymbol(declId, new FunctionType(null, null, returnType, 0));
if (parameters != null) { // handle funcs w/ empty parameter lists (e.g., "foo()")
for (Iterator iter = parameters.iterator(); iter.hasNext(); ) {
ParameterDeclaration pd = (ParameterDeclaration) iter.next();
@@ -272,13 +260,13 @@ options {
// FIXME: this doesn't take into account struct alignment, which may be necessary
// See also FIXMEs in ArrayType.java
int len = parseIntConstExpr(t);
- tb.setType(canonicalize(new ArrayType(tb.type(), len * tb.type().getSize(), len, 0)));
+ tb.setType(canonicalize(new ArrayType(tb.type(), SizeThunk.mul(SizeThunk.constant(len), tb.type().getSize()), len, 0)));
return;
} catch (RecognitionException e) {
// Fall through
}
}
- tb.setType(canonicalize(new PointerType(machDesc.pointerSizeInBytes(),
+ tb.setType(canonicalize(new PointerType(SizeThunk.POINTER,
tb.type(),
0)));
}
@@ -301,7 +289,7 @@ options {
}
if (enumType == null) {
- enumType = new EnumType(enumTypeName, machDesc.longSizeInBytes());
+ enumType = new EnumType(enumTypeName, SizeThunk.LONG);
}
return enumType;
@@ -348,7 +336,7 @@ declarator[TypeBox tb] returns [String s] {
doDeclaration();
} else if ( funcPointerName != null ) {
/* TypeBox becomes function pointer in this case */
- FunctionType ft = new FunctionType(null, -1, tb.type(), 0);
+ FunctionType ft = new FunctionType(null, null, tb.type(), 0);
if (params == null) {
// If the function pointer has no declared parameters, it's a
// void function. I'm not sure if the parameter name is
@@ -362,7 +350,7 @@ declarator[TypeBox tb] returns [String s] {
ft.addArgument(pd.type(), pd.id());
}
}
- tb.setType(canonicalize(new PointerType(machDesc.pointerSizeInBytes(),
+ tb.setType(canonicalize(new PointerType(SizeThunk.POINTER,
ft,
0)));
s = funcPointerName;
@@ -431,7 +419,7 @@ declSpecifiers returns [TypeBox tb] {
{
if (t == null &&
(x & (SIGNED | UNSIGNED)) != 0) {
- t = new IntType("int", machDesc.intSizeInBytes(), ((x & UNSIGNED) != 0), attrs2CVAttrs(x));
+ t = new IntType("int", SizeThunk.INT, ((x & UNSIGNED) != 0), attrs2CVAttrs(x));
}
tb = new TypeBox(t, ((x & TYPEDEF) != 0));
}
@@ -465,13 +453,13 @@ typeSpecifier[int attributes] returns [Type t] {
boolean unsigned = ((attributes & UNSIGNED) != 0);
}
: "void" { t = new VoidType(cvAttrs); }
- | "char" { t = new IntType("char" , machDesc.charSizeInBytes(), unsigned, cvAttrs); }
- | "short" { t = new IntType("short", machDesc.shortSizeInBytes(), unsigned, cvAttrs); }
- | "int" { t = new IntType("int" , machDesc.intSizeInBytes(), unsigned, cvAttrs); }
- | "long" { t = new IntType("long" , machDesc.longSizeInBytes(), unsigned, cvAttrs); }
- | "__int64" { t = new IntType("__int64", machDesc.int64SizeInBytes(), unsigned, cvAttrs); }
- | "float" { t = new FloatType("float", machDesc.floatSizeInBytes(), cvAttrs); }
- | "double" { t = new DoubleType("double", machDesc.doubleSizeInBytes(), cvAttrs); }
+ | "char" { t = new IntType("char" , SizeThunk.CHAR, unsigned, cvAttrs); }
+ | "short" { t = new IntType("short", SizeThunk.SHORT, unsigned, cvAttrs); }
+ | "int" { t = new IntType("int" , SizeThunk.INT, unsigned, cvAttrs); }
+ | "long" { t = new IntType("long" , SizeThunk.LONG, unsigned, cvAttrs); }
+ | "__int64" { t = new IntType("__int64", SizeThunk.INT64, unsigned, cvAttrs); }
+ | "float" { t = new FloatType("float", SizeThunk.FLOAT, cvAttrs); }
+ | "double" { t = new DoubleType("double", SizeThunk.DOUBLE, cvAttrs); }
| t = structSpecifier[cvAttrs] ( attributeDecl )*
| t = unionSpecifier [cvAttrs] ( attributeDecl )*
| t = enumSpecifier [cvAttrs]
@@ -507,7 +495,7 @@ structOrUnionBody[CompoundTypeKind kind, int cvAttrs] returns [CompoundType t] {
t = (CompoundType) canonicalize(lookupInStructDictionary(id.getText(), kind, cvAttrs));
} ( structDeclarationList[t] )?
RCURLY { t.setBodyParsed(); }
- | LCURLY { t = new CompoundType(null, -1, kind, cvAttrs); }
+ | LCURLY { t = new CompoundType(null, null, kind, cvAttrs); }
( structDeclarationList[t] )?
RCURLY { t.setBodyParsed(); }
| id2:ID { t = (CompoundType) canonicalize(lookupInStructDictionary(id2.getText(), kind, cvAttrs)); }
@@ -528,7 +516,7 @@ structDeclaration[CompoundType containingType] {
CompoundType ct = t.asCompound();
if (ct.isUnion()) {
// Anonymous union
- containingType.addField(new Field(null, t, -1));
+ containingType.addField(new Field(null, t, null));
}
}
}
@@ -544,7 +532,7 @@ specifierQualifierList returns [Type t] {
)+ {
if (t == null &&
(x & (SIGNED | UNSIGNED)) != 0) {
- t = new IntType("int", machDesc.intSizeInBytes(), ((x & UNSIGNED) != 0), attrs2CVAttrs(x));
+ t = new IntType("int", SizeThunk.INT, ((x & UNSIGNED) != 0), attrs2CVAttrs(x));
}
}
;
@@ -563,7 +551,7 @@ structDeclarator[CompoundType containingType, Type t] returns [boolean addedAny]
}
:
#( NStructDeclarator
- ( s = declarator[tb] { containingType.addField(new Field(s, tb.type(), -1)); addedAny = true; } )?
+ ( s = declarator[tb] { containingType.addField(new Field(s, tb.type(), null)); addedAny = true; } )?
( COLON expr { /* FIXME: bit types not handled yet */ } ) ?
( attributeDecl )*
)
@@ -659,7 +647,7 @@ pointerGroup[TypeBox tb] { int x = 0; int y = 0; }
{
//System.err.println("IN PTR GROUP: TB=" + tb);
if (tb != null) {
- tb.setType(canonicalize(new PointerType(machDesc.pointerSizeInBytes(),
+ tb.setType(canonicalize(new PointerType(SizeThunk.POINTER,
tb.type(),
attrs2CVAttrs(x))));
}
diff --git a/src/classes/com/sun/gluegen/cgram/types/ArrayType.java b/src/classes/com/sun/gluegen/cgram/types/ArrayType.java
index c61e6457f..0e23d356d 100644
--- a/src/classes/com/sun/gluegen/cgram/types/ArrayType.java
+++ b/src/classes/com/sun/gluegen/cgram/types/ArrayType.java
@@ -49,7 +49,7 @@ public class ArrayType extends Type {
private int length;
private String computedName;
- public ArrayType(Type elementType, int sizeInBytes, int length, int cvAttributes) {
+ public ArrayType(Type elementType, SizeThunk sizeInBytes, int length, int cvAttributes) {
super(elementType.getName() + " *", sizeInBytes, cvAttributes);
this.elementType = elementType;
this.length = length;
@@ -100,7 +100,7 @@ public class ArrayType extends Type {
}
// FIXME: this doesn't take into account struct alignment, which may be necessary
// See also FIXME below and in HeaderParser.g
- super.setSize(getLength() * elementType.getSize());
+ super.setSize(SizeThunk.mul(SizeThunk.constant(getLength()), elementType.getSize()));
}
public String toString() {
diff --git a/src/classes/com/sun/gluegen/cgram/types/CompoundType.java b/src/classes/com/sun/gluegen/cgram/types/CompoundType.java
index 6ad7580e0..28d7b7664 100644
--- a/src/classes/com/sun/gluegen/cgram/types/CompoundType.java
+++ b/src/classes/com/sun/gluegen/cgram/types/CompoundType.java
@@ -55,11 +55,11 @@ public class CompoundType extends Type {
private boolean computedHashcode;
private int hashcode;
- public CompoundType(String name, int size, CompoundTypeKind kind, int cvAttributes) {
+ public CompoundType(String name, SizeThunk size, CompoundTypeKind kind, int cvAttributes) {
this(name, size, kind, cvAttributes, null);
}
- private CompoundType(String name, int size, CompoundTypeKind kind, int cvAttributes, String structName) {
+ private CompoundType(String name, SizeThunk size, CompoundTypeKind kind, int cvAttributes, String structName) {
super(name, size, cvAttributes);
assert kind != null;
this.kind = kind;
@@ -107,7 +107,7 @@ public class CompoundType extends Type {
this.structName = structName;
}
- public void setSize(int size) {
+ public void setSize(SizeThunk size) {
super.setSize(size);
}
diff --git a/src/classes/com/sun/gluegen/cgram/types/DoubleType.java b/src/classes/com/sun/gluegen/cgram/types/DoubleType.java
index e2be470fb..6d6e62c98 100644
--- a/src/classes/com/sun/gluegen/cgram/types/DoubleType.java
+++ b/src/classes/com/sun/gluegen/cgram/types/DoubleType.java
@@ -42,7 +42,7 @@ package com.sun.gluegen.cgram.types;
/** Represents a double-word floating-point type (C type "double".) */
public class DoubleType extends PrimitiveType {
- public DoubleType(String name, int size, int cvAttributes) {
+ public DoubleType(String name, SizeThunk size, int cvAttributes) {
super(name, size, cvAttributes);
}
diff --git a/src/classes/com/sun/gluegen/cgram/types/EnumType.java b/src/classes/com/sun/gluegen/cgram/types/EnumType.java
index 7f4b9e559..717d3892c 100644
--- a/src/classes/com/sun/gluegen/cgram/types/EnumType.java
+++ b/src/classes/com/sun/gluegen/cgram/types/EnumType.java
@@ -60,16 +60,14 @@ public class EnumType extends IntType {
}
private List/*<Enum>*/ enums;
- private static final int longSizeBytes = 8;
-
public EnumType(String name) {
- super(name, longSizeBytes, false, CVAttributes.CONST );
- this.underlyingType = new IntType(name, longSizeBytes, false, CVAttributes.CONST);
+ super(name, SizeThunk.LONG, false, CVAttributes.CONST );
+ this.underlyingType = new IntType(name, SizeThunk.LONG, false, CVAttributes.CONST);
}
- public EnumType(String name, int enumSizeBytes) {
- super(name, enumSizeBytes, false, CVAttributes.CONST );
- this.underlyingType = new IntType(name, enumSizeBytes, false, CVAttributes.CONST);
+ public EnumType(String name, SizeThunk enumSizeInBytes) {
+ super(name, enumSizeInBytes, false, CVAttributes.CONST );
+ this.underlyingType = new IntType(name, enumSizeInBytes, false, CVAttributes.CONST);
}
protected EnumType(String name, IntType underlyingType, int cvAttributes) {
diff --git a/src/classes/com/sun/gluegen/cgram/types/Field.java b/src/classes/com/sun/gluegen/cgram/types/Field.java
index 3514c8f7e..e16ffbc5b 100644
--- a/src/classes/com/sun/gluegen/cgram/types/Field.java
+++ b/src/classes/com/sun/gluegen/cgram/types/Field.java
@@ -42,11 +42,11 @@ package com.sun.gluegen.cgram.types;
/** Represents a field in a struct or union. */
public class Field {
- private String name;
- private Type type;
- private long offset;
+ private String name;
+ private Type type;
+ private SizeThunk offset;
- public Field(String name, Type type, long offset) {
+ public Field(String name, Type type, SizeThunk offset) {
this.name = name;
this.type = type;
this.offset = offset;
@@ -62,10 +62,11 @@ public class Field {
}
Field f = (Field) arg;
+ // Note: don't know how to examine offset any more since it's
+ // implemented in terms of code and they're not canonicalized
return (((name != null && name.equals(f.name)) ||
(name == null && f.name == null)) &&
- type.equals(f.type) &&
- offset == f.offset);
+ type.equals(f.type));
}
/** Name of this field in the containing data structure. */
@@ -74,11 +75,15 @@ public class Field {
/** Type of this field. */
public Type getType() { return type; }
- /** Offset, in bytes, of this field in the containing data structure. */
- public long getOffset() { return offset; }
+ /** SizeThunk computing offset, in bytes, of this field in the containing data structure. */
+ public SizeThunk getOffset() { return offset; }
+
+ /** Offset, in bytes, of this field in the containing data structure
+ given the specified MachineDescription. */
+ public long getOffset(MachineDescription machDesc) { return offset.compute(machDesc); }
/** Sets the offset of this field in the containing data structure. */
- public void setOffset(long offset) { this.offset = offset; }
+ public void setOffset(SizeThunk offset) { this.offset = offset; }
public String toString() {
if (!getType().isFunctionPointer()) {
diff --git a/src/classes/com/sun/gluegen/cgram/types/FloatType.java b/src/classes/com/sun/gluegen/cgram/types/FloatType.java
index 9f59b3564..7a6fa4d64 100644
--- a/src/classes/com/sun/gluegen/cgram/types/FloatType.java
+++ b/src/classes/com/sun/gluegen/cgram/types/FloatType.java
@@ -42,7 +42,7 @@ package com.sun.gluegen.cgram.types;
/** Represents a single-word floating-point type (C type "float".) */
public class FloatType extends PrimitiveType {
- public FloatType(String name, int size, int cvAttributes) {
+ public FloatType(String name, SizeThunk size, int cvAttributes) {
super(name, size, cvAttributes);
}
diff --git a/src/classes/com/sun/gluegen/cgram/types/FunctionType.java b/src/classes/com/sun/gluegen/cgram/types/FunctionType.java
index 9c94daea2..5e22e47d7 100644
--- a/src/classes/com/sun/gluegen/cgram/types/FunctionType.java
+++ b/src/classes/com/sun/gluegen/cgram/types/FunctionType.java
@@ -49,7 +49,7 @@ public class FunctionType extends Type {
private ArrayList argumentTypes;
private ArrayList argumentNames;
- public FunctionType(String name, int size, Type returnType, int cvAttributes) {
+ public FunctionType(String name, SizeThunk size, Type returnType, int cvAttributes) {
super(name, size, cvAttributes);
this.returnType = returnType;
}
diff --git a/src/classes/com/sun/gluegen/cgram/types/IntType.java b/src/classes/com/sun/gluegen/cgram/types/IntType.java
index 2816c561c..acd6a3d2b 100644
--- a/src/classes/com/sun/gluegen/cgram/types/IntType.java
+++ b/src/classes/com/sun/gluegen/cgram/types/IntType.java
@@ -43,11 +43,11 @@ public class IntType extends PrimitiveType {
private boolean unsigned;
private boolean typedefedUnsigned;
- public IntType(String name, int size, boolean unsigned, int cvAttributes) {
+ public IntType(String name, SizeThunk size, boolean unsigned, int cvAttributes) {
this(name, size, unsigned, cvAttributes, false);
}
- private IntType(String name, int size, boolean unsigned, int cvAttributes, boolean typedefedUnsigned) {
+ private IntType(String name, SizeThunk size, boolean unsigned, int cvAttributes, boolean typedefedUnsigned) {
super(name, size, cvAttributes);
this.unsigned = unsigned;
this.typedefedUnsigned = typedefedUnsigned;
diff --git a/src/classes/com/sun/gluegen/cgram/types/PointerType.java b/src/classes/com/sun/gluegen/cgram/types/PointerType.java
index 142a2f12d..3fe69a164 100644
--- a/src/classes/com/sun/gluegen/cgram/types/PointerType.java
+++ b/src/classes/com/sun/gluegen/cgram/types/PointerType.java
@@ -44,13 +44,13 @@ public class PointerType extends Type {
private String computedName;
private boolean hasTypedefedName;
- public PointerType(int size, Type targetType, int cvAttributes) {
+ public PointerType(SizeThunk size, Type targetType, int cvAttributes) {
// can pass null for the final name parameter because the PointerType's getName()
// completely replaces superclass behavior
- this(size, targetType, cvAttributes, false, null);
+ this(size, targetType, cvAttributes, false, null);
}
- private PointerType(int size, Type targetType, int cvAttributes, boolean hasTypedefedName, String typedefedName) {
+ private PointerType(SizeThunk size, Type targetType, int cvAttributes, boolean hasTypedefedName, String typedefedName) {
super(targetType.getName() + " *", size, cvAttributes);
this.hasTypedefedName = false;
this.targetType = targetType;
diff --git a/src/classes/com/sun/gluegen/cgram/types/PrimitiveType.java b/src/classes/com/sun/gluegen/cgram/types/PrimitiveType.java
index 8807e2615..80dab9aef 100644
--- a/src/classes/com/sun/gluegen/cgram/types/PrimitiveType.java
+++ b/src/classes/com/sun/gluegen/cgram/types/PrimitiveType.java
@@ -40,7 +40,7 @@
package com.sun.gluegen.cgram.types;
public abstract class PrimitiveType extends Type {
- protected PrimitiveType(String name, int size, int cvAttributes) {
+ protected PrimitiveType(String name, SizeThunk size, int cvAttributes) {
super(name, size, cvAttributes);
}
diff --git a/src/classes/com/sun/gluegen/cgram/types/SizeThunk.java b/src/classes/com/sun/gluegen/cgram/types/SizeThunk.java
new file mode 100755
index 000000000..74feef950
--- /dev/null
+++ b/src/classes/com/sun/gluegen/cgram/types/SizeThunk.java
@@ -0,0 +1,171 @@
+/*
+ * Copyright (c) 2005 Sun Microsystems, Inc. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any kind. ALL
+ * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
+ * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
+ * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN
+ * MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE FOR
+ * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
+ * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR
+ * ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR
+ * DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE
+ * DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY,
+ * ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF
+ * SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed or intended for use
+ * in the design, construction, operation or maintenance of any nuclear
+ * facility.
+ *
+ * Sun gratefully acknowledges that this software was originally authored
+ * and developed by Kenneth Bradley Russell and Christopher John Kline.
+ */
+
+package com.sun.gluegen.cgram.types;
+
+/** Provides a level of indirection between the definition of a type's
+ size and the absolute value of this size. Necessary when
+ generating glue code for two different CPU architectures (e.g.,
+ 32-bit and 64-bit) from the same internal representation of the
+ various types involved. */
+
+public abstract class SizeThunk {
+ // Private constructor because there are only a few of these
+ private SizeThunk() {}
+
+ public abstract long compute(MachineDescription machDesc);
+
+ public static final SizeThunk CHAR = new SizeThunk() {
+ public long compute(MachineDescription machDesc) {
+ return machDesc.charSizeInBytes();
+ }
+ };
+
+ public static final SizeThunk SHORT = new SizeThunk() {
+ public long compute(MachineDescription machDesc) {
+ return machDesc.shortSizeInBytes();
+ }
+ };
+
+ public static final SizeThunk INT = new SizeThunk() {
+ public long compute(MachineDescription machDesc) {
+ return machDesc.intSizeInBytes();
+ }
+ };
+
+ public static final SizeThunk LONG = new SizeThunk() {
+ public long compute(MachineDescription machDesc) {
+ return machDesc.longSizeInBytes();
+ }
+ };
+
+ public static final SizeThunk INT64 = new SizeThunk() {
+ public long compute(MachineDescription machDesc) {
+ return machDesc.int64SizeInBytes();
+ }
+ };
+
+ public static final SizeThunk FLOAT = new SizeThunk() {
+ public long compute(MachineDescription machDesc) {
+ return machDesc.floatSizeInBytes();
+ }
+ };
+
+ public static final SizeThunk DOUBLE = new SizeThunk() {
+ public long compute(MachineDescription machDesc) {
+ return machDesc.doubleSizeInBytes();
+ }
+ };
+
+ public static final SizeThunk POINTER = new SizeThunk() {
+ public long compute(MachineDescription machDesc) {
+ return machDesc.pointerSizeInBytes();
+ }
+ };
+
+ // Factory methods for performing certain limited kinds of
+ // arithmetic on these values
+ public static SizeThunk add(final SizeThunk thunk1,
+ final SizeThunk thunk2) {
+ return new SizeThunk() {
+ public long compute(MachineDescription machDesc) {
+ return thunk1.compute(machDesc) + thunk2.compute(machDesc);
+ }
+ };
+ }
+
+ public static SizeThunk sub(final SizeThunk thunk1,
+ final SizeThunk thunk2) {
+ return new SizeThunk() {
+ public long compute(MachineDescription machDesc) {
+ return thunk1.compute(machDesc) - thunk2.compute(machDesc);
+ }
+ };
+ }
+
+ public static SizeThunk mul(final SizeThunk thunk1,
+ final SizeThunk thunk2) {
+ return new SizeThunk() {
+ public long compute(MachineDescription machDesc) {
+ return thunk1.compute(machDesc) * thunk2.compute(machDesc);
+ }
+ };
+ }
+
+ public static SizeThunk mod(final SizeThunk thunk1,
+ final SizeThunk thunk2) {
+ return new SizeThunk() {
+ public long compute(MachineDescription machDesc) {
+ return thunk1.compute(machDesc) % thunk2.compute(machDesc);
+ }
+ };
+ }
+
+ public static SizeThunk roundUp(final SizeThunk thunk1,
+ final SizeThunk thunk2) {
+ return new SizeThunk() {
+ public long compute(MachineDescription machDesc) {
+ long sz1 = thunk1.compute(machDesc);
+ long sz2 = thunk2.compute(machDesc);
+ long rem = (sz1 % sz2);
+ if (rem == 0) {
+ return sz1;
+ }
+ return sz1 + (sz2 - rem);
+ }
+ };
+ }
+
+ public static SizeThunk max(final SizeThunk thunk1,
+ final SizeThunk thunk2) {
+ return new SizeThunk() {
+ public long compute(MachineDescription machDesc) {
+ return Math.max(thunk1.compute(machDesc), thunk2.compute(machDesc));
+ }
+ };
+ }
+
+ public static SizeThunk constant(final int constant) {
+ return new SizeThunk() {
+ public long compute(MachineDescription machDesc) {
+ return constant;
+ }
+ };
+ }
+}
diff --git a/src/classes/com/sun/gluegen/cgram/types/Type.java b/src/classes/com/sun/gluegen/cgram/types/Type.java
index 2ac492d3f..0dcaabcef 100644
--- a/src/classes/com/sun/gluegen/cgram/types/Type.java
+++ b/src/classes/com/sun/gluegen/cgram/types/Type.java
@@ -48,12 +48,12 @@ import java.util.List;
public abstract class Type {
private String name;
- private int size;
+ private SizeThunk size;
private int cvAttributes;
private int typedefedCVAttributes;
private boolean hasTypedefName;
- protected Type(String name, int size, int cvAttributes) {
+ protected Type(String name, SizeThunk size, int cvAttributes) {
setName(name);
this.size = size;
this.cvAttributes = cvAttributes;
@@ -88,10 +88,18 @@ public abstract class Type {
hasTypedefName = true;
}
- /** Size of this type in bytes. */
- public int getSize() { return size; }
+ /** 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(MachineDescription machDesc) {
+ SizeThunk thunk = getSize();
+ if (thunk == null) {
+ throw new RuntimeException("No size set for type \"" + getName() + "\"");
+ }
+ return thunk.compute(machDesc);
+ }
/** Set the size of this type; only available for CompoundTypes. */
- void setSize(int size) { this.size = size; }
+ void setSize(SizeThunk size) { this.size = size; }
/** Casts this to a BitType or returns null if not a BitType. */
public BitType asBit() { return null; }
diff --git a/src/classes/com/sun/gluegen/cgram/types/VoidType.java b/src/classes/com/sun/gluegen/cgram/types/VoidType.java
index db4c43f81..3a2f1b93f 100644
--- a/src/classes/com/sun/gluegen/cgram/types/VoidType.java
+++ b/src/classes/com/sun/gluegen/cgram/types/VoidType.java
@@ -45,7 +45,7 @@ public class VoidType extends Type {
}
private VoidType(String name, int cvAttributes) {
- super(name, 0, cvAttributes);
+ super(name, null, cvAttributes);
}
public VoidType asVoid() { return this; }