blob: d2894f7cbdcabcf04d092ecaa9fcc58da88a6358 [file] [log] [blame]
/**
* 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.
*/
/**
* @file
* Export interfaces provided by the interpreter.
*
* The current DRLVM implementation describes how the interpreter exports its
* enumeration, stack trace generation and JVMTI support functions via a single
* method table, to create the Interpreter interface.*/
#ifndef _INTERPRETER_EXPORTS_H_
#define _INTERPRETER_EXPORTS_H_
#include "open/types.h"
#include "jvmti.h"
typedef struct FrameHandle FrameHandle;
/**
* @ingroup
* Interpreter table
*/
typedef struct {
/**
* Fills the stack trace frame at the given depth for the current thread.
*
* @param[in] target_depth - the zero-based depth of the frame or inlined method,
* information about which will be stored at the given
* stack trace frame, <i>stf</i>
* @param[out] stf - the pointer to the <code>StackTraceFrame</code>
* structure that needs to be filled with the data on
* the frame or inlined method corresponding to the
* given depth
* @return <code>TRUE</code> on success, <code>FALSE</code> if the depth is greater than
* or equal to the current thread stack trace length.*/
bool (*interpreter_st_get_frame) (unsigned target_depth, struct StackTraceFrame* stf);
/**
* Fills the stack trace frames for the specified number of frames of the specified thread.
*
* @param[in] thread - the pointer to the thread
* @param[in] res_depth - the number of frames including inlined methods,
* information about which should be stored
* @param[out] stfs - the pointer to the array of stack trace frames
* created by this function and returned via this pointer
* @note The caller is responsible for freeing the memory.*/
void (*interpreter_st_get_trace) (struct VM_thread *thread, unsigned* res_depth, struct StackTraceFrame** stfs);
/**
* Enumerates references associated with the thread.
*
* @param thread - the pointer to the thread*/
void (*interpreter_enumerate_thread) (struct VM_thread *thread);
/**
* Returns the last frame.
*
* @param thread - the pointer to the thread
* @return The pointer to the last frame.*/
FrameHandle* (*interpreter_get_last_frame) (struct VM_thread *thread);
/** Returns the previous frame.
*
* @param frame - the pointer to the frame
* @return The pointer to the previous frame.*/
FrameHandle* (*interpreter_get_prev_frame) (FrameHandle* frame);
/**
* Returns the frame method.
*
* @param frame - the pointer to the frame
* @return The pointer to the method.*/
Method_Handle (*interpreter_get_frame_method) (FrameHandle* frame);
/**
* Returns the pointer to the bytecode.
*
* @param frame - the pointer to the frame
* @return The pointer to the bytecode.*/
U_8* (*interpreter_get_frame_bytecode_ptr) (FrameHandle* frame);
// 'end' is not inclusive
/**
* Returns <code>TRUE</code> if the frame is native.
*
* @param frame - the pointer to the frame
* @param begin - the pointer to the register
* @param end - the pointer to the register
* @return <code>TRUE</code> on success.*/
bool (*is_frame_in_native_frame) (struct FrameHandle* frame, void* begin, void* end);
/**
* Enumerates references associated with the thread.
*
* @param thread - the pointer to the thread
* @param jvmtiEnv - the pointer to the jvmti environment*/
void (*interpreter_ti_enumerate_thread) (jvmtiEnv*, struct VM_thread *thread);
#ifdef _IPF_
/**
* Returns the stacked register address.
*
* @param bsp - the pointer to the register
* @param reg - the register
* @return The stacked register address.*/
uint64* (*interpreter_get_stacked_register_address) (uint64* bsp, unsigned reg);
#endif
/**
* Returns the frame location.
*
* @param jvmtiEnv - the pointer to the jvmti environment
* @param thread - the pointer to the thread
* @param depth - the pointer to the depth
* @param _jmethodID - the pointer to the method
* @param jlocation - the pointer to the location
* @return <code>JVMTI_ERROR_NONE</code> - a successfully added notification<br>
* <code>JVMTI_ERROR_NO_MORE_FRAMES</code> - depth is too large*/
jvmtiError (*interpreter_ti_getFrameLocation) ( jvmtiEnv*, struct VM_thread*,
int, struct _jmethodID * *, int64 *);
/**
* Returns the value of the 32 bit local variable.
*
* @param jvmtiEnv - the pointer to the jvmti environment
* @param thread - the pointer to the thread
* @param depth - the pointer to the depth
* @param slot - the pointer to the slot
* @param value_ptr - the pointer to the value
* @return <code>JVMTI_ERROR_NONE</code> - a successfully added notification<br>
* <code>JVMTI_ERROR_NO_MORE_FRAMES</code> - depth is too large<br>
* <code>JVMTI_ERROR_OPAQUE_FRAME</code> - no frame<br>
* <code>JVMTI_ERROR_INVALID_SLOT</code> - a bad slot<br>
* <code>JVMTI_ERROR_TYPE_MISMATCH</code> - an invalid variable type*/
jvmtiError (*interpreter_ti_getLocal32) ( jvmtiEnv*, struct VM_thread*, int, int, int *);
/**
* Returns the value of 64 bit local variable.
*
* @param jvmtiEnv - the pointer to the jvmti environment
* @param thread - the pointer to the thread
* @param depth - the pointer to the depth
* @param slot - the pointer to the slot
* @param value_ptr - the pointer to the value
* @return <code>JVMTI_ERROR_NONE</code> - a successfully added notification<br>
* <code>JVMTI_ERROR_NO_MORE_FRAMES</code> - depth is too large<br>
* <code>JVMTI_ERROR_OPAQUE_FRAME</code> - no frame<br>
* <code>JVMTI_ERROR_INVALID_SLOT</code> - a bad slot<br>
* <code>JVMTI_ERROR_TYPE_MISMATCH</code> - an invalid variable type*/
jvmtiError (*interpreter_ti_getLocal64) ( jvmtiEnv*, struct VM_thread*, int, int, int64 *);
/**
* Returns the value of the <code>Object</code> type local variable.
*
* @param jvmtiEnv - the pointer to the jvmti environment
* @param thread - the pointer to the thread
* @param depth - the pointer to the depth
* @param slot - the pointer to the slot
* @param value_ptr - the pointer to the value
* @return <code>JVMTI_ERROR_NONE</code> - a successfully added notification<br>
* <code>JVMTI_ERROR_NO_MORE_FRAMES</code> - depth is too large<br>
* <code>JVMTI_ERROR_OPAQUE_FRAME</code> - no frame<br>
* <code>JVMTI_ERROR_INVALID_SLOT</code> - a bad slot<br>
* <code>JVMTI_ERROR_TYPE_MISMATCH</code> - an invalid variable type*/
jvmtiError (*interpreter_ti_getObject) ( jvmtiEnv*, struct VM_thread*, int, int, struct _jobject * *);
/**
* Returns stack trace data.
*
* @param jvmtiEnv - the pointer to the jvmti environment
* @param thread - the pointer to the thread
* @param start_depth - the pointer to the depth
* @param max_frame_count - the pointer to <code>max_frame_count</code>
* @param frame_buffer - the pointer to <code>frame_buffer</code>
* @param count_ptr - the pointer to the count
* @return <code>JVMTI_ERROR_NONE</code> - a successfully added notification<br>
* <code>JVMTI_ERROR_ILLEGAL_ARGUMENT</code> - bad arguments*/
jvmtiError (*interpreter_ti_getStackTrace) (jvmtiEnv*, struct VM_thread*, int, int, jvmtiFrameInfo*, int *);
/**
* Returns frame count.
*
* @param jvmtiEnv - the pointer to the jvmti environment
* @param thread - the pointer to the thread
* @param count_ptr[out] - the pointer to the count
* @return <code>JVMTI_ERROR_NONE</code> - a successfully added notification*/
jvmtiError (*interpreter_ti_get_frame_count) ( jvmtiEnv*, struct VM_thread*, int *);
/**
* Sets the value of 32 bit local variable.
*
* @param jvmtiEnv - the pointer to the jvmti environment
* @param thread - the pointer to the thread
* @param depth - the pointer to the depth
* @param slot - the pointer to the slot
* @param value_ptr - the pointer to the value
* @return <code>JVMTI_ERROR_NONE</code> - a successfully added notification<br>
* <code>JVMTI_ERROR_NO_MORE_FRAMES</code> - depth is too large<br>
* <code>JVMTI_ERROR_OPAQUE_FRAME</code> - no frame<br>
* <code>JVMTI_ERROR_INVALID_SLOT</code> - a bad slot<br>
* <code>JVMTI_ERROR_TYPE_MISMATCH</code> - an invalid variable type*/
jvmtiError (*interpreter_ti_setLocal32) ( jvmtiEnv*, struct VM_thread*, int, int, int);
/**
* Sets the value of 64 bit local variable.
*
* @param jvmtiEnv - the pointer to the jvmti environment
* @param thread - the pointer to the thread
* @param depth - the pointer to the depth
* @param slot - the pointer to the slot
* @param value_ptr - the pointer to the value
* @return <code>JVMTI_ERROR_NONE</code> - a successfully added notification<br>
* <code>JVMTI_ERROR_NO_MORE_FRAMES</code> - depth is too large<br>
* <code>JVMTI_ERROR_OPAQUE_FRAME</code> - no frame<br>
* <code>JVMTI_ERROR_INVALID_SLOT</code> - a bad slot<br>
* <code>JVMTI_ERROR_TYPE_MISMATCH</code> - an invalid variable type<br>*/
jvmtiError (*interpreter_ti_setLocal64) ( jvmtiEnv*, struct VM_thread*, int, int, int64);
/**
* Sets the value of the <code>Object</code> type local variable.
*
* @param jvmtiEnv - the pointer to the jvmti environment
* @param thread - the pointer to the thread
* @param depth - the pointer to the depth
* @param slot - the pointer to the slot
* @param value_ptr - the pointer to the value
* @return <code>JVMTI_ERROR_NONE</code> - a successfully added notification<br>
* <code>JVMTI_ERROR_NO_MORE_FRAMES</code> - depth is too large<br>
* <code>JVMTI_ERROR_OPAQUE_FRAME</code> - no frame<br>
* <code>JVMTI_ERROR_INVALID_SLOT</code> - a bad slot<br>
* <code>JVMTI_ERROR_TYPE_MISMATCH</code> - an invalid variable type*/
jvmtiError (*interpreter_ti_setObject) ( jvmtiEnv*, struct VM_thread*, int, int, struct _jobject *);
/**
* Returns the interrupted method native bit.
*
* @param thread - the pointer to the thread
* @return The interrupted method native bit.*/
unsigned int (*interpreter_st_get_interrupted_method_native_bit) (struct VM_thread *);
/** @defgroup open_interfaces Open Interfaces
* Open interfaces.*/
/*@{*/
/**
* The function is called when the global TI event state is changed. This means
* that at least one of jvmtiEnv's enabled the event or the event was
* disabled in all environments.
*
* @param event_type - jvmti to enable/disable
* @param enable - enable or disable the events in exe*/
void (*interpreter_ti_set_notification_mode)(jvmtiEvent event_type, bool enable);
/**
* Sets the breakpoint in the place identified by the method and location.
* No more than one breakpoint will be set at any specific place. Handling
* for multiple jvmti environments is done by the jvmti framework.
*
* @return The bytecode has been replaced by instrumentation.*/
jbyte (*interpreter_ti_set_breakpoint)(jmethodID method, jlocation location);
/**
* Clears the breakpoint in the place identified by the method and location.
* Replaced the bytecode, returned by <code>interpreter_ti_set_breakpoint(..)</code>,
* is also passed as a parameter.*/
void (*interpreter_ti_clear_breakpoint)(jmethodID method, jlocation location, jbyte saved);
/**
* Sets a callback to notify JVMTI about the frame-pop event.
*
* @return <code>JVMTI_ERROR_NONE</code> - a successfully added notification<br>
* <code>JVMTI_ERROR_OPAQUE_FRAME</code> - the frame is native<br>
* <code>JVMTI_ERROR_NO_MORE_FRAMES</code> - depth is too large*/
jvmtiError (*interpreter_ti_notify_frame_pop) (jvmtiEnv*,
VM_thread *thread,
int depth);
/**
* Pops the frame.
*
* @param jvmtiEnv - the pointer to the jvmti environment
* @param thread - the pointer to the thread
* @return <code>JVMTI_ERROR_NONE</code> - a successfully added notification<br>
* <code>JVMTI_ERROR_OPAQUE_FRAME</code> - no frame*/
jvmtiError (*interpreter_ti_pop_frame) (jvmtiEnv*, VM_thread *thread);
/**
* Dumps the stack.
*
* @param file - File to dump stack to
* @param thread - the pointer to the thread*/
void (*stack_dump) (int, VM_thread*);
} Interpreter;
/*@}*/
/**
* Returns the interpreter table.
*
* @return The interpreter table.*/
VMEXPORT Interpreter *interpreter_table();
#ifdef BUILDING_VM
extern Interpreter interpreter;
/**
* Returns <code>TRUE</code> if interpreter table.
*
* @return <code>TRUE</code> on success.*/
extern bool interpreter_enabled();
#endif
#endif /* _INTERPRETER_EXPORTS_H_ */