mirror of
https://github.com/openjdk/jdk.git
synced 2025-09-21 03:24:38 +02:00
6863023: need non-perm oops in code cache for JSR 292
Make a special root-list for those few nmethods which might contain non-perm oops. Reviewed-by: twisti, kvn, never, jmasa, ysr
This commit is contained in:
parent
1cf5b7ae11
commit
e261aecad8
74 changed files with 979 additions and 279 deletions
|
@ -51,9 +51,10 @@ private:
|
|||
ciKlass* _klass;
|
||||
uint _ident;
|
||||
|
||||
enum { FLAG_BITS = 1};
|
||||
enum { FLAG_BITS = 2 };
|
||||
enum {
|
||||
PERM_FLAG = 1
|
||||
PERM_FLAG = 1,
|
||||
SCAVENGABLE_FLAG = 2
|
||||
};
|
||||
protected:
|
||||
ciObject();
|
||||
|
@ -68,8 +69,15 @@ protected:
|
|||
return JNIHandles::resolve_non_null(_handle);
|
||||
}
|
||||
|
||||
void set_perm() {
|
||||
_ident |= PERM_FLAG;
|
||||
void init_flags_from(oop x) {
|
||||
int flags = 0;
|
||||
if (x != NULL) {
|
||||
if (x->is_perm())
|
||||
flags |= PERM_FLAG;
|
||||
if (x->is_scavengable())
|
||||
flags |= SCAVENGABLE_FLAG;
|
||||
}
|
||||
_ident |= flags;
|
||||
}
|
||||
|
||||
// Virtual behavior of the print() method.
|
||||
|
@ -91,17 +99,27 @@ public:
|
|||
// A hash value for the convenience of compilers.
|
||||
int hash();
|
||||
|
||||
// Tells if this oop has an encoding. (I.e., is it null or perm?)
|
||||
// Tells if this oop has an encoding as a constant.
|
||||
// True if is_scavengable is false.
|
||||
// Also true if ScavengeRootsInCode is non-zero.
|
||||
// If it does not have an encoding, the compiler is responsible for
|
||||
// making other arrangements for dealing with the oop.
|
||||
// See ciEnv::make_perm_array
|
||||
bool has_encoding();
|
||||
// See ciEnv::make_array
|
||||
bool can_be_constant();
|
||||
|
||||
// Tells if this oop should be made a constant.
|
||||
// True if is_scavengable is false or ScavengeRootsInCode > 1.
|
||||
bool should_be_constant();
|
||||
|
||||
// Is this object guaranteed to be in the permanent part of the heap?
|
||||
// If so, CollectedHeap::can_elide_permanent_oop_store_barriers is relevant.
|
||||
// If the answer is false, no guarantees are made.
|
||||
bool is_perm() { return (_ident & PERM_FLAG) != 0; }
|
||||
|
||||
// Might this object possibly move during a scavenge operation?
|
||||
// If the answer is true and ScavengeRootsInCode==0, the oop cannot be embedded in code.
|
||||
bool is_scavengable() { return (_ident & SCAVENGABLE_FLAG) != 0; }
|
||||
|
||||
// The address which the compiler should embed into the
|
||||
// generated code to represent this oop. This address
|
||||
// is not the true address of the oop -- it will get patched
|
||||
|
@ -109,7 +127,7 @@ public:
|
|||
//
|
||||
// Usage note: no address arithmetic allowed. Oop must
|
||||
// be registered with the oopRecorder.
|
||||
jobject encoding();
|
||||
jobject constant_encoding();
|
||||
|
||||
// What kind of ciObject is this?
|
||||
virtual bool is_null_object() const { return false; }
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue