< prev index next >
src/share/vm/compiler/oopMap.hpp
Print this page
@@ -1,7 +1,7 @@
/*
- * Copyright (c) 1998, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2015, 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.
@@ -182,10 +182,12 @@
int heap_size() const;
void copy_data_to(address addr) const;
OopMap* deep_copy();
+ bool has_derived_pointer() const PRODUCT_RETURN0;
+
bool legal_vm_reg_name(VMReg local) {
return OopMapValue::legal_vm_reg_name(local);
}
// Printing
@@ -348,17 +350,86 @@
#ifdef ASSERT
int stream_position() const { return _stream->position(); }
#endif
};
+class ImmutableOopMapBuilder {
+private:
+ class Mapping;
+
+private:
+ const OopMapSet* _set;
+ const OopMap* _empty;
+ const OopMap* _last;
+ int _empty_offset;
+ int _last_offset;
+ int _offset;
+ int _required;
+ Mapping* _mapping;
+ ImmutableOopMapSet* _new_set;
+
+ /* Used for bookkeeping when building ImmutableOopMaps */
+ class Mapping : public ResourceObj {
+ public:
+ enum kind_t { OOPMAP_UNKNOWN = 0, OOPMAP_NEW = 1, OOPMAP_EMPTY = 2, OOPMAP_DUPLICATE = 3 };
+
+ kind_t _kind;
+ int _offset;
+ int _size;
+ const OopMap* _map;
+ const OopMap* _other;
+
+ Mapping() : _kind(OOPMAP_UNKNOWN), _offset(-1), _size(-1), _map(NULL) {}
+
+ void set(kind_t kind, int offset, int size, const OopMap* map = 0, const OopMap* other = 0) {
+ _kind = kind;
+ _offset = offset;
+ _size = size;
+ _map = map;
+ _other = other;
+ }
+ };
+
+public:
+ ImmutableOopMapBuilder(const OopMapSet* set);
+
+ int heap_size();
+ ImmutableOopMapSet* build();
+ ImmutableOopMapSet* generate_into(address buffer);
+private:
+ bool is_empty(const OopMap* map) const {
+ return map->count() == 0;
+ }
+
+ bool is_last_duplicate(const OopMap* map) {
+ if (_last != NULL && _last->count() > 0 && _last->equals(map)) {
+ return true;
+ }
+ return false;
+ }
+
+#ifdef ASSERT
+ void verify(address buffer, int size, const ImmutableOopMapSet* set);
+#endif
+
+ bool has_empty() const {
+ return _empty_offset != -1;
+ }
+
+ int size_for(const OopMap* map) const;
+ void fill_pair(ImmutableOopMapPair* pair, const OopMap* map, int offset, const ImmutableOopMapSet* set);
+ int fill_map(ImmutableOopMapPair* pair, const OopMap* map, int offset, const ImmutableOopMapSet* set);
+ void fill(ImmutableOopMapSet* set, int size);
+};
+
// Derived pointer support. This table keeps track of all derived points on a
// stack. It is cleared before each scavenge/GC. During the traversal of all
// oops, it is filled in with references to all locations that contains a
// derived oop (assumed to be very few). When the GC is complete, the derived
// pointers are updated based on their base pointers new value and an offset.
-#ifdef COMPILER2
+#if defined(COMPILER2) || INCLUDE_JVMCI
class DerivedPointerTable : public AllStatic {
friend class VMStructs;
private:
static GrowableArray<DerivedPointerEntry*>* _list;
static bool _active; // do not record pointers for verify pass etc.
@@ -390,8 +461,8 @@
if (_active) {
DerivedPointerTable::set_active(true);
}
}
};
-#endif // COMPILER2
+#endif // COMPILER2 || INCLUDE_JVMCI
#endif // SHARE_VM_COMPILER_OOPMAP_HPP
< prev index next >