mirror of
https://github.com/openjdk/jdk.git
synced 2025-08-28 15:24:43 +02:00
8149741: Don't refer to stub entry points by index in external_word relocations
Reviewed-by: kvn
This commit is contained in:
parent
4532f54300
commit
78fbdd19fa
7 changed files with 30 additions and 134 deletions
|
@ -161,13 +161,7 @@ address TemplateInterpreterGenerator::generate_exception_handler_common(
|
||||||
create_klass_exception),
|
create_klass_exception),
|
||||||
rarg, rarg2);
|
rarg, rarg2);
|
||||||
} else {
|
} else {
|
||||||
// kind of lame ExternalAddress can't take NULL because
|
__ lea(rarg2, ExternalAddress((address)message));
|
||||||
// external_word_Relocation will assert.
|
|
||||||
if (message != NULL) {
|
|
||||||
__ lea(rarg2, ExternalAddress((address)message));
|
|
||||||
} else {
|
|
||||||
__ movptr(rarg2, NULL_WORD);
|
|
||||||
}
|
|
||||||
__ call_VM(rax,
|
__ call_VM(rax,
|
||||||
CAST_FROM_FN_PTR(address, InterpreterRuntime::create_exception),
|
CAST_FROM_FN_PTR(address, InterpreterRuntime::create_exception),
|
||||||
rarg, rarg2);
|
rarg, rarg2);
|
||||||
|
|
|
@ -51,11 +51,8 @@ void MacroAssembler::int3() {
|
||||||
// movl reg, [reg + thread_ptr_offset] Load thread
|
// movl reg, [reg + thread_ptr_offset] Load thread
|
||||||
//
|
//
|
||||||
void MacroAssembler::get_thread(Register thread) {
|
void MacroAssembler::get_thread(Register thread) {
|
||||||
// can't use ExternalAddress because it can't take NULL
|
|
||||||
AddressLiteral null(0, relocInfo::none);
|
|
||||||
|
|
||||||
prefix(FS_segment);
|
prefix(FS_segment);
|
||||||
movptr(thread, null);
|
movptr(thread, ExternalAddress(NULL));
|
||||||
assert(os::win32::get_thread_ptr_offset() != 0,
|
assert(os::win32::get_thread_ptr_offset() != 0,
|
||||||
"Thread Pointer Offset has not been initialized");
|
"Thread Pointer Offset has not been initialized");
|
||||||
movl(thread, Address(thread, os::win32::get_thread_ptr_offset()));
|
movl(thread, Address(thread, os::win32::get_thread_ptr_offset()));
|
||||||
|
|
|
@ -457,49 +457,6 @@ RelocationHolder Relocation::spec_simple(relocInfo::relocType rtype) {
|
||||||
return itr._rh;
|
return itr._rh;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t Relocation::runtime_address_to_index(address runtime_address) {
|
|
||||||
assert(!is_reloc_index((intptr_t)runtime_address), "must not look like an index");
|
|
||||||
|
|
||||||
if (runtime_address == NULL) return 0;
|
|
||||||
|
|
||||||
StubCodeDesc* p = StubCodeDesc::desc_for(runtime_address);
|
|
||||||
if (p != NULL && p->begin() == runtime_address) {
|
|
||||||
assert(is_reloc_index(p->index()), "there must not be too many stubs");
|
|
||||||
return (int32_t)p->index();
|
|
||||||
} else {
|
|
||||||
// Known "miscellaneous" non-stub pointers:
|
|
||||||
// os::get_polling_page(), SafepointSynchronize::address_of_state()
|
|
||||||
if (PrintRelocations) {
|
|
||||||
tty->print_cr("random unregistered address in relocInfo: " INTPTR_FORMAT, p2i(runtime_address));
|
|
||||||
}
|
|
||||||
#ifndef _LP64
|
|
||||||
return (int32_t) (intptr_t)runtime_address;
|
|
||||||
#else
|
|
||||||
// didn't fit return non-index
|
|
||||||
return -1;
|
|
||||||
#endif /* _LP64 */
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
address Relocation::index_to_runtime_address(int32_t index) {
|
|
||||||
if (index == 0) return NULL;
|
|
||||||
|
|
||||||
if (is_reloc_index(index)) {
|
|
||||||
StubCodeDesc* p = StubCodeDesc::desc_for_index(index);
|
|
||||||
assert(p != NULL, "there must be a stub for this index");
|
|
||||||
return p->begin();
|
|
||||||
} else {
|
|
||||||
#ifndef _LP64
|
|
||||||
// this only works on 32bit machines
|
|
||||||
return (address) ((intptr_t) index);
|
|
||||||
#else
|
|
||||||
fatal("Relocation::index_to_runtime_address, int32_t not pointer sized");
|
|
||||||
return NULL;
|
|
||||||
#endif /* _LP64 */
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
address Relocation::old_addr_for(address newa,
|
address Relocation::old_addr_for(address newa,
|
||||||
const CodeBuffer* src, CodeBuffer* dest) {
|
const CodeBuffer* src, CodeBuffer* dest) {
|
||||||
int sect = dest->section_index_of(newa);
|
int sect = dest->section_index_of(newa);
|
||||||
|
@ -623,20 +580,13 @@ void trampoline_stub_Relocation::unpack_data() {
|
||||||
|
|
||||||
void external_word_Relocation::pack_data_to(CodeSection* dest) {
|
void external_word_Relocation::pack_data_to(CodeSection* dest) {
|
||||||
short* p = (short*) dest->locs_end();
|
short* p = (short*) dest->locs_end();
|
||||||
int32_t index = runtime_address_to_index(_target);
|
|
||||||
#ifndef _LP64
|
#ifndef _LP64
|
||||||
p = pack_1_int_to(p, index);
|
p = pack_1_int_to(p, (int32_t) (intptr_t)_target);
|
||||||
#else
|
#else
|
||||||
if (is_reloc_index(index)) {
|
jlong t = (jlong) _target;
|
||||||
p = pack_2_ints_to(p, index, 0);
|
int32_t lo = low(t);
|
||||||
} else {
|
int32_t hi = high(t);
|
||||||
jlong t = (jlong) _target;
|
p = pack_2_ints_to(p, lo, hi);
|
||||||
int32_t lo = low(t);
|
|
||||||
int32_t hi = high(t);
|
|
||||||
p = pack_2_ints_to(p, lo, hi);
|
|
||||||
DEBUG_ONLY(jlong t1 = jlong_from(hi, lo));
|
|
||||||
assert(!is_reloc_index(t1) && (address) t1 == _target, "not symmetric");
|
|
||||||
}
|
|
||||||
#endif /* _LP64 */
|
#endif /* _LP64 */
|
||||||
dest->set_locs_end((relocInfo*) p);
|
dest->set_locs_end((relocInfo*) p);
|
||||||
}
|
}
|
||||||
|
@ -644,16 +594,12 @@ void external_word_Relocation::pack_data_to(CodeSection* dest) {
|
||||||
|
|
||||||
void external_word_Relocation::unpack_data() {
|
void external_word_Relocation::unpack_data() {
|
||||||
#ifndef _LP64
|
#ifndef _LP64
|
||||||
_target = index_to_runtime_address(unpack_1_int());
|
_target = (address) (intptr_t)unpack_1_int();
|
||||||
#else
|
#else
|
||||||
int32_t lo, hi;
|
int32_t lo, hi;
|
||||||
unpack_2_ints(lo, hi);
|
unpack_2_ints(lo, hi);
|
||||||
jlong t = jlong_from(hi, lo);;
|
jlong t = jlong_from(hi, lo);;
|
||||||
if (is_reloc_index(t)) {
|
_target = (address) t;
|
||||||
_target = index_to_runtime_address(t);
|
|
||||||
} else {
|
|
||||||
_target = (address) t;
|
|
||||||
}
|
|
||||||
#endif /* _LP64 */
|
#endif /* _LP64 */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -707,10 +707,6 @@ class Relocation VALUE_OBJ_CLASS_SPEC {
|
||||||
assert(datalen()==0 || type()==relocInfo::none, "no data here");
|
assert(datalen()==0 || type()==relocInfo::none, "no data here");
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool is_reloc_index(intptr_t index) {
|
|
||||||
return 0 < index && index < os::vm_page_size();
|
|
||||||
}
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
// Helper functions for pack_data_to() and unpack_data().
|
// Helper functions for pack_data_to() and unpack_data().
|
||||||
|
|
||||||
|
@ -806,10 +802,6 @@ class Relocation VALUE_OBJ_CLASS_SPEC {
|
||||||
return base + byte_offset;
|
return base + byte_offset;
|
||||||
}
|
}
|
||||||
|
|
||||||
// these convert between indexes and addresses in the runtime system
|
|
||||||
static int32_t runtime_address_to_index(address runtime_address);
|
|
||||||
static address index_to_runtime_address(int32_t index);
|
|
||||||
|
|
||||||
// helpers for mapping between old and new addresses after a move or resize
|
// helpers for mapping between old and new addresses after a move or resize
|
||||||
address old_addr_for(address newa, const CodeBuffer* src, CodeBuffer* dest);
|
address old_addr_for(address newa, const CodeBuffer* src, CodeBuffer* dest);
|
||||||
address new_addr_for(address olda, const CodeBuffer* src, CodeBuffer* dest);
|
address new_addr_for(address olda, const CodeBuffer* src, CodeBuffer* dest);
|
||||||
|
@ -1253,7 +1245,8 @@ class external_word_Relocation : public DataRelocation {
|
||||||
// Some address looking values aren't safe to treat as relocations
|
// Some address looking values aren't safe to treat as relocations
|
||||||
// and should just be treated as constants.
|
// and should just be treated as constants.
|
||||||
static bool can_be_relocated(address target) {
|
static bool can_be_relocated(address target) {
|
||||||
return target != NULL && !is_reloc_index((intptr_t)target);
|
assert(target == NULL || (uintptr_t)target >= (uintptr_t)os::vm_page_size(), INTPTR_FORMAT, (intptr_t)target);
|
||||||
|
return target != NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
|
@ -173,9 +173,7 @@ void CodeBlobCollector::collect() {
|
||||||
_global_code_blobs = new (ResourceObj::C_HEAP, mtInternal) GrowableArray<JvmtiCodeBlobDesc*>(50,true);
|
_global_code_blobs = new (ResourceObj::C_HEAP, mtInternal) GrowableArray<JvmtiCodeBlobDesc*>(50,true);
|
||||||
|
|
||||||
// iterate over the stub code descriptors and put them in the list first.
|
// iterate over the stub code descriptors and put them in the list first.
|
||||||
int index = 0;
|
for (StubCodeDesc* desc = StubCodeDesc::first(); desc != NULL; desc = StubCodeDesc::next(desc)) {
|
||||||
StubCodeDesc* desc;
|
|
||||||
while ((desc = StubCodeDesc::desc_for_index(++index)) != NULL) {
|
|
||||||
_global_code_blobs->append(new JvmtiCodeBlobDesc(desc->name(), desc->begin(), desc->end()));
|
_global_code_blobs->append(new JvmtiCodeBlobDesc(desc->name(), desc->begin(), desc->end()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -36,19 +36,13 @@
|
||||||
// Implementation of StubCodeDesc
|
// Implementation of StubCodeDesc
|
||||||
|
|
||||||
StubCodeDesc* StubCodeDesc::_list = NULL;
|
StubCodeDesc* StubCodeDesc::_list = NULL;
|
||||||
int StubCodeDesc::_count = 0;
|
|
||||||
bool StubCodeDesc::_frozen = false;
|
bool StubCodeDesc::_frozen = false;
|
||||||
|
|
||||||
StubCodeDesc* StubCodeDesc::desc_for(address pc) {
|
StubCodeDesc* StubCodeDesc::desc_for(address pc) {
|
||||||
StubCodeDesc* p = _list;
|
StubCodeDesc* p = _list;
|
||||||
while (p != NULL && !p->contains(pc)) p = p->_next;
|
while (p != NULL && !p->contains(pc)) {
|
||||||
// p == NULL || p->contains(pc)
|
p = p->_next;
|
||||||
return p;
|
}
|
||||||
}
|
|
||||||
|
|
||||||
StubCodeDesc* StubCodeDesc::desc_for_index(int index) {
|
|
||||||
StubCodeDesc* p = _list;
|
|
||||||
while (p != NULL && p->index() != index) p = p->_next;
|
|
||||||
return p;
|
return p;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -73,43 +67,17 @@ void StubCodeDesc::print_on(outputStream* st) const {
|
||||||
// Implementation of StubCodeGenerator
|
// Implementation of StubCodeGenerator
|
||||||
|
|
||||||
StubCodeGenerator::StubCodeGenerator(CodeBuffer* code, bool print_code) {
|
StubCodeGenerator::StubCodeGenerator(CodeBuffer* code, bool print_code) {
|
||||||
_masm = new MacroAssembler(code);
|
_masm = new MacroAssembler(code );
|
||||||
_first_stub = _last_stub = NULL;
|
_print_code = PrintStubCode || print_code;
|
||||||
_print_code = print_code;
|
|
||||||
}
|
|
||||||
|
|
||||||
extern "C" {
|
|
||||||
static int compare_cdesc(const void* void_a, const void* void_b) {
|
|
||||||
int ai = (*((StubCodeDesc**) void_a))->index();
|
|
||||||
int bi = (*((StubCodeDesc**) void_b))->index();
|
|
||||||
return ai - bi;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
StubCodeGenerator::~StubCodeGenerator() {
|
StubCodeGenerator::~StubCodeGenerator() {
|
||||||
if (PrintStubCode || _print_code) {
|
if (_print_code) {
|
||||||
CodeBuffer* cbuf = _masm->code();
|
CodeBuffer* cbuf = _masm->code();
|
||||||
CodeBlob* blob = CodeCache::find_blob_unsafe(cbuf->insts()->start());
|
CodeBlob* blob = CodeCache::find_blob_unsafe(cbuf->insts()->start());
|
||||||
if (blob != NULL) {
|
if (blob != NULL) {
|
||||||
blob->set_strings(cbuf->strings());
|
blob->set_strings(cbuf->strings());
|
||||||
}
|
}
|
||||||
bool saw_first = false;
|
|
||||||
StubCodeDesc* toprint[1000];
|
|
||||||
int toprint_len = 0;
|
|
||||||
for (StubCodeDesc* cdesc = _last_stub; cdesc != NULL; cdesc = cdesc->_next) {
|
|
||||||
toprint[toprint_len++] = cdesc;
|
|
||||||
if (cdesc == _first_stub) { saw_first = true; break; }
|
|
||||||
}
|
|
||||||
assert(toprint_len == 0 || saw_first, "must get both first & last");
|
|
||||||
// Print in reverse order:
|
|
||||||
qsort(toprint, toprint_len, sizeof(toprint[0]), compare_cdesc);
|
|
||||||
for (int i = 0; i < toprint_len; i++) {
|
|
||||||
StubCodeDesc* cdesc = toprint[i];
|
|
||||||
cdesc->print();
|
|
||||||
tty->cr();
|
|
||||||
Disassembler::decode(cdesc->begin(), cdesc->end());
|
|
||||||
tty->cr();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -118,9 +86,12 @@ void StubCodeGenerator::stub_prolog(StubCodeDesc* cdesc) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void StubCodeGenerator::stub_epilog(StubCodeDesc* cdesc) {
|
void StubCodeGenerator::stub_epilog(StubCodeDesc* cdesc) {
|
||||||
// default implementation - record the cdesc
|
if (_print_code) {
|
||||||
if (_first_stub == NULL) _first_stub = cdesc;
|
cdesc->print();
|
||||||
_last_stub = cdesc;
|
tty->cr();
|
||||||
|
Disassembler::decode(cdesc->begin(), cdesc->end());
|
||||||
|
tty->cr();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -39,13 +39,11 @@
|
||||||
class StubCodeDesc: public CHeapObj<mtCode> {
|
class StubCodeDesc: public CHeapObj<mtCode> {
|
||||||
private:
|
private:
|
||||||
static StubCodeDesc* _list; // the list of all descriptors
|
static StubCodeDesc* _list; // the list of all descriptors
|
||||||
static int _count; // length of list
|
|
||||||
static bool _frozen; // determines whether _list modifications are allowed
|
static bool _frozen; // determines whether _list modifications are allowed
|
||||||
|
|
||||||
StubCodeDesc* _next; // the next element in the linked list
|
StubCodeDesc* _next; // the next element in the linked list
|
||||||
const char* _group; // the group to which the stub code belongs
|
const char* _group; // the group to which the stub code belongs
|
||||||
const char* _name; // the name assigned to the stub code
|
const char* _name; // the name assigned to the stub code
|
||||||
int _index; // serial number assigned to the stub
|
|
||||||
address _begin; // points to the first byte of the stub code (included)
|
address _begin; // points to the first byte of the stub code (included)
|
||||||
address _end; // points to the first byte after the stub code (excluded)
|
address _end; // points to the first byte after the stub code (excluded)
|
||||||
|
|
||||||
|
@ -64,8 +62,10 @@ class StubCodeDesc: public CHeapObj<mtCode> {
|
||||||
friend class StubCodeGenerator;
|
friend class StubCodeGenerator;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
static StubCodeDesc* first() { return _list; }
|
||||||
|
static StubCodeDesc* next(StubCodeDesc* desc) { return desc->_next; }
|
||||||
|
|
||||||
static StubCodeDesc* desc_for(address pc); // returns the code descriptor for the code containing pc or NULL
|
static StubCodeDesc* desc_for(address pc); // returns the code descriptor for the code containing pc or NULL
|
||||||
static StubCodeDesc* desc_for_index(int); // returns the code descriptor for the index or NULL
|
|
||||||
static const char* name_for(address pc); // returns the name of the code containing pc or NULL
|
static const char* name_for(address pc); // returns the name of the code containing pc or NULL
|
||||||
|
|
||||||
StubCodeDesc(const char* group, const char* name, address begin, address end = NULL) {
|
StubCodeDesc(const char* group, const char* name, address begin, address end = NULL) {
|
||||||
|
@ -74,7 +74,6 @@ class StubCodeDesc: public CHeapObj<mtCode> {
|
||||||
_next = _list;
|
_next = _list;
|
||||||
_group = group;
|
_group = group;
|
||||||
_name = name;
|
_name = name;
|
||||||
_index = ++_count; // (never zero)
|
|
||||||
_begin = begin;
|
_begin = begin;
|
||||||
_end = end;
|
_end = end;
|
||||||
_list = this;
|
_list = this;
|
||||||
|
@ -84,7 +83,6 @@ class StubCodeDesc: public CHeapObj<mtCode> {
|
||||||
|
|
||||||
const char* group() const { return _group; }
|
const char* group() const { return _group; }
|
||||||
const char* name() const { return _name; }
|
const char* name() const { return _name; }
|
||||||
int index() const { return _index; }
|
|
||||||
address begin() const { return _begin; }
|
address begin() const { return _begin; }
|
||||||
address end() const { return _end; }
|
address end() const { return _end; }
|
||||||
int size_in_bytes() const { return _end - _begin; }
|
int size_in_bytes() const { return _end - _begin; }
|
||||||
|
@ -97,13 +95,12 @@ class StubCodeDesc: public CHeapObj<mtCode> {
|
||||||
// Provides utility functions.
|
// Provides utility functions.
|
||||||
|
|
||||||
class StubCodeGenerator: public StackObj {
|
class StubCodeGenerator: public StackObj {
|
||||||
|
private:
|
||||||
|
bool _print_code;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
MacroAssembler* _masm;
|
MacroAssembler* _masm;
|
||||||
|
|
||||||
StubCodeDesc* _first_stub;
|
|
||||||
StubCodeDesc* _last_stub;
|
|
||||||
bool _print_code;
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
StubCodeGenerator(CodeBuffer* code, bool print_code = false);
|
StubCodeGenerator(CodeBuffer* code, bool print_code = false);
|
||||||
~StubCodeGenerator();
|
~StubCodeGenerator();
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue