2 * Copyright (C) 2014, United States Government, as represented by the
3 * Administrator of the National Aeronautics and Space Administration.
6 * The Java Pathfinder core (jpf-core) platform is licensed under the
7 * Apache License, Version 2.0 (the "License"); you may not use this file except
8 * in compliance with the License. You may obtain a copy of the License at
10 * http://www.apache.org/licenses/LICENSE-2.0.
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
18 package gov.nasa.jpf.jvm;
20 import gov.nasa.jpf.util.Invocation;
21 import gov.nasa.jpf.vm.ClassInfo;
22 import gov.nasa.jpf.vm.Instruction;
23 import gov.nasa.jpf.vm.MethodInfo;
24 import gov.nasa.jpf.vm.NativeMethodInfo;
26 import java.util.List;
29 * interface for bytecode creation
31 * this deliberately uses the abstract abstract public Instruction as return type to allow different instruction hierarchies in
34 * This shouldn't impose runtime overhead since mandatory parameters are now passed in as factory method arguments. The only
35 * drawback is that the compiler cannot check for abstract public Instruction class typos, but that seems less important than
36 * allowing extension specific abstract public Instruction class hierarchies
38 * <2do> there are still direct references of LOOKUPSWITCH, TABLESWITCH. Once these are removed, .jvm does not assume a particular
39 * abstract public Instruction hierarchy
41 public abstract class JVMInstructionFactory implements Cloneable {
43 protected static JVMInstructionFactory singleton;
45 public static JVMInstructionFactory getFactory(){
49 protected JVMInstructionFactory(){
50 // we should check the singleton first
55 //--- the factory methods
56 abstract public Instruction aconst_null ();
58 abstract public Instruction aload (int localVarIndex);
60 abstract public Instruction aload_0 ();
62 abstract public Instruction aload_1 ();
64 abstract public Instruction aload_2 ();
66 abstract public Instruction aload_3 ();
68 abstract public Instruction aaload ();
70 abstract public Instruction astore (int localVarIndex);
72 abstract public Instruction astore_0 ();
74 abstract public Instruction astore_1 ();
76 abstract public Instruction astore_2 ();
78 abstract public Instruction astore_3 ();
80 abstract public Instruction aastore ();
82 abstract public Instruction areturn ();
84 abstract public Instruction anewarray (String clsName);
86 abstract public Instruction arraylength ();
88 abstract public Instruction athrow ();
90 abstract public Instruction baload ();
92 abstract public Instruction bastore ();
94 abstract public Instruction bipush (int b);
96 abstract public Instruction caload ();
98 abstract public Instruction castore ();
100 abstract public Instruction checkcast (String clsName);
102 abstract public Instruction d2f ();
104 abstract public Instruction d2i ();
106 abstract public Instruction d2l ();
108 abstract public Instruction dadd ();
110 abstract public Instruction daload ();
112 abstract public Instruction dastore ();
114 abstract public Instruction dcmpg ();
116 abstract public Instruction dcmpl ();
118 abstract public Instruction dconst_0 ();
120 abstract public Instruction dconst_1 ();
122 abstract public Instruction ddiv ();
124 abstract public Instruction dload (int localVarIndex);
126 abstract public Instruction dload_0 ();
128 abstract public Instruction dload_1 ();
130 abstract public Instruction dload_2 ();
132 abstract public Instruction dload_3 ();
134 abstract public Instruction dmul ();
136 abstract public Instruction dneg ();
138 abstract public Instruction drem ();
140 abstract public Instruction dreturn ();
142 abstract public Instruction dstore (int localVarIndex);
144 abstract public Instruction dstore_0 ();
146 abstract public Instruction dstore_1 ();
148 abstract public Instruction dstore_2 ();
150 abstract public Instruction dstore_3 ();
152 abstract public Instruction dsub ();
154 abstract public Instruction dup ();
156 abstract public Instruction dup_x1 ();
158 abstract public Instruction dup_x2 ();
160 abstract public Instruction dup2 ();
162 abstract public Instruction dup2_x1 ();
164 abstract public Instruction dup2_x2 ();
166 abstract public Instruction f2d ();
168 abstract public Instruction f2i ();
170 abstract public Instruction f2l ();
172 abstract public Instruction fadd ();
174 abstract public Instruction faload ();
176 abstract public Instruction fastore ();
178 abstract public Instruction fcmpg ();
180 abstract public Instruction fcmpl ();
182 abstract public Instruction fconst_0 ();
184 abstract public Instruction fconst_1 ();
186 abstract public Instruction fconst_2 ();
188 abstract public Instruction fdiv ();
190 abstract public Instruction fload (int localVarIndex);
192 abstract public Instruction fload_0 ();
194 abstract public Instruction fload_1 ();
196 abstract public Instruction fload_2 ();
198 abstract public Instruction fload_3 ();
200 abstract public Instruction fmul ();
202 abstract public Instruction fneg ();
204 abstract public Instruction frem ();
206 abstract public Instruction freturn ();
208 abstract public Instruction fstore (int localVarIndex);
210 abstract public Instruction fstore_0 ();
212 abstract public Instruction fstore_1 ();
214 abstract public Instruction fstore_2 ();
216 abstract public Instruction fstore_3 ();
218 abstract public Instruction fsub ();
220 abstract public Instruction getfield (String fieldName, String clsName, String fieldDescriptor);
222 abstract public Instruction getstatic (String fieldName, String clsName, String fieldDescriptor);
224 abstract public Instruction goto_ (int targetPc);
226 abstract public Instruction goto_w (int targetPc);
228 abstract public Instruction i2b ();
230 abstract public Instruction i2c ();
232 abstract public Instruction i2d ();
234 abstract public Instruction i2f ();
236 abstract public Instruction i2l ();
238 abstract public Instruction i2s ();
240 abstract public Instruction iadd ();
242 abstract public Instruction iaload ();
244 abstract public Instruction iand ();
246 abstract public Instruction iastore ();
248 abstract public Instruction iconst_m1 ();
250 abstract public Instruction iconst_0 ();
252 abstract public Instruction iconst_1 ();
254 abstract public Instruction iconst_2 ();
256 abstract public Instruction iconst_3 ();
258 abstract public Instruction iconst_4 ();
260 abstract public Instruction iconst_5 ();
262 abstract public Instruction idiv ();
264 abstract public Instruction if_acmpeq (int targetPc);
266 abstract public Instruction if_acmpne (int targetPc);
268 abstract public Instruction if_icmpeq (int targetPc);
270 abstract public Instruction if_icmpne (int targetPc);
272 abstract public Instruction if_icmplt (int targetPc);
274 abstract public Instruction if_icmpge (int targetPc);
276 abstract public Instruction if_icmpgt (int targetPc);
278 abstract public Instruction if_icmple (int targetPc);
280 abstract public Instruction ifeq (int targetPc);
282 abstract public Instruction ifne (int targetPc);
284 abstract public Instruction iflt (int targetPc);
286 abstract public Instruction ifge (int targetPc);
288 abstract public Instruction ifgt (int targetPc);
290 abstract public Instruction ifle (int targetPc);
292 abstract public Instruction ifnonnull (int targetPc);
294 abstract public Instruction ifnull (int targetPc);
296 abstract public Instruction iinc (int localVarIndex, int incConstant);
298 abstract public Instruction iload (int localVarIndex);
300 abstract public Instruction iload_0 ();
302 abstract public Instruction iload_1 ();
304 abstract public Instruction iload_2 ();
306 abstract public Instruction iload_3 ();
308 abstract public Instruction imul ();
310 abstract public Instruction ineg ();
312 abstract public Instruction instanceof_ (String clsName);
314 abstract public Instruction invokeinterface (String clsName, String methodName, String methodSignature);
316 abstract public Instruction invokespecial (String clsName, String methodName, String methodSignature);
318 abstract public Instruction invokestatic (String clsName, String methodName, String methodSignature);
320 abstract public Instruction invokevirtual (String clsName, String methodName, String methodSignature);
322 abstract public Instruction invokedynamic (int bootstrapIndex, String samMethodName, String functionType);
324 abstract public Instruction ior ();
326 abstract public Instruction irem ();
328 abstract public Instruction ireturn ();
330 abstract public Instruction ishl ();
332 abstract public Instruction ishr ();
334 abstract public Instruction istore (int localVarIndex);
336 abstract public Instruction istore_0 ();
338 abstract public Instruction istore_1 ();
340 abstract public Instruction istore_2 ();
342 abstract public Instruction istore_3 ();
344 abstract public Instruction isub ();
346 abstract public Instruction iushr ();
348 abstract public Instruction ixor ();
350 abstract public Instruction jsr (int targetPc);
352 abstract public Instruction jsr_w (int targetPc);
354 abstract public Instruction l2d ();
356 abstract public Instruction l2f ();
358 abstract public Instruction l2i ();
360 abstract public Instruction ladd ();
362 abstract public Instruction laload ();
364 abstract public Instruction land ();
366 abstract public Instruction lastore ();
368 abstract public Instruction lcmp ();
370 abstract public Instruction lconst_0 ();
372 abstract public Instruction lconst_1 ();
374 abstract public Instruction ldc (int v);
376 abstract public Instruction ldc (float v);
378 abstract public Instruction ldc (String v, boolean isClass);
380 abstract public Instruction ldc_w (int v);
382 abstract public Instruction ldc_w (float v);
384 abstract public Instruction ldc_w (String v, boolean isClass);
386 abstract public Instruction ldc2_w (long v);
388 abstract public Instruction ldc2_w (double v);
390 abstract public Instruction ldiv ();
392 abstract public Instruction lload (int localVarIndex);
394 abstract public Instruction lload_0 ();
396 abstract public Instruction lload_1 ();
398 abstract public Instruction lload_2 ();
400 abstract public Instruction lload_3 ();
402 abstract public Instruction lmul ();
404 abstract public Instruction lneg ();
406 abstract public Instruction lookupswitch (int defaultTargetPc, int nEntries);
408 abstract public Instruction lor ();
410 abstract public Instruction lrem ();
412 abstract public Instruction lreturn ();
414 abstract public Instruction lshl ();
416 abstract public Instruction lshr ();
418 abstract public Instruction lstore (int localVarIndex);
420 abstract public Instruction lstore_0 ();
422 abstract public Instruction lstore_1 ();
424 abstract public Instruction lstore_2 ();
426 abstract public Instruction lstore_3 ();
428 abstract public Instruction lsub ();
430 abstract public Instruction lushr ();
432 abstract public Instruction lxor ();
434 abstract public Instruction monitorenter ();
436 abstract public Instruction monitorexit ();
438 abstract public Instruction multianewarray (String clsName, int dimensions);
440 abstract public Instruction new_ (String clsName);
442 abstract public Instruction newarray (int typeCode);
444 abstract public Instruction nop ();
446 abstract public Instruction pop ();
448 abstract public Instruction pop2 ();
450 abstract public Instruction putfield (String fieldName, String clsName, String fieldDescriptor);
452 abstract public Instruction putstatic (String fieldName, String clsName, String fieldDescriptor);
454 abstract public Instruction ret (int localVarIndex);
456 abstract public Instruction return_ ();
458 abstract public Instruction saload ();
460 abstract public Instruction sastore ();
462 abstract public Instruction sipush (int val);
464 abstract public Instruction swap ();
466 abstract public Instruction tableswitch (int defaultTargetPc, int low, int high);
468 abstract public Instruction wide ();
470 //--- the JPF specific ones (only used in synthetic methods)
471 abstract public Instruction invokecg (List<Invocation> invokes);
473 abstract public Instruction invokeclinit (ClassInfo ci);
475 abstract public Instruction directcallreturn ();
477 abstract public Instruction executenative (NativeMethodInfo mi);
479 abstract public Instruction nativereturn ();
481 // this is never part of MethodInfo stored code
482 abstract public Instruction runstart (MethodInfo miRun);
484 abstract public Instruction finishclinit (ClassInfo ci);