src/share/vm/aot/aotCodeHeap.cpp
Index
Unified diffs
Context diffs
Sdiffs
Frames
Patch
New
Old
Previous File
Next File
hotspot Cdiff src/share/vm/aot/aotCodeHeap.cpp
src/share/vm/aot/aotCodeHeap.cpp
Print this page
*** 49,68 ****
return symbol;
}
Klass* AOTCodeHeap::get_klass_from_got(const char* klass_name, int klass_len, const Method* method) {
AOTKlassData* klass_data = (AOTKlassData*)_lib->load_symbol(klass_name);
! Klass* k = (Klass*)_metaspace_got[klass_data->_got_index];
if (k == NULL) {
Thread* thread = Thread::current();
k = lookup_klass(klass_name, klass_len, method, thread);
// Note, exceptions are cleared.
if (k == NULL) {
fatal("Shared file %s error: klass %s should be resolved already", _lib->name(), klass_name);
vm_exit(1);
}
! _metaspace_got[klass_data->_got_index] = k;
}
return k;
}
Klass* AOTCodeHeap::lookup_klass(const char* name, int len, const Method* method, Thread* thread) {
--- 49,68 ----
return symbol;
}
Klass* AOTCodeHeap::get_klass_from_got(const char* klass_name, int klass_len, const Method* method) {
AOTKlassData* klass_data = (AOTKlassData*)_lib->load_symbol(klass_name);
! Klass* k = (Klass*)_klasses_got[klass_data->_got_index];
if (k == NULL) {
Thread* thread = Thread::current();
k = lookup_klass(klass_name, klass_len, method, thread);
// Note, exceptions are cleared.
if (k == NULL) {
fatal("Shared file %s error: klass %s should be resolved already", _lib->name(), klass_name);
vm_exit(1);
}
! _klasses_got[klass_data->_got_index] = k;
}
return k;
}
Klass* AOTCodeHeap::lookup_klass(const char* name, int len, const Method* method, Thread* thread) {
*** 200,211 ****
AOTLib::AOTLib(void* handle, const char* name, int dso_id) : _valid(true), _dl_handle(handle), _dso_id(dso_id) {
_name = (const char*) strdup(name);
// Verify that VM runs with the same parameters as AOT tool.
! _config = (AOTConfiguration*) load_symbol("JVM.config");
! _header = (AOTHeader*) load_symbol("JVM.header");
verify_config();
if (!_valid && PrintAOT) {
tty->print("%7d ", (int) tty->time_stamp().milliseconds());
--- 200,211 ----
AOTLib::AOTLib(void* handle, const char* name, int dso_id) : _valid(true), _dl_handle(handle), _dso_id(dso_id) {
_name = (const char*) strdup(name);
// Verify that VM runs with the same parameters as AOT tool.
! _config = (AOTConfiguration*) load_symbol("A.config");
! _header = (AOTHeader*) load_symbol("A.header");
verify_config();
if (!_valid && PrintAOT) {
tty->print("%7d ", (int) tty->time_stamp().milliseconds());
*** 222,256 ****
_class_count = _lib->header()->_class_count;
_method_count = _lib->header()->_method_count;
// Collect metaspace info: names -> address in .got section
! _metaspace_names = (const char*) _lib->load_symbol("JVM.meta.names");
! _method_metadata = (address) _lib->load_symbol("JVM.meth.metadata");
! _methods_offsets = (address) _lib->load_symbol("JVM.methods.offsets");
! _klasses_offsets = (address) _lib->load_symbol("JVM.kls.offsets");
! _dependencies = (address) _lib->load_symbol("JVM.kls.dependencies");
! _code_space = (address) _lib->load_symbol("JVM.text");
// First cell is number of elements.
! _metaspace_got = (Metadata**) _lib->load_symbol("JVM.meta.got");
! _metaspace_got_size = _lib->header()->_metaspace_got_size;
! _metadata_got = (Metadata**) _lib->load_symbol("JVM.metadata.got");
_metadata_got_size = _lib->header()->_metadata_got_size;
! _oop_got = (oop*) _lib->load_symbol("JVM.oop.got");
_oop_got_size = _lib->header()->_oop_got_size;
// Collect stubs info
! _stubs_offsets = (int*) _lib->load_symbol("JVM.stubs.offsets");
// code segments table
! _code_segments = (address) _lib->load_symbol("JVM.code.segments");
// method state
! _method_state = (jlong*) _lib->load_symbol("JVM.meth.state");
// Create a table for mapping classes
_classes = NEW_C_HEAP_ARRAY(AOTClass, _class_count, mtCode);
memset(_classes, 0, _class_count * sizeof(AOTClass));
--- 222,256 ----
_class_count = _lib->header()->_class_count;
_method_count = _lib->header()->_method_count;
// Collect metaspace info: names -> address in .got section
! _metaspace_names = (const char*) _lib->load_symbol("A.meta.names");
! _method_metadata = (address) _lib->load_symbol("A.meth.metadata");
! _methods_offsets = (address) _lib->load_symbol("A.meth.offsets");
! _klasses_offsets = (address) _lib->load_symbol("A.kls.offsets");
! _dependencies = (address) _lib->load_symbol("A.kls.dependencies");
! _code_space = (address) _lib->load_symbol("A.text");
// First cell is number of elements.
! _klasses_got = (Metadata**) _lib->load_symbol("A.kls.got");
! _klasses_got_size = _lib->header()->_klasses_got_size;
! _metadata_got = (Metadata**) _lib->load_symbol("A.meta.got");
_metadata_got_size = _lib->header()->_metadata_got_size;
! _oop_got = (oop*) _lib->load_symbol("A.oop.got");
_oop_got_size = _lib->header()->_oop_got_size;
// Collect stubs info
! _stubs_offsets = (int*) _lib->load_symbol("A.stubs.offsets");
// code segments table
! _code_segments = (address) _lib->load_symbol("A.code.segments");
// method state
! _method_state = (jlong*) _lib->load_symbol("A.meth.state");
// Create a table for mapping classes
_classes = NEW_C_HEAP_ARRAY(AOTClass, _class_count, mtCode);
memset(_classes, 0, _class_count * sizeof(AOTClass));
*** 340,351 ****
const Klass* arr_klass = Universe::typeArrayKlassObj(t);
AOTKlassData* klass_data = (AOTKlassData*) os::dll_lookup(_lib->dl_handle(), arr_klass->signature_name());
if (klass_data != NULL) {
// Set both GOT cells, resolved and initialized klass pointers.
// _got_index points to second cell - resolved klass pointer.
! _metaspace_got[klass_data->_got_index-1] = (Metadata*)arr_klass; // Initialized
! _metaspace_got[klass_data->_got_index ] = (Metadata*)arr_klass; // Resolved
if (PrintAOT) {
tty->print_cr("[Found %s in %s]", arr_klass->internal_name(), _lib->name());
}
}
}
--- 340,351 ----
const Klass* arr_klass = Universe::typeArrayKlassObj(t);
AOTKlassData* klass_data = (AOTKlassData*) os::dll_lookup(_lib->dl_handle(), arr_klass->signature_name());
if (klass_data != NULL) {
// Set both GOT cells, resolved and initialized klass pointers.
// _got_index points to second cell - resolved klass pointer.
! _klasses_got[klass_data->_got_index-1] = (Metadata*)arr_klass; // Initialized
! _klasses_got[klass_data->_got_index ] = (Metadata*)arr_klass; // Resolved
if (PrintAOT) {
tty->print_cr("[Found %s in %s]", arr_klass->internal_name(), _lib->name());
}
}
}
*** 713,723 ****
log_trace(aot, class, load)("found %s in %s for classloader %p tid=" INTPTR_FORMAT, ik->internal_name(), _lib->name(), ik->class_loader_data(), p2i(thread));
aot_class->_classloader = ik->class_loader_data();
// Set klass's Resolve (second) got cell.
! _metaspace_got[klass_data->_got_index] = ik;
// Initialize global symbols of the DSO to the corresponding VM symbol values.
link_global_lib_symbols();
int methods_offset = klass_data->_compiled_methods_offset;
--- 713,723 ----
log_trace(aot, class, load)("found %s in %s for classloader %p tid=" INTPTR_FORMAT, ik->internal_name(), _lib->name(), ik->class_loader_data(), p2i(thread));
aot_class->_classloader = ik->class_loader_data();
// Set klass's Resolve (second) got cell.
! _klasses_got[klass_data->_got_index] = ik;
// Initialize global symbols of the DSO to the corresponding VM symbol values.
link_global_lib_symbols();
int methods_offset = klass_data->_compiled_methods_offset;
*** 821,836 ****
AOTCompiledMethod* aot = _code_to_aot[index]._aot;
aot->do_oops(f);
}
}
! // Scan only metaspace_got cells which should have only Klass*,
// metadata_got cells are scanned only for alive AOT methods
// by AOTCompiledMethod::metadata_do().
void AOTCodeHeap::got_metadata_do(void f(Metadata*)) {
! for (int i = 1; i < _metaspace_got_size; i++) {
! Metadata** p = &_metaspace_got[i];
Metadata* md = *p;
if (md == NULL) continue; // skip non-oops
if (Metaspace::contains(md)) {
f(md);
} else {
--- 821,836 ----
AOTCompiledMethod* aot = _code_to_aot[index]._aot;
aot->do_oops(f);
}
}
! // Scan only klasses_got cells which should have only Klass*,
// metadata_got cells are scanned only for alive AOT methods
// by AOTCompiledMethod::metadata_do().
void AOTCodeHeap::got_metadata_do(void f(Metadata*)) {
! for (int i = 1; i < _klasses_got_size; i++) {
! Metadata** p = &_klasses_got[i];
Metadata* md = *p;
if (md == NULL) continue; // skip non-oops
if (Metaspace::contains(md)) {
f(md);
} else {
src/share/vm/aot/aotCodeHeap.cpp
Index
Unified diffs
Context diffs
Sdiffs
Frames
Patch
New
Old
Previous File
Next File