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 protected Integer getIDtoGen( Alloc a, int idWhenNull ) {
54 return a.getUniqueAllocSiteID();
59 public void additionalClassObjectFields(PrintWriter outclassdefs) {
60 outclassdefs.println(" int allocsite;");
64 public void additionalCodeForCommandLineArgs(PrintWriter outmethod, String argsVar) {
66 String argsAccess = "((struct "+cdString.getSafeSymbol()+
67 " **)(((char *)& "+argsVar+"->___length___)+sizeof(int)))";
69 Integer argsAllocID = getIDtoGen( heapAnalysis.getCmdLineArgsAlloc(), -109 );
70 Integer argAllocID = getIDtoGen( heapAnalysis.getCmdLineArgAlloc(), -119 );
71 Integer argBytesAllocID = getIDtoGen( heapAnalysis.getCmdLineArgBytesAlloc(), -129 );
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("");
86 public void additionalCodeNewObject(PrintWriter outmethod, String dstVar, FlatNew flatNew) {
88 Integer allocID = getIDtoGen( heapAnalysis.getAllocationSiteFromFlatNew( flatNew ), -199 );
90 outmethod.println(dstVar+"->allocsite = "+allocID+";");
94 public void additionalCodeNewStringLiteral(PrintWriter output, String dstVar) {
96 Integer stringAllocID = getIDtoGen( heapAnalysis.getNewStringLiteralAlloc(), -29 );
97 Integer stringBytesAllocID = getIDtoGen( heapAnalysis.getNewStringLiteralBytesAlloc(), -39 );
99 output.println(dstVar+"->allocsite = "+stringAllocID+";");
100 output.println(dstVar+"->"+strBytes.getSafeSymbol()+
101 "->allocsite = "+stringBytesAllocID+";");
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) {}