3 import Analysis.Disjoint.HeapAnalysis;
4 import Analysis.Disjoint.Alloc;
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.
17 public class BCXallocsiteObjectField implements BuildCodeExtension {
19 protected BuildCode buildCode;
20 protected TypeUtil typeUtil;
21 protected HeapAnalysis heapAnalysis;
23 protected ClassDescriptor cdString;
24 protected FieldDescriptor strBytes;
27 public BCXallocsiteObjectField( BuildCode buildCode,
29 HeapAnalysis heapAnalysis ) {
30 this.buildCode = buildCode;
31 this.typeUtil = typeUtil;
32 this.heapAnalysis = heapAnalysis;
34 cdString = typeUtil.getClass( typeUtil.StringClass );
35 assert cdString != null;
38 Iterator sFieldsItr = cdString.getFields();
39 while( sFieldsItr.hasNext() ) {
40 FieldDescriptor fd = (FieldDescriptor) sFieldsItr.next();
41 if( fd.getSymbol().equals( typeUtil.StringClassValueField ) ) {
46 assert strBytes != null;
50 public void additionalClassObjectFields(PrintWriter outclassdefs) {
51 outclassdefs.println(" int allocsite;");
55 public void additionalCodeForCommandLineArgs(PrintWriter outmethod, String argsVar) {
57 String argsAccess = "((struct "+cdString.getSafeSymbol()+
58 " **)(((char *)& "+argsVar+"->___length___)+sizeof(int)))";
60 outmethod.println(argsVar+"->allocsite = "+
61 heapAnalysis.getCmdLineArgsAlloc().getUniqueAllocSiteID()+
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()+
71 outmethod.println(" "+argsAccess+"[i]->"+
72 strBytes.getSafeSymbol()+
74 heapAnalysis.getCmdLineArgBytesAlloc().getUniqueAllocSiteID()+
77 outmethod.println(" }");
78 outmethod.println("}");
79 outmethod.println("");
83 public void additionalCodeNewObject(PrintWriter outmethod, String dstVar, FlatNew flatNew) {
84 outmethod.println(dstVar+"->allocsite = "+
85 heapAnalysis.getAllocationSiteFromFlatNew( flatNew ).getUniqueAllocSiteID()+
91 public void additionalCodeNewStringLiteral(PrintWriter output, String dstVar) {
92 output.println(dstVar+"->allocsite = "+
93 heapAnalysis.getNewStringLiteralAlloc().getUniqueAllocSiteID()+
97 output.println(dstVar+"->"+
98 strBytes.getSafeSymbol()+
100 heapAnalysis.getNewStringLiteralBytesAlloc().getUniqueAllocSiteID()+
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) {}