603c505fd27683e7ebfecbfa0aa9fe1def07d59a
[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          injectTarget.getType().isPrimitive() &&
73         !injectTarget.getType().isArray() 
74         ) {
75       output.println("if( errorInjectionInit ) {");
76       output.println("  int roll = rand() % "+nStr+";");
77       output.println("  if( !"+errorInjectedStr+" && roll == 0 ) {" );
78       output.println("    "+errorInjectedStr+" = 1;" );
79
80       // inject a random value
81       output.println("    "+buildCode.generateTemp( fm, injectTarget )+
82                      " = ("+injectTarget.getType().getSafeSymbol()+") rand();" );
83
84       output.println("    printf(\"SSJAVA: Injecting error at file:%s, func:%s, line:%d \\n\"" + 
85                      ", __FILE__, __func__, __LINE__);");
86       output.println("  }" );
87       output.println("}");
88     }
89   }
90
91
92
93   public void printExtraArrayFields(PrintWriter outclassdefs){}
94   public void outputTransCode(PrintWriter output){}
95   public void buildCodeSetup(){}
96   public void generateSizeArrayExtensions(PrintWriter outclassdefs){}
97   public void preCodeGenInitialization(){}
98   public void postCodeGenCleanUp(){}
99   public void additionalIncludesMethodsHeader(PrintWriter outmethodheader){}
100   public void additionalIncludesStructsHeader(PrintWriter outstructs){}
101   public void additionalClassObjectFields(PrintWriter outclassdefs){}
102   public void additionalCodeForCommandLineArgs(PrintWriter outmethod, String argsVar){}
103   public void additionalCodeAtBottomOfMain(PrintWriter outmethod){}
104   public void additionalCodeAtTopMethodsImplementation(PrintWriter outmethod){}
105   public void additionalCodeAtTopFlatMethodBody(PrintWriter output, FlatMethod fm){}
106   public void additionalCodePreNode(FlatMethod fm, FlatNode fn, PrintWriter output){}
107   public void additionalCodeNewObject(PrintWriter outmethod, String dstVar, FlatNew flatNew){}
108   public void additionalCodeNewStringLiteral(PrintWriter output, String dstVar){}
109 }