< prev index next > src/hotspot/share/code/nmethod.hpp
Print this page
#ifndef SHARE_CODE_NMETHOD_HPP
#define SHARE_CODE_NMETHOD_HPP
#include "code/codeBlob.hpp"
#include "code/pcDesc.hpp"
+ #include "compiler/compilerDefinitions.hpp"
#include "oops/metadata.hpp"
#include "oops/method.hpp"
class AbstractCompiler;
class CompiledDirectCall;
// offsets for entry points
address _osr_entry_point; // entry point for on stack replacement
uint16_t _entry_offset; // entry point with class check
uint16_t _verified_entry_offset; // entry point without class check
+ // TODO: can these be uint16_t, seem rely on -1 CodeOffset, can change later...
+ address _inline_entry_point; // inline type entry point (unpack all inline type args) with class check
+ address _verified_inline_entry_point; // inline type entry point (unpack all inline type args) without class check
+ address _verified_inline_ro_entry_point; // inline type entry point (unpack receiver only) without class check
int _entry_bci; // != InvocationEntryBci if this nmethod is an on-stack replacement method
int _immutable_data_size;
// _consts_offset == _content_offset because SECT_CONSTS is first in code buffer
bool nul_chk_table_contains (address addr) const { return nul_chk_table_begin() <= addr && addr < nul_chk_table_end(); }
// entry points
address entry_point() const { return code_begin() + _entry_offset; } // normal entry point
address verified_entry_point() const { return code_begin() + _verified_entry_offset; } // if klass is correct
+ address inline_entry_point() const { return _inline_entry_point; } // inline type entry point (unpack all inline type args)
+ address verified_inline_entry_point() const { return _verified_inline_entry_point; } // inline type entry point (unpack all inline type args) without class check
+ address verified_inline_ro_entry_point() const { return _verified_inline_ro_entry_point; } // inline type entry point (only unpack receiver) without class check
enum : signed char { not_installed = -1, // in construction, only the owner doing the construction is
// allowed to advance state
in_use = 0, // executable nmethod
not_entrant = 1 // marked for deoptimization but activations may still exist
void set_has_method_handle_invokes(bool z) { _has_method_handle_invokes = z; }
bool has_wide_vectors() const { return _has_wide_vectors; }
void set_has_wide_vectors(bool z) { _has_wide_vectors = z; }
+ bool needs_stack_repair() const {
+ if (is_compiled_by_c1()) {
+ return method()->c1_needs_stack_repair();
+ } else if (is_compiled_by_c2()) {
+ return method()->c2_needs_stack_repair();
+ } else {
+ return false;
+ }
+ }
+
bool has_flushed_dependencies() const { return _has_flushed_dependencies; }
void set_has_flushed_dependencies(bool z) {
assert(!has_flushed_dependencies(), "should only happen once");
_has_flushed_dependencies = z;
}
< prev index next >