Revision: 2941
Author: [email protected]
Date: Mon Sep 21 03:35:47 2009
Log: Stop "cooking" targets of jumps and calls in code objects.  Do not  
convert jump and call targets to absolute pointers to Code objects during  
GC, heap verification, and serialization.
Review URL: http://codereview.chromium.org/203070
http://code.google.com/p/v8/source/detail?r=2941

Modified:
  /branches/bleeding_edge/src/heap.cc
  /branches/bleeding_edge/src/mark-compact.cc
  /branches/bleeding_edge/src/objects-debug.cc
  /branches/bleeding_edge/src/objects-inl.h
  /branches/bleeding_edge/src/objects.cc
  /branches/bleeding_edge/src/objects.h
  /branches/bleeding_edge/src/serialize.cc
  /branches/bleeding_edge/src/serialize.h
  /branches/bleeding_edge/src/spaces.cc

=======================================
--- /branches/bleeding_edge/src/heap.cc Wed Sep 16 06:41:24 2009
+++ /branches/bleeding_edge/src/heap.cc Mon Sep 21 03:35:47 2009
@@ -637,15 +637,7 @@
    HeapObjectIterator code_it(Heap::code_space());
    while (code_it.has_next()) {
      HeapObject* object = code_it.next();
-    if (object->IsCode()) {
-      Code::cast(object)->ConvertICTargetsFromAddressToObject();
-      object->Iterate(&v);
-      Code::cast(object)->ConvertICTargetsFromObjectToAddress();
-    } else {
-      // If we find non-code objects in code space (e.g., free list
-      // nodes) we want to verify them as well.
-      object->Iterate(&v);
-    }
+    object->Iterate(&v);
    }

    HeapObjectIterator data_it(Heap::old_data_space());
@@ -1935,7 +1927,6 @@
    code->set_relocation_size(desc.reloc_size);
    code->set_sinfo_size(sinfo_size);
    code->set_flags(flags);
-  code->set_ic_flag(Code::IC_TARGET_IS_ADDRESS);
    // Allow self references to created code object by patching the handle to
    // point to the newly allocated Code object.
    if (!self_reference.is_null()) {
@@ -3586,10 +3577,6 @@
      found_target = true;
      return;
    }
-
-  if (obj->IsCode()) {
-    Code::cast(obj)->ConvertICTargetsFromAddressToObject();
-  }

    // not visited yet
    Map* map_p = reinterpret_cast<Map*>(HeapObject::cast(map));
@@ -3646,10 +3633,6 @@
    obj->IterateBody(Map::cast(map_p)->instance_type(),
                     obj->SizeFromMap(Map::cast(map_p)),
                     &unmark_visitor);
-
-  if (obj->IsCode()) {
-    Code::cast(obj)->ConvertICTargetsFromObjectToAddress();
-  }
  }


=======================================
--- /branches/bleeding_edge/src/mark-compact.cc Tue Sep 15 04:39:47 2009
+++ /branches/bleeding_edge/src/mark-compact.cc Mon Sep 21 03:35:47 2009
@@ -264,18 +264,6 @@
      }
      for (Object** p = start; p < end; p++) MarkObjectByPointer(p);
    }
-
-  void BeginCodeIteration(Code* code) {
-    // When iterating over a code object during marking
-    // ic targets are derived pointers.
-    ASSERT(code->ic_flag() == Code::IC_TARGET_IS_ADDRESS);
-  }
-
-  void EndCodeIteration(Code* code) {
-    // If this is a compacting collection, set ic targets
-    // are pointing to object headers.
-    if (IsCompacting()) code->set_ic_flag(Code::IC_TARGET_IS_OBJECT);
-  }

    void VisitCodeTarget(RelocInfo* rinfo) {
      ASSERT(RelocInfo::IsCodeTarget(rinfo->rmode()));
@@ -287,11 +275,6 @@
      } else {
        MarkCompactCollector::MarkObject(code);
      }
-    if (IsCompacting()) {
-      // When compacting we convert the target to a real object pointer.
-      code = Code::GetCodeFromTargetAddress(rinfo->target_address());
-      rinfo->set_target_object(code);
-    }
    }

    void VisitDebugTarget(RelocInfo* rinfo) {
@@ -1187,12 +1170,6 @@
        if (object->IsMarked()) {
          object->ClearMark();
          MarkCompactCollector::tracer()->decrement_marked_count();
-        if (MarkCompactCollector::IsCompacting() && object->IsCode()) {
-          // If this is compacting collection marked code objects have had
-          // their IC targets converted to objects.
-          // They need to be converted back to addresses.
-          Code::cast(object)->ConvertICTargetsFromObjectToAddress();
-        }
          if (!is_previous_alive) {  // Transition from free to live.
            dealloc(free_start, current - free_start);
            is_previous_alive = true;
@@ -1397,6 +1374,14 @@
      // Mark all HeapObject pointers in [start, end)
      for (Object** p = start; p < end; p++) UpdatePointer(p);
    }
+
+  void VisitCodeTarget(RelocInfo* rinfo) {
+    ASSERT(RelocInfo::IsCodeTarget(rinfo->rmode()));
+    Object* target =  
Code::GetCodeFromTargetAddress(rinfo->target_address());
+    VisitPointer(&target);
+    rinfo->set_target_address(
+        reinterpret_cast<Code*>(target)->instruction_start());
+  }

   private:
    void UpdatePointer(Object** p) {
@@ -1630,11 +1615,6 @@
    ASSERT(live_codes == live_code_objects_);
    ASSERT(live_cells == live_cell_objects_);
    ASSERT(live_news == live_young_objects_);
-
-  // Notify code object in LO to convert IC target to address
-  // This must happen after lo_space_->Compact
-  LargeObjectIterator it(Heap::lo_space());
-  while (it.has_next()) { ConvertCodeICTargetToAddress(it.next()); }

    // Flip from and to spaces
    Heap::new_space()->Flip();
@@ -1652,14 +1632,6 @@
    PagedSpaces spaces;
    while (PagedSpace* space = spaces.next())  
space->MCCommitRelocationInfo();
  }
-
-
-int MarkCompactCollector::ConvertCodeICTargetToAddress(HeapObject* obj) {
-  if (obj->IsCode()) {
-    Code::cast(obj)->ConvertICTargetsFromObjectToAddress();
-  }
-  return obj->Size();
-}


  int MarkCompactCollector::RelocateMapObject(HeapObject* obj) {
@@ -1769,11 +1741,6 @@

    // Reset the map pointer.
    int obj_size = RestoreMap(obj, Heap::code_space(), new_addr, map_addr);
-
-  // Convert inline cache target to address using old address.
-  if (obj->IsCode()) {
-    Code::cast(obj)->ConvertICTargetsFromObjectToAddress();
-  }

    Address old_addr = obj->address();

=======================================
--- /branches/bleeding_edge/src/objects-debug.cc        Wed Sep  2 01:36:26 2009
+++ /branches/bleeding_edge/src/objects-debug.cc        Mon Sep 21 03:35:47 2009
@@ -733,7 +733,6 @@


  void Code::CodeVerify() {
-  CHECK(ic_flag() == IC_TARGET_IS_ADDRESS);
    CHECK(IsAligned(reinterpret_cast<intptr_t>(instruction_start()),
                    static_cast<intptr_t>(kCodeAlignment)));
    Address last_gc_pc = NULL;
=======================================
--- /branches/bleeding_edge/src/objects-inl.h   Wed Aug 26 03:33:11 2009
+++ /branches/bleeding_edge/src/objects-inl.h   Mon Sep 21 03:35:47 2009
@@ -2538,16 +2538,6 @@
  INT_ACCESSORS(Code, sinfo_size, kSInfoSizeOffset)


-Code::ICTargetState Code::ic_flag() {
-  return static_cast<ICTargetState>(READ_BYTE_FIELD(this, kICFlagOffset));
-}
-
-
-void Code::set_ic_flag(ICTargetState value) {
-  WRITE_BYTE_FIELD(this, kICFlagOffset, value);
-}
-
-
  byte* Code::instruction_start()  {
    return FIELD_ADDR(this, kHeaderSize);
  }
=======================================
--- /branches/bleeding_edge/src/objects.cc      Thu Sep 17 01:58:06 2009
+++ /branches/bleeding_edge/src/objects.cc      Mon Sep 21 03:35:47 2009
@@ -4953,62 +4953,27 @@
    IteratePointers(v, kThisPropertyAssignmentsOffset,
        kThisPropertyAssignmentsOffset + kPointerSize);
  }
-
-
-void ObjectVisitor::BeginCodeIteration(Code* code) {
-  ASSERT(code->ic_flag() == Code::IC_TARGET_IS_OBJECT);
-}


  void ObjectVisitor::VisitCodeTarget(RelocInfo* rinfo) {
    ASSERT(RelocInfo::IsCodeTarget(rinfo->rmode()));
-  VisitPointer(rinfo->target_object_address());
+  Object* target = Code::GetCodeFromTargetAddress(rinfo->target_address());
+  Object* old_target = target;
+  VisitPointer(&target);
+  CHECK_EQ(target, old_target);  // VisitPointer doesn't change Code*  
*target.
  }


  void ObjectVisitor::VisitDebugTarget(RelocInfo* rinfo) {
    ASSERT(RelocInfo::IsJSReturn(rinfo->rmode()) &&  
rinfo->IsCallInstruction());
-  VisitPointer(rinfo->call_object_address());
-}
-
-
-// Convert relocatable targets from address to code object address. This is
-// mainly IC call targets but for debugging straight-line code can be  
replaced
-// with a call instruction which also has to be relocated.
-void Code::ConvertICTargetsFromAddressToObject() {
-  ASSERT(ic_flag() == IC_TARGET_IS_ADDRESS);
-
-  for (RelocIterator it(this, RelocInfo::kCodeTargetMask);
-       !it.done(); it.next()) {
-    Address ic_addr = it.rinfo()->target_address();
-    ASSERT(ic_addr != NULL);
-    HeapObject* code = Code::GetCodeFromTargetAddress(ic_addr);
-    ASSERT(code->IsHeapObject());
-    it.rinfo()->set_target_object(code);
-  }
-
-#ifdef ENABLE_DEBUGGER_SUPPORT
-  if (Debug::has_break_points()) {
-    for (RelocIterator it(this, RelocInfo::ModeMask(RelocInfo::JS_RETURN));
-         !it.done();
-         it.next()) {
-      if (it.rinfo()->IsCallInstruction()) {
-        Address addr = it.rinfo()->call_address();
-        ASSERT(addr != NULL);
-        HeapObject* code = Code::GetCodeFromTargetAddress(addr);
-        ASSERT(code->IsHeapObject());
-        it.rinfo()->set_call_object(code);
-      }
-    }
-  }
-#endif
-  set_ic_flag(IC_TARGET_IS_OBJECT);
+  Object* target = Code::GetCodeFromTargetAddress(rinfo->call_address());
+  Object* old_target = target;
+  VisitPointer(&target);
+  CHECK_EQ(target, old_target);  // VisitPointer doesn't change Code*  
*target.
  }


  void Code::CodeIterateBody(ObjectVisitor* v) {
-  v->BeginCodeIteration(this);
-
    int mode_mask = RelocInfo::kCodeTargetMask |
                    RelocInfo::ModeMask(RelocInfo::EMBEDDED_OBJECT) |
                    RelocInfo::ModeMask(RelocInfo::EXTERNAL_REFERENCE) |
@@ -5035,38 +5000,6 @@
    }

    ScopeInfo<>::IterateScopeInfo(this, v);
-
-  v->EndCodeIteration(this);
-}
-
-
-void Code::ConvertICTargetsFromObjectToAddress() {
-  ASSERT(ic_flag() == IC_TARGET_IS_OBJECT);
-
-  for (RelocIterator it(this, RelocInfo::kCodeTargetMask);
-       !it.done(); it.next()) {
-    // We cannot use the safe cast (Code::cast) here, because we may be in
-    // the middle of relocating old objects during GC and the map pointer  
in
-    // the code object may be mangled
-    Code* code = reinterpret_cast<Code*>(it.rinfo()->target_object());
-    ASSERT((code != NULL) && code->IsHeapObject());
-    it.rinfo()->set_target_address(code->instruction_start());
-  }
-
-#ifdef ENABLE_DEBUGGER_SUPPORT
-  if (Debug::has_break_points()) {
-    for (RelocIterator it(this, RelocInfo::ModeMask(RelocInfo::JS_RETURN));
-         !it.done();
-         it.next()) {
-      if (it.rinfo()->IsCallInstruction()) {
-        Code* code = reinterpret_cast<Code*>(it.rinfo()->call_object());
-        ASSERT((code != NULL) && code->IsHeapObject());
-        it.rinfo()->set_call_address(code->instruction_start());
-      }
-    }
-  }
-#endif
-  set_ic_flag(IC_TARGET_IS_ADDRESS);
  }


=======================================
--- /branches/bleeding_edge/src/objects.h       Thu Sep 17 03:35:52 2009
+++ /branches/bleeding_edge/src/objects.h       Mon Sep 21 03:35:47 2009
@@ -2520,13 +2520,6 @@
      NUMBER_OF_KINDS = KEYED_STORE_IC + 1
    };

-  // A state indicates that inline cache in this Code object contains
-  // objects or relative instruction addresses.
-  enum ICTargetState {
-    IC_TARGET_IS_ADDRESS,
-    IC_TARGET_IS_OBJECT
-  };
-
  #ifdef ENABLE_DISASSEMBLER
    // Printing
    static const char* Kind2String(Kind kind);
@@ -2565,12 +2558,6 @@
    inline bool is_store_stub() { return kind() == STORE_IC; }
    inline bool is_keyed_store_stub() { return kind() == KEYED_STORE_IC; }
    inline bool is_call_stub() { return kind() == CALL_IC; }
-
-  // [ic_flag]: State of inline cache targets. The flag is set to the
-  // object variant in ConvertICTargetsFromAddressToObject, and set to
-  // the address variant in ConvertICTargetsFromObjectToAddress.
-  inline ICTargetState ic_flag();
-  inline void set_ic_flag(ICTargetState value);

    // [major_key]: For kind STUB, the major key.
    inline CodeStub::Major major_key();
@@ -2617,12 +2604,6 @@
    // Returns the address of the scope information.
    inline byte* sinfo_start();

-  // Convert inline cache target from address to code object before GC.
-  void ConvertICTargetsFromAddressToObject();
-
-  // Convert inline cache target from code object to address after GC
-  void ConvertICTargetsFromObjectToAddress();
-
    // Relocate the code by delta bytes. Called to signal that this code
    // object has been moved by delta bytes.
    void Relocate(int delta);
@@ -2678,7 +2659,6 @@
            ~kCodeAlignmentMask;

    // Byte offsets within kKindSpecificFlagsOffset.
-  static const int kICFlagOffset = kKindSpecificFlagsOffset + 0;
    static const int kStubMajorKeyOffset = kKindSpecificFlagsOffset + 1;

    // Flags layout.
@@ -4810,9 +4790,6 @@
    // To allow lazy clearing of inline caches the visitor has
    // a rich interface for iterating over Code objects..

-  // Called prior to visiting the body of a Code object.
-  virtual void BeginCodeIteration(Code* code);
-
    // Visits a code target in the instruction stream.
    virtual void VisitCodeTarget(RelocInfo* rinfo);

@@ -4821,9 +4798,6 @@

    // Visits a debug call target in the instruction stream.
    virtual void VisitDebugTarget(RelocInfo* rinfo);
-
-  // Called after completing  visiting the body of a Code object.
-  virtual void EndCodeIteration(Code* code) {}

    // Handy shorthand for visiting a single pointer.
    virtual void VisitPointer(Object** p) { VisitPointers(p, p + 1); }
=======================================
--- /branches/bleeding_edge/src/serialize.cc    Fri Sep 18 03:50:08 2009
+++ /branches/bleeding_edge/src/serialize.cc    Mon Sep 21 03:35:47 2009
@@ -934,10 +934,6 @@
        }
      }
    }
-
-  // Do not assert that code targets have been converted to object  
pointers.
-  virtual void BeginCodeIteration(Code* code) {
-  }

    virtual void VisitCodeTarget(RelocInfo* rinfo) {
      ASSERT(RelocInfo::IsCodeTarget(rinfo->rmode()));
=======================================
--- /branches/bleeding_edge/src/serialize.h     Fri Sep 18 03:50:08 2009
+++ /branches/bleeding_edge/src/serialize.h     Mon Sep 21 03:35:47 2009
@@ -154,7 +154,6 @@
   private:
    friend class ReferenceUpdater;

-  virtual void BeginCodeIteration(Code* code) { }
    virtual void VisitPointers(Object** start, Object** end);
    virtual void VisitCodeTarget(RelocInfo* rinfo);
    bool IsVisited(HeapObject* obj);
@@ -290,7 +289,6 @@

   private:
    virtual void VisitPointers(Object** start, Object** end);
-  virtual void BeginCodeIteration(Code* code) { }
    virtual void VisitCodeTarget(RelocInfo* rinfo);
    virtual void VisitExternalReferences(Address* start, Address* end);
    virtual void VisitRuntimeEntry(RelocInfo* rinfo);
=======================================
--- /branches/bleeding_edge/src/spaces.cc       Fri Sep 18 05:02:36 2009
+++ /branches/bleeding_edge/src/spaces.cc       Mon Sep 21 03:35:47 2009
@@ -827,13 +827,7 @@
          // have their remembered set bits set if required as determined
          // by the visitor.
          int size = object->Size();
-        if (object->IsCode()) {
-          Code::cast(object)->ConvertICTargetsFromAddressToObject();
-          object->IterateBody(map->instance_type(), size, visitor);
-          Code::cast(object)->ConvertICTargetsFromObjectToAddress();
-        } else {
-          object->IterateBody(map->instance_type(), size, visitor);
-        }
+        object->IterateBody(map->instance_type(), size, visitor);

          current += size;
        }
@@ -2574,11 +2568,9 @@
      // Byte arrays and strings don't have interior pointers.
      if (object->IsCode()) {
        VerifyPointersVisitor code_visitor;
-      Code::cast(object)->ConvertICTargetsFromAddressToObject();
        object->IterateBody(map->instance_type(),
                            object->Size(),
                            &code_visitor);
-      Code::cast(object)->ConvertICTargetsFromObjectToAddress();
      } else if (object->IsFixedArray()) {
        // We loop over fixed arrays ourselves, rather then using the  
visitor,
        // because the visitor doesn't support the start/offset iteration

--~--~---------~--~----~------------~-------~--~----~
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
-~----------~----~----~----~------~----~------~--~---

Reply via email to