Added array analysis (computes paths used to add elements/tuples to sets/relations.
[repair.git] / Repair / RepairCompiler / MCC / IR / Sources.java
1 package MCC.IR;
2
3 import MCC.State;
4
5 public class Sources {
6     State state;
7
8     public Sources(State s) {
9         this.state=s;
10     }
11
12     public boolean setSource(SetDescriptor sd) {
13         if (sd.getSymbol().equals("InodeBitmapBlock"))
14             return true;
15
16         return false;
17     }
18     public boolean allocSource(SetDescriptor sd) {
19         return !setSource(sd);
20     }
21     public SetDescriptor getSourceSet(SetDescriptor sd) {
22         if (sd.getSymbol().equals("InodeBitmapBlock"))
23             return (SetDescriptor)state.stSets.get("FreeBlock");
24         return null;
25     }
26     public void generateSourceAlloc(CodeWriter cr,VarDescriptor vd, SetDescriptor sd) {
27         TypeDescriptor td=sd.getType();
28         Expr e=td.getSizeExpr();
29         VarDescriptor size=VarDescriptor.makeNew("size");
30         cr.pushSymbolTable(state.stGlobals);
31         e.generate(cr, size);
32         cr.popSymbolTable();
33         cr.outputline(td.getGenerateType().getSafeSymbol()+" "+vd.getSafeSymbol()+"=("+td.getGenerateType().getSafeSymbol()+") malloc("+size.getSafeSymbol()+");");
34     }
35
36     public boolean relsetSource(RelationDescriptor rd, boolean domain) {
37         if (domain)
38             return setSource(rd.getDomain());
39         else return setSource(rd.getRange());
40     }
41     public boolean relallocSource(RelationDescriptor rd, boolean domain) {
42         if (domain)
43             return allocSource(rd.getDomain());
44         else return allocSource(rd.getRange());
45     }
46     
47     public SetDescriptor relgetSourceSet(RelationDescriptor rd, boolean domain) {
48         if (domain)
49             return getSourceSet(rd.getDomain());
50         else return getSourceSet(rd.getRange());
51     }
52     public void relgenerateSourceAlloc(CodeWriter cr,VarDescriptor vd, RelationDescriptor rd, boolean domain) {
53         SetDescriptor sd=null;
54         if (domain)
55             sd=rd.getDomain();
56         else
57             sd=rd.getRange();
58         TypeDescriptor td=sd.getType();
59         Expr e=td.getSizeExpr();
60         VarDescriptor size=VarDescriptor.makeNew("size");
61         cr.pushSymbolTable(state.stGlobals);
62         e.generate(cr, size);
63         cr.popSymbolTable();
64         cr.outputline(td.getGenerateType().getSafeSymbol()+" "+vd.getSafeSymbol()+"=("+td.getGenerateType().getSafeSymbol()+") malloc("+size.getSafeSymbol()+");");
65     }
66
67 }