this system checks heap results against runtime pointers to look for analysis bugs...
[IRC.git] / Robust / src / IR / Flat / BCXallocsiteObjectField.java
index 230b20a73803d313f0deed221983de2e0e4a7285..096de3ecb78726db7282e0bd488475a9b637c43b 100644 (file)
@@ -17,12 +17,15 @@ import java.util.*;
 public class BCXallocsiteObjectField implements BuildCodeExtension {
   
   protected BuildCode    buildCode;
+  protected TypeUtil     typeUtil;
   protected HeapAnalysis heapAnalysis;
   
 
   public BCXallocsiteObjectField( BuildCode    buildCode,
+                                  TypeUtil     typeUtil,
                                   HeapAnalysis heapAnalysis ) {
     this.buildCode    = buildCode;
+    this.typeUtil     = typeUtil;
     this.heapAnalysis = heapAnalysis;
   }
   
@@ -32,10 +35,44 @@ public class BCXallocsiteObjectField implements BuildCodeExtension {
   }
 
   public void additionalCodeForCommandLineArgs(PrintWriter outmethod, String argsVar) {
+
+    ClassDescriptor cdString = typeUtil.getClass( typeUtil.StringClass );
+    assert cdString != null;
+
+    FieldDescriptor argBytes = null;
+    Iterator sFieldsItr = cdString.getFields();
+    while( sFieldsItr.hasNext() ) {
+      FieldDescriptor fd = (FieldDescriptor) sFieldsItr.next();
+      if( fd.getSymbol().equals( typeUtil.StringClassValueField ) ) {
+        argBytes = fd;
+        break;
+      }
+    }
+    assert argBytes != null;
+
+    String argsAccess = "((struct "+cdString.getSafeSymbol()+
+      " **)(((char *)& "+argsVar+"->___length___)+sizeof(int)))";
+    
     outmethod.println(argsVar+"->allocsite = "+
                       heapAnalysis.getCmdLineArgsAlloc().getUniqueAllocSiteID()+
                       ";"
                       );
+    outmethod.println("{");
+    outmethod.println("  int i;" );
+    outmethod.println("  for( i = 0; i < "+argsVar+"->___length___; ++i ) {");    
+    outmethod.println("    "+argsAccess+"[i]->allocsite = "+
+                      heapAnalysis.getCmdLineArgAlloc().getUniqueAllocSiteID()+
+                      ";"
+                      );
+    outmethod.println("    "+argsAccess+"[i]->"+
+                      argBytes.getSafeSymbol()+
+                      "->allocsite = "+
+                      heapAnalysis.getCmdLineArgBytesAlloc().getUniqueAllocSiteID()+
+                      ";"
+                      );
+    outmethod.println("  }");
+    outmethod.println("}");
+    outmethod.println("");
   }
 
   public void additionalCodeNewObject(PrintWriter outmethod, String dstVar, FlatNew flatNew) {