blob: 352d168dc90a0520f2fdc695f20ac7991a0e08f6 [file] [log] [blame]
//===-- BytecodeParser.h - Java bytecode parser -----------------*- C++ -*-===//
//
// The LLVM Compiler Infrastructure
//
// This file was developed by the LLVM research group and is distributed under
// the University of Illinois Open Source License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// This file contains Java bytecode parser baseclass: a class that
// helps writing Java bytecode parsers.
//
//===----------------------------------------------------------------------===//
#ifndef LLVM_JAVA_BYTECODEPARSER_H
#define LLVM_JAVA_BYTECODEPARSER_H
#include <llvm/Java/Bytecode.h>
namespace llvm { namespace Java {
/// @brief This class provides a base class that eases bytecode
/// parsing.
///
/// By default all the do_* methods do nothing. A subclass can
/// override at will to provide specific behaviour.
template <typename SubClass>
class BytecodeParser {
protected:
typedef std::vector<std::pair<int, unsigned> > SwitchCases;
private:
SwitchCases switchCases_;
protected:
#define THIS ((SubClass*)this)
/// @brief parse code pointed to by \c code beginning at \c start
/// bytecode and ending at \c end bytecode
///
/// This function parses the code pointed to by \c code and calls
/// the subclass's do_<bytecode> method appropriately. When this
/// function returns all code in [start, end) is parsed.
void parse(const uint8_t* code, unsigned start, unsigned end) {
for (unsigned i = start; i < end; ++i) {
unsigned curBC = i;
bool wide = code[i] == WIDE;
i += wide;
THIS->pre_inst(curBC);
switch (code[i]) {
case ACONST_NULL:
THIS->do_aconst_null();
break;
case ICONST_M1:
case ICONST_0:
case ICONST_1:
case ICONST_2:
case ICONST_3:
case ICONST_4:
case ICONST_5:
THIS->do_iconst(code[i]-ICONST_0);
break;
case LCONST_0:
case LCONST_1:
THIS->do_lconst(code[i]-LCONST_0);
break;
case FCONST_0:
case FCONST_1:
case FCONST_2:
THIS->do_fconst(code[i]-FCONST_0);
break;
case DCONST_0:
case DCONST_1:
THIS->do_dconst(code[i]-DCONST_0);
break;
case BIPUSH:
THIS->do_iconst(readSByte(code, i));
break;
case SIPUSH:
THIS->do_iconst(readSShort(code, i));
break;
case LDC:
THIS->do_ldc(readUByte(code, i));
break;
case LDC_W:
THIS->do_ldc(readUShort(code, i));
break;
case LDC2_W:
THIS->do_ldc2(readUShort(code, i));
break;
case ILOAD:
THIS->do_iload(wide ? readUShort(code, i) : readUByte(code, i));
break;
case LLOAD:
THIS->do_lload(wide ? readUShort(code, i) : readUByte(code, i));
break;
case FLOAD:
THIS->do_fload(wide ? readUShort(code, i) : readUByte(code, i));
break;
case DLOAD:
THIS->do_dload(wide ? readUShort(code, i) : readUByte(code, i));
break;
case ALOAD:
THIS->do_aload(wide ? readUShort(code, i) : readUByte(code, i));
break;
case ILOAD_0:
case ILOAD_1:
case ILOAD_2:
case ILOAD_3:
THIS->do_iload(code[i]-ILOAD_0);
break;
case LLOAD_0:
case LLOAD_1:
case LLOAD_2:
case LLOAD_3:
THIS->do_lload(code[i]-LLOAD_0);
break;
case FLOAD_0:
case FLOAD_1:
case FLOAD_2:
case FLOAD_3:
THIS->do_fload(code[i]-FLOAD_0);
break;
case DLOAD_0:
case DLOAD_1:
case DLOAD_2:
case DLOAD_3:
THIS->do_dload(code[i]-DLOAD_0);
break;
case ALOAD_0:
case ALOAD_1:
case ALOAD_2:
case ALOAD_3:
THIS->do_aload(code[i]-ALOAD_0);
break;
case IALOAD:
THIS->do_iaload();
break;
case LALOAD:
THIS->do_laload();
break;
case FALOAD:
THIS->do_faload();
break;
case DALOAD:
THIS->do_daload();
break;
case AALOAD:
THIS->do_aaload();
break;
case BALOAD:
THIS->do_baload();
break;
case CALOAD:
THIS->do_caload();
break;
case SALOAD:
THIS->do_saload();
break;
case ISTORE:
THIS->do_istore(wide ? readUShort(code, i) : readUByte(code, i));
break;
case LSTORE:
THIS->do_lstore(wide ? readUShort(code, i) : readUByte(code, i));
break;
case FSTORE:
THIS->do_fstore(wide ? readUShort(code, i) : readUByte(code, i));
break;
case DSTORE:
THIS->do_dstore(wide ? readUShort(code, i) : readUByte(code, i));
break;
case ASTORE:
THIS->do_astore(wide ? readUShort(code, i) : readUByte(code, i));
break;
case ISTORE_0:
case ISTORE_1:
case ISTORE_2:
case ISTORE_3:
THIS->do_istore(code[i]-ISTORE_0);
break;
case LSTORE_0:
case LSTORE_1:
case LSTORE_2:
case LSTORE_3:
THIS->do_lstore(code[i]-LSTORE_0);
break;
case FSTORE_0:
case FSTORE_1:
case FSTORE_2:
case FSTORE_3:
THIS->do_fstore(code[i]-FSTORE_0);
break;
case DSTORE_0:
case DSTORE_1:
case DSTORE_2:
case DSTORE_3:
THIS->do_dstore(code[i]-DSTORE_0);
break;
case ASTORE_0:
case ASTORE_1:
case ASTORE_2:
case ASTORE_3:
THIS->do_astore(code[i]-ASTORE_0);
break;
case IASTORE:
THIS->do_iastore();
break;
case LASTORE:
THIS->do_lastore();
break;
case FASTORE:
THIS->do_fastore();
break;
case DASTORE:
THIS->do_dastore();
break;
case AASTORE:
THIS->do_aastore();
break;
case BASTORE:
THIS->do_bastore();
break;
case CASTORE:
THIS->do_castore();
break;
case SASTORE:
THIS->do_sastore();
break;
case POP:
THIS->do_pop();
break;
case POP2:
THIS->do_pop2();
break;
case DUP:
THIS->do_dup();
break;
case DUP_X1:
THIS->do_dup_x1();
break;
case DUP_X2:
THIS->do_dup_x2();
break;
case DUP2:
THIS->do_dup2();
break;
case DUP2_X1:
THIS->do_dup2_x1();
break;
case DUP2_X2:
THIS->do_dup2_x2();
break;
case SWAP:
THIS->do_swap();
break;
case IADD:
THIS->do_iadd();
break;
case LADD:
THIS->do_ladd();
break;
case FADD:
THIS->do_fadd();
break;
case DADD:
THIS->do_dadd();
break;
case ISUB:
THIS->do_isub();
break;
case LSUB:
THIS->do_lsub();
break;
case FSUB:
THIS->do_fsub();
break;
case DSUB:
THIS->do_dsub();
break;
case IMUL:
THIS->do_imul();
break;
case LMUL:
THIS->do_lmul();
break;
case FMUL:
THIS->do_fmul();
break;
case DMUL:
THIS->do_dmul();
break;
case IDIV:
THIS->do_idiv();
break;
case LDIV:
THIS->do_ldiv();
break;
case FDIV:
THIS->do_fdiv();
break;
case DDIV:
THIS->do_ddiv();
break;
case IREM:
THIS->do_irem();
break;
case LREM:
THIS->do_lrem();
break;
case FREM:
THIS->do_frem();
break;
case DREM:
THIS->do_drem();
break;
case INEG:
THIS->do_ineg();
break;
case LNEG:
THIS->do_lneg();
break;
case FNEG:
THIS->do_fneg();
break;
case DNEG:
THIS->do_dneg();
break;
case ISHL:
THIS->do_ishl();
break;
case LSHL:
THIS->do_lshl();
break;
case ISHR:
THIS->do_ishr();
break;
case LSHR:
THIS->do_lshr();
break;
case IUSHR:
THIS->do_iushr();
break;
case LUSHR:
THIS->do_lushr();
break;
case IAND:
THIS->do_iand();
break;
case LAND:
THIS->do_land();
break;
case IOR:
THIS->do_ior();
break;
case LOR:
THIS->do_lor();
break;
case IXOR:
THIS->do_ixor();
break;
case LXOR:
THIS->do_lxor();
break;
case IINC: {
unsigned index = wide ? readUShort(code, i) : readUByte(code, i);
int amount = wide ? readSShort(code, i) : readSByte(code, i);
THIS->do_iinc(index, amount);
break;
}
case I2L:
THIS->do_i2l();
break;
case I2F:
THIS->do_i2f();
break;
case I2D:
THIS->do_i2d();
break;
case L2I:
THIS->do_l2i();
break;
case L2F:
THIS->do_l2f();
break;
case L2D:
THIS->do_l2d();
break;
case F2I:
THIS->do_f2i();
break;
case F2L:
THIS->do_f2l();
break;
case F2D:
THIS->do_f2d();
break;
case D2I:
THIS->do_d2i();
break;
case D2L:
THIS->do_d2l();
break;
case D2F:
THIS->do_d2f();
break;
case I2B:
THIS->do_i2b();
break;
case I2C:
THIS->do_i2c();
break;
case I2S:
THIS->do_i2s();
break;
case LCMP:
THIS->do_lcmp();
break;
case FCMPL:
THIS->do_fcmpl();
break;
case FCMPG:
THIS->do_fcmpg();
break;
case DCMPL:
THIS->do_dcmpl();
break;
case DCMPG:
THIS->do_dcmpg();
break;
case IFEQ: {
unsigned t = curBC + readSShort(code, i);
THIS->do_ifeq(t, i + 1);
break;
}
case IFNE: {
unsigned t = curBC + readSShort(code, i);
THIS->do_ifne(t, i + 1);
break;
}
case IFLT: {
unsigned t = curBC + readSShort(code, i);
THIS->do_iflt(t, i + 1);
break;
}
case IFGE: {
unsigned t = curBC + readSShort(code, i);
THIS->do_ifge(t, i + 1);
break;
}
case IFGT: {
unsigned t = curBC + readSShort(code, i);
THIS->do_ifgt(t, i + 1);
break;
}
case IFLE: {
unsigned t = curBC + readSShort(code, i);
THIS->do_ifle(t, i + 1);
break;
}
case IF_ICMPEQ: {
unsigned t = curBC + readSShort(code, i);
THIS->do_if_icmpeq(t, i + 1);
break;
}
case IF_ICMPNE: {
unsigned t = curBC + readSShort(code, i);
THIS->do_if_icmpne(t, i + 1);
break;
}
case IF_ICMPLT: {
unsigned t = curBC + readSShort(code, i);
THIS->do_if_icmplt(t, i + 1);
break;
}
case IF_ICMPGE: {
unsigned t = curBC + readSShort(code, i);
THIS->do_if_icmpge(t, i + 1);
break;
}
case IF_ICMPGT: {
unsigned t = curBC + readSShort(code, i);
THIS->do_if_icmpgt(t, i + 1);
break;
}
case IF_ICMPLE: {
unsigned t = curBC + readSShort(code, i);
THIS->do_if_icmple(t, i + 1);
break;
}
case IF_IACMPEQ: {
unsigned t = curBC + readSShort(code, i);
THIS->do_if_acmpeq(t, i + 1);
break;
}
case IF_IACMPNE: {
unsigned t = curBC + readSShort(code, i);
THIS->do_if_acmpne(t, i + 1);
break;
}
case GOTO:
THIS->do_goto(curBC + readSShort(code, i));
break;
case JSR: {
unsigned t = curBC + readSShort(code, i);
THIS->do_jsr(t, i + 1);
break;
}
case RET:
THIS->do_ret(readUByte(code, i));
break;
case TABLESWITCH: {
switchCases_.clear();
skipPadBytes(i);
int def = readSInt(code, i);
int low = readSInt(code, i);
int high = readSInt(code, i);
switchCases_.reserve(high - low + 1);
while (low <= high)
switchCases_.push_back(
std::make_pair(low++, curBC + readSInt(code, i)));
THIS->do_tableswitch(curBC + def, switchCases_);
break;
}
case LOOKUPSWITCH: {
switchCases_.clear();
skipPadBytes(i);
int def = readSInt(code, i);
int pairCount = readSInt(code, i);
switchCases_.reserve(pairCount);
while (pairCount--) {
int value = readSInt(code, i);
switchCases_.push_back(
std::make_pair(value, curBC + readSInt(code, i)));
}
THIS->do_lookupswitch(curBC + def, switchCases_);
break;
}
case IRETURN:
THIS->do_ireturn();
break;
case LRETURN:
THIS->do_lreturn();
break;
case FRETURN:
THIS->do_freturn();
break;
case DRETURN:
THIS->do_dreturn();
break;
case ARETURN:
THIS->do_areturn();
break;
case RETURN:
THIS->do_return();
break;
case GETSTATIC:
THIS->do_getstatic(readUShort(code, i));
break;
case PUTSTATIC:
THIS->do_putstatic(readUShort(code, i));
break;
case GETFIELD:
THIS->do_getfield(readUShort(code, i));
break;
case PUTFIELD:
THIS->do_putfield(readUShort(code, i));
break;
case INVOKEVIRTUAL:
THIS->do_invokevirtual(readUShort(code, i));
break;
case INVOKESPECIAL:
THIS->do_invokespecial(readUShort(code, i));
break;
case INVOKESTATIC:
THIS->do_invokestatic(readUShort(code, i));
break;
case INVOKEINTERFACE: {
THIS->do_invokeinterface(readUShort(code, i));
unsigned count = readUByte(code, i);
unsigned zero = readUByte(code, i);
break;
}
case XXXUNUSEDXXX:
// FIXME: must throw something
break;
case NEW:
THIS->do_new(readUShort(code, i));
break;
case NEWARRAY:
THIS->do_newarray(static_cast<JType>(readUByte(code, i)));
break;
case ANEWARRAY:
THIS->do_anewarray(readUShort(code, i));
break;
case ARRAYLENGTH:
THIS->do_arraylength();
break;
case ATHROW:
THIS->do_athrow();
break;
case CHECKCAST:
THIS->do_checkcast(readUShort(code, i));
break;
case INSTANCEOF:
THIS->do_instanceof(readUShort(code, i));
break;
case MONITORENTER:
THIS->do_monitorenter();
break;
case MONITOREXIT:
THIS->do_monitorexit();
break;
case WIDE:
// FIXME: must throw something
break;
case MULTIANEWARRAY: {
unsigned index = readUShort(code, i);
unsigned dims = readUByte(code, i);
THIS->do_multianewarray(index, dims);
break;
}
case IFNULL: {
unsigned t = curBC + readSShort(code, i);
THIS->do_ifnull(t, i + 1);
break;
}
case IFNONNULL: {
unsigned t = curBC + readSShort(code, i);
THIS->do_ifnonnull(t, i + 1);
break;
}
case GOTO_W:
THIS->do_goto(curBC + readSInt(code, i));
break;
case JSR_W: {
unsigned t = curBC + readSInt(code, i);
THIS->do_jsr(t, i + 1);
break;
}
case BREAKPOINT:
case IMPDEP1:
case IMPDEP2:
case NOP:
break;
default:
// FIXME: must throw something
break;
}
}
}
#undef THIS
/// @brief called before every bytecode
void pre_inst(unsigned bcI) { }
/// @brief called on ACONST_NULL
void do_aconst_null() { }
/// @brief called on ICONST_<n>, SIPUSH and BIPUSH
void do_iconst(int value) { }
/// @brief called on LCONST_<n>
void do_lconst(long long value) { }
/// @brief called on FCONST_<n>
void do_fconst(float value) { }
/// @brief called on DCONST_<n>
void do_dconst(double value) { }
/// @brief called on LDC and LDC_W
void do_ldc(unsigned index) { }
/// @brief called on LDC2_W
void do_ldc2(unsigned index) { }
/// @brief called on ILOAD and ILOAD_<n>
void do_iload(unsigned index) { }
/// @brief called on LLOAD and LLOAD_<n>
void do_lload(unsigned index) { }
/// @brief called on FLOAD and FLOAD_<n>
void do_fload(unsigned index) { }
/// @brief called on DLOAD and DLOAD_<n>
void do_dload(unsigned index) { }
/// @brief called on ALOAD and ALOAD_<n>
void do_aload(unsigned index) { }
/// @brief called on IALOAD
void do_iaload() { }
/// @brief called on LALOAD
void do_laload() { }
/// @brief called on FALOAD
void do_faload() { }
/// @brief called on DALOAD
void do_daload() { }
/// @brief called on AALOAD
void do_aaload() { }
/// @brief called on BALOAD
void do_baload() { }
/// @brief called on CALOAD
void do_caload() { }
/// @brief called on SALOAD
void do_saload() { }
/// @brief called on ISTORE and ISTORE_<n>
void do_istore(unsigned index) { }
/// @brief called on LSTORE and LSTORE_<n>
void do_lstore(unsigned index) { }
/// @brief called on FSTORE and FSTORE_<n>
void do_fstore(unsigned index) { }
/// @brief called on DSTORE and DSTORE_<n>
void do_dstore(unsigned index) { }
/// @brief called on ASTORE and ASTORE_<n>
void do_astore(unsigned index) { }
/// @brief called on IASTORE
void do_iastore() { }
/// @brief called on LASTORE
void do_lastore() { }
/// @brief called on FASTORE
void do_fastore() { }
/// @brief called on DASTORE
void do_dastore() { }
/// @brief called on AASTORE
void do_aastore() { }
/// @brief called on BASTORE
void do_bastore() { }
/// @brief called on CASTORE
void do_castore() { }
/// @brief called on SASTORE
void do_sastore() { }
/// @brief called on POP
void do_pop() { }
/// @brief called on POP2
void do_pop2() { }
/// @brief called on DUP
void do_dup() { }
/// @brief called on DUP_X1
void do_dup_x1() { }
/// @brief called on DUP_X2
void do_dup_x2() { }
/// @brief called on DUP2
void do_dup2() { }
/// @brief called on DUP2_X1
void do_dup2_x1() { }
/// @brief called on DUP2_X2
void do_dup2_x2() { }
/// @brief called on SWAP
void do_swap() { }
/// @brief called on IADD
void do_iadd() { }
/// @brief called on LADD
void do_ladd() { }
/// @brief called on FADD
void do_fadd() { }
/// @brief called on DADD
void do_dadd() { }
/// @brief called on ISUB
void do_isub() { }
/// @brief called on LSUB
void do_lsub() { }
/// @brief called on FSUB
void do_fsub() { }
/// @brief called on DSUB
void do_dsub() { }
/// @brief called on IMUL
void do_imul() { }
/// @brief called on LMUL
void do_lmul() { }
/// @brief called on FMUL
void do_fmul() { }
/// @brief called on DMUL
void do_dmul() { }
/// @brief called on IDIV
void do_idiv() { }
/// @brief called on LDIV
void do_ldiv() { }
/// @brief called on FDIV
void do_fdiv() { }
/// @brief called on DDIV
void do_ddiv() { }
/// @brief called on IREM
void do_irem() { }
/// @brief called on LREM
void do_lrem() { }
/// @brief called on FREM
void do_frem() { }
/// @brief called on DREM
void do_drem() { }
/// @brief called on INEG
void do_ineg() { }
/// @brief called on LNEG
void do_lneg() { }
/// @brief called on FNEG
void do_fneg() { }
/// @brief called on DNEG
void do_dneg() { }
/// @brief called on ISHL
void do_ishl() { }
/// @brief called on LSHL
void do_lshl() { }
/// @brief called on ISHR
void do_ishr() { }
/// @brief called on LSHR
void do_lshr() { }
/// @brief called on IUSHR
void do_iushr() { }
/// @brief called on LUSHR
void do_lushr() { }
/// @brief called on IAND
void do_iand() { }
/// @brief called on LAND
void do_land() { }
/// @brief called on IOR
void do_ior() { }
/// @brief called on LOR
void do_lor() { }
/// @brief called on IXOR
void do_ixor() { }
/// @brief called on LXOR
void do_lxor() { }
/// @brief called on IINC
void do_iinc(unsigned index, int amount) { }
/// @brief called on I2L
void do_i2l() { }
/// @brief called on I2F
void do_i2f() { }
/// @brief called on I2D
void do_i2d() { }
/// @brief called on L2I
void do_l2i() { }
/// @brief called on L2F
void do_l2f() { }
/// @brief called on L2D
void do_l2d() { }
/// @brief called on F2I
void do_f2i() { }
/// @brief called on F2L
void do_f2l() { }
/// @brief called on F2D
void do_f2d() { }
/// @brief called on D2I
void do_d2i() { }
/// @brief called on D2L
void do_d2l() { }
/// @brief called on D2F
void do_d2f() { }
/// @brief called on I2B
void do_i2b() { }
/// @brief called on I2C
void do_i2c() { }
/// @brief called on I2S
void do_i2s() { }
/// @brief called on LCMP
void do_lcmp() { }
/// @brief called on FCMPL
void do_fcmpl() { }
/// @brief called on DCMPL
void do_dcmpl() { }
/// @brief called on FCMPG
void do_fcmpg() { }
/// @brief called on DCMPG
void do_dcmpg() { }
/// @brief called on IFEQ
void do_ifeq(unsigned t, unsigned f) { }
/// @brief called on IFNE
void do_ifne(unsigned t, unsigned f) { }
/// @brief called on IFLT
void do_iflt(unsigned t, unsigned f) { }
/// @brief called on IFGE
void do_ifge(unsigned t, unsigned f) { }
/// @brief called on IFGT
void do_ifgt(unsigned t, unsigned f) { }
/// @brief called on IFLE
void do_ifle(unsigned t, unsigned f) { }
/// @brief called on IF_ICMPEQ
void do_if_icmpeq(unsigned t, unsigned f) { }
/// @brief called on IF_ICMPNE
void do_if_icmpne(unsigned t, unsigned f) { }
/// @brief called on IF_ICMPLT
void do_if_icmplt(unsigned t, unsigned f) { }
/// @brief called on IF_ICMPGE
void do_if_icmpge(unsigned t, unsigned f) { }
/// @brief called on IF_ICMPGT
void do_if_icmpgt(unsigned t, unsigned f) { }
/// @brief called on IF_ICMPLE
void do_if_icmple(unsigned t, unsigned f) { }
/// @brief called on IF_ACMPEQ
void do_if_acmpeq(unsigned t, unsigned f) { }
/// @brief called on IF_ACMPNE
void do_if_acmpne(unsigned t, unsigned f) { }
/// @brief called on GOTO and GOTO_W
void do_goto(unsigned target) { }
/// @brief called on JSR and JSR_W
void do_jsr(unsigned target, unsigned retAddress) { }
/// @brief called on RET
void do_ret(unsigned index) { }
/// @brief called on TABLESWITCH
void do_tableswitch(unsigned defTarget, const SwitchCases& sw) { }
/// @brief called on LOOKUPSWITCH
void do_lookupswitch(unsigned defTarget, const SwitchCases& sw) { }
/// @brief called on IRETURN
void do_ireturn() { }
/// @brief called on LRETURN
void do_lreturn() { }
/// @brief called on FRETURN
void do_freturn() { }
/// @brief called on DRETURN
void do_dreturn() { }
/// @brief called on ARETURN
void do_areturn() { }
/// @brief called on RETURN
void do_return() { }
/// @brief called on GETSTATIC
void do_getstatic(unsigned index) { }
/// @brief called on PUTSTATIC
void do_putstatic(unsigned index) { }
/// @brief called on GETFIELD
void do_getfield(unsigned index) { }
/// @brief called on PUTFIELD
void do_putfield(unsigned index) { }
/// @brief called on INVOKEVIRTUAL
void do_invokevirtual(unsigned index) { }
/// @brief called on INVOKESPECIAL
void do_invokespecial(unsigned index) { }
/// @brief called on INVOKESTATIC
void do_invokestatic(unsigned index) { }
/// @brief called on INVOKEINTERFACE
void do_invokeinterface(unsigned index) { }
/// @brief called on NEW
void do_new(unsigned index) { }
/// @brief called on NEWARRAY
void do_newarray(JType type) { }
/// @brief called on ANEWARRAY
void do_anewarray(unsigned index) { }
/// @brief called on ARRAYLENGTH
void do_arraylength() { }
/// @brief called on ATHROW
void do_athrow() { }
/// @brief called on CHECKCAST
void do_checkcast(unsigned index) { }
/// @brief called on INSTANCEOF
void do_instanceof(unsigned index) { }
/// @brief called on MONITORENTER
void do_monitorenter() { }
/// @brief called on MONITOREXIT
void do_monitorexit() { }
/// @brief called on MULTIANEWARRAY
void do_multianewarray(unsigned index, unsigned dims) { }
/// @brief called on IFNULL
void do_ifnull(unsigned t, unsigned f) { }
/// @brief called on IFNONNULL
void do_ifnonnull(unsigned t, unsigned f) { }
};
} } // namespace llvm::Java
#endif//LLVM_JAVA_BYTECODEPARSER_H