40 // ------------------------------------------------------------------
41 // ciMethodData::ciMethodData
42 //
43 ciMethodData::ciMethodData(MethodData* md)
44 : ciMetadata(md),
45 _data_size(0), _extra_data_size(0), _data(nullptr),
46 _parameters_data_offset(0),
47 _exception_handlers_data_offset(0),
48 // Set an initial hint. Don't use set_hint_di() because
49 // first_di() may be out of bounds if data_size is 0.
50 _hint_di(first_di()),
51 _state(empty_state),
52 _saw_free_extra_data(false),
53 // Initialize the escape information (to "don't know.");
54 _eflags(0), _arg_local(0), _arg_stack(0), _arg_returned(0),
55 _invocation_counter(0),
56 _orig() {}
57
58
59 static bool is_klass_loaded(Klass* k) {
60 if (TrainingData::have_data()) {
61 // If we're running in AOT mode some classes may not be loaded yet
62 return !k->is_instance_klass() || InstanceKlass::cast(k)->is_loaded();
63 }
64 return true;
65 }
66
67 // Check for entries that reference an unloaded method
68 class PrepareExtraDataClosure : public CleanExtraDataClosure {
69 MethodData* _mdo;
70 SafepointStateTracker _safepoint_tracker;
71 GrowableArray<Method*> _uncached_methods;
72
73 public:
74 PrepareExtraDataClosure(MethodData* mdo)
75 : _mdo(mdo),
76 _safepoint_tracker(SafepointSynchronize::safepoint_state_tracker()),
77 _uncached_methods()
78 { }
79
80 bool is_live(Method* m) {
81 Klass* holder = m->method_holder();
82 if (holder == nullptr || !holder->is_loader_present_and_alive() || !is_klass_loaded(holder)) {
83 return false;
84 }
|
40 // ------------------------------------------------------------------
41 // ciMethodData::ciMethodData
42 //
43 ciMethodData::ciMethodData(MethodData* md)
44 : ciMetadata(md),
45 _data_size(0), _extra_data_size(0), _data(nullptr),
46 _parameters_data_offset(0),
47 _exception_handlers_data_offset(0),
48 // Set an initial hint. Don't use set_hint_di() because
49 // first_di() may be out of bounds if data_size is 0.
50 _hint_di(first_di()),
51 _state(empty_state),
52 _saw_free_extra_data(false),
53 // Initialize the escape information (to "don't know.");
54 _eflags(0), _arg_local(0), _arg_stack(0), _arg_returned(0),
55 _invocation_counter(0),
56 _orig() {}
57
58
59 static bool is_klass_loaded(Klass* k) {
60 return TrainingData::is_klass_loaded(k);
61 }
62
63 // Check for entries that reference an unloaded method
64 class PrepareExtraDataClosure : public CleanExtraDataClosure {
65 MethodData* _mdo;
66 SafepointStateTracker _safepoint_tracker;
67 GrowableArray<Method*> _uncached_methods;
68
69 public:
70 PrepareExtraDataClosure(MethodData* mdo)
71 : _mdo(mdo),
72 _safepoint_tracker(SafepointSynchronize::safepoint_state_tracker()),
73 _uncached_methods()
74 { }
75
76 bool is_live(Method* m) {
77 Klass* holder = m->method_holder();
78 if (holder == nullptr || !holder->is_loader_present_and_alive() || !is_klass_loaded(holder)) {
79 return false;
80 }
|