diff options
author | Hiroshi Yamauchi <yamauchi@google.com> | 2014-03-31 15:14:47 -0700 |
---|---|---|
committer | Hiroshi Yamauchi <yamauchi@google.com> | 2014-03-31 17:40:21 -0700 |
commit | 624468cd401cc1ac0dd70c746301e0788a597759 (patch) | |
tree | b21c389d43e25c3d95208c9d2f3f1bc81355a4e5 /runtime/mirror | |
parent | cfd5acf281b0c509f86b13d73c6a8dfa3ea9922c (diff) | |
download | art-624468cd401cc1ac0dd70c746301e0788a597759.tar.gz art-624468cd401cc1ac0dd70c746301e0788a597759.tar.bz2 art-624468cd401cc1ac0dd70c746301e0788a597759.zip |
Make the support code for read barriers a bit more general.
Add an option for Baker in addition to Brooks.
Bug: 12687968
Change-Id: I8a31db817ff6686c72951b6534f588228e270b11
Diffstat (limited to 'runtime/mirror')
-rw-r--r-- | runtime/mirror/object-inl.h | 32 | ||||
-rw-r--r-- | runtime/mirror/object.h | 14 |
2 files changed, 27 insertions, 19 deletions
diff --git a/runtime/mirror/object-inl.h b/runtime/mirror/object-inl.h index 527b8a65e9..b6c140d6d8 100644 --- a/runtime/mirror/object-inl.h +++ b/runtime/mirror/object-inl.h @@ -93,33 +93,41 @@ inline void Object::Wait(Thread* self, int64_t ms, int32_t ns) { Monitor::Wait(self, this, ms, ns, true, kTimedWaiting); } -inline Object* Object::GetBrooksPointer() { -#ifdef USE_BROOKS_POINTER - DCHECK(kUseBrooksPointer); - return GetFieldObject<Object, kVerifyNone>(OFFSET_OF_OBJECT_MEMBER(Object, x_brooks_ptr_), false); +inline Object* Object::GetReadBarrierPointer() { +#ifdef USE_BAKER_OR_BROOKS_READ_BARRIER + DCHECK(kUseBakerOrBrooksReadBarrier); + return GetFieldObject<Object, kVerifyNone>(OFFSET_OF_OBJECT_MEMBER(Object, x_rb_ptr_), false); #else LOG(FATAL) << "Unreachable"; return nullptr; #endif } -inline void Object::SetBrooksPointer(Object* brooks_pointer) { -#ifdef USE_BROOKS_POINTER - DCHECK(kUseBrooksPointer); +inline void Object::SetReadBarrierPointer(Object* rb_pointer) { +#ifdef USE_BAKER_OR_BROOKS_READ_BARRIER + DCHECK(kUseBakerOrBrooksReadBarrier); // We don't mark the card as this occurs as part of object allocation. Not all objects have // backing cards, such as large objects. SetFieldObjectWithoutWriteBarrier<false, false, kVerifyNone>( - OFFSET_OF_OBJECT_MEMBER(Object, x_brooks_ptr_), brooks_pointer, false); + OFFSET_OF_OBJECT_MEMBER(Object, x_rb_ptr_), rb_pointer, false); #else LOG(FATAL) << "Unreachable"; #endif } -inline void Object::AssertSelfBrooksPointer() const { -#ifdef USE_BROOKS_POINTER - DCHECK(kUseBrooksPointer); +inline void Object::AssertReadBarrierPointer() const { +#if defined(USE_BAKER_READ_BARRIER) + DCHECK(kUseBakerReadBarrier); Object* obj = const_cast<Object*>(this); - DCHECK_EQ(obj, obj->GetBrooksPointer()); + DCHECK(obj->GetReadBarrierPointer() == nullptr) + << "Bad Baker pointer: obj=" << reinterpret_cast<void*>(obj) + << " ptr=" << reinterpret_cast<void*>(obj->GetReadBarrierPointer()); +#elif defined(USE_BROOKS_READ_BARRIER) + DCHECK(kUseBrooksReadBarrier); + Object* obj = const_cast<Object*>(this); + DCHECK_EQ(obj, obj->GetReadBarrierPointer()) + << "Bad Brooks pointer: obj=" << reinterpret_cast<void*>(obj) + << " ptr=" << reinterpret_cast<void*>(obj->GetReadBarrierPointer()); #else LOG(FATAL) << "Unreachable"; #endif diff --git a/runtime/mirror/object.h b/runtime/mirror/object.h index 0a778289aa..1ac23ce6c3 100644 --- a/runtime/mirror/object.h +++ b/runtime/mirror/object.h @@ -78,9 +78,9 @@ class MANAGED LOCKABLE Object { template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags> void SetClass(Class* new_klass) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); - Object* GetBrooksPointer() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); - void SetBrooksPointer(Object* brooks_pointer) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); - void AssertSelfBrooksPointer() const SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); + Object* GetReadBarrierPointer() SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); + void SetReadBarrierPointer(Object* rb_pointer) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); + void AssertReadBarrierPointer() const SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); // The verifier treats all interfaces as java.lang.Object and relies on runtime checks in // invoke-interface to detect incompatible interface types. @@ -289,12 +289,12 @@ class MANAGED LOCKABLE Object { // Monitor and hash code information. uint32_t monitor_; -#ifdef USE_BROOKS_POINTER - // Note names use a 'x' prefix and the x_brooks_ptr_ is of type int +#ifdef USE_BAKER_OR_BROOKS_READ_BARRIER + // Note names use a 'x' prefix and the x_rb_ptr_ is of type int // instead of Object to go with the alphabetical/by-type field order // on the Java side. - uint32_t x_brooks_ptr_; // For the Brooks pointer. - uint32_t x_padding_; // For 8-byte alignment. TODO: get rid of this. + uint32_t x_rb_ptr_; // For the Baker or Brooks pointer. + uint32_t x_xpadding_; // For 8-byte alignment. TODO: get rid of this. #endif friend class art::ImageWriter; |