Mercurial > hg > graal-jvmci-8
diff src/share/vm/ci/ciObject.hpp @ 989:148e5441d916
6863023: need non-perm oops in code cache for JSR 292
Summary: Make a special root-list for those few nmethods which might contain non-perm oops.
Reviewed-by: twisti, kvn, never, jmasa, ysr
author | jrose |
---|---|
date | Tue, 15 Sep 2009 21:53:47 -0700 |
parents | a61af66fc99e |
children | 97125851f396 |
line wrap: on
line diff
--- a/src/share/vm/ci/ciObject.hpp Tue Sep 15 11:09:34 2009 -0700 +++ b/src/share/vm/ci/ciObject.hpp Tue Sep 15 21:53:47 2009 -0700 @@ -51,9 +51,10 @@ 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 @@ 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 @@ // 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 @@ // // 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; }