src/share/vm/ci/ciMethodData.hpp
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File
*** old/src/share/vm/ci/ciMethodData.hpp	Thu Jan 16 17:24:39 2014
--- new/src/share/vm/ci/ciMethodData.hpp	Thu Jan 16 17:24:38 2014

*** 29,38 **** --- 29,39 ---- #include "ci/ciKlass.hpp" #include "ci/ciObject.hpp" #include "ci/ciUtilities.hpp" #include "oops/methodData.hpp" #include "oops/oop.inline.hpp" + #include "runtime/deoptimization.hpp" class ciBitData; class ciCounterData; class ciJumpData; class ciReceiverTypeData;
*** 42,51 **** --- 43,53 ---- class ciMultiBranchData; class ciArgInfoData; class ciCallTypeData; class ciVirtualCallTypeData; class ciParametersTypeData; + class ciSpeculativeTrapData;; typedef ProfileData ciProfileData; class ciBitData : public BitData { public:
*** 171,181 **** --- 173,183 ---- bool return_maybe_null() const { return ret()->maybe_null(); } #ifndef PRODUCT ! void print_data_on(outputStream* st, const char* extra) const; #endif }; class ciReceiverTypeData : public ReceiverTypeData { public:
*** 198,208 **** --- 200,210 ---- virtual void translate_from(const ProfileData* data) { translate_receiver_data_from(data); } void translate_receiver_data_from(const ProfileData* data); #ifndef PRODUCT ! void print_data_on(outputStream* st, const char* extra) const; void print_receiver_data_on(outputStream* st) const; #endif }; class ciVirtualCallData : public VirtualCallData {
*** 223,233 **** --- 225,235 ---- // Copy & translate from oop based VirtualCallData virtual void translate_from(const ProfileData* data) { rtd_super()->translate_receiver_data_from(data); } #ifndef PRODUCT ! void print_data_on(outputStream* st, const char* extra) const; #endif }; class ciVirtualCallTypeData : public VirtualCallTypeData { private:
*** 285,295 **** --- 287,297 ---- bool return_maybe_null() const { return ret()->maybe_null(); } #ifndef PRODUCT ! void print_data_on(outputStream* st, const char* extra) const; #endif }; class ciRetData : public RetData {
*** 334,344 **** --- 336,365 ---- bool parameter_maybe_null(int i) const { return parameters()->maybe_null(i); } #ifndef PRODUCT ! void print_data_on(outputStream* st, const char* extra) const; + #endif + }; + + class ciSpeculativeTrapData : public SpeculativeTrapData { + public: + ciSpeculativeTrapData(DataLayout* layout) : SpeculativeTrapData(layout) {} + + virtual void translate_from(const ProfileData* data); + + ciMethod* method() const { + return (ciMethod*)intptr_at(method_offset); + } + + void set_method(ciMethod* m) { + set_intptr_at(method_offset, (intptr_t)m); + } + + #ifndef PRODUCT + void print_data_on(outputStream* st, const char* extra) const; #endif }; // ciMethodData //
*** 434,443 **** --- 455,474 ---- // What is the index of the first data entry? int first_di() { return 0; } ciArgInfoData *arg_info() const; + address data_base() const { + return (address) _data; + } + DataLayout* limit_data_position() const { + return (DataLayout*)((address)data_base() + _data_size); + } + + void load_extra_data(); + ciProfileData* bci_to_extra_data(int bci, ciMethod* m, bool& two_free_slots); + public: bool is_method_data() const { return true; } bool is_empty() { return _state == empty_state; } bool is_mature() { return _state == mature_state; }
*** 473,485 **** --- 504,518 ---- // Walk through the data in order. ciProfileData* first_data() { return data_at(first_di()); } ciProfileData* next_data(ciProfileData* current); bool is_valid(ciProfileData* current) { return current != NULL; } // Get the data at an arbitrary bci, or NULL if there is none. ciProfileData* bci_to_data(int bci); ciProfileData* bci_to_extra_data(int bci, bool create_if_missing); + DataLayout* extra_data_base() const { return limit_data_position(); } + + // Get the data at an arbitrary bci, or NULL if there is none. If m + // is not NULL look for a SpeculativeTrapData if any first. + ciProfileData* bci_to_data(int bci, ciMethod* m = NULL); uint overflow_trap_count() const { return _orig.overflow_trap_count(); } uint overflow_recompile_count() const {
*** 494,509 **** --- 527,543 ---- uint trap_reason_limit() const { return _orig.trap_reason_limit(); } uint trap_count_limit() const { return _orig.trap_count_limit(); } // Helpful query functions that decode trap_state. int has_trap_at(ciProfileData* data, int reason); ! int has_trap_at(int bci, ciMethod* m, int reason) { ! return has_trap_at(bci_to_data(bci), reason); ! assert((m != NULL) == Deoptimization::reason_is_speculate(reason), "inconsistent method/reason"); + return has_trap_at(bci_to_data(bci, m), reason); } int trap_recompiled_at(ciProfileData* data); ! int trap_recompiled_at(int bci, ciMethod* m) { ! return trap_recompiled_at(bci_to_data(bci, m)); } void clear_escape_info(); bool has_escape_info(); void update_escape_info();

src/share/vm/ci/ciMethodData.hpp
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File