Just-In-Time compilers (JIT's) communicate with the Virtual Machine
(VM) through an interface which hides the details of the VM
implementation from the JIT and the details of the JIT implementation
from the VM.
 
The complete interface is contained in 4 header files in the
'interface' directory:
orp_types.h
jit_intf.h
jit_runtime_support.h
jit_export.h

1. orp_types.h: Basic types used by the VM.
 
2. jit_intf.h: Functions provided by the VM to be used at compile
   time.
 
The JIT uses those functions to query the class loader about classes,
fields and methods.  Other methods are used to request memory from the
VM and to pass extra information to the VM (e.g., exception info).
 
3. jit_runtime_support.h: Functions provided by the VM to be used at
   run time.
 
There are two groups of runtime functions: functions called by the JIT
runtime (to enumerate the root set for GC) and functions called by the
code generated by the JIT (allocated an object, monitorenter, etc).
 
4. jit_export.h: Functions provided by the JIT (compile and run time).
 
If the JIT is loaded as a DLL, those entry points are used.  Note that
the same interface is also implemented as a set of C++ member
functions (in jit_intf_cpp.h).  The C++ API is not part of the
official interface, because the C++ name mangling is compiler
dependent and cannot be used by the VM to locate entry points in a
DLL.  However the VM uses the C++ interface internally, so if a JIT is
loaded from a DLL, a proxy C++ object is created by the VM to
represent this JIT (see dll_jit_intf.h and dll_jit.cpp). A statically
linked JIT may choose to provide the C++ interface instead.

