Adding functionality for printing sets.
[repair.git] / Repair / RepairCompiler / MCC / IR / StructureTypeDescriptor.java
index a9fd29c5d6c8d3f5ddcfe55d977902959b42308d..f7e19dcb49663b79c18bb89117044cc7232ada8a 100755 (executable)
@@ -16,6 +16,7 @@ public class StructureTypeDescriptor extends TypeDescriptor {
     Vector fieldlist = new Vector(); /* ordering information */
     Hashtable labels = new Hashtable();
 
+
     public StructureTypeDescriptor(String name) {
         super(name);
     }
@@ -28,67 +29,64 @@ public class StructureTypeDescriptor extends TypeDescriptor {
         return fields.keys();
     }
    
-    private Vector getFieldSizes() {
-        Vector fieldsizes = new Vector();
-                
+    
+    public Expr getSizeExpr() {        
+        return getOffsetExpr(null);
+    }
+
+    public Expr getOffsetExpr(FieldDescriptor field) {
+       /* Fix sizeof calculations */
+       if ((field==null)&&(subtype!=null))
+           return subtype.getSizeExpr();
+
+       boolean aligned=true;
+        Expr size = new IntegerLiteralExpr(0);
+        
         for (int i = 0; i < fieldlist.size(); i++) {
-            FieldDescriptor fd = (FieldDescriptor) fieldlist.elementAt(i);
+            FieldDescriptor fd = (FieldDescriptor)fieldlist.elementAt(i);
+
             TypeDescriptor td = fd.getType();
             boolean ptr = fd.getPtr();
-
             Expr basesize; 
             if (ptr) { /* ptrs are 32bits */
-                basesize = new IntegerLiteralExpr(32);
+               basesize = new IntegerLiteralExpr(32);
             } else {
-                basesize = td.getSizeExpr();
+               basesize = td.getSizeExpr();
             }
-
+           Expr fieldsize;
             if (fd instanceof ArrayDescriptor) {
                 Expr totalsize = new OpExpr(Opcode.MULT, basesize, ((ArrayDescriptor) fd).getIndexBound());
-                fieldsizes.addElement(totalsize);
+               fieldsize=totalsize;
             } else {
-                fieldsizes.addElement(basesize);
+                fieldsize=basesize;
             }
-        }
-
-        return fieldsizes;
-    }
-    
-    public Expr getSizeExpr() {        
-        Vector fieldsizes = getFieldSizes();
-
-        /* we've got the field sizes! now return the addition! */
-        Expr size = new IntegerLiteralExpr(0);
-        
-        for (int i = 0; i < fieldsizes.size(); i++) {
-            Expr fieldsize = (Expr) fieldsizes.elementAt(i);
-            size = new OpExpr(Opcode.ADD, fieldsize, size);
-        }
-        
-        return size;
-    }
-
-    public Expr getOffsetExpr(FieldDescriptor field) {
-        Vector fieldsizes = getFieldSizes();
-
-        // #ATTN#: getOffsetExpr needs to be called with the fielddescriptor obect that is in teh vector list
-        // this means that if the field is an arraydescriptor you have to call getOffsetExpr with the array 
-
-        /* we've got the field sizes! now return the addition! */
-        Expr size = new IntegerLiteralExpr(0);
-        
-        for (int i = 0; i < fieldsizes.size(); i++) {
-            FieldDescriptor fd = (FieldDescriptor)fieldlist.elementAt(i);
+           if (td instanceof ReservedTypeDescriptor) {
+               ReservedTypeDescriptor rtd=(ReservedTypeDescriptor) td;
+               if (rtd==ReservedTypeDescriptor.BIT) {
+                   aligned=false;
+               } else {
+                   if (!aligned) {
+                       size=new OpExpr(Opcode.RND, size,null);
+                       aligned=true;
+                   }
+               }
+           } else {
+               if (!aligned) {
+                   size=new OpExpr(Opcode.RND, size,null);
+                   aligned=true;
+               }
+           }
 
             if (fd == field) { /* stop, reached target field */
-                break; 
+                break;
             }
 
-            Expr fieldsize = (Expr) fieldsizes.elementAt(i);
             size = new OpExpr(Opcode.ADD, fieldsize, size);
         }
-        
-        return size;        
+
+        if ((field==null)&&(!aligned))
+           return new OpExpr(Opcode.RND, size, null);
+        return size;
     }
 
     public Iterator getFields() {
@@ -122,11 +120,11 @@ public class StructureTypeDescriptor extends TypeDescriptor {
         labels.put(ld.getSymbol(), ld);
     }
 
-    public TypeDescriptor getSubType() {
+    public TypeDescriptor getSuperType() {
         return subtype;
     }
 
-    public void setSubType(TypeDescriptor td) {
+    public void setSuperType(TypeDescriptor td) {
         subtype = td;
     }
 
@@ -134,8 +132,30 @@ public class StructureTypeDescriptor extends TypeDescriptor {
         if (td == this) {
             return true;
         } else {
+           if (subtype==null)
+               return false;
             return subtype.isSubtypeOf(td);
         }
     }
 
+    public void generate_printout(CodeWriter cr, VarDescriptor vd) {
+       // #TBD#: does not support printing out fields that have variable size, substructures, etc
+
+       cr.outputline("printf(\"" + getSymbol() + " %p: \", " + vd.getSafeSymbol() + ");");     
+       for (int i = 0; i < fieldlist.size(); i++) {
+           FieldDescriptor fd = (FieldDescriptor) fieldlist.elementAt(i);                                                      
+           cr.outputline("printf(\"\\n\\t" + fd.getSymbol() + " = \");");
+           if (fd.getPtr()) { 
+               cr.outputline("printf(\"(" + fd.getType().getSymbol() + ") %p \", ((int *)" + vd.getSafeSymbol() + ")[" + i + "]);");
+           } else if ( fd.getType() instanceof ReservedTypeDescriptor) {
+               cr.outputline("printf(\"%d \", ((int *)" + vd.getSafeSymbol() + ")[" + i + "]);");              
+           } else {
+               cr.outputline("printf(\"unsupported, breaking\");");
+               break;
+           }
+       }
+       
+       cr.outputline("printf(\"\\n\");");
+    }
+
 }