Create analysis model for string literals in disjointness analysis that supports...
[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   public void additionalClassObjectFields(PrintWriter outclassdefs) {
51     outclassdefs.println("  int allocsite;");    
52   }
53
54
55   public void additionalCodeForCommandLineArgs(PrintWriter outmethod, String argsVar) {
56
57     String argsAccess = "((struct "+cdString.getSafeSymbol()+
58       " **)(((char *)& "+argsVar+"->___length___)+sizeof(int)))";
59     
60     outmethod.println(argsVar+"->allocsite = "+
61                       heapAnalysis.getCmdLineArgsAlloc().getUniqueAllocSiteID()+
62                       ";"
63                       );
64     outmethod.println("{");
65     outmethod.println("  int i;" );
66     outmethod.println("  for( i = 0; i < "+argsVar+"->___length___; ++i ) {");    
67     outmethod.println("    "+argsAccess+"[i]->allocsite = "+
68                       heapAnalysis.getCmdLineArgAlloc().getUniqueAllocSiteID()+
69                       ";"
70                       );
71     outmethod.println("    "+argsAccess+"[i]->"+
72                       strBytes.getSafeSymbol()+
73                       "->allocsite = "+
74                       heapAnalysis.getCmdLineArgBytesAlloc().getUniqueAllocSiteID()+
75                       ";"
76                       );
77     outmethod.println("  }");
78     outmethod.println("}");
79     outmethod.println("");
80   }
81
82
83   public void additionalCodeNewObject(PrintWriter outmethod, String dstVar, FlatNew flatNew) {
84     outmethod.println(dstVar+"->allocsite = "+
85                       heapAnalysis.getAllocationSiteFromFlatNew( flatNew ).getUniqueAllocSiteID()+
86                       ";"
87                       );
88   }
89
90
91   public void additionalCodeNewStringLiteral(PrintWriter output, String dstVar) {
92     output.println(dstVar+"->allocsite = "+
93                    heapAnalysis.getNewStringLiteralAlloc().getUniqueAllocSiteID()+
94                    ";"
95                    );    
96
97     output.println(dstVar+"->"+
98                    strBytes.getSafeSymbol()+
99                    "->allocsite = "+
100                    heapAnalysis.getNewStringLiteralBytesAlloc().getUniqueAllocSiteID()+
101                    ";"
102                    );
103   }
104
105
106
107   public void printExtraArrayFields(PrintWriter outclassdefs) {}
108   public void outputTransCode(PrintWriter output) {}
109   public void buildCodeSetup() {}
110   public void generateSizeArrayExtensions(PrintWriter outclassdefs) {}
111   public void preCodeGenInitialization() {}
112   public void postCodeGenCleanUp() {}
113   public void additionalCodeGen(PrintWriter outmethodheader,
114                                    PrintWriter outstructs,
115                                    PrintWriter outmethod) {}
116   public void additionalCodeAtTopOfMain(PrintWriter outmethod) {}
117   public void additionalCodeAtBottomOfMain(PrintWriter outmethod) {}
118   public void additionalIncludesMethodsImplementation(PrintWriter outmethod) {}
119   public void additionalIncludesStructsHeader(PrintWriter outstructs) {}
120   public void additionalCodeAtTopMethodsImplementation(PrintWriter outmethod) {}
121   public void additionalIncludesMethodsHeader(PrintWriter outmethodheader) {}
122   public void additionalCodeAtTopFlatMethodBody(PrintWriter output, FlatMethod fm) {}
123   public void additionalCodePreNode(FlatMethod fm, FlatNode fn, PrintWriter output) {}
124   public void additionalCodePostNode(FlatMethod fm, FlatNode fn, PrintWriter output) {}
125 }