decouple ssjava code gen to prevent crashes from the analysis, so we can turn it...
[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   public void additionalIncludesMethodsImplementation( PrintWriter outmethod ) { 
24     outmethod.println("#include <stdlib.h>");
25     outmethod.println("#include <stdio.h>");
26   }
27
28   // the reason for errorInjectionInit is that some code (like static initializers
29   // in the compiled program) actually run before the GENERATED MAIN runs!  Not the
30   // complied program's main, either!  So just rig it so no error injection code runs
31   // until we're sure the random seed is initialized.
32
33   public void additionalCodeGen( PrintWriter outmethodheader,
34                                  PrintWriter outstructs,
35                                  PrintWriter outmethod ) {
36     outmethodheader.println("extern int "+nStr+";");
37     outmethodheader.println("extern int "+errorInjectedStr+";");
38     outmethodheader.println("extern int errorInjectionInit;");
39
40     outmethod.println("int "+nStr+" = "+state.SSJAVA_INV_ERROR_PROB+";");
41     outmethod.println("int "+errorInjectedStr+" = 0;");
42     outmethod.println("int errorInjectionInit = 0;");
43   }
44
45   public void additionalCodeAtTopOfMain( PrintWriter outmethod ) {
46     outmethod.println("  srand("+state.SSJAVA_ERROR_SEED+");");
47     outmethod.println("  errorInjectionInit = 1;");
48   }
49   
50   public void additionalCodePostNode( FlatMethod fm, FlatNode fn, PrintWriter output ) {
51     
52     TempDescriptor injectTarget = null;
53     
54     switch( fn.kind() ) {
55       case FKind.FlatOpNode:
56         FlatOpNode fon = (FlatOpNode) fn;
57         if( fon.getOp().getOp() == Operation.DIV ) {
58           injectTarget = fon.getDest();
59         }
60         break;
61       
62       case FKind.FlatFieldNode:
63         injectTarget = ((FlatFieldNode) fn).getDst();
64         break;
65         
66       case FKind.FlatElementNode:
67         injectTarget = ((FlatElementNode) fn).getDst();
68         break;
69     }
70
71     if( injectTarget != null ) {
72       output.println("if( errorInjectionInit ) {");
73       output.println("  int roll = rand() % "+nStr+";");
74       output.println("  if( !"+errorInjectedStr+" && roll == 0 ) {" );
75       output.println("    "+errorInjectedStr+" = 1;" );
76       output.println("    "+buildCode.generateTemp( fm, injectTarget )+" = 0;" );
77       output.println("    printf(\"SSJAVA: Injecting error ["+injectTarget+
78                      "=%d] at file:%s, func:%s, line:%d \\n\"" + 
79                      ", 0, __FILE__, __func__, __LINE__);");
80       output.println("  }" );
81       output.println("}");
82     }
83   }
84
85
86
87   public void printExtraArrayFields(PrintWriter outclassdefs){}
88   public void outputTransCode(PrintWriter output){}
89   public void buildCodeSetup(){}
90   public void generateSizeArrayExtensions(PrintWriter outclassdefs){}
91   public void preCodeGenInitialization(){}
92   public void postCodeGenCleanUp(){}
93   public void additionalIncludesMethodsHeader(PrintWriter outmethodheader){}
94   public void additionalIncludesStructsHeader(PrintWriter outstructs){}
95   public void additionalClassObjectFields(PrintWriter outclassdefs){}
96   public void additionalCodeForCommandLineArgs(PrintWriter outmethod, String argsVar){}
97   public void additionalCodeAtBottomOfMain(PrintWriter outmethod){}
98   public void additionalCodeAtTopMethodsImplementation(PrintWriter outmethod){}
99   public void additionalCodeAtTopFlatMethodBody(PrintWriter output, FlatMethod fm){}
100   public void additionalCodePreNode(FlatMethod fm, FlatNode fn, PrintWriter output){}
101   public void additionalCodeNewObject(PrintWriter outmethod, String dstVar, FlatNew flatNew){}
102   public void additionalCodeNewStringLiteral(PrintWriter output, String dstVar){}
103 }