model the allocation of string literals in heap analysis
[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
24   public BCXallocsiteObjectField( BuildCode    buildCode,
25                                   TypeUtil     typeUtil,
26                                   HeapAnalysis heapAnalysis ) {
27     this.buildCode    = buildCode;
28     this.typeUtil     = typeUtil;
29     this.heapAnalysis = heapAnalysis;
30   }
31   
32   
33   public void additionalClassObjectFields(PrintWriter outclassdefs) {
34     outclassdefs.println("  int allocsite;");    
35   }
36
37
38   public void additionalCodeForCommandLineArgs(PrintWriter outmethod, String argsVar) {
39
40     ClassDescriptor cdString = typeUtil.getClass( typeUtil.StringClass );
41     assert cdString != null;
42
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 ) ) {
48         argBytes = fd;
49         break;
50       }
51     }
52     assert argBytes != null;
53
54     String argsAccess = "((struct "+cdString.getSafeSymbol()+
55       " **)(((char *)& "+argsVar+"->___length___)+sizeof(int)))";
56     
57     outmethod.println(argsVar+"->allocsite = "+
58                       heapAnalysis.getCmdLineArgsAlloc().getUniqueAllocSiteID()+
59                       ";"
60                       );
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()+
66                       ";"
67                       );
68     outmethod.println("    "+argsAccess+"[i]->"+
69                       argBytes.getSafeSymbol()+
70                       "->allocsite = "+
71                       heapAnalysis.getCmdLineArgBytesAlloc().getUniqueAllocSiteID()+
72                       ";"
73                       );
74     outmethod.println("  }");
75     outmethod.println("}");
76     outmethod.println("");
77   }
78
79
80   public void additionalCodeNewObject(PrintWriter outmethod, String dstVar, FlatNew flatNew) {
81     outmethod.println(dstVar+"->allocsite = "+
82                       heapAnalysis.getAllocationSiteFromFlatNew( flatNew ).getUniqueAllocSiteID()+
83                       ";"
84                       );
85   }
86
87
88   public void additionalCodeNewStringLiteral(PrintWriter output, String dstVar) {
89     output.println(dstVar+"->allocsite = "+
90                    heapAnalysis.getNewStringLiteralAlloc().getUniqueAllocSiteID()+
91                    ";"
92                    );    
93   }
94
95
96
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) {}
115 }