blob: d13a41f45ff821f96ac5702768ce17aa5846a82b [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.
*/
#include <stdlib.h>
#include <stdio.h>
#include "open/types.h"
#include "open/vm.h"
#include "platform_lowlevel.h"
#include "interpreter_exports.h"
#include "jit_export.h"
#include "cxxlog.h"
typedef void *GC_Enumeration_Handle;
#ifndef PLATFORM_POSIX
#define EXPORT __declspec(dllexport)
#else
#define EXPORT
#endif
extern "C" {
extern void EXPORT JIT_init(JIT_Handle h, const char* name, vm_adaptor_t adaptor);
EXPORT extern void JIT_deinit(JIT_Handle h);
EXPORT extern void JIT_unwind_stack_frame(JIT_Handle, Method_Handle, JitFrameContext *);
EXPORT extern void JIT_get_root_set_from_stack_frame(JIT_Handle, Method_Handle, GC_Enumeration_Handle, JitFrameContext *);
EXPORT extern void JIT_get_root_set_for_thread_dump(JIT_Handle, Method_Handle, GC_Enumeration_Handle, JitFrameContext *);
EXPORT extern void JIT_fix_handler_context(JIT_Handle, Method_Handle, JitFrameContext *);
EXPORT extern void * JIT_get_address_of_this(JIT_Handle, Method_Handle, const JitFrameContext *);
EXPORT extern Boolean JIT_supports_compressed_references(JIT_Handle);
EXPORT extern void JIT_execute_method(JIT_Handle,jmethodID method, jvalue *return_value, jvalue *args);
}
EXPORT void JIT_unwind_stack_frame(JIT_Handle, Method_Handle, JitFrameContext *) { LDIE(51, "Not implemented"); }
EXPORT void JIT_get_root_set_from_stack_frame(JIT_Handle, Method_Handle, GC_Enumeration_Handle, JitFrameContext *) { LDIE(51, "Not implemented"); }
EXPORT void JIT_get_root_set_for_thread_dump(JIT_Handle, Method_Handle, GC_Enumeration_Handle, JitFrameContext *) {return;}
EXPORT void JIT_fix_handler_context(JIT_Handle, Method_Handle, JitFrameContext *) { LDIE(51, "Not implemented"); }
EXPORT void * JIT_get_address_of_this(JIT_Handle, Method_Handle, const JitFrameContext *) { LDIE(51, "Not implemented"); return (void *)JIT_FAILURE;}
struct StackTraceFrame;
extern bool interpreter_st_get_frame(unsigned target_depth, StackTraceFrame* stf);
extern jvmtiError interpreter_ti_getFrameLocation(
struct jvmtiEnv_struct *,struct VM_thread *,int, struct _jmethodID * *,int64 *);
extern jvmtiError interpreter_ti_getLocal32( struct jvmtiEnv_struct *,struct VM_thread *,int,int,int *);
extern jvmtiError interpreter_ti_getLocal64( struct jvmtiEnv_struct *,struct VM_thread *,int,int,int64 *);
extern jvmtiError interpreter_ti_getObject( struct jvmtiEnv_struct *,struct VM_thread *,int,int,struct _jobject * *);
extern jvmtiError interpreter_ti_getStackTrace(struct jvmtiEnv_struct *,struct VM_thread *,int,int,jvmtiFrameInfo *,int *);
extern jvmtiError interpreter_ti_get_frame_count( struct jvmtiEnv_struct *,struct VM_thread *,int *);
extern jvmtiError interpreter_ti_notify_frame_pop (jvmtiEnv*, VM_thread *thread, int depth);
extern jvmtiError interpreter_ti_setLocal32( struct jvmtiEnv_struct *,struct VM_thread *,int,int,int);
extern jvmtiError interpreter_ti_setLocal64( struct jvmtiEnv_struct *,struct VM_thread *,int,int,int64);
extern jvmtiError interpreter_ti_setObject( struct jvmtiEnv_struct *,struct VM_thread *,int,int,struct _jobject *);
extern unsigned int interpreter_st_get_interrupted_method_native_bit(struct VM_thread *);
extern void interpreter_enumerate_thread(struct VM_thread *);
extern void interpreter_ti_enumerate_thread(jvmtiEnv*, struct VM_thread*);
extern void interpreter_st_get_interrupted_method(struct Method * *,int64 *);
extern void interpreter_st_get_catch_method(struct Method * *,int64 *,struct _jobject *);
extern void interpreter_st_get_trace(VM_thread *thread, unsigned int *,struct StackTraceFrame * *);
uint64* interpreter_get_stacked_register_address(uint64* bsp, unsigned reg);
extern void interpreter_execute_method(Method *method, jvalue *return_value, jvalue *args);
extern void interpreter_ti_set_notification_mode(jvmtiEvent event_type, bool enable);
extern jbyte interpreter_ti_set_breakpoint(jmethodID method, jlocation location);
extern void interpreter_ti_clear_breakpoint(jmethodID method, jlocation location, jbyte saved);
extern jvmtiError interpreter_ti_pop_frame(jvmtiEnv*, VM_thread *thread);
extern void stack_dump(int fd, VM_thread *thread);
extern FrameHandle* interpreter_get_last_frame(struct VM_thread *thread);
extern FrameHandle* interpreter_get_prev_frame(FrameHandle* frame);
extern Method_Handle interpreter_get_frame_method(FrameHandle* frame);
extern U_8* interpreter_get_frame_bytecode_ptr(FrameHandle* frame);
extern bool is_frame_in_native_frame(FrameHandle* frame, void* begin, void* end);
void EXPORT JIT_init(JIT_Handle UNREF h, const char* UNREF name, vm_adaptor_t adaptor) {
Interpreter *interpreter = interpreter_table();
interpreter->interpreter_st_get_frame = &interpreter_st_get_frame;
interpreter->interpreter_st_get_trace = &interpreter_st_get_trace;
interpreter->interpreter_enumerate_thread = &interpreter_enumerate_thread;
interpreter->interpreter_get_last_frame = &interpreter_get_last_frame;
interpreter->interpreter_get_prev_frame = &interpreter_get_prev_frame;
interpreter->interpreter_get_frame_method = &interpreter_get_frame_method;
interpreter->interpreter_get_frame_bytecode_ptr = &interpreter_get_frame_bytecode_ptr;
interpreter->is_frame_in_native_frame = &is_frame_in_native_frame;
interpreter->interpreter_ti_enumerate_thread = &interpreter_ti_enumerate_thread;
#ifdef _IPF_
interpreter->interpreter_get_stacked_register_address = &interpreter_get_stacked_register_address;
#endif
interpreter->interpreter_ti_getFrameLocation = &interpreter_ti_getFrameLocation;
interpreter->interpreter_ti_getLocal32 = &interpreter_ti_getLocal32;
interpreter->interpreter_ti_getLocal64 = &interpreter_ti_getLocal64;
interpreter->interpreter_ti_getObject = &interpreter_ti_getObject;
interpreter->interpreter_ti_getStackTrace = &interpreter_ti_getStackTrace;
interpreter->interpreter_ti_get_frame_count = &interpreter_ti_get_frame_count;
interpreter->interpreter_ti_setLocal32 = &interpreter_ti_setLocal32;
interpreter->interpreter_ti_setLocal64 = &interpreter_ti_setLocal64;
interpreter->interpreter_ti_setObject = &interpreter_ti_setObject;
interpreter->interpreter_st_get_interrupted_method_native_bit = &interpreter_st_get_interrupted_method_native_bit;
interpreter->interpreter_ti_set_notification_mode = &interpreter_ti_set_notification_mode;
interpreter->interpreter_ti_set_breakpoint = &interpreter_ti_set_breakpoint;
interpreter->interpreter_ti_clear_breakpoint = &interpreter_ti_clear_breakpoint;
interpreter->interpreter_ti_notify_frame_pop = &interpreter_ti_notify_frame_pop;
interpreter->interpreter_ti_pop_frame = &interpreter_ti_pop_frame;
interpreter->stack_dump = &stack_dump;
}
EXPORT Boolean JIT_supports_compressed_references(JIT_Handle UNREF jh) {
#ifdef REFS_USE_UNCOMPRESSED
return false;
#else
return true;
#endif
}
EXPORT JIT_Result JIT_compile_method_with_params(JIT_Handle UNREF jh,Compile_Handle, Method_Handle, OpenMethodExecutionParams) {
fprintf(stderr, "interpreter: Compile a method\n");
return JIT_FAILURE;
}
EXPORT void JIT_deinit(JIT_Handle UNREF h) {}
EXPORT void JIT_execute_method(JIT_Handle UNREF jh,jmethodID m, jvalue *return_value, jvalue *args) {
Method *method = (Method*) m;
// fprintf(stderr, "interpreter execute method\n");
interpreter_execute_method(method, return_value, args);
}