* src/vm/jit/jit.c: Moved instruction stuff to...
authorChristian Thalinger <twisti@complang.tuwien.ac.at>
Tue, 12 Aug 2008 13:09:39 +0000 (15:09 +0200)
committerChristian Thalinger <twisti@complang.tuwien.ac.at>
Tue, 12 Aug 2008 13:09:39 +0000 (15:09 +0200)
* src/vm/jit/jit.h: Likewise.
* src/vm/jit/ir/instruction.cpp: New file.
* src/vm/jit/ir/instruction.hpp: Likewise.
* src/vm/jit/ir/Makefile.am: Added new files.
* src/vm/jit/linenumbertable.h,
src/vm/resolve.h: Updated includes accordingly.

src/vm/jit/ir/Makefile.am
src/vm/jit/ir/instruction.cpp [new file with mode: 0644]
src/vm/jit/ir/instruction.hpp [new file with mode: 0644]
src/vm/jit/jit.c
src/vm/jit/jit.h
src/vm/jit/linenumbertable.h
src/vm/resolve.h

index 6ccaa9f75203d59fe9ef8792a101a5f8d1602f79..ecfdab36526bc077bc0845b9d761a55b17e1111c 100644 (file)
@@ -33,7 +33,9 @@ libir_la_SOURCES = \
        bytecode.h \
        icmd.cpp \
        icmd.hpp \
-       icmdtable.inc
+       icmdtable.inc \
+       instruction.cpp \
+       instruction.hpp
 
 
 ## Local variables:
diff --git a/src/vm/jit/ir/instruction.cpp b/src/vm/jit/ir/instruction.cpp
new file mode 100644 (file)
index 0000000..9be1a6f
--- /dev/null
@@ -0,0 +1,66 @@
+/* src/vm/jit/ir/instruction.cpp - IR instruction
+
+   Copyright (C) 2008
+   CACAOVM - Verein zur Foerderung der freien virtuellen Maschine CACAO
+
+   This file is part of CACAO.
+
+   This program is free software; you can redistribute it and/or
+   modify it under the terms of the GNU General Public License as
+   published by the Free Software Foundation; either version 2, or (at
+   your option) any later version.
+
+   This program is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+   02110-1301, USA.
+
+*/
+
+
+#include "config.h"
+
+#include <stdint.h>
+
+#include "vm/descriptor.h"
+
+#include "vm/jit/ir/instruction.hpp"
+
+
+// REMOVEME
+extern "C" {
+
+methoddesc* instruction_call_site(const instruction* iptr)
+{
+       if (iptr->opc == ICMD_BUILTIN) {
+               return iptr->sx.s23.s3.bte->md;
+       }
+       else if (INSTRUCTION_IS_UNRESOLVED(iptr)) {
+               return iptr->sx.s23.s3.um->methodref->parseddesc.md;
+       }
+       else {
+               return iptr->sx.s23.s3.fmiref->p.method->parseddesc;
+       }
+}
+
+}
+
+
+/*
+ * These are local overrides for various environment variables in Emacs.
+ * Please do not remove this and leave it at the end of the file, where
+ * Emacs will automagically detect them.
+ * ---------------------------------------------------------------------
+ * Local variables:
+ * mode: c++
+ * indent-tabs-mode: t
+ * c-basic-offset: 4
+ * tab-width: 4
+ * End:
+ * vim:noexpandtab:sw=4:ts=4:
+ */
diff --git a/src/vm/jit/ir/instruction.hpp b/src/vm/jit/ir/instruction.hpp
new file mode 100644 (file)
index 0000000..e176b2b
--- /dev/null
@@ -0,0 +1,277 @@
+/* src/vm/jit/ir/instruction.hpp - IR instruction
+
+   Copyright (C) 2008
+   CACAOVM - Verein zur Foerderung der freien virtuellen Maschine CACAO
+
+   This file is part of CACAO.
+
+   This program is free software; you can redistribute it and/or
+   modify it under the terms of the GNU General Public License as
+   published by the Free Software Foundation; either version 2, or (at
+   your option) any later version.
+
+   This program is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+   02110-1301, USA.
+
+*/
+
+
+#ifndef _INSTRUCTION_HPP
+#define _INSTRUCTION_HPP
+
+// Forward typedefs.
+typedef struct instruction instruction;
+typedef struct insinfo_inline insinfo_inline;
+
+
+#include "config.h"
+
+#include <stdint.h>
+
+#include "vm/descriptor.h"
+
+#include "vm/jit/jit.h"
+#include "vm/jit/replace.h"
+
+#include "vm/jit/ir/icmd.hpp"
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+// Instruction structure.
+
+/* branch_target_t: used in TABLESWITCH tables */
+
+typedef union {
+    int32_t                    insindex; /* used in parse                     */
+    basicblock                *block;    /* valid after parse                 */
+} branch_target_t;
+
+/* lookup_target_t: used in LOOKUPSWITCH tables */
+
+typedef struct {
+    int32_t                    value;    /* case value                        */
+    branch_target_t            target;   /* branch target, see above          */
+} lookup_target_t;
+
+/*** s1 operand ***/
+
+typedef union {
+       int32_t                    varindex;
+       int32_t                    argcount;
+} s1_operand_t;
+
+/*** s2 operand ***/
+
+typedef union {
+       int32_t                    varindex;
+       int32_t                   *args;
+    classref_or_classinfo      c;
+    unresolved_class          *uc;
+    uintptr_t                  constval;         /* for PUT*CONST             */
+    int32_t                    tablelow;         /* for TABLESWITCH           */
+    uint32_t                   lookupcount;      /* for LOOKUPSWITCH          */
+       int32_t                    retaddrnr;        /* for ASTORE                */
+       instruction              **iargs;            /* for PHI                   */
+} s2_operand_t;
+
+/*** s3 operand ***/
+
+typedef union {
+       int32_t                    varindex;
+    uintptr_t                  constval;
+    classref_or_classinfo      c;
+    constant_FMIref           *fmiref;
+    unresolved_method         *um;
+    unresolved_field          *uf;
+    insinfo_inline            *inlineinfo;       /* for INLINE_START/END      */
+    int32_t                    tablehigh;        /* for TABLESWITCH           */
+    branch_target_t            lookupdefault;    /* for LOOKUPSWITCH          */
+    branch_target_t            jsrtarget;        /* for JSR                   */
+       int32_t                    javaindex;        /* for *STORE                */
+    struct builtintable_entry *bte;
+} s3_operand_t;
+
+/*** val operand ***/
+
+typedef union {
+    int32_t                   i;
+    int64_t                   l;
+    float                     f;
+    double                    d;
+    void                     *anyptr;
+    java_handle_t            *stringconst;       /* for ACONST with string    */
+    classref_or_classinfo     c;                 /* for ACONST with class     */
+} val_operand_t;
+
+/*** dst operand ***/
+
+typedef union {
+       int32_t                    varindex;
+    basicblock                *block;       /* valid after parse              */
+    branch_target_t           *table;       /* for TABLESWITCH                */
+    lookup_target_t           *lookup;      /* for LOOKUPSWITCH               */
+    int32_t                    insindex;    /* used in parse                  */
+} dst_operand_t;
+
+/*** flags (32 bits) ***/
+
+#define INS_FLAG_BASICBLOCK    0x01    /* marks a basic block start           */
+#define INS_FLAG_UNRESOLVED    0x02    /* contains unresolved field/meth/class*/
+#define INS_FLAG_CLASS         0x04    /* for ACONST, PUT*CONST with class    */
+#define INS_FLAG_ARRAY         0x08    /* for CHECKCAST/INSTANCEOF with array */
+#define INS_FLAG_CHECK         0x10    /* for *ALOAD|*ASTORE: check index     */
+                                       /* for BUILTIN: check exception        */
+#define INS_FLAG_KILL_PREV     0x04    /* for *STORE, invalidate prev local   */
+#define INS_FLAG_KILL_NEXT     0x08    /* for *STORE, invalidate next local   */
+#define INS_FLAG_RETADDR       0x10    /* for ASTORE: op is a returnAddress   */
+
+#define INS_FLAG_ID_SHIFT      5
+#define INS_FLAG_ID_MASK       (~0 << INS_FLAG_ID_SHIFT)
+
+typedef union {
+    u4                  bits;
+} flags_operand_t;
+
+
+// Instruction.
+
+/* The instruction format for the intermediate representation: */
+
+struct instruction {
+    u2                      opc;    /* opcode       */
+    u2                      line;   /* line number  */
+#if SIZEOF_VOID_P == 8
+    flags_operand_t         flags;  /* 4 bytes      */
+#endif
+    s1_operand_t            s1;     /* pointer-size */
+    union {
+        struct {
+            s2_operand_t    s2;     /* pointer-size */
+            s3_operand_t    s3;     /* pointer-size */
+        } s23;                      /*     XOR      */
+        val_operand_t       val;    /*  long-size   */
+    } sx;
+    dst_operand_t           dst;    /* pointer-size */
+#if SIZEOF_VOID_P == 4
+    flags_operand_t         flags;  /* 4 bytes      */
+#endif
+#if defined(ENABLE_ESCAPE_REASON)
+       void *escape_reasons;
+#endif
+};
+
+
+#define INSTRUCTION_STARTS_BASICBLOCK(iptr) \
+       ((iptr)->flags.bits & INS_FLAG_BASICBLOCK)
+
+#define INSTRUCTION_IS_RESOLVED(iptr) \
+       (!((iptr)->flags.bits & INS_FLAG_UNRESOLVED))
+
+#define INSTRUCTION_IS_UNRESOLVED(iptr) \
+       ((iptr)->flags.bits & INS_FLAG_UNRESOLVED)
+
+#define INSTRUCTION_MUST_CHECK(iptr) \
+       ((iptr)->flags.bits & INS_FLAG_CHECK)
+
+#define INSTRUCTION_GET_FIELDREF(iptr,fref) \
+       do { \
+               if (iptr->flags.bits & INS_FLAG_UNRESOLVED) \
+                       fref = iptr->sx.s23.s3.uf->fieldref; \
+               else \
+                       fref = iptr->sx.s23.s3.fmiref; \
+       } while (0)
+
+#define INSTRUCTION_GET_METHODREF(iptr,mref) \
+       do { \
+               if (iptr->flags.bits & INS_FLAG_UNRESOLVED) \
+                       mref = iptr->sx.s23.s3.um->methodref; \
+               else \
+                       mref = iptr->sx.s23.s3.fmiref; \
+       } while (0)
+
+#define INSTRUCTION_GET_METHODDESC(iptr, md) \
+       do { \
+               if (iptr->flags.bits & INS_FLAG_UNRESOLVED) \
+                       md = iptr->sx.s23.s3.um->methodref->parseddesc.md; \
+               else \
+                       md = iptr->sx.s23.s3.fmiref->parseddesc.md; \
+       } while (0)
+
+
+/* additional info structs for special instructions ***************************/
+
+/* for ICMD_INLINE_START and ICMD_INLINE_END */
+
+struct insinfo_inline {
+       /* fields copied from the inlining tree ----------------------------------*/
+       insinfo_inline *parent;     /* insinfo of the surrounding inlining, if any*/
+       methodinfo     *method;     /* the inlined method starting/ending here    */
+       methodinfo     *outer;      /* the outer method suspended/resumed here    */
+       int32_t         synclocal;      /* local index used for synchronization   */
+       bool            synchronize;    /* true if synchronization is needed      */
+       int32_t         throughcount;   /* total # of pass-through variables      */
+       int32_t         paramcount;     /* number of parameters of original call  */
+       int32_t         stackvarscount; /* source stackdepth at INLINE_START      */
+       int32_t        *stackvars;      /* stack vars at INLINE_START             */
+
+       /* fields set by inlining ------------------------------------------------*/
+       int32_t    *javalocals_start; /* javalocals at start of inlined body      */
+       int32_t    *javalocals_end;   /* javalocals after inlined body            */
+
+       /* fields set by replacement point creation ------------------------------*/
+#if defined(ENABLE_REPLACEMENT)
+       rplpoint   *rp;             /* replacement point at INLINE_START          */
+#endif
+
+       /* fields set by the codegen ---------------------------------------------*/
+       int32_t     startmpc;       /* machine code offset of start of inlining   */
+};
+
+
+/* Additional instruction accessors */
+
+methoddesc* instruction_call_site(const instruction* iptr);
+
+static inline bool instruction_has_dst(const instruction* iptr)
+{
+       if (
+               (icmd_table[iptr->opc].dataflow == DF_INVOKE) ||
+               (icmd_table[iptr->opc].dataflow == DF_BUILTIN)
+               ) {
+               return instruction_call_site(iptr)->returntype.type != TYPE_VOID;
+       }
+       else {
+               return icmd_table[iptr->opc].dataflow >= DF_DST_BASE;
+       }
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // _INSTRUCTION_HPP
+
+
+/*
+ * These are local overrides for various environment variables in Emacs.
+ * Please do not remove this and leave it at the end of the file, where
+ * Emacs will automagically detect them.
+ * ---------------------------------------------------------------------
+ * Local variables:
+ * mode: c++
+ * indent-tabs-mode: t
+ * c-basic-offset: 4
+ * tab-width: 4
+ * End:
+ * vim:noexpandtab:sw=4:ts=4:
+ */
index cf8fe8ab25f9dfe809e03d66fecf5a5142dd7af0..b76f51c51838e399088a42c84534642288331016 100644 (file)
@@ -1173,15 +1173,6 @@ void jit_check_basicblock_numbers(jitdata *jd)
 }
 #endif /* !defined(NDEBUG) */
 
-methoddesc *instruction_call_site(const instruction *iptr) {
-       if (iptr->opc == ICMD_BUILTIN) {
-               return iptr->sx.s23.s3.bte->md;
-       } else if (INSTRUCTION_IS_UNRESOLVED(iptr)) {
-               return iptr->sx.s23.s3.um->methodref->parseddesc.md;
-       } else {
-               return iptr->sx.s23.s3.fmiref->p.method->parseddesc;
-       }
-}
 
 /*
  * These are local overrides for various environment variables in Emacs.
index e548acdec983e8fa9ae274716c0181def217caf2..2b684b0f68162a1242cb37fe3a1e114e6da71a80 100644 (file)
@@ -30,8 +30,6 @@
 
 typedef struct jitdata jitdata;
 typedef struct basicblock basicblock;
-typedef struct instruction instruction;
-typedef struct insinfo_inline insinfo_inline;
 typedef struct exception_entry exception_entry;
 
 
@@ -60,7 +58,7 @@ typedef struct exception_entry exception_entry;
 #endif
 
 #include "vm/jit/ir/bytecode.h"
-#include "vm/jit/ir/icmd.hpp"
+#include "vm/jit/ir/instruction.hpp"
 
 #if defined(ENABLE_LOOP)
 # include "vm/jit/loop/loop.h"
@@ -266,195 +264,6 @@ static inline bool var_is_saved(const jitdata *jd, s4 i) {
 }
 
 
-/**************************** instruction structure ***************************/
-
-/* branch_target_t: used in TABLESWITCH tables */
-
-typedef union {
-    s4                         insindex; /* used in parse                     */
-    basicblock                *block;    /* valid after parse                 */
-} branch_target_t;
-
-/* lookup_target_t: used in LOOKUPSWITCH tables */
-
-typedef struct {
-    s4                         value;    /* case value                        */
-    branch_target_t            target;   /* branch target, see above          */
-} lookup_target_t;
-
-/*** s1 operand ***/
-
-typedef union {
-       s4                         varindex;
-    s4                         argcount;
-} s1_operand_t;
-
-/*** s2 operand ***/
-
-typedef union {
-       s4                         varindex;
-       s4                        *args;
-    classref_or_classinfo      c;
-    unresolved_class          *uc;
-    ptrint                     constval;         /* for PUT*CONST             */
-    s4                         tablelow;         /* for TABLESWITCH           */
-    u4                         lookupcount;      /* for LOOKUPSWITCH          */
-       s4                         retaddrnr;        /* for ASTORE                */
-       instruction              **iargs;            /* for PHI                   */
-} s2_operand_t;
-
-/*** s3 operand ***/
-
-typedef union {
-       s4                         varindex;
-    ptrint                     constval;
-    classref_or_classinfo      c;
-    constant_FMIref           *fmiref;
-    unresolved_method         *um;
-    unresolved_field          *uf;
-    insinfo_inline            *inlineinfo;       /* for INLINE_START/END      */
-    s4                         tablehigh;        /* for TABLESWITCH           */
-    branch_target_t            lookupdefault;    /* for LOOKUPSWITCH          */
-    branch_target_t            jsrtarget;        /* for JSR                   */
-       s4                         javaindex;        /* for *STORE                */
-    struct builtintable_entry *bte;
-} s3_operand_t;
-
-/*** val operand ***/
-
-typedef union {
-    s4                        i;
-    s8                        l;
-    float                     f;
-    double                    d;
-    void                     *anyptr;
-    java_handle_t            *stringconst;       /* for ACONST with string    */
-    classref_or_classinfo     c;                 /* for ACONST with class     */
-} val_operand_t;
-
-/*** dst operand ***/
-
-typedef union {
-       s4                         varindex;
-    basicblock                *block;       /* valid after parse              */
-    branch_target_t           *table;       /* for TABLESWITCH                */
-    lookup_target_t           *lookup;      /* for LOOKUPSWITCH               */
-    s4                         insindex;    /* used in parse                  */
-} dst_operand_t;
-
-/*** flags (32 bits) ***/
-
-#define INS_FLAG_BASICBLOCK    0x01    /* marks a basic block start           */
-#define INS_FLAG_UNRESOLVED    0x02    /* contains unresolved field/meth/class*/
-#define INS_FLAG_CLASS         0x04    /* for ACONST, PUT*CONST with class    */
-#define INS_FLAG_ARRAY         0x08    /* for CHECKCAST/INSTANCEOF with array */
-#define INS_FLAG_CHECK         0x10    /* for *ALOAD|*ASTORE: check index     */
-                                       /* for BUILTIN: check exception        */
-#define INS_FLAG_KILL_PREV     0x04    /* for *STORE, invalidate prev local   */
-#define INS_FLAG_KILL_NEXT     0x08    /* for *STORE, invalidate next local   */
-#define INS_FLAG_RETADDR       0x10    /* for ASTORE: op is a returnAddress   */
-
-#define INS_FLAG_ID_SHIFT      5
-#define INS_FLAG_ID_MASK       (~0 << INS_FLAG_ID_SHIFT)
-
-typedef union {
-    u4                  bits;
-} flags_operand_t;
-
-/*** instruction ***/
-
-/* The instruction format for the intermediate representation: */
-
-struct instruction {
-    u2                      opc;    /* opcode       */
-    u2                      line;   /* line number  */
-#if SIZEOF_VOID_P == 8
-    flags_operand_t         flags;  /* 4 bytes      */
-#endif
-    s1_operand_t            s1;     /* pointer-size */
-    union {
-        struct {
-            s2_operand_t    s2;     /* pointer-size */
-            s3_operand_t    s3;     /* pointer-size */
-        } s23;                      /*     XOR      */
-        val_operand_t       val;    /*  long-size   */
-    } sx;
-    dst_operand_t           dst;    /* pointer-size */
-#if SIZEOF_VOID_P == 4
-    flags_operand_t         flags;  /* 4 bytes      */
-#endif
-#if defined(ENABLE_ESCAPE_REASON)
-       void *escape_reasons;
-#endif
-};
-
-
-#define INSTRUCTION_STARTS_BASICBLOCK(iptr) \
-       ((iptr)->flags.bits & INS_FLAG_BASICBLOCK)
-
-#define INSTRUCTION_IS_RESOLVED(iptr) \
-       (!((iptr)->flags.bits & INS_FLAG_UNRESOLVED))
-
-#define INSTRUCTION_IS_UNRESOLVED(iptr) \
-       ((iptr)->flags.bits & INS_FLAG_UNRESOLVED)
-
-#define INSTRUCTION_MUST_CHECK(iptr) \
-       ((iptr)->flags.bits & INS_FLAG_CHECK)
-
-#define INSTRUCTION_GET_FIELDREF(iptr,fref) \
-       do { \
-               if (iptr->flags.bits & INS_FLAG_UNRESOLVED) \
-                       fref = iptr->sx.s23.s3.uf->fieldref; \
-               else \
-                       fref = iptr->sx.s23.s3.fmiref; \
-       } while (0)
-
-#define INSTRUCTION_GET_METHODREF(iptr,mref) \
-       do { \
-               if (iptr->flags.bits & INS_FLAG_UNRESOLVED) \
-                       mref = iptr->sx.s23.s3.um->methodref; \
-               else \
-                       mref = iptr->sx.s23.s3.fmiref; \
-       } while (0)
-
-#define INSTRUCTION_GET_METHODDESC(iptr, md) \
-       do { \
-               if (iptr->flags.bits & INS_FLAG_UNRESOLVED) \
-                       md = iptr->sx.s23.s3.um->methodref->parseddesc.md; \
-               else \
-                       md = iptr->sx.s23.s3.fmiref->parseddesc.md; \
-       } while (0)
-
-/* additional info structs for special instructions ***************************/
-
-/* for ICMD_INLINE_START and ICMD_INLINE_END */
-
-struct insinfo_inline {
-       /* fields copied from the inlining tree ----------------------------------*/
-       insinfo_inline *parent;     /* insinfo of the surrounding inlining, if any*/
-       methodinfo     *method;     /* the inlined method starting/ending here    */
-       methodinfo     *outer;      /* the outer method suspended/resumed here    */
-       s4              synclocal;      /* local index used for synchronization   */
-       bool            synchronize;    /* true if synchronization is needed      */
-       s4              throughcount;   /* total # of pass-through variables      */
-       s4              paramcount;     /* number of parameters of original call  */
-       s4              stackvarscount; /* source stackdepth at INLINE_START      */
-       s4             *stackvars;      /* stack vars at INLINE_START             */
-
-       /* fields set by inlining ------------------------------------------------*/
-       s4         *javalocals_start; /* javalocals at start of inlined body      */
-       s4         *javalocals_end;   /* javalocals after inlined body            */
-
-       /* fields set by replacement point creation ------------------------------*/
-#if defined(ENABLE_REPLACEMENT)
-       rplpoint   *rp;             /* replacement point at INLINE_START          */
-#endif
-
-       /* fields set by the codegen ---------------------------------------------*/
-       s4          startmpc;       /* machine code offset of start of inlining   */
-};
-
-
 /* basicblock *****************************************************************/
 
 /* flags */
@@ -601,20 +410,6 @@ static inline bool basicblock_reached(const basicblock *bptr) {
 }
 
 
-/* Additional instruction accessors */
-
-methoddesc *instruction_call_site(const instruction *iptr);
-
-static inline bool instruction_has_dst(const instruction *iptr) {
-       if (
-               (icmd_table[iptr->opc].dataflow == DF_INVOKE) ||
-               (icmd_table[iptr->opc].dataflow == DF_BUILTIN)
-               ) {
-               return instruction_call_site(iptr)->returntype.type != TYPE_VOID;
-       } else {
-               return icmd_table[iptr->opc].dataflow >= DF_DST_BASE;
-       }
-}
 
 /***************************** register types *********************************/
 
index ce915d367ef15a275e70047da726aac64e5b9003..6dc5d1480757b29f7f08a41d3a7fc75d326e6ba4 100644 (file)
 #ifndef _LINENUMBERTABLE_H
 #define _LINENUMBERTABLE_H
 
-#ifdef __cplusplus
-extern "C" {
-#endif
-
 /* forward typedefs ***********************************************************/
 
 typedef struct linenumbertable_t            linenumbertable_t;
@@ -49,6 +45,12 @@ typedef struct linenumbertable_list_entry_t linenumbertable_list_entry_t;
 #include "vm/jit/code.h"
 #include "vm/jit/codegen-common.h"
 
+#include "vm/jit/ir/instruction.hpp"
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
 
 /* linenumbertable_t **********************************************************/
 
index fa9ccaddc650c84a450581fb5da787f901ac53d7..897c9fead4443e3f9de471168ec5cd647dfd8590 100644 (file)
@@ -45,6 +45,8 @@ typedef struct unresolved_subtype_set unresolved_subtype_set;
 
 #include "vm/jit/jit.h"
 #include "vm/jit/reg.h"
+
+#include "vm/jit/ir/instruction.hpp"
 #include "vm/jit/verify/typeinfo.h"