blob: 3c6ac01d7f5aec208210471d51e2264ef980bfe1 [file] [log] [blame]
/*
* Copyright (c) 2020, 2022, 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
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
#ifndef SHARE_OOPS_INSTANCESTACKCHUNKKLASS_HPP
#define SHARE_OOPS_INSTANCESTACKCHUNKKLASS_HPP
#include "oops/instanceKlass.hpp"
#include "oops/oopsHierarchy.hpp"
#include "utilities/macros.hpp"
#include "utilities/ostream.hpp"
class ClassFileParser;
class MemRegion;
// An InstanceStackChunkKlass is a specialization of the InstanceKlass.
//
// The stackChunkOops have a header containing metadata, and a blob containing a
// stack segment (some integral number of stack frames).
//
// A chunk is said to be "mixed" if it contains interpreter frames or stubs
// (which can only be a safepoint stub as the topmost frame). Otherwise, it
// must contain only compiled Java frames.
//
// Interpreter frames in chunks have their internal pointers converted to
// relative offsets from fp. Derived pointers in compiled frames might also
// be converted to relative offsets from their base.
/************************************************
Chunk layout:
+--------------------------------+
| |
| oop bitmap |
| |
| ------------------------------ |
| |
| [empty] |
| |
-|================================|
/ | |
| | caller stack args | argsize
| | [metadata at frame top (1)] | + frame::metadata_words_at_top
| | ------------------------------ | words
| | [metadata at frame bottom (2)] |
^ | | frame |
| | | |
| size | ------------------------------ |
| words | |
| | | frame |
| | | |
Address | | | ------------------------------ |
| | | |
| | | frame |
| | | |
| | | callee stack args |
| | | [metadata at frame top (1)] |<--\
| | | ------------------------------ | |
| | | [metadata at frame bottom (2) | |
| | | i.e. rbp, pc] | |
| | | | |
| | | [empty] | |
| \ | | |
- |================================| |
| int maxSize | |
| long pc | |
header | byte flags | |
| int argsize | |
| int sp +---/
| int size |
+--------------------------------+
(1) Metadata at frame top (see frame::metadata_words_at_top)
Used on ppc64, empty on x86_64, aarch64
(2) Metadata at the frame bottom (see frame::metadata_words_at_bottom)
Used on x86_64 (saved rbp, ret.addr.), aarch64, empty on ppc64
************************************************/
class InstanceStackChunkKlass: public InstanceKlass {
friend class VMStructs;
friend class InstanceKlass;
friend class Continuations;
public:
static const KlassKind Kind = InstanceStackChunkKlassKind;
private:
static int _offset_of_stack;
InstanceStackChunkKlass(const ClassFileParser& parser);
public:
InstanceStackChunkKlass() { assert(DumpSharedSpaces || UseSharedSpaces, "only for CDS"); }
// Casting from Klass*
static InstanceStackChunkKlass* cast(Klass* k) {
assert(k->is_stack_chunk_instance_klass(), "cast to InstanceStackChunkKlass");
return static_cast<InstanceStackChunkKlass*>(k);
}
inline size_t instance_size(size_t stack_size_in_words) const;
static inline size_t bitmap_size_in_bits(size_t stack_size_in_words); // In bits
static inline size_t bitmap_size(size_t stack_size_in_words); // In words
static inline size_t gc_data_size(size_t stack_size_in_words); // In words
// Returns the size of the instance including the stack data.
virtual size_t oop_size(oop obj) const override;
static void serialize_offsets(class SerializeClosure* f) NOT_CDS_RETURN;
static void print_chunk(const stackChunkOop chunk, bool verbose, outputStream* st = tty);
#ifndef PRODUCT
void oop_print_on(oop obj, outputStream* st) override;
#endif
// Stack offset is an offset into the Heap
static int offset_of_stack() { return _offset_of_stack; }
static void init_offset_of_stack();
// Oop fields (and metadata) iterators
//
// The InstanceClassLoaderKlass iterators also visit the CLD pointer (or mirror of anonymous klasses).
// Forward iteration
// Iterate over the oop fields and metadata.
template <typename T, class OopClosureType>
inline void oop_oop_iterate(oop obj, OopClosureType* closure);
// Reverse iteration
// Iterate over the oop fields and metadata.
template <typename T, class OopClosureType>
inline void oop_oop_iterate_reverse(oop obj, OopClosureType* closure);
// Bounded range iteration
// Iterate over the oop fields and metadata.
template <typename T, class OopClosureType>
inline void oop_oop_iterate_bounded(oop obj, OopClosureType* closure, MemRegion mr);
private:
template <typename T, class OopClosureType>
inline void oop_oop_iterate_header(stackChunkOop chunk, OopClosureType* closure);
template <typename T, class OopClosureType>
inline void oop_oop_iterate_header_bounded(stackChunkOop chunk, OopClosureType* closure, MemRegion mr);
template <typename T, class OopClosureType>
inline void oop_oop_iterate_stack(stackChunkOop chunk, OopClosureType* closure);
template <typename T, class OopClosureType>
inline void oop_oop_iterate_stack_bounded(stackChunkOop chunk, OopClosureType* closure, MemRegion mr);
template <typename T, class OopClosureType>
inline void oop_oop_iterate_stack_with_bitmap(stackChunkOop chunk, OopClosureType* closure, intptr_t* start, intptr_t* end);
void do_methods(stackChunkOop chunk, OopIterateClosure* cl);
void oop_oop_iterate_stack_slow(stackChunkOop chunk, OopIterateClosure* closure, MemRegion mr);
};
#endif // SHARE_OOPS_INSTANCESTACKCHUNKKLASS_HPP