Mercurial > hg > truffle
diff src/share/vm/ci/ciMethodData.cpp @ 6725:da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
Summary: Remove PermGen, allocate meta-data in metaspace linked to class loaders, rewrite GC walking, rewrite and rename metadata to be C++ classes
Reviewed-by: jmasa, stefank, never, coleenp, kvn, brutisso, mgerdin, dholmes, jrose, twisti, roland
Contributed-by: jmasa <jon.masamitsu@oracle.com>, stefank <stefan.karlsson@oracle.com>, mgerdin <mikael.gerdin@oracle.com>, never <tom.rodriguez@oracle.com>
author | coleenp |
---|---|
date | Sat, 01 Sep 2012 13:25:18 -0400 |
parents | f95d63e2154a |
children | bd7a7ce2e264 |
line wrap: on
line diff
--- a/src/share/vm/ci/ciMethodData.cpp Fri Aug 31 16:39:35 2012 -0700 +++ b/src/share/vm/ci/ciMethodData.cpp Sat Sep 01 13:25:18 2012 -0400 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -23,6 +23,7 @@ */ #include "precompiled.hpp" +#include "ci/ciMetadata.hpp" #include "ci/ciMethodData.hpp" #include "ci/ciUtilities.hpp" #include "memory/allocation.inline.hpp" @@ -35,8 +36,8 @@ // ------------------------------------------------------------------ // ciMethodData::ciMethodData // -ciMethodData::ciMethodData(methodDataHandle h_md) : ciObject(h_md) { - assert(h_md() != NULL, "no null method data"); +ciMethodData::ciMethodData(MethodData* md) : ciMetadata(md) { + assert(md != NULL, "no null method data"); Copy::zero_to_words((HeapWord*) &_orig, sizeof(_orig) / sizeof(HeapWord)); _data = NULL; _data_size = 0; @@ -56,8 +57,8 @@ // ------------------------------------------------------------------ // ciMethodData::ciMethodData // -// No methodDataOop. -ciMethodData::ciMethodData() : ciObject() { +// No MethodData*. +ciMethodData::ciMethodData() : ciMetadata(NULL) { Copy::zero_to_words((HeapWord*) &_orig, sizeof(_orig) / sizeof(HeapWord)); _data = NULL; _data_size = 0; @@ -75,7 +76,7 @@ } void ciMethodData::load_data() { - methodDataOop mdo = get_methodDataOop(); + MethodData* mdo = get_MethodData(); if (mdo == NULL) return; // To do: don't copy the data if it is not "ripe" -- require a minimum # @@ -84,11 +85,9 @@ // Snapshot the data -- actually, take an approximate snapshot of // the data. Any concurrently executing threads may be changing the // data as we copy it. - int skip_header = oopDesc::header_size(); - Copy::disjoint_words((HeapWord*) mdo + skip_header, - (HeapWord*) &_orig + skip_header, - sizeof(_orig) / HeapWordSize - skip_header); - DEBUG_ONLY(*_orig.adr_method() = NULL); // no dangling oops, please + Copy::disjoint_words((HeapWord*) mdo, + (HeapWord*) &_orig, + sizeof(_orig) / HeapWordSize); Arena* arena = CURRENT_ENV->arena(); _data_size = mdo->data_size(); _extra_data_size = mdo->extra_data_size(); @@ -107,7 +106,7 @@ data = mdo->next_data(data); } // Note: Extra data are all BitData, and do not need translation. - _current_mileage = methodDataOopDesc::mileage_of(mdo->method()); + _current_mileage = MethodData::mileage_of(mdo->method()); _invocation_counter = mdo->invocation_count(); _backedge_counter = mdo->backedge_count(); _state = mdo->is_mature()? mature_state: immature_state; @@ -120,9 +119,9 @@ void ciReceiverTypeData::translate_receiver_data_from(ProfileData* data) { for (uint row = 0; row < row_limit(); row++) { - klassOop k = data->as_ReceiverTypeData()->receiver(row); + Klass* k = data->as_ReceiverTypeData()->receiver(row); if (k != NULL) { - ciKlass* klass = CURRENT_ENV->get_object(k)->as_klass(); + ciKlass* klass = CURRENT_ENV->get_klass(k); set_receiver(row, klass); } } @@ -184,7 +183,7 @@ // bci_to_extra_data(bci) ... DataLayout* dp = data_layout_at(data_size()); DataLayout* end = data_layout_at(data_size() + extra_data_size()); - for (; dp < end; dp = methodDataOopDesc::next_extra(dp)) { + for (; dp < end; dp = MethodData::next_extra(dp)) { if (dp->tag() == DataLayout::no_tag) { _saw_free_extra_data = true; // observed an empty slot (common case) return NULL; @@ -236,7 +235,7 @@ void ciMethodData::clear_escape_info() { VM_ENTRY_MARK; - methodDataOop mdo = get_methodDataOop(); + MethodData* mdo = get_MethodData(); if (mdo != NULL) { mdo->clear_escape_info(); ArgInfoData *aid = arg_info(); @@ -248,10 +247,10 @@ _eflags = _arg_local = _arg_stack = _arg_returned = 0; } -// copy our escape info to the methodDataOop if it exists +// copy our escape info to the MethodData* if it exists void ciMethodData::update_escape_info() { VM_ENTRY_MARK; - methodDataOop mdo = get_methodDataOop(); + MethodData* mdo = get_MethodData(); if ( mdo != NULL) { mdo->set_eflags(_eflags); mdo->set_arg_local(_arg_local); @@ -266,7 +265,7 @@ void ciMethodData::set_compilation_stats(short loops, short blocks) { VM_ENTRY_MARK; - methodDataOop mdo = get_methodDataOop(); + MethodData* mdo = get_MethodData(); if (mdo != NULL) { mdo->set_num_loops(loops); mdo->set_num_blocks(blocks); @@ -275,25 +274,25 @@ void ciMethodData::set_would_profile(bool p) { VM_ENTRY_MARK; - methodDataOop mdo = get_methodDataOop(); + MethodData* mdo = get_MethodData(); if (mdo != NULL) { mdo->set_would_profile(p); } } bool ciMethodData::has_escape_info() { - return eflag_set(methodDataOopDesc::estimated); + return eflag_set(MethodData::estimated); } -void ciMethodData::set_eflag(methodDataOopDesc::EscapeFlag f) { +void ciMethodData::set_eflag(MethodData::EscapeFlag f) { set_bits(_eflags, f); } -void ciMethodData::clear_eflag(methodDataOopDesc::EscapeFlag f) { +void ciMethodData::clear_eflag(MethodData::EscapeFlag f) { clear_bits(_eflags, f); } -bool ciMethodData::eflag_set(methodDataOopDesc::EscapeFlag f) const { +bool ciMethodData::eflag_set(MethodData::EscapeFlag f) const { return mask_bits(_eflags, f) != 0; } @@ -338,8 +337,8 @@ } ByteSize ciMethodData::offset_of_slot(ciProfileData* data, ByteSize slot_offset_in_data) { - // Get offset within methodDataOop of the data array - ByteSize data_offset = methodDataOopDesc::data_offset(); + // Get offset within MethodData* of the data array + ByteSize data_offset = MethodData::data_offset(); // Get cell offset of the ProfileData within data array int cell_offset = dp_to_di(data->dp()); @@ -354,7 +353,7 @@ // Should be last, have to skip all traps. DataLayout* dp = data_layout_at(data_size()); DataLayout* end = data_layout_at(data_size() + extra_data_size()); - for (; dp < end; dp = methodDataOopDesc::next_extra(dp)) { + for (; dp < end; dp = MethodData::next_extra(dp)) { if (dp->tag() == DataLayout::arg_info_data_tag) return new ciArgInfoData(dp); } @@ -364,7 +363,7 @@ // Implementation of the print method. void ciMethodData::print_impl(outputStream* st) { - ciObject::print_impl(st); + ciMetadata::print_impl(st); } #ifndef PRODUCT @@ -383,7 +382,7 @@ st->print_cr("--- Extra data:"); DataLayout* dp = data_layout_at(data_size()); DataLayout* end = data_layout_at(data_size() + extra_data_size()); - for (; dp < end; dp = methodDataOopDesc::next_extra(dp)) { + for (; dp < end; dp = MethodData::next_extra(dp)) { if (dp->tag() == DataLayout::no_tag) continue; if (dp->tag() == DataLayout::bit_data_tag) { data = new BitData(dp);