blob: 6734383fff82979ac967b729ef2300d1b7b52412 [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.
*/
/**
* @author Mikhail Y. Fursov
*/
#ifndef _EM_VM_H_
#define _EM_VM_H_
/**
* @file
* EM interface exposed to VM.
*
* VM uses the given interface to ask EM to execute and/or compile a method
* or to notify EM on profiler thread events. Compiled methods lookup table
* also resides in EM.
*/
#include "open/types.h"
#include "open/em.h"
#include "jni_types.h"
#ifdef __cplusplus
extern "C" {
#endif
/// The runtime name of EM_VM interface.
# define OPEN_INTF_EM_VM "open.interface.em.vm." OPEN_EM_VERSION
/// The runtime property name to request if EM needs in profiler thread support.
# define OPEN_EM_VM_PROFILER_NEEDS_THREAD_SUPPORT "open.property.em.vm.profiler_needs_thread_support"
/// The runtime property name to request EM profiler thread timeout.
# define OPEN_EM_VM_PROFILER_THREAD_TIMEOUT "open.property.em.vm.profiler_thread_timeout"
/**
* The structure comprises all EM to VM interface methods.
*/
struct _OpenEmVm {
/**
* Requests EM to execute the method.
*
* VM uses the given method to execute uncompiled methods.
* EM is responsible for selecting the appropriate execution engine and
* executing the method using the stub provided by the execution engine.
*
* @param[in] meth - the method to execute
* @param[in] return_value - the place to store the return value of the method
* @param[in] args - the parameters to be passed to the method
*/
void (*ExecuteMethod) (jmethodID meth, jvalue *return_value, jvalue *args);
/**
* Requests EM to start the compilation of the method
*
* VM or JIT method compilation stubs use the given method to
* ask EM to start the method compilation.
* EM is responsible for selecting JIT for the given method and passing the
* control under JIT and the specified method to VM.
*
* @param[in] method_handle - the handle of the method to compile
*/
JIT_Result (*CompileMethod) (Method_Handle method_handle);
/**
* Registers a code chunk in EM for later possible lookup by IP in code
*
* EM implements method lookup by IP. All code chunks allocated by
* VM as responses for JIT helper call to method_allocate_code_block
* helper. To register a code chunk this function is called by VM.
*
* @param[in] method_handler - the handler of the method that
* occupies this code chunk.
* @param[in] code_addr - address of the code.
* @param[in] size - size of the code chunk in bytes.
* @param[in] data - pointer to additional data associated with code chunk,
* may be NULL if VM is not interested in storing any data.
*/
void (*RegisterCodeChunk) (Method_Handle method_handle, void *code_addr,
size_t size, void *data);
/**
* Lookup code chunk by IP
*
* Return code chunk registered by RegisterCodeChunk if <code>addr</code>
* pointer points inside of it.
*
* @param[in] addr - IP address to use to lookup code chunk.
* @param[in] is_ip_past - <code>TRUE</code> if IP points to an instruction
* after call, <code>FALSE</code> otherwise
* @param[out] code_addr - start address of found code chunk, if NULL,
* argument is not filled.
* @param[out] size - size of found code chunk in bytes, if NULL,
* argument is not filled.
* @param[out] data - additional data that was specified to store with code
* chunk. If NULL, argument is not filled.
* @return the handle of the method that occupies found code chunk. NULL if
* no method is found.
*/
Method_Handle (*LookupCodeChunk) (void *addr, Boolean is_ip_past,
void **code_addr, size_t *size, void **data);
/**
* Removes registered code chunk from the lookup table.
*
* @param[in] addr - Any IP address that points to the code region
* of the method.
* @return <code>TRUE</code> if removal was successful, <code>FALSE</code>
* otherwise, e.g. if code chunk was not found.
*/
Boolean (*UnregisterCodeChunk) (void *addr);
/**
* The method is used to callback EM from the profiler thread supported
* by VM on time-out.
*/
void (*ProfilerThreadTimeout) ();
void (*ClassloaderUnloadingCallback) (Class_Loader_Handle class_handle);
};
typedef const struct _OpenEmVm* OpenEmVmHandle;
#ifdef __cplusplus
}
#endif
#endif