[vm, gc] Avoid duplicate pointer visiting functions when compressed pointers are disabled.

This reduces code size ~10k, but more importantly it is easier to read profiling results without duplicate entries.

TEST=ci
Change-Id: I14c4a0d78d856242c5493df6de629ce048753c38
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/294440
Commit-Queue: Ryan Macnak <rmacnak@google.com>
Reviewed-by: Liam Appelbe <liama@google.com>
diff --git a/runtime/lib/isolate.cc b/runtime/lib/isolate.cc
index 108e40fb..d5a6b57 100644
--- a/runtime/lib/isolate.cc
+++ b/runtime/lib/isolate.cc
@@ -159,19 +159,21 @@
     }
 
    private:
-    void VisitPointers(ObjectPtr* from, ObjectPtr* to) {
+    void VisitPointers(ObjectPtr* from, ObjectPtr* to) override {
       for (ObjectPtr* ptr = from; ptr <= to; ptr++) {
         VisitObject(*ptr);
       }
     }
 
+#if defined(DART_COMPRESSED_POINTERS)
     void VisitCompressedPointers(uword heap_base,
                                  CompressedObjectPtr* from,
-                                 CompressedObjectPtr* to) {
+                                 CompressedObjectPtr* to) override {
       for (CompressedObjectPtr* ptr = from; ptr <= to; ptr++) {
         VisitObject(ptr->Decompress(heap_base));
       }
     }
+#endif
 
     WeakTable* visited_;
     MallocGrowableArray<ObjectPtr>* const working_set_;
diff --git a/runtime/vm/class_finalizer.cc b/runtime/vm/class_finalizer.cc
index f9af930..600ff15 100644
--- a/runtime/vm/class_finalizer.cc
+++ b/runtime/vm/class_finalizer.cc
@@ -1499,7 +1499,7 @@
     return old_to_new_cids_[cid];
   }
 
-  void VisitObject(ObjectPtr obj) {
+  void VisitObject(ObjectPtr obj) override {
     if (obj->IsClass()) {
       ClassPtr cls = Class::RawCast(obj);
       const classid_t old_cid = cls->untag()->id_;
@@ -1621,7 +1621,7 @@
         record_type_(RecordType::Handle(zone)),
         type_args_(TypeArguments::Handle(zone)) {}
 
-  void VisitObject(ObjectPtr obj) {
+  void VisitObject(ObjectPtr obj) override {
     if (obj->IsTypeParameter()) {
       type_param_ ^= obj;
       type_param_.SetHash(0);
diff --git a/runtime/vm/compiler/aot/precompiler.cc b/runtime/vm/compiler/aot/precompiler.cc
index c791baf..ee68e94 100644
--- a/runtime/vm/compiler/aot/precompiler.cc
+++ b/runtime/vm/compiler/aot/precompiler.cc
@@ -1297,7 +1297,7 @@
           precompiler_(precompiler),
           subinstance_(Object::Handle()) {}
 
-    void VisitPointers(ObjectPtr* first, ObjectPtr* last) {
+    void VisitPointers(ObjectPtr* first, ObjectPtr* last) override {
       for (ObjectPtr* current = first; current <= last; current++) {
         subinstance_ = *current;
         if (subinstance_.IsInstance()) {
@@ -1307,9 +1307,10 @@
       subinstance_ = Object::null();
     }
 
+#if defined(DART_COMPRESSED_POINTERS)
     void VisitCompressedPointers(uword heap_base,
                                  CompressedObjectPtr* first,
-                                 CompressedObjectPtr* last) {
+                                 CompressedObjectPtr* last) override {
       for (CompressedObjectPtr* current = first; current <= last; current++) {
         subinstance_ = current->Decompress(heap_base);
         if (subinstance_.IsInstance()) {
@@ -1318,6 +1319,7 @@
       }
       subinstance_ = Object::null();
     }
+#endif
 
    private:
     Precompiler* precompiler_;
@@ -2399,7 +2401,7 @@
                               GrowableHandlePtrArray<const AbstractType>* types)
           : type_(AbstractType::Handle(zone)), types_(types) {}
 
-      void VisitObject(ObjectPtr obj) {
+      void VisitObject(ObjectPtr obj) override {
         if (obj->GetClassId() == kTypeCid ||
             obj->GetClassId() == kFunctionTypeCid ||
             obj->GetClassId() == kRecordTypeCid ||
@@ -3313,7 +3315,7 @@
                               GrowableHandlePtrArray<const Script>* scripts)
         : script_(Script::Handle(zone)), scripts_(scripts) {}
 
-    void VisitObject(ObjectPtr obj) {
+    void VisitObject(ObjectPtr obj) override {
       if (obj->GetClassId() == kScriptCid) {
         script_ ^= obj;
         scripts_->Add(Script::Cast(script_));
diff --git a/runtime/vm/dart_api_impl.cc b/runtime/vm/dart_api_impl.cc
index c3bea3c..5e3ffdf 100644
--- a/runtime/vm/dart_api_impl.cc
+++ b/runtime/vm/dart_api_impl.cc
@@ -119,7 +119,7 @@
         funcHandle_(Function::Handle(thread->zone())),
         typeHandle_(AbstractType::Handle(thread->zone())) {}
 
-  void VisitObject(ObjectPtr obj) {
+  void VisitObject(ObjectPtr obj) override {
     if (obj->IsFunction()) {
       funcHandle_ ^= obj;
       classHandle_ ^= funcHandle_.Owner();
diff --git a/runtime/vm/gdb_helpers.cc b/runtime/vm/gdb_helpers.cc
index 0dfa825..1cb17b5 100644
--- a/runtime/vm/gdb_helpers.cc
+++ b/runtime/vm/gdb_helpers.cc
@@ -58,21 +58,23 @@
   PrintObjectPointersVisitor()
       : ObjectPointerVisitor(IsolateGroup::Current()) {}
 
-  void VisitPointers(ObjectPtr* first, ObjectPtr* last) {
+  void VisitPointers(ObjectPtr* first, ObjectPtr* last) override {
     for (ObjectPtr* p = first; p <= last; p++) {
       Object& obj = Object::Handle(*p);
       OS::PrintErr("%p: %s\n", p, obj.ToCString());
     }
   }
 
+#if defined(DART_COMPRESSED_POINTERS)
   void VisitCompressedPointers(uword heap_base,
                                CompressedObjectPtr* first,
-                               CompressedObjectPtr* last) {
+                               CompressedObjectPtr* last) override {
     for (CompressedObjectPtr* p = first; p <= last; p++) {
       Object& obj = Object::Handle(p->Decompress(heap_base));
       OS::PrintErr("%p: %s\n", p, obj.ToCString());
     }
   }
+#endif
 };
 
 DART_EXPORT
diff --git a/runtime/vm/heap/become.cc b/runtime/vm/heap/become.cc
index e7d112b..543dbeb 100644
--- a/runtime/vm/heap/become.cc
+++ b/runtime/vm/heap/become.cc
@@ -83,7 +83,7 @@
         thread_(thread),
         visiting_object_(nullptr) {}
 
-  void VisitPointers(ObjectPtr* first, ObjectPtr* last) {
+  void VisitPointers(ObjectPtr* first, ObjectPtr* last) override {
     for (ObjectPtr* p = first; p <= last; p++) {
       ObjectPtr old_target = *p;
       ObjectPtr new_target;
@@ -107,9 +107,10 @@
     }
   }
 
+#if defined(DART_COMPRESSED_POINTERS)
   void VisitCompressedPointers(uword heap_base,
                                CompressedObjectPtr* first,
-                               CompressedObjectPtr* last) {
+                               CompressedObjectPtr* last) override {
     for (CompressedObjectPtr* p = first; p <= last; p++) {
       ObjectPtr old_target = p->Decompress(heap_base);
       ObjectPtr new_target;
@@ -134,6 +135,7 @@
       }
     }
   }
+#endif
 
   void VisitingObject(ObjectPtr obj) {
     visiting_object_ = obj;
@@ -159,7 +161,7 @@
   explicit ForwardHeapPointersVisitor(ForwardPointersVisitor* pointer_visitor)
       : pointer_visitor_(pointer_visitor) {}
 
-  virtual void VisitObject(ObjectPtr obj) {
+  void VisitObject(ObjectPtr obj) override {
     pointer_visitor_->VisitingObject(obj);
     obj->untag()->VisitPointers(pointer_visitor_);
   }
@@ -175,7 +177,7 @@
   explicit ForwardHeapPointersHandleVisitor(Thread* thread)
       : HandleVisitor(thread) {}
 
-  virtual void VisitHandle(uword addr) {
+  void VisitHandle(uword addr) override {
     FinalizablePersistentHandle* handle =
         reinterpret_cast<FinalizablePersistentHandle*>(addr);
     if (IsForwardingObject(handle->ptr())) {
diff --git a/runtime/vm/heap/compactor.cc b/runtime/vm/heap/compactor.cc
index 5f59ad2..e863ade4 100644
--- a/runtime/vm/heap/compactor.cc
+++ b/runtime/vm/heap/compactor.cc
@@ -744,6 +744,7 @@
   }
 }
 
+#if defined(DART_COMPRESSED_POINTERS)
 void GCCompactor::VisitCompressedPointers(uword heap_base,
                                           CompressedObjectPtr* first,
                                           CompressedObjectPtr* last) {
@@ -751,6 +752,7 @@
     ForwardCompressedPointer(heap_base, ptr);
   }
 }
+#endif
 
 bool GCCompactor::CanVisitSuspendStatePointers(SuspendStatePtr suspend_state) {
   if ((suspend_state->untag()->pc() != 0) && !can_visit_stack_frames_) {
diff --git a/runtime/vm/heap/compactor.h b/runtime/vm/heap/compactor.h
index 7b65ccd..518c12d 100644
--- a/runtime/vm/heap/compactor.h
+++ b/runtime/vm/heap/compactor.h
@@ -43,9 +43,11 @@
                                   CompressedObjectPtr* first,
                                   CompressedObjectPtr* last) override;
   void VisitPointers(ObjectPtr* first, ObjectPtr* last) override;
+#if defined(DART_COMPRESSED_POINTERS)
   void VisitCompressedPointers(uword heap_base,
                                CompressedObjectPtr* first,
                                CompressedObjectPtr* last) override;
+#endif
   bool CanVisitSuspendStatePointers(SuspendStatePtr suspend_state) override;
   void VisitHandle(uword addr) override;
 
diff --git a/runtime/vm/heap/marker.cc b/runtime/vm/heap/marker.cc
index 9bbba90..5cb2c41 100644
--- a/runtime/vm/heap/marker.cc
+++ b/runtime/vm/heap/marker.cc
@@ -179,20 +179,22 @@
     return *ptr;
   }
 
-  void VisitPointers(ObjectPtr* first, ObjectPtr* last) {
+  void VisitPointers(ObjectPtr* first, ObjectPtr* last) override {
     for (ObjectPtr* current = first; current <= last; current++) {
       MarkObject(LoadPointerIgnoreRace(current));
     }
   }
 
+#if defined(DART_COMPRESSED_POINTERS)
   void VisitCompressedPointers(uword heap_base,
                                CompressedObjectPtr* first,
-                               CompressedObjectPtr* last) {
+                               CompressedObjectPtr* last) override {
     for (CompressedObjectPtr* current = first; current <= last; current++) {
       MarkObject(
           LoadCompressedPointerIgnoreRace(current).Decompress(heap_base));
     }
   }
+#endif
 
   intptr_t ProcessWeakProperty(WeakPropertyPtr raw_weak) {
     // The fate of the weak property is determined by its key.
@@ -473,7 +475,7 @@
  public:
   explicit MarkingWeakVisitor(Thread* thread) : HandleVisitor(thread) {}
 
-  void VisitHandle(uword addr) {
+  void VisitHandle(uword addr) override {
     FinalizablePersistentHandle* handle =
         reinterpret_cast<FinalizablePersistentHandle*>(addr);
     ObjectPtr raw_obj = handle->ptr();
@@ -659,7 +661,7 @@
   explicit ObjectIdRingClearPointerVisitor(IsolateGroup* isolate_group)
       : ObjectPointerVisitor(isolate_group) {}
 
-  void VisitPointers(ObjectPtr* first, ObjectPtr* last) {
+  void VisitPointers(ObjectPtr* first, ObjectPtr* last) override {
     for (ObjectPtr* current = first; current <= last; current++) {
       ObjectPtr raw_obj = *current;
       ASSERT(raw_obj->IsHeapObject());
@@ -670,11 +672,13 @@
     }
   }
 
+#if defined(DART_COMPRESSED_POINTERS)
   void VisitCompressedPointers(uword heap_base,
                                CompressedObjectPtr* first,
-                               CompressedObjectPtr* last) {
+                               CompressedObjectPtr* last) override {
     UNREACHABLE();  // ObjectIdRing is not compressed.
   }
+#endif
 };
 
 void GCMarker::ProcessObjectIdTable(Thread* thread) {
@@ -1022,13 +1026,13 @@
   VerifyAfterMarkingVisitor()
       : ObjectVisitor(), ObjectPointerVisitor(IsolateGroup::Current()) {}
 
-  void VisitObject(ObjectPtr obj) {
+  void VisitObject(ObjectPtr obj) override {
     if (obj->IsNewObject() || obj->untag()->IsMarked()) {
       obj->untag()->VisitPointers(this);
     }
   }
 
-  void VisitPointers(ObjectPtr* from, ObjectPtr* to) {
+  void VisitPointers(ObjectPtr* from, ObjectPtr* to) override {
     for (ObjectPtr* ptr = from; ptr <= to; ptr++) {
       ObjectPtr obj = *ptr;
       if (obj->IsHeapObject() && obj->IsOldObject() &&
@@ -1039,9 +1043,10 @@
     }
   }
 
+#if defined(DART_COMPRESSED_POINTERS)
   void VisitCompressedPointers(uword heap_base,
                                CompressedObjectPtr* from,
-                               CompressedObjectPtr* to) {
+                               CompressedObjectPtr* to) override {
     for (CompressedObjectPtr* ptr = from; ptr <= to; ptr++) {
       ObjectPtr obj = ptr->Decompress(heap_base);
       if (obj->IsHeapObject() && obj->IsOldObject() &&
@@ -1051,6 +1056,7 @@
       }
     }
   }
+#endif
 };
 
 void GCMarker::MarkObjects(PageSpace* page_space) {
diff --git a/runtime/vm/heap/pages.cc b/runtime/vm/heap/pages.cc
index fb19322..e055dc1 100644
--- a/runtime/vm/heap/pages.cc
+++ b/runtime/vm/heap/pages.cc
@@ -744,7 +744,7 @@
 class HeapMapAsJSONVisitor : public ObjectVisitor {
  public:
   explicit HeapMapAsJSONVisitor(JSONArray* array) : array_(array) {}
-  virtual void VisitObject(ObjectPtr obj) {
+  void VisitObject(ObjectPtr obj) override {
     array_->AddValue(obj->untag()->HeapSize() / kObjectAlignment);
     array_->AddValue(obj->GetClassId());
   }
diff --git a/runtime/vm/heap/scavenger.cc b/runtime/vm/heap/scavenger.cc
index 3dec815..526fb5a 100644
--- a/runtime/vm/heap/scavenger.cc
+++ b/runtime/vm/heap/scavenger.cc
@@ -149,9 +149,9 @@
   constexpr static const char* const kName = "Scavenger";
 #endif
 
-  virtual void VisitTypedDataViewPointers(TypedDataViewPtr view,
-                                          CompressedObjectPtr* first,
-                                          CompressedObjectPtr* last) {
+  void VisitTypedDataViewPointers(TypedDataViewPtr view,
+                                  CompressedObjectPtr* first,
+                                  CompressedObjectPtr* last) override {
     // TypedDataViews require extra processing to update their
     // PointerBase::data_ pointer. If the underlying typed data is external, no
     // update is needed. If the underlying typed data is internal, the pointer
@@ -218,7 +218,7 @@
     view->untag()->RecomputeDataFieldForInternalTypedData();
   }
 
-  void VisitPointers(ObjectPtr* first, ObjectPtr* last) {
+  void VisitPointers(ObjectPtr* first, ObjectPtr* last) override {
     ASSERT(Utils::IsAligned(first, sizeof(*first)));
     ASSERT(Utils::IsAligned(last, sizeof(*last)));
     for (ObjectPtr* current = first; current <= last; current++) {
@@ -226,15 +226,17 @@
     }
   }
 
+#if defined(DART_COMPRESSED_POINTERS)
   void VisitCompressedPointers(uword heap_base,
                                CompressedObjectPtr* first,
-                               CompressedObjectPtr* last) {
+                               CompressedObjectPtr* last) override {
     ASSERT(Utils::IsAligned(first, sizeof(*first)));
     ASSERT(Utils::IsAligned(last, sizeof(*last)));
     for (CompressedObjectPtr* current = first; current <= last; current++) {
       ScavengeCompressedPointer(heap_base, current);
     }
   }
+#endif
 
   void VisitingOldObject(ObjectPtr obj) {
     ASSERT((obj == nullptr) || obj->IsOldObject());
@@ -584,7 +586,7 @@
  public:
   explicit ScavengerWeakVisitor(Thread* thread) : HandleVisitor(thread) {}
 
-  void VisitHandle(uword addr) {
+  void VisitHandle(uword addr) override {
     FinalizablePersistentHandle* handle =
         reinterpret_cast<FinalizablePersistentHandle*>(addr);
     ObjectPtr* p = handle->ptr_addr();
@@ -820,7 +822,7 @@
       : ObjectPointerVisitor(IsolateGroup::Current()),
         in_store_buffer_(in_store_buffer) {}
 
-  void VisitPointers(ObjectPtr* from, ObjectPtr* to) {
+  void VisitPointers(ObjectPtr* from, ObjectPtr* to) override {
     for (ObjectPtr* ptr = from; ptr <= to; ptr++) {
       ObjectPtr raw_obj = *ptr;
       RELEASE_ASSERT(raw_obj->untag()->IsRemembered());
@@ -836,11 +838,13 @@
     }
   }
 
+#if defined(DART_COMPRESSED_POINTERS)
   void VisitCompressedPointers(uword heap_base,
                                CompressedObjectPtr* from,
-                               CompressedObjectPtr* to) {
+                               CompressedObjectPtr* to) override {
     UNREACHABLE();  // Store buffer blocks are not compressed.
   }
+#endif
 
  private:
   ObjectSet* const in_store_buffer_;
@@ -855,7 +859,7 @@
         in_store_buffer_(in_store_buffer),
         to_(to) {}
 
-  void VisitObject(ObjectPtr raw_obj) {
+  void VisitObject(ObjectPtr raw_obj) override {
     if (raw_obj->IsPseudoObject()) return;
     RELEASE_ASSERT(raw_obj->IsOldObject());
 
@@ -871,7 +875,7 @@
     raw_obj->untag()->VisitPointers(this);
   }
 
-  void VisitPointers(ObjectPtr* from, ObjectPtr* to) {
+  void VisitPointers(ObjectPtr* from, ObjectPtr* to) override {
     for (ObjectPtr* ptr = from; ptr <= to; ptr++) {
       ObjectPtr raw_obj = *ptr;
       if (raw_obj->IsHeapObject() && raw_obj->IsNewObject()) {
@@ -900,9 +904,10 @@
     }
   }
 
+#if defined(DART_COMPRESSED_POINTERS)
   void VisitCompressedPointers(uword heap_base,
                                CompressedObjectPtr* from,
-                               CompressedObjectPtr* to) {
+                               CompressedObjectPtr* to) override {
     for (CompressedObjectPtr* ptr = from; ptr <= to; ptr++) {
       ObjectPtr raw_obj = ptr->Decompress(heap_base);
       if (raw_obj->IsHeapObject() && raw_obj->IsNewObject()) {
@@ -930,6 +935,7 @@
       }
     }
   }
+#endif
 
  private:
   const ObjectSet* const in_store_buffer_;
@@ -1868,7 +1874,7 @@
   TIMELINE_FUNCTION_GC_DURATION(thread, "ReverseScavenge");
 
   class ReverseFromForwardingVisitor : public ObjectVisitor {
-    void VisitObject(ObjectPtr from_obj) {
+    void VisitObject(ObjectPtr from_obj) override {
       uword from_header = ReadHeaderRelaxed(from_obj);
       if (IsForwarding(from_header)) {
         ObjectPtr to_obj = ForwardedObj(from_header);
diff --git a/runtime/vm/heap/scavenger_test.cc b/runtime/vm/heap/scavenger_test.cc
index 61e5fbc..53b3ae3 100644
--- a/runtime/vm/heap/scavenger_test.cc
+++ b/runtime/vm/heap/scavenger_test.cc
@@ -13,19 +13,23 @@
 class FailingObjectVisitor : public ObjectVisitor {
  public:
   FailingObjectVisitor() {}
-  virtual void VisitObject(ObjectPtr obj) { EXPECT(false); }
+  void VisitObject(ObjectPtr obj) override { EXPECT(false); }
 };
 
 // Expects to visit no objects (since the space should be empty).
 class FailingObjectPointerVisitor : public ObjectPointerVisitor {
  public:
   FailingObjectPointerVisitor() : ObjectPointerVisitor(nullptr) {}
-  void VisitPointers(ObjectPtr* first, ObjectPtr* last) { EXPECT(false); }
-  void VisitCompressedPointers(uword heap_base,
-                               CompressedObjectPtr* first,
-                               CompressedObjectPtr* last) {
+  void VisitPointers(ObjectPtr* first, ObjectPtr* last) override {
     EXPECT(false);
   }
+#if defined(DART_COMPRESSED_POINTERS)
+  void VisitCompressedPointers(uword heap_base,
+                               CompressedObjectPtr* first,
+                               CompressedObjectPtr* last) override {
+    EXPECT(false);
+  }
+#endif
 };
 
 // Expects to visit no objects (since the space should be empty).
diff --git a/runtime/vm/heap/verifier.cc b/runtime/vm/heap/verifier.cc
index 516a663..aacc1cf 100644
--- a/runtime/vm/heap/verifier.cc
+++ b/runtime/vm/heap/verifier.cc
@@ -59,6 +59,7 @@
   }
 }
 
+#if defined(DART_COMPRESSED_POINTERS)
 void VerifyPointersVisitor::VisitCompressedPointers(uword heap_base,
                                                     CompressedObjectPtr* from,
                                                     CompressedObjectPtr* to) {
@@ -76,6 +77,7 @@
     }
   }
 }
+#endif
 
 void VerifyWeakPointersVisitor::VisitHandle(uword addr) {
   FinalizablePersistentHandle* handle =
diff --git a/runtime/vm/heap/verifier.h b/runtime/vm/heap/verifier.h
index 0b490cd..63a853d 100644
--- a/runtime/vm/heap/verifier.h
+++ b/runtime/vm/heap/verifier.h
@@ -29,7 +29,7 @@
         allocated_set_(allocated_set),
         mark_expectation_(mark_expectation) {}
 
-  virtual void VisitObject(ObjectPtr obj);
+  void VisitObject(ObjectPtr obj) override;
 
  private:
   IsolateGroup* isolate_group_;
@@ -47,10 +47,12 @@
                                  ObjectSet* allocated_set)
       : ObjectPointerVisitor(isolate_group), allocated_set_(allocated_set) {}
 
-  void VisitPointers(ObjectPtr* first, ObjectPtr* last);
+  void VisitPointers(ObjectPtr* first, ObjectPtr* last) override;
+#if defined(DART_COMPRESSED_POINTERS)
   void VisitCompressedPointers(uword heap_base,
                                CompressedObjectPtr* first,
-                               CompressedObjectPtr* last);
+                               CompressedObjectPtr* last) override;
+#endif
 
   static void VerifyPointers(MarkExpectation mark_expectation = kForbidMarked);
 
@@ -65,7 +67,7 @@
   explicit VerifyWeakPointersVisitor(VerifyPointersVisitor* visitor)
       : HandleVisitor(Thread::Current()), visitor_(visitor) {}
 
-  virtual void VisitHandle(uword addr);
+  void VisitHandle(uword addr) override;
 
  private:
   ObjectPointerVisitor* visitor_;
@@ -79,7 +81,7 @@
 class VerifyCanonicalVisitor : public ObjectVisitor {
  public:
   explicit VerifyCanonicalVisitor(Thread* thread);
-  virtual void VisitObject(ObjectPtr obj);
+  void VisitObject(ObjectPtr obj) override;
 
  private:
   Thread* thread_;
diff --git a/runtime/vm/isolate.cc b/runtime/vm/isolate.cc
index 2818dc6..dfd616d 100644
--- a/runtime/vm/isolate.cc
+++ b/runtime/vm/isolate.cc
@@ -262,7 +262,7 @@
   explicit FinalizeWeakPersistentHandlesVisitor(IsolateGroup* isolate_group)
       : HandleVisitor(Thread::Current()), isolate_group_(isolate_group) {}
 
-  void VisitHandle(uword addr) {
+  void VisitHandle(uword addr) override {
     auto handle = reinterpret_cast<FinalizablePersistentHandle*>(addr);
     handle->UpdateUnreachable(isolate_group_);
   }
diff --git a/runtime/vm/isolate_reload.cc b/runtime/vm/isolate_reload.cc
index af15f18..3cfb5cb 100644
--- a/runtime/vm/isolate_reload.cc
+++ b/runtime/vm/isolate_reload.cc
@@ -73,7 +73,7 @@
   explicit ObjectLocator(IsolateGroupReloadContext* context)
       : context_(context), count_(0) {}
 
-  void VisitObject(ObjectPtr obj) {
+  void VisitObject(ObjectPtr obj) override {
     InstanceMorpher* morpher =
         context_->instance_morpher_by_cid_.LookupValue(obj->GetClassId());
     if (morpher != nullptr) {
@@ -2045,7 +2045,7 @@
         instances_(instances) {}
   virtual ~InvalidationCollector() {}
 
-  void VisitObject(ObjectPtr obj) {
+  void VisitObject(ObjectPtr obj) override {
     intptr_t cid = obj->GetClassId();
     if (cid == kFunctionCid) {
       const Function& func =
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index 111c6db..10464a7 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -2861,7 +2861,7 @@
     ASSERT(old_obj_->IsOldObject());
   }
 
-  void VisitPointers(ObjectPtr* from, ObjectPtr* to) {
+  void VisitPointers(ObjectPtr* from, ObjectPtr* to) override {
     if (old_obj_->IsArray()) {
       for (ObjectPtr* slot = from; slot <= to; ++slot) {
         ObjectPtr value = *slot;
@@ -2879,9 +2879,10 @@
     }
   }
 
+#if defined(DART_COMPRESSED_POINTERS)
   void VisitCompressedPointers(uword heap_base,
                                CompressedObjectPtr* from,
-                               CompressedObjectPtr* to) {
+                               CompressedObjectPtr* to) override {
     if (old_obj_->IsArray()) {
       for (CompressedObjectPtr* slot = from; slot <= to; ++slot) {
         ObjectPtr value = slot->Decompress(heap_base);
@@ -2898,6 +2899,7 @@
       }
     }
   }
+#endif
 
  private:
   Thread* thread_;
@@ -19963,19 +19965,21 @@
 
   bool has_pointers() const { return has_pointers_; }
 
-  void VisitPointers(ObjectPtr* first, ObjectPtr* last) {
+  void VisitPointers(ObjectPtr* first, ObjectPtr* last) override {
     if (last >= first) {
       has_pointers_ = true;
     }
   }
 
+#if defined(DART_COMPRESSED_POINTERS)
   void VisitCompressedPointers(uword heap_base,
                                CompressedObjectPtr* first,
-                               CompressedObjectPtr* last) {
+                               CompressedObjectPtr* last) override {
     if (last >= first) {
       has_pointers_ = true;
     }
   }
+#endif
 
  private:
   bool has_pointers_;
diff --git a/runtime/vm/object_graph.cc b/runtime/vm/object_graph.cc
index 026c2a8..dc764b9 100644
--- a/runtime/vm/object_graph.cc
+++ b/runtime/vm/object_graph.cc
@@ -181,24 +181,26 @@
     object_ids_ = nullptr;
   }
 
-  virtual bool trace_values_through_fields() const { return true; }
+  bool trace_values_through_fields() const override { return true; }
 
   // Marks and pushes. Used to initialize this stack with roots.
   // We can use ObjectIdTable normally used by serializers because it
   // won't be in use while handling a service request (ObjectGraph's only use).
-  void VisitPointers(ObjectPtr* first, ObjectPtr* last) {
+  void VisitPointers(ObjectPtr* first, ObjectPtr* last) override {
     for (ObjectPtr* current = first; current <= last; ++current) {
       Visit(current, *current);
     }
   }
 
+#if defined(DART_COMPRESSED_POINTERS)
   void VisitCompressedPointers(uword heap_base,
                                CompressedObjectPtr* first,
-                               CompressedObjectPtr* last) {
+                               CompressedObjectPtr* last) override {
     for (CompressedObjectPtr* current = first; current <= last; ++current) {
       Visit(current, current->Decompress(heap_base));
     }
   }
+#endif
 
   void Visit(void* ptr, ObjectPtr obj) {
     if (obj->IsHeapObject() && !obj->untag()->InVMIsolateHeap() &&
@@ -244,7 +246,7 @@
     }
   }
 
-  virtual bool visit_weak_persistent_handles() const {
+  bool visit_weak_persistent_handles() const override {
     return visit_weak_persistent_handles_;
   }
 
@@ -399,7 +401,7 @@
   InstanceAccumulator(ObjectGraph::Stack* stack, intptr_t class_id)
       : stack_(stack), class_id_(class_id) {}
 
-  void VisitObject(ObjectPtr obj) {
+  void VisitObject(ObjectPtr obj) override {
     if (obj->GetClassId() == class_id_) {
       ObjectPtr rawobj = obj;
       stack_->VisitPointer(&rawobj);
@@ -617,16 +619,16 @@
     ASSERT(Thread::Current()->no_safepoint_scope_depth() != 0);
   }
 
-  virtual bool trace_values_through_fields() const { return true; }
+  bool trace_values_through_fields() const override { return true; }
 
   intptr_t length() const { return length_; }
 
-  virtual void VisitObject(ObjectPtr raw_obj) {
+  void VisitObject(ObjectPtr raw_obj) override {
     source_ = raw_obj;
     raw_obj->untag()->VisitPointers(this);
   }
 
-  void VisitPointers(ObjectPtr* first, ObjectPtr* last) {
+  void VisitPointers(ObjectPtr* first, ObjectPtr* last) override {
     for (ObjectPtr* current_ptr = first; current_ptr <= last; current_ptr++) {
       ObjectPtr current_obj = *current_ptr;
       if (current_obj == target_) {
@@ -656,9 +658,10 @@
     }
   }
 
+#if defined(DART_COMPRESSED_POINTERS)
   void VisitCompressedPointers(uword heap_base,
                                CompressedObjectPtr* first,
-                               CompressedObjectPtr* last) {
+                               CompressedObjectPtr* last) override {
     for (CompressedObjectPtr* current_ptr = first; current_ptr <= last;
          current_ptr++) {
       ObjectPtr current_obj = current_ptr->Decompress(heap_base);
@@ -688,6 +691,7 @@
       }
     }
   }
+#endif
 
  private:
   ObjectPtr source_;
@@ -939,7 +943,7 @@
         writer_(writer),
         object_slots_(object_slots) {}
 
-  void VisitObject(ObjectPtr obj) {
+  void VisitObject(ObjectPtr obj) override {
     if (obj->IsPseudoObject()) return;
 
     writer_->AssignObjectId(obj);
@@ -960,7 +964,7 @@
     }
   }
 
-  void VisitPointers(ObjectPtr* from, ObjectPtr* to) {
+  void VisitPointers(ObjectPtr* from, ObjectPtr* to) override {
     for (ObjectPtr* ptr = from; ptr <= to; ptr++) {
       ObjectPtr obj = *ptr;
       if (!obj->IsHeapObject()) {
@@ -970,9 +974,10 @@
     }
   }
 
+#if defined(DART_COMPRESSED_POINTERS)
   void VisitCompressedPointers(uword heap_base,
                                CompressedObjectPtr* from,
-                               CompressedObjectPtr* to) {
+                               CompressedObjectPtr* to) override {
     for (CompressedObjectPtr* ptr = from; ptr <= to; ptr++) {
       ObjectPtr obj = ptr->Decompress(heap_base);
       if (!obj->IsHeapObject()) {
@@ -981,8 +986,9 @@
       writer_->CountReferences(1);
     }
   }
+#endif
 
-  void VisitHandle(uword addr) {
+  void VisitHandle(uword addr) override {
     FinalizablePersistentHandle* weak_persistent_handle =
         reinterpret_cast<FinalizablePersistentHandle*>(addr);
     if (!weak_persistent_handle->ptr()->IsHeapObject()) {
@@ -1003,7 +1009,7 @@
  public:
   CountImagePageRefs() : ObjectVisitor() {}
 
-  void VisitObject(ObjectPtr obj) {
+  void VisitObject(ObjectPtr obj) override {
     if (obj->IsPseudoObject()) return;
     count_++;
   }
@@ -1020,7 +1026,7 @@
   explicit WriteImagePageRefs(HeapSnapshotWriter* writer)
       : ObjectVisitor(), writer_(writer) {}
 
-  void VisitObject(ObjectPtr obj) {
+  void VisitObject(ObjectPtr obj) override {
     if (obj->IsPseudoObject()) return;
 #if defined(DEBUG)
     count_++;
@@ -1073,7 +1079,7 @@
         writer_(writer),
         object_slots_(object_slots) {}
 
-  void VisitObject(ObjectPtr obj) {
+  void VisitObject(ObjectPtr obj) override {
     if (obj->IsPseudoObject()) return;
 
     intptr_t cid = obj->GetClassId();
@@ -1258,7 +1264,7 @@
     writer_->WriteUnsigned(counted_);
   }
 
-  void VisitPointers(ObjectPtr* from, ObjectPtr* to) {
+  void VisitPointers(ObjectPtr* from, ObjectPtr* to) override {
     if (writing_) {
       for (ObjectPtr* ptr = from; ptr <= to; ptr++) {
         ObjectPtr target = *ptr;
@@ -1273,9 +1279,10 @@
     }
   }
 
+#if defined(DART_COMPRESSED_POINTERS)
   void VisitCompressedPointers(uword heap_base,
                                CompressedObjectPtr* from,
-                               CompressedObjectPtr* to) {
+                               CompressedObjectPtr* to) override {
     if (writing_) {
       for (CompressedObjectPtr* ptr = from; ptr <= to; ptr++) {
         ObjectPtr target = ptr->Decompress(heap_base);
@@ -1289,8 +1296,9 @@
       counted_ += count;
     }
   }
+#endif
 
-  void VisitHandle(uword addr) {
+  void VisitHandle(uword addr) override {
     FinalizablePersistentHandle* weak_persistent_handle =
         reinterpret_cast<FinalizablePersistentHandle*>(addr);
     if (!weak_persistent_handle->ptr()->IsHeapObject()) {
@@ -1336,7 +1344,7 @@
   explicit Pass3Visitor(HeapSnapshotWriter* writer)
       : ObjectVisitor(), thread_(Thread::Current()), writer_(writer) {}
 
-  void VisitObject(ObjectPtr obj) {
+  void VisitObject(ObjectPtr obj) override {
     if (obj->IsPseudoObject()) {
       return;
     }
@@ -1360,7 +1368,7 @@
         field_table_names_(field_table_names),
         field_(Field::Handle()) {}
 
-  void VisitObject(ObjectPtr obj) {
+  void VisitObject(ObjectPtr obj) override {
     if (obj->IsField()) {
       field_ ^= obj;
       if (field_.is_static()) {
diff --git a/runtime/vm/object_graph.h b/runtime/vm/object_graph.h
index 5e22637..0761993 100644
--- a/runtime/vm/object_graph.h
+++ b/runtime/vm/object_graph.h
@@ -282,8 +282,8 @@
   CountObjectsVisitor(Thread* thread, intptr_t class_count);
   ~CountObjectsVisitor() {}
 
-  void VisitObject(ObjectPtr obj);
-  void VisitHandle(uword addr);
+  void VisitObject(ObjectPtr obj) override;
+  void VisitHandle(uword addr) override;
 
   std::unique_ptr<intptr_t[]> new_count_;
   std::unique_ptr<intptr_t[]> new_size_;
diff --git a/runtime/vm/object_graph_copy.cc b/runtime/vm/object_graph_copy.cc
index 113a864..6fbd142 100644
--- a/runtime/vm/object_graph_copy.cc
+++ b/runtime/vm/object_graph_copy.cc
@@ -915,6 +915,7 @@
       }
     }
 
+#if defined(DART_COMPRESSED_POINTERS)
     void VisitCompressedPointers(uword heap_base,
                                  CompressedObjectPtr* from,
                                  CompressedObjectPtr* to) override {
@@ -922,6 +923,7 @@
         VisitObject(ptr->Decompress(heap_base));
       }
     }
+#endif
 
     RetainingPath* retaining_path_;
     MallocGrowableArray<ObjectPtr>* const working_list_;
diff --git a/runtime/vm/profiler.cc b/runtime/vm/profiler.cc
index f3efdf2..916ba2e 100644
--- a/runtime/vm/profiler.cc
+++ b/runtime/vm/profiler.cc
@@ -1444,7 +1444,7 @@
 
   ~CodeLookupTableBuilder() {}
 
-  void VisitObject(ObjectPtr raw_obj) {
+  void VisitObject(ObjectPtr raw_obj) override {
     if (raw_obj->IsCode() && !Code::IsUnknownDartCode(Code::RawCast(raw_obj))) {
       table_->Add(Code::Handle(Code::RawCast(raw_obj)));
     }
diff --git a/runtime/vm/program_visitor.cc b/runtime/vm/program_visitor.cc
index 6429479..1cfbe30 100644
--- a/runtime/vm/program_visitor.cc
+++ b/runtime/vm/program_visitor.cc
@@ -1242,13 +1242,13 @@
       }
     }
 
-    void VisitObject(ObjectPtr obj) {
+    void VisitObject(ObjectPtr obj) override {
       if (!obj->IsInstructions()) return;
       instructions_ = Instructions::RawCast(obj);
       AddCanonical(instructions_);
     }
 
-    void VisitFunction(const Function& function) {
+    void VisitFunction(const Function& function) override {
       if (!function.HasCode()) return;
       code_ = function.CurrentCode();
       // This causes the code to be visited once here and once directly in the
@@ -1258,7 +1258,7 @@
       function.SetInstructionsSafe(code_);  // Update cached entry point.
     }
 
-    void VisitCode(const Code& code) {
+    void VisitCode(const Code& code) override {
       instructions_ = code.instructions();
       instructions_ = Dedup(instructions_);
       code.set_instructions(instructions_);
@@ -1447,7 +1447,7 @@
         unit_(LoadingUnit::Handle(zone)),
         obj_(Object::Handle(zone)) {}
 
-  void VisitObject(ObjectPtr obj) {
+  void VisitObject(ObjectPtr obj) override {
     if (obj->IsCode()) {
       code_ ^= obj;
       VisitCode(code_);
diff --git a/runtime/vm/service.cc b/runtime/vm/service.cc
index 4aeda83..5eb3fe4 100644
--- a/runtime/vm/service.cc
+++ b/runtime/vm/service.cc
@@ -4797,7 +4797,7 @@
   }
 
  protected:
-  virtual void VisitHandle(uword addr) {
+  void VisitHandle(uword addr) override {
     T* handle = reinterpret_cast<T*>(addr);
     Append(handle);
   }
diff --git a/runtime/vm/thread.cc b/runtime/vm/thread.cc
index 3ee9276..e33912f 100644
--- a/runtime/vm/thread.cc
+++ b/runtime/vm/thread.cc
@@ -666,7 +666,7 @@
         current_(Thread::Current()),
         op_(op) {}
 
-  void VisitPointers(ObjectPtr* first, ObjectPtr* last) {
+  void VisitPointers(ObjectPtr* first, ObjectPtr* last) override {
     for (; first != last + 1; first++) {
       ObjectPtr obj = *first;
       // Stores into new-space objects don't need a write barrier.
@@ -712,11 +712,13 @@
     }
   }
 
+#if defined(DART_COMPRESSED_POINTERS)
   void VisitCompressedPointers(uword heap_base,
                                CompressedObjectPtr* first,
-                               CompressedObjectPtr* last) {
+                               CompressedObjectPtr* last) override {
     UNREACHABLE();  // Stack slots are not compressed.
   }
+#endif
 
  private:
   Thread* const thread_;
diff --git a/runtime/vm/thread_test.cc b/runtime/vm/thread_test.cc
index a69d258..582af1e 100644
--- a/runtime/vm/thread_test.cc
+++ b/runtime/vm/thread_test.cc
@@ -83,7 +83,7 @@
   explicit ObjectCounter(IsolateGroup* isolate_group, const Object* obj)
       : ObjectPointerVisitor(isolate_group), obj_(obj), count_(0) {}
 
-  void VisitPointers(ObjectPtr* first, ObjectPtr* last) {
+  void VisitPointers(ObjectPtr* first, ObjectPtr* last) override {
     for (ObjectPtr* current = first; current <= last; ++current) {
       if (*current == obj_->ptr()) {
         ++count_;
@@ -91,15 +91,17 @@
     }
   }
 
+#if defined(DART_COMPRESSED_POINTERS)
   void VisitCompressedPointers(uword heap_base,
                                CompressedObjectPtr* first,
-                               CompressedObjectPtr* last) {
+                               CompressedObjectPtr* last) override {
     for (CompressedObjectPtr* current = first; current <= last; ++current) {
       if (current->Decompress(heap_base) == obj_->ptr()) {
         ++count_;
       }
     }
   }
+#endif
 
   intptr_t count() const { return count_; }
 
diff --git a/runtime/vm/visitor.h b/runtime/vm/visitor.h
index 5aafc64..cf2cb63 100644
--- a/runtime/vm/visitor.h
+++ b/runtime/vm/visitor.h
@@ -35,9 +35,17 @@
 
   // Range of pointers to visit 'first' <= pointer <= 'last'.
   virtual void VisitPointers(ObjectPtr* first, ObjectPtr* last) = 0;
+#if defined(DART_COMPRESSED_POINTERS)
   virtual void VisitCompressedPointers(uword heap_base,
                                        CompressedObjectPtr* first,
                                        CompressedObjectPtr* last) = 0;
+#else
+  void VisitCompressedPointers(uword heap_base,
+                               CompressedObjectPtr* first,
+                               CompressedObjectPtr* last) {
+    VisitPointers(first, last);
+  }
+#endif
 
   // len argument is the number of pointers to visit starting from 'p'.
   void VisitPointers(ObjectPtr* p, intptr_t len) {