changes.
[IRC.git] / Robust / src / Main / Main.java
index 08b16f4ccd05f068bb48e8e68dd09dab849f6670..2ec01a630eb17ea5cd3a3775a1e171616182a618 100644 (file)
@@ -15,12 +15,7 @@ import IR.Tree.ParseNode;
 import IR.Tree.BuildIR;
 import IR.Tree.JavaBuilder;
 import IR.Tree.SemanticCheck;
-import IR.Flat.BuildCodeMultiCore;
-import IR.Flat.BuildCodeMGC;
-import IR.Flat.BuildFlat;
-import IR.Flat.BuildCode;
-import IR.Flat.BuildCodeTran;
-import IR.Flat.BuildOoOJavaCode;
+import IR.Flat.*;
 import IR.Flat.Inliner;
 import IR.ClassDescriptor;
 import IR.State;
@@ -54,6 +49,7 @@ import Analysis.Loops.*;
 import Analysis.Liveness;
 import Analysis.ArrayReferencees;
 import Analysis.Pointer.Pointer;
+import Analysis.Disjoint.HeapAnalysis;
 import IR.MethodDescriptor;
 import IR.Flat.FlatMethod;
 import Interface.*;
@@ -75,7 +71,7 @@ public class Main {
     String outputdir = null;
     boolean isDistributeInfo = false;
     boolean isDisAll = false;
-    int startnum = 0;
+    int startnum = 0;    
 
 
     for(int i=0; i<args.length; i++) {
@@ -160,6 +156,8 @@ public class Main {
         state.MULTICORE=true;
       else if (option.equals("-multicoregc"))
         state.MULTICOREGC=true;
+      else if (option.equals("-pmc"))
+        state.PMC=true;
       else if (option.equals("-mgc")) {
         state.MGC = true;
       } else if (option.equals("-objectlockdebug")) {
@@ -208,6 +206,9 @@ public class Main {
       } else if (option.equals("-disjoint-write-ihms")) {
         state.DISJOINTWRITEIHMS = true;
 
+      } else if (option.equals("-disjoint-write-all-node-graphs")) {
+        state.DISJOINT_WRITE_ALL_NODE_FINAL_GRAPHS = true;
+
       } else if (option.equals("-disjoint-alias-file")) {
         state.DISJOINTALIASFILE = args[++i];
         String arg = args[++i];
@@ -233,6 +234,11 @@ public class Main {
           throw new Error("disjoint-debug-callsite requires arguments:\n"+
                           "  <callee symbol> <caller symbol> <# visit to start> <# visits to capture> <T/F stop after>");
         }
+        System.out.println( "Disjoint analysis is debugging when "+
+                            state.DISJOINTDEBUGCALLER+" calls "+
+                            state.DISJOINTDEBUGCALLEE+" starting after "+
+                            state.DISJOINTDEBUGCALLVISITTOSTART+" visits and running for "+
+                            state.DISJOINTDEBUGCALLNUMVISITS+ " visits." );
 
       } else if (option.equals("-disjoint-debug-snap-method")) {
         state.DISJOINTSNAPSYMBOL=args[++i];
@@ -279,6 +285,36 @@ public class Main {
 
       } else if( option.equals("-disjoint-debug-scheduling") ) {
         state.DISJOINTDEBUGSCHEDULING = true;
+
+
+      } else if( option.equals("-pointsto-check-v-runtime") ) {
+        state.POINTSTO_CHECK_V_RUNTIME = true;
+
+
+      } else if( option.equals("-do-definite-reach-analysis") ) {
+        state.DO_DEFINITE_REACH_ANALYSIS = true;
+
+
+      } else if( option.equals("-disjoint-disable-global-sweep") ) {
+        state.DISJOINT_USE_GLOBAL_SWEEP = false;
+
+      } else if( option.equals("-disjoint-disable-strong-update") ) {
+        state.DISJOINT_USE_STRONG_UPDATE = false;
+
+      } else if( option.equals("-disjoint-disable-predicates") ) {
+        state.DISJOINT_USE_PREDICATES = false;
+
+      } else if( option.equals("-disjoint-summarize-per-class") ) {
+        state.DISJOINT_SUMMARIZE_PER_CLASS = true;
+
+
+      } else if( option.equals("-disjoint-count-visits") ) {
+        state.DISJOINT_COUNT_VISITS = true;
+
+      } else if( option.equals("-disjoint-count-graph-elements") ) {
+        state.DISJOINT_COUNT_GRAPH_ELEMENTS = true;
+        state.DISJOINT_COUNT_GRAPH_ELEMENTS_FILE = args[++i];
+
       } else if (option.equals("-optional"))
         state.OPTIONAL=true;
       else if (option.equals("-optimize"))
@@ -348,9 +384,28 @@ public class Main {
         state.KEEP_RG_FOR_ALL_PROGRAM_POINTS=true;
       } else if (option.equals("-nostalltr")) {
         state.NOSTALLTR = true;
+
       } else if (option.equals("-ssjava")) {
         state.SSJAVA = true;
-      } else if (option.equals("-printlinenum")) {
+        state.SSJAVA_GENCODE_PREVENT_CRASHES = true;
+
+      } else if (option.equals("-ssjavadebug")) {
+        state.SSJAVADEBUG = true;
+      } else if (option.equals("-ssjavainfer")) {
+        state.SSJAVAINFER= true;
+      } else if( option.equals( "-ssjava-inject-error" ) ) {
+        state.SSJAVA_GENCODE_PREVENT_CRASHES = true;
+        state.SSJAVA_INJECT_ERROR   = true;
+        state.SSJAVA_INV_ERROR_PROB = Integer.parseInt( args[++i] );
+        state.SSJAVA_ERROR_SEED     = Integer.parseInt( args[++i] );
+
+        // special case, if the inverse prob is 0, turn off errors
+        if( state.SSJAVA_INV_ERROR_PROB == 0 ) {
+          state.SSJAVA_INJECT_ERROR = false;
+        }
+
+
+      }else if (option.equals("-printlinenum")) {
         state.LINENUM=true;
       } else if (option.equals("-help")) {
         System.out.println("-classlibrary classlibrarydirectory -- directory where classlibrary is located");
@@ -411,7 +466,7 @@ public class Main {
     State.logEvent("Done Parsing Commands");
     System.out.println("Classpath: "+state.classpath);
 
-    SSJavaAnalysis ssjava=new SSJavaAnalysis(state);
+    
 
     TypeUtil tu;
     BuildFlat bf;
@@ -450,6 +505,8 @@ public class Main {
     SafetyAnalysis sa=null;
     PrefetchAnalysis pa=null;
     OoOJavaAnalysis oooa=null;
+    HeapAnalysis heapAnalysis=null;
+
     if (state.INLINEATOMIC) {
       Iterator classit=state.getClassSymbolTable().getDescriptorsIterator();
       while(classit.hasNext()) {
@@ -467,6 +524,7 @@ public class Main {
     CallGraph callgraph=jb!=null?jb:(state.TASK?new BaseCallGraph(state, tu):new JavaCallGraph(state, tu));
 
     // SSJava
+    SSJavaAnalysis ssjava=new SSJavaAnalysis(state,tu,bf,callgraph);
     if(state.SSJAVA) {
       ssjava.doCheck();
       State.logEvent("Done SSJava Checking");
@@ -493,8 +551,12 @@ public class Main {
             continue;
           cp.optimize(fm);
           dc.optimize(fm);
-          if (!state.NOLOOP)
+          if (!state.NOLOOP){            
+            lo.analyze(fm);
             lo.optimize(fm);
+          }
+            
+          
           cp.optimize(fm);
           dc.optimize(fm);
           lcse.doAnalysis(fm);
@@ -506,6 +568,7 @@ public class Main {
         }
       }
       State.logEvent("Done Optimizing");
+      
     }
 
     if (state.FLATIRGRAPH) {
@@ -534,12 +597,14 @@ public class Main {
       Liveness l  = new Liveness();
       ArrayReferencees ar = new ArrayReferencees(state, tu, callgraph);
       DisjointAnalysis da = new DisjointAnalysis(state, tu, callgraph, l, ar, null, null);
+      heapAnalysis = da;
     }
 
     if (state.OOOJAVA) {
       Liveness l   = new Liveness();
       ArrayReferencees ar  = new ArrayReferencees(state, tu, callgraph);
       oooa = new OoOJavaAnalysis(state, tu, callgraph, l, ar);
+      heapAnalysis = oooa.getHeapAnalysis();
     }
 
 
@@ -657,6 +722,25 @@ public class Main {
         }
       }
 
+      if( (state.OOOJAVA || state.POINTSTO_CHECK_V_RUNTIME) &&
+          heapAnalysis != null ) {
+        // use this extension to generate the allocsite field of Object and
+        // ArrayObject for whatever other extensions and systems need it
+        BCXallocsiteObjectField bcx = new BCXallocsiteObjectField( bc, tu, heapAnalysis );
+        bc.registerExtension( bcx );
+      }
+
+      if( state.POINTSTO_CHECK_V_RUNTIME &&
+          heapAnalysis != null ) {
+        BCXPointsToCheckVRuntime bcx = new BCXPointsToCheckVRuntime( state, bc, tu, heapAnalysis );
+        bc.registerExtension( bcx );
+      }
+
+      if( state.SSJAVA_INJECT_ERROR ) {
+        BCXSSJavaInjectError bcx = new BCXSSJavaInjectError( state, bc );
+        bc.registerExtension( bcx );
+      }
+
       bc.buildCode();
       State.logEvent("Done With BuildCode");
 
@@ -686,7 +770,7 @@ public class Main {
   public static ParseNode readSourceFile(State state, String sourcefile) {
     try {
       Reader fr= new BufferedReader(new FileReader(sourcefile));
-      Lex.Lexer l = new Lex.Lexer(fr, state.TASK);
+      Lex.Lexer l = new Lex.Lexer(fr, state.TASK, state.DSM);
       java_cup.runtime.lr_parser g;
       g = new Parse.Parser(l);
       ParseNode p=null;