a start on error inject for SSJava
[IRC.git] / Robust / src / IR / Flat / BCXSSJavaInjectError.java
1 package IR.Flat;
2 import IR.*;
3 import IR.Tree.*;
4
5 import java.util.*;
6 import java.io.*;
7
8 import Util.*;
9
10
11 public class BCXSSJavaInjectError implements BuildCodeExtension {
12
13   private State state;
14   private BuildCode buildCode;
15   private String nStr             = "__ssjava_inv_error_prob__";
16   private String errorInjectedStr = "__ssjava_error_has_been_injected__";
17
18   public BCXSSJavaInjectError( State state, BuildCode buildCode ) {
19     this.state     = state;
20     this.buildCode = buildCode;
21   }
22
23
24   // the reason for errorInjectionInit is that some code (like static initializers
25   // in the compiled program) actually run before the GENERATED MAIN runs!  Not the
26   // complied program's main, either!  So just rig it so no error injection code runs
27   // until we're sure the random seed is initialized.
28
29   public void additionalCodeGen( PrintWriter outmethodheader,
30                                  PrintWriter outstructs,
31                                  PrintWriter outmethod ) {
32     outmethodheader.println("extern int "+nStr+";");
33     outmethodheader.println("extern int "+errorInjectedStr+";");
34     outmethodheader.println("extern int errorInjectionInit;");
35
36     outmethod.println("int "+nStr+" = "+state.SSJAVA_INV_ERROR_PROB+";");
37     outmethod.println("int "+errorInjectedStr+" = 0;");
38     outmethod.println("int errorInjectionInit = 0;");
39   }
40
41   public void additionalCodeAtTopOfMain( PrintWriter outmethod ) {
42     outmethod.println("  srand("+state.SSJAVA_ERROR_SEED+");");
43     outmethod.println("  errorInjectionInit = 1;");
44   }
45   
46   public void additionalCodePostNode( FlatMethod fm, FlatNode fn, PrintWriter output ) {
47     
48     TempDescriptor injectTarget = null;
49     
50     switch( fn.kind() ) {
51       case FKind.FlatOpNode:
52         FlatOpNode fon = (FlatOpNode) fn;
53         if( fon.getOp().getOp() == Operation.DIV ) {
54           injectTarget = fon.getDest();
55         }
56         break;
57       
58       case FKind.FlatFieldNode:
59         injectTarget = ((FlatFieldNode) fn).getDst();
60         break;
61         
62       case FKind.FlatElementNode:
63         injectTarget = ((FlatElementNode) fn).getDst();
64         break;
65     }
66
67     if( injectTarget != null ) {
68       output.println("if( errorInjectionInit ) {");
69       output.println("  int roll = rand() % "+nStr+";");
70       output.println("  if( !"+errorInjectedStr+" && roll == 0 ) {" );
71       output.println("    "+errorInjectedStr+" = 1;" );
72       output.println("    "+buildCode.generateTemp( fm, injectTarget )+" = 0;" );
73       output.println("    printf(\"SSJAVA: Injecting error ["+injectTarget+
74                      "=%d] at file:%s, func:%s, line:%d \\n\"" + 
75                      ", 0, __FILE__, __func__, __LINE__);");
76       output.println("  }" );
77       output.println("}");
78     }
79   }
80
81
82
83   public void additionalIncludesMethodsImplementation( PrintWriter outmethod ){}
84   public void printExtraArrayFields(PrintWriter outclassdefs){}
85   public void outputTransCode(PrintWriter output){}
86   public void buildCodeSetup(){}
87   public void generateSizeArrayExtensions(PrintWriter outclassdefs){}
88   public void preCodeGenInitialization(){}
89   public void postCodeGenCleanUp(){}
90   public void additionalIncludesMethodsHeader(PrintWriter outmethodheader){}
91   public void additionalIncludesStructsHeader(PrintWriter outstructs){}
92   public void additionalClassObjectFields(PrintWriter outclassdefs){}
93   public void additionalCodeForCommandLineArgs(PrintWriter outmethod, String argsVar){}
94   public void additionalCodeAtBottomOfMain(PrintWriter outmethod){}
95   public void additionalCodeAtTopMethodsImplementation(PrintWriter outmethod){}
96   public void additionalCodeAtTopFlatMethodBody(PrintWriter output, FlatMethod fm){}
97   public void additionalCodePreNode(FlatMethod fm, FlatNode fn, PrintWriter output){}
98   public void additionalCodeNewObject(PrintWriter outmethod, String dstVar, FlatNew flatNew){}
99   public void additionalCodeNewStringLiteral(PrintWriter output, String dstVar){}
100 }