aa88cdf2d4a33394423dcac2e86b845c632a4dcf
[IRC.git] / Robust / src / IR / Flat / BCXallocsiteObjectField.java
1 package IR.Flat;
2
3 import Analysis.Disjoint.HeapAnalysis;
4 import Analysis.Disjoint.Alloc;
5 import IR.*;
6
7 import java.io.*;
8 import java.util.*;
9
10
11 // This BuildCode Extension (BCX) takes a heap analysis
12 // with points-to information and adds a field to objects
13 // at runtime that specifies which allocation site it is
14 // from.  This extension supports other extensions.
15
16
17 public class BCXallocsiteObjectField implements BuildCodeExtension {
18   
19   protected BuildCode    buildCode;
20   protected TypeUtil     typeUtil;
21   protected HeapAnalysis heapAnalysis;
22   
23   protected ClassDescriptor cdString;
24   protected FieldDescriptor strBytes;
25
26
27   public BCXallocsiteObjectField( BuildCode    buildCode,
28                                   TypeUtil     typeUtil,
29                                   HeapAnalysis heapAnalysis ) {
30     this.buildCode    = buildCode;
31     this.typeUtil     = typeUtil;
32     this.heapAnalysis = heapAnalysis;
33
34     cdString = typeUtil.getClass( typeUtil.StringClass );
35     assert cdString != null;
36
37     strBytes = null;
38     Iterator sFieldsItr = cdString.getFields();
39     while( sFieldsItr.hasNext() ) {
40       FieldDescriptor fd = (FieldDescriptor) sFieldsItr.next();
41       if( fd.getSymbol().equals( typeUtil.StringClassValueField ) ) {
42         strBytes = fd;
43         break;
44       }
45     }
46     assert strBytes != null;
47   }
48
49
50   protected Integer getIDtoGen( Alloc a, int idWhenNull ) {
51     if( a == null ) {
52       return idWhenNull;
53     }
54     return a.getUniqueAllocSiteID();
55   }
56
57   
58   
59   public void additionalClassObjectFields(PrintWriter outclassdefs) {
60     outclassdefs.println("  int allocsite;");    
61   }
62
63
64   public void additionalCodeForCommandLineArgs(PrintWriter outmethod, String argsVar) {
65
66     String argsAccess = "((struct "+cdString.getSafeSymbol()+
67       " **)(((char *)& "+argsVar+"->___length___)+sizeof(int)))";
68
69     Integer argsAllocID     = getIDtoGen( heapAnalysis.getCmdLineArgsAlloc(),     -109 ); 
70     Integer argAllocID      = getIDtoGen( heapAnalysis.getCmdLineArgAlloc(),      -119 ); 
71     Integer argBytesAllocID = getIDtoGen( heapAnalysis.getCmdLineArgBytesAlloc(), -129 ); 
72     
73     outmethod.println(argsVar+"->allocsite = "+argsAllocID+";");
74     outmethod.println("{");
75     outmethod.println("  int i;" );
76     outmethod.println("  for( i = 0; i < "+argsVar+"->___length___; ++i ) {");    
77     outmethod.println("    "+argsAccess+"[i]->allocsite = "+argAllocID+";");
78     outmethod.println("    "+argsAccess+"[i]->"+strBytes.getSafeSymbol()+
79                       "->allocsite = "+argBytesAllocID+";");
80     outmethod.println("  }");
81     outmethod.println("}");
82     outmethod.println("");
83   }
84
85
86   public void additionalCodeNewObject(PrintWriter outmethod, String dstVar, FlatNew flatNew) {
87
88     Integer allocID = getIDtoGen( heapAnalysis.getAllocationSiteFromFlatNew( flatNew ), -199 ); 
89
90     outmethod.println(dstVar+"->allocsite = "+allocID+";");
91   }
92
93
94   public void additionalCodeNewStringLiteral(PrintWriter output, String dstVar) {
95
96     Integer stringAllocID      = getIDtoGen( heapAnalysis.getNewStringLiteralAlloc(),      -29 ); 
97     Integer stringBytesAllocID = getIDtoGen( heapAnalysis.getNewStringLiteralBytesAlloc(), -39 ); 
98
99     output.println(dstVar+"->allocsite = "+stringAllocID+";");    
100     output.println(dstVar+"->"+strBytes.getSafeSymbol()+
101                    "->allocsite = "+stringBytesAllocID+";");
102   }
103
104
105
106   public void printExtraArrayFields(PrintWriter outclassdefs) {}
107   public void outputTransCode(PrintWriter output) {}
108   public void buildCodeSetup() {}
109   public void generateSizeArrayExtensions(PrintWriter outclassdefs) {}
110   public void preCodeGenInitialization() {}
111   public void postCodeGenCleanUp() {}
112   public void additionalCodeGen(PrintWriter outmethodheader,
113                                    PrintWriter outstructs,
114                                    PrintWriter outmethod) {}
115   public void additionalCodeAtTopOfMain(PrintWriter outmethod) {}
116   public void additionalCodeAtBottomOfMain(PrintWriter outmethod) {}
117   public void additionalIncludesMethodsImplementation(PrintWriter outmethod) {}
118   public void additionalIncludesStructsHeader(PrintWriter outstructs) {}
119   public void additionalCodeAtTopMethodsImplementation(PrintWriter outmethod) {}
120   public void additionalIncludesMethodsHeader(PrintWriter outmethodheader) {}
121   public void additionalCodeAtTopFlatMethodBody(PrintWriter output, FlatMethod fm) {}
122   public void additionalCodePreNode(FlatMethod fm, FlatNode fn, PrintWriter output) {}
123   public void additionalCodePostNode(FlatMethod fm, FlatNode fn, PrintWriter output) {}
124 }