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;
24 public BCXallocsiteObjectField( BuildCode buildCode,
26 HeapAnalysis heapAnalysis ) {
27 this.buildCode = buildCode;
28 this.typeUtil = typeUtil;
29 this.heapAnalysis = heapAnalysis;
33 public void additionalClassObjectFields(PrintWriter outclassdefs) {
34 outclassdefs.println(" int allocsite;");
38 public void additionalCodeForCommandLineArgs(PrintWriter outmethod, String argsVar) {
40 ClassDescriptor cdString = typeUtil.getClass( typeUtil.StringClass );
41 assert cdString != null;
43 FieldDescriptor argBytes = null;
44 Iterator sFieldsItr = cdString.getFields();
45 while( sFieldsItr.hasNext() ) {
46 FieldDescriptor fd = (FieldDescriptor) sFieldsItr.next();
47 if( fd.getSymbol().equals( typeUtil.StringClassValueField ) ) {
52 assert argBytes != null;
54 String argsAccess = "((struct "+cdString.getSafeSymbol()+
55 " **)(((char *)& "+argsVar+"->___length___)+sizeof(int)))";
57 outmethod.println(argsVar+"->allocsite = "+
58 heapAnalysis.getCmdLineArgsAlloc().getUniqueAllocSiteID()+
61 outmethod.println("{");
62 outmethod.println(" int i;" );
63 outmethod.println(" for( i = 0; i < "+argsVar+"->___length___; ++i ) {");
64 outmethod.println(" "+argsAccess+"[i]->allocsite = "+
65 heapAnalysis.getCmdLineArgAlloc().getUniqueAllocSiteID()+
68 outmethod.println(" "+argsAccess+"[i]->"+
69 argBytes.getSafeSymbol()+
71 heapAnalysis.getCmdLineArgBytesAlloc().getUniqueAllocSiteID()+
74 outmethod.println(" }");
75 outmethod.println("}");
76 outmethod.println("");
80 public void additionalCodeNewObject(PrintWriter outmethod, String dstVar, FlatNew flatNew) {
81 outmethod.println(dstVar+"->allocsite = "+
82 heapAnalysis.getAllocationSiteFromFlatNew( flatNew ).getUniqueAllocSiteID()+
88 public void additionalCodeNewStringLiteral(PrintWriter output, String dstVar) {
89 output.println(dstVar+"->allocsite = "+
90 heapAnalysis.getNewStringLiteralAlloc().getUniqueAllocSiteID()+
97 public void printExtraArrayFields(PrintWriter outclassdefs) {}
98 public void outputTransCode(PrintWriter output) {}
99 public void buildCodeSetup() {}
100 public void generateSizeArrayExtensions(PrintWriter outclassdefs) {}
101 public void preCodeGenInitialization() {}
102 public void postCodeGenCleanUp() {}
103 public void additionalCodeGen(PrintWriter outmethodheader,
104 PrintWriter outstructs,
105 PrintWriter outmethod) {}
106 public void additionalCodeAtTopOfMain(PrintWriter outmethod) {}
107 public void additionalCodeAtBottomOfMain(PrintWriter outmethod) {}
108 public void additionalIncludesMethodsImplementation(PrintWriter outmethod) {}
109 public void additionalIncludesStructsHeader(PrintWriter outstructs) {}
110 public void additionalCodeAtTopMethodsImplementation(PrintWriter outmethod) {}
111 public void additionalIncludesMethodsHeader(PrintWriter outmethodheader) {}
112 public void additionalCodeAtTopFlatMethodBody(PrintWriter output, FlatMethod fm) {}
113 public void additionalCodePreNode(FlatMethod fm, FlatNode fn, PrintWriter output) {}
114 public void additionalCodePostNode(FlatMethod fm, FlatNode fn, PrintWriter output) {}