summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--compiler/utils/arm/assembler_arm.cc3
-rw-r--r--compiler/utils/mips/assembler_mips.cc3
-rw-r--r--compiler/utils/x86/assembler_x86.cc3
-rw-r--r--runtime/globals.h3
-rw-r--r--runtime/mirror/object_reference.h5
-rw-r--r--runtime/parsed_options.cc8
6 files changed, 22 insertions, 3 deletions
diff --git a/compiler/utils/arm/assembler_arm.cc b/compiler/utils/arm/assembler_arm.cc
index 828dffafa1..dbd078a81c 100644
--- a/compiler/utils/arm/assembler_arm.cc
+++ b/compiler/utils/arm/assembler_arm.cc
@@ -1550,6 +1550,9 @@ void ArmAssembler::LoadRef(ManagedRegister mdest, ManagedRegister base,
CHECK(dst.IsCoreRegister() && dst.IsCoreRegister()) << dst;
LoadFromOffset(kLoadWord, dst.AsCoreRegister(),
base.AsArm().AsCoreRegister(), offs.Int32Value());
+ if (kPoisonHeapReferences) {
+ rsb(dst.AsCoreRegister(), dst.AsCoreRegister(), ShifterOperand(0));
+ }
}
void ArmAssembler::LoadRef(ManagedRegister mdest, FrameOffset src) {
diff --git a/compiler/utils/mips/assembler_mips.cc b/compiler/utils/mips/assembler_mips.cc
index fdd2bab4da..ce21b84867 100644
--- a/compiler/utils/mips/assembler_mips.cc
+++ b/compiler/utils/mips/assembler_mips.cc
@@ -684,6 +684,9 @@ void MipsAssembler::LoadRef(ManagedRegister mdest, ManagedRegister base,
CHECK(dest.IsCoreRegister() && dest.IsCoreRegister());
LoadFromOffset(kLoadWord, dest.AsCoreRegister(),
base.AsMips().AsCoreRegister(), offs.Int32Value());
+ if (kPoisonHeapReferences) {
+ Subu(dest.AsCoreRegister(), ZERO, dest.AsCoreRegister());
+ }
}
void MipsAssembler::LoadRawPtr(ManagedRegister mdest, ManagedRegister base,
diff --git a/compiler/utils/x86/assembler_x86.cc b/compiler/utils/x86/assembler_x86.cc
index 136d2486df..16165029f4 100644
--- a/compiler/utils/x86/assembler_x86.cc
+++ b/compiler/utils/x86/assembler_x86.cc
@@ -1553,6 +1553,9 @@ void X86Assembler::LoadRef(ManagedRegister mdest, ManagedRegister base,
X86ManagedRegister dest = mdest.AsX86();
CHECK(dest.IsCpuRegister() && dest.IsCpuRegister());
movl(dest.AsCpuRegister(), Address(base.AsX86().AsCpuRegister(), offs));
+ if (kPoisonHeapReferences) {
+ negl(dest.AsCpuRegister());
+ }
}
void X86Assembler::LoadRawPtr(ManagedRegister mdest, ManagedRegister base,
diff --git a/runtime/globals.h b/runtime/globals.h
index 83e302892a..5bc4b9146d 100644
--- a/runtime/globals.h
+++ b/runtime/globals.h
@@ -99,6 +99,9 @@ static constexpr bool kUseBrooksPointer = true;
static constexpr bool kUseBrooksPointer = false;
#endif
+// If true, references within the heap are poisoned (negated).
+static constexpr bool kPoisonHeapReferences = false;
+
} // namespace art
#endif // ART_RUNTIME_GLOBALS_H_
diff --git a/runtime/mirror/object_reference.h b/runtime/mirror/object_reference.h
index b30890f99a..94869e55b6 100644
--- a/runtime/mirror/object_reference.h
+++ b/runtime/mirror/object_reference.h
@@ -17,6 +17,7 @@
#ifndef ART_RUNTIME_MIRROR_OBJECT_REFERENCE_H_
#define ART_RUNTIME_MIRROR_OBJECT_REFERENCE_H_
+#include "globals.h"
#include "locks.h"
namespace art {
@@ -74,7 +75,7 @@ class MANAGED ObjectReference {
// References between objects within the managed heap.
template<class MirrorType>
-class MANAGED HeapReference : public ObjectReference<false, MirrorType> {
+class MANAGED HeapReference : public ObjectReference<kPoisonHeapReferences, MirrorType> {
public:
static HeapReference<MirrorType> FromMirrorPtr(MirrorType* mirror_ptr)
SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
@@ -82,7 +83,7 @@ class MANAGED HeapReference : public ObjectReference<false, MirrorType> {
}
private:
HeapReference<MirrorType>(MirrorType* mirror_ptr) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_)
- : ObjectReference<false, MirrorType>(mirror_ptr) {}
+ : ObjectReference<kPoisonHeapReferences, MirrorType>(mirror_ptr) {}
};
} // namespace mirror
diff --git a/runtime/parsed_options.cc b/runtime/parsed_options.cc
index 04f1a05a3d..37db4624be 100644
--- a/runtime/parsed_options.cc
+++ b/runtime/parsed_options.cc
@@ -147,7 +147,13 @@ bool ParsedOptions::Parse(const Runtime::Options& options, bool ignore_unrecogni
compiler_callbacks_ = nullptr;
is_zygote_ = false;
- interpreter_only_ = false;
+ if (kPoisonHeapReferences) {
+ // kPoisonHeapReferences currently works only with the interpreter only.
+ // TODO: make it work with the compiler.
+ interpreter_only_ = true;
+ } else {
+ interpreter_only_ = false;
+ }
is_explicit_gc_disabled_ = false;
long_pause_log_threshold_ = gc::Heap::kDefaultLongPauseLogThreshold;