vm/include/open/vm_ee.h (104 lines of code) (raw):
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef _VM_EE_H_
#define _VM_EE_H_
/**
* @file
*
*
*/
#include "open/types.h"
#include "open/rt_types.h"
#include "open/em.h"
#ifdef __cplusplus
extern "C" {
#endif
/*
* Acquires lock associated with method
*/
DECLARE_OPEN(void, method_lock, (Method_Handle mh));
/*
* Releases lock associated with method
*/
DECLARE_OPEN(void, method_unlock, (Method_Handle mh));
/**
* Looks for a method in native libraries of a class loader.
*
* @param[in] method - a searching native-method structure
* @return The pointer to found a native function.
* @note The function raises <code>UnsatisfiedLinkError</code> with a method name
* in an exception message, if the specified method is not found.*/
DECLARE_OPEN(void *, method_get_native_func_addr, (Method_Handle method));
/**
* Address of the memory location containing the address of the code.
* Used for static and special methods which have been resolved but not jitted. (FIXME??)
* The call would be:
* call dword ptr [addr]
*
* @return The address where the code pointer for a given method is.
*
* A simple JIT that doesn't support recompilation (see e.g.
* <code>vm_register_jit_recompiled_method_callback</code>) can only
* generate code with indirect branches through the address provided
* by method_get_indirect_address().
*/
DECLARE_OPEN(void *, method_get_indirect_address, (Method_Handle method));
/**
* @return The offset in bytes from the start of the vtable to the entry for
* a given method.
*/
DECLARE_OPEN(size_t, method_get_vtable_offset, (Method_Handle method));
/**
* Allocate the "read-write" data block for this method. This memory block
* cannot be retrieved later. The intention is to use the data block for data
* that may be needed during the program execution (e.g. tables for
* switch statements).
*
* Separation of data allocated by method_allocate_data_block() and
* method_allocate_info_block() may help improve locality of
* references to data accessed during execution of compiled code and data
* accessed during stack uwinding.
*
* @sa method_allocate_info_block
*/
DECLARE_OPEN(U_8*, method_allocate_data_block, (Method_Handle method,
JIT_Handle j,
size_t size,
size_t alignment));
/**
* Allocated a "read-only" data block.
*
* (? 20030314) This function is deprecated. In all new code, use
* method_allocate_data_block() only. At some point, we
* will revisit this interface to have more control over the layout
* of various memory blocks allocated by the VM.
*/
DECLARE_OPEN(U_8*, method_allocate_jit_data_block, (Method_Handle method,
JIT_Handle j,
size_t size,
size_t alignment));
/**
* This function allows allocation of multiple chunks of code with different
* heat values. The JIT is responsible for specifying ids that are unique
* within the same method.
* The first instruction of the chunk with <code>id=0</code> is the entry point
* of the method.
*
* Deprecated.
*
* @return If the <code>CAA_Allocate</code> argument is specified, memory is
* allocated and a pointer to it is returned. If the
* <code>CAA_Simulate</code> argument is specified, no memory is
* allocated - the same as pass parameter size = 0 - function returns
* only current address for allocation in pool but no memory is allocated.
*/
DECLARE_OPEN(U_8*,
method_allocate_code_block, (Method_Handle m,
JIT_Handle j,
size_t size,
size_t alignment,
CodeBlockHeat heat,
int id,
Code_Allocation_Action action));
/**
* Allocate an info block for this method. An info block can be later
* retrieved by the JIT. The JIT may for instance store GC maps for
* root set enumeration and stack unwinding in the onfo block.
*
* @sa method_allocate_data_block
*/
DECLARE_OPEN(U_8*, method_allocate_info_block, (Method_Handle method,
JIT_Handle j,
size_t size));
/**
* Retrieve the memory block allocated earlier by
* method_allocate_code_block().
* A pair <code><method, jit></code> uniquely identifies a code block.
*/
DECLARE_OPEN(U_8*, method_get_code_block_addr_jit, (Method_Handle method,
JIT_Handle j));
/**
* Get the size of the memory block allocated earlier by
* method_allocate_code_block().
*/
DECLARE_OPEN(unsigned, method_get_code_block_size_jit, (Method_Handle method,
JIT_Handle j));
/**
* Retrieve the memory block allocated earlier by
* method_allocate_code_block().
* A triple <code><method, jit, id></code> uniquely identifies a
* code block.
*/
DECLARE_OPEN(U_8*, method_get_code_block_addr_jit_new, (Method_Handle method,
JIT_Handle j,
int id));
/**
* Get the size of the memory block allocated earlier by
* method_allocate_code_block().
* A triple <code><method, jit, id></code> uniquely identifies a
* code block.
*/
DECLARE_OPEN(unsigned, method_get_code_block_size_jit_new, (Method_Handle method,
JIT_Handle j,
int id));
/**
* Retrieve the memory block allocated earlier by
* method_allocate_info_block().
* A pair <code><method, jit></code> uniquely identifies a JIT info block.
*/
DECLARE_OPEN(U_8*, method_get_info_block_jit, (Method_Handle method,
JIT_Handle j));
/**
* Get the size of the memory block allocated earlier by
* method_allocate_info_block().
*/
DECLARE_OPEN(unsigned, method_get_info_block_size_jit, (Method_Handle method,
JIT_Handle j));
/**
* Called by a JIT in order to be notified whenever the vtable entries for the
* given method are changed. This could happen, e.g., when a method is first
* compiled, or when it is recompiled. The <code>callback_data</code> pointer
* will be passed back to the JIT during the callback. The callback method is
* <code>JIT_recompiled_method_callback</code>.
*/
DECLARE_OPEN(void, vm_register_jit_recompiled_method_callback, (JIT_Handle jit,
Method_Handle method,
Method_Handle caller,
void *callback_data));
/**
* Called by a JIT to have the VM replace a section of executable code in a
* thread-safe fashion. This function does not synchronize the I- or D-caches.
* It may be a lot cheaper to batch up the patch requests, so we may need to
* extend this interface.
*/
DECLARE_OPEN(void, vm_patch_code_block, (U_8* code_block, U_8* new_code, size_t size));
/**
* Called by a JIT to have VM synchronously (in the same thread) compile a method
* It is a requirement that JIT calls this routine only during compilation of
* other method, not during run-time.
*/
DECLARE_OPEN(JIT_Result, vm_compile_method, (JIT_Handle jit, Method_Handle method));
/**
* Adds information about inlined method.
* @param[in] method - method which is inlined
* @param[in] codeSize - size of inlined code block
* @param[in] codeAddr - size of inlined code block
* @param[in] mapLength - number of AddrLocation elements in addrLocationMap
* @param[in] addrLocationMap - native addresses to bytecode locations
* correspondence table
* @param[in] compileInfo - VM specific information.
* @param[in] outer_method - target method to which inlining was made
*/
DECLARE_OPEN(void, vm_compiled_method_load, (Method_Handle method, U_32 codeSize,
void* codeAddr, U_32 mapLength,
AddrLocation* addrLocationMap,
void* compileInfo, Method_Handle outer_method));
DECLARE_OPEN(Method_Side_Effects, method_get_side_effects, (Method_Handle mh));
DECLARE_OPEN(void, method_set_side_effects, (Method_Handle mh, Method_Side_Effects mse));
//Has side effect: initiates classloading of classes annotating the method, if any.
DECLARE_OPEN(BOOLEAN, method_has_annotation, (Method_Handle target, Class_Handle antn_type));
/**
* Set the number of exception handlers in the code generated by the JIT
* <code>j</code> for a given method. The JIT must then
* call method_set_target_handler_info()
* for each of the num_handlers exception handlers.
*/
DECLARE_OPEN(void, method_set_num_target_handlers, (Method_Handle method,
JIT_Handle j,
unsigned num_handlers));
/**
* Set the information about an exception handler in the code generated by
* the JIT.
*/
DECLARE_OPEN(void, method_set_target_handler_info, (Method_Handle method,
JIT_Handle j,
unsigned eh_number,
void *start_ip,
void *end_ip,
void *handler_ip,
Class_Handle catch_cl,
Boolean exc_obj_is_dead));
//-----------------------------------------------------------------------------
// Constant pool resolution
//-----------------------------------------------------------------------------
//
// The following byte codes reference constant pool entries:
//
// field
// getstatic static field
// putstatic static field
// getfield non-static field
// putfield non-static field
//
// method
// invokevirtual virtual method
// invokespecial special method
// invokestatic static method
// invokeinterface interface method
//
// class
// new class
// anewarray class
// checkcast class
// instanceof class
// multianewarray class
//
//
// For the method invocation byte codes, certain linkage exceptions are thrown
// at run-time:
//
// (1) invocation of a native methods throws the UnsatisfiedLinkError if the
// code that implements the method cannot be loaded or linked.
// (2) invocation of an interface method throws
// - IncompatibleClassChangeError if the object does not implement
// the called method, or the method is implemented as static
// - IllegalAccessError if the implemented method is not public
// - AbstractMethodError if the implemented method is abstract
//
/**
* @name Resolution-related functions
*/
//@{
/**
* Resolve a reference to a non-static field.
* The <code>idx</code> parameter is interpreted as a constant pool index for JVM.
* Used for getfield and putfield in JVM.
*/
DECLARE_OPEN(Field_Handle,
resolve_nonstatic_field, (Compile_Handle h, Class_Handle ch, unsigned idx, unsigned putfield));
/**
* Resolve constant pool reference to a static field.
* The <code>idx</code> parameter is interpreted as a constant pool index for JVM.
* Used for getstatic and putstatic in JVM.
*/
DECLARE_OPEN(Field_Handle,
resolve_static_field, (Compile_Handle h, Class_Handle ch, unsigned idx, unsigned putfield));
/**
* Resolve a method.
* The <code>idx</code> parameter is interpreted as a constant pool index for JVM.
*/
DECLARE_OPEN(Method_Handle,
resolve_method, (Compile_Handle h, Class_Handle ch, unsigned idx));
/**
* Resolve a method. Same as resolve_method() but the VM checks
* that the method can be used for a virtual dispatch.
* The <code>idx</code> parameter is interpreted as a constant pool index for JVM.
*/
DECLARE_OPEN(Method_Handle,
resolve_virtual_method, (Compile_Handle h, Class_Handle c, unsigned index));
/**
* Resolve a method. Same as resolve_method() but the VM checks
* that the method is static (i.e. it is not an instance method).
* The <code>idx</code> parameter is interpreted as a constant pool index for
* JVM.
*/
DECLARE_OPEN(Method_Handle,
resolve_static_method, (Compile_Handle h, Class_Handle c, unsigned index));
/**
* Resolve a method. Same as resolve_method() but the VM checks
* that the method is declared in an interface type.
* The <code>idx</code> parameter is interpreted as a constant pool index for JVM.
*/
DECLARE_OPEN(Method_Handle,
resolve_interface_method, (Compile_Handle h, Class_Handle c, unsigned index));
//
// resolve constant pool reference to a virtual method
// used for invokespecial
//
DECLARE_OPEN(Method_Handle,
resolve_special_method, (Compile_Handle h, Class_Handle c, unsigned index));
//@}
//
// resolve constant pool reference to a class
// used for
// (1) new
// - InstantiationError exception if resolved class is abstract
// (2) anewarray
// (3) multianewarray
//
// resolve_class_new is used for resolving references to class entries by the
// the new byte code.
//
/**
* Resolve a class and provide error checking if the class cannot have an
* instance, i.e. it is abstract (or is an interface class).
* The <code>idx</code> parameter is interpreted as a constant pool index for JVM.
*/
DECLARE_OPEN(Class_Handle, resolve_class_new, (Compile_Handle h, Class_Handle c, unsigned index));
//
// resolve_class is used by all the other byte codes that reference classes,
// as well as exception handlers.
//
DECLARE_OPEN(Class_Handle, resolve_class, (Compile_Handle h, Class_Handle c, unsigned index));
DECLARE_OPEN(U_32, class_get_depth, (Class_Handle cl));
/// Check if fast_instanceof is applicable for the class
DECLARE_OPEN(BOOLEAN, class_is_support_fast_instanceof, (Class_Handle cl));
/**
* @return The offset to the vtable pointer in an object.
*/
DECLARE_OPEN(size_t, object_get_vtable_offset, ());
/**
* @return The vtable handle of the given class.
*/
DECLARE_OPEN(VTable_Handle, class_get_vtable, (Class_Handle ch));
/**
* @return Class handle given object's <code>VTable_Handle</code>.
*/
DECLARE_OPEN(Class_Handle, vtable_get_class, (VTable_Handle vh));
/**
* @return The allocation handle to be used for the object allocation
* routines, given a class handle.
*/
DECLARE_OPEN(Allocation_Handle, class_get_allocation_handle, (Class_Handle ch));
/**
* @return The class handle corresponding to a given allocation handle.
*/
DECLARE_OPEN(Class_Handle, allocation_handle_get_class, (Allocation_Handle ah));
/**
* Returns the address of the global flag that specifies whether
* MethodEntry event is enabled. JIT should call this function in case
* a method is compiled with exe_notify_method_entry flag set.
*/
DECLARE_OPEN(char *, get_method_entry_flag_address, ());
/**
* Returns the address of the global flag that specifies whether
* MethodExit event is enabled. JIT should call this function in case
* a method is compiled with exe_notify_method_exit flag set.
*/
DECLARE_OPEN(char *, get_method_exit_flag_address, ());
/**
* @return The address and bit mask, for the flag which determine whether field
* access event should be sent. JIT may use the following expression to
* determine if specified field access should be tracked:
* ( **address & *mask != 0 )
*
* @param field - handle of the field
* @param[out] address - pointer to the address of the byte which contains the flag
* @param[out] mask - pointer to the bit mask of the flag
*/
DECLARE_OPEN(void,
field_get_track_access_flag, (Field_Handle field, char** address, char* mask));
/**
* @return the address and bit mask, for the flag which determine whether field
* modification event should be sent. JIT may use the following expression to
* determine if specified field modification should be tracked:
* ( **address & *mask != 0 )
*
* @param field - handle of the field
* @param[out] address - pointer to the address of the byte which contains the flag
* @param[out] mask - pointer to the bit mask of the flag
*/
DECLARE_OPEN(void,
field_get_track_modification_flag, (Field_Handle field, char** address,
char* mask));
#ifdef __cplusplus
}
#endif
#endif