-
- final SymbolTable st = writer.getSymbolTable();
- TypeDescriptor td = offsetbits.typecheck(new SemanticAnalyzer() {
- public IRErrorReporter getErrorReporter() { throw new IRException("badness"); }
- public SymbolTable getSymbolTable() { return st; }
- });
-
- if (td == null) {
- throw new IRException();
- } else if (td != ReservedTypeDescriptor.INT) {
- throw new IRException();
- }
-
- // #TBD#: ptr's to bits and byte's and stuff are a little iffy...
- // right now, a bit* is the same as a int* = short* = byte* (that is there
- // is no post-derefernce mask)
-
- // #ATTN#: do we handle int* correctly? what is the correct behavior? we automatically
- // dereference pointers, but for structures that means that if we have a nested structure
- // we return an integer address to that nested structure. if we have a pointer to a
- // structure else where we want that base address ... yeah so we *(int *) it... ok we are
- // correct
-
- boolean dotypecheck = false;
-
- if (offsetbits instanceof IntegerLiteralExpr) {
- int offsetinbits = ((IntegerLiteralExpr) offsetbits).getValue();
- int offset = offsetinbits >> 3; /* offset in bytes */
-
- if (fd.getType() instanceof ReservedTypeDescriptor && !fd.getPtr()) {
- int shift = offsetinbits - (offset << 3);
- int mask = bitmask(((IntegerLiteralExpr)fd.getType().getSizeExpr()).getValue());
-
- /* type var = ((*(int *) (base + offset)) >> shift) & mask */
- writer.outputline(getType().getGenerateType() + " " + dest.getSafeSymbol() +
- " = ((*(int *)" +
- "(" + leftd.getSafeSymbol() + " + " + offset + ")) " +
- " >> " + shift + ") & 0x" + Integer.toHexString(mask) + ";");
- } else { /* a structure address or a ptr! */
- String ptr = fd.getPtr() ? "*(int *)" : "";
- /* type var = [*(int *)] (base + offset) */
-
- // #ATTN: was 'getType.getGeneratedType()' instead of 'int' but all pointers are represented
- // by integers
- writer.outputline("int " + dest.getSafeSymbol() +
- " = " + ptr + "(" + leftd.getSafeSymbol() + " + " + offset + ");");
-
- dotypecheck = true;
- }
- } else { /* offset in bits is an expression that must be generated */
- VarDescriptor ob = VarDescriptor.makeNew("offsetinbits");
- writer.output("// " + ob.getSafeSymbol() + " <-- ");
- offsetbits.prettyPrint(writer);
- writer.outputline("");
- offsetbits.generate(writer, ob);
- writer.output("// " + ob.getSafeSymbol() + " = ");
- offsetbits.prettyPrint(writer);
- writer.outputline("");
-
- /* derive offset in bytes */
- VarDescriptor offset = VarDescriptor.makeNew("offset");
- writer.outputline("int " + offset.getSafeSymbol() + " = " + ob.getSafeSymbol() + " >> 3;");
-
- if (fd.getType() instanceof ReservedTypeDescriptor && !fd.getPtr()) {
- VarDescriptor shift = VarDescriptor.makeNew("shift");
- writer.outputline("int " + shift.getSafeSymbol() + " = " + ob.getSafeSymbol() +
- " - (" + offset.getSafeSymbol() + " << 3);");
- int mask = bitmask(((IntegerLiteralExpr)fd.getType().getSizeExpr()).getValue());
-
- /* type var = ((*(int *) (base + offset)) >> shift) & mask */
- writer.outputline(getType().getGenerateType() + " " + dest.getSafeSymbol() +
- " = ((*(int *)" +
- "(" + leftd.getSafeSymbol() + " + " + offset.getSafeSymbol() + ")) " +
- " >> " + shift.getSafeSymbol() + ") & 0x" + Integer.toHexString(mask) + ";");
- } else { /* a structure address or a ptr */
- String ptr = fd.getPtr() ? "*(int *)" : "";
- /* type var = [*(int *)] (base + offset) */
-
- // #ATTN: was 'getType.getGeneratedType()' instead of 'int' but all pointers are represented
- // by integers
- writer.outputline("int " + dest.getSafeSymbol() +
- " = " + ptr + "(" + leftd.getSafeSymbol() + " + " + offset.getSafeSymbol() + ");");
- dotypecheck = true;
- }
- }
-