Revision: 15477
Author:   [email protected]
Date:     Wed Jul  3 08:29:59 2013
Log:      GDBJIT: Remove codes when they are garbage collected.

[email protected]

Review URL: https://codereview.chromium.org/13880031

Patch from Haitao Feng <[email protected]>.
http://code.google.com/p/v8/source/detail?r=15477

Modified:
 /branches/bleeding_edge/src/gdb-jit.cc
 /branches/bleeding_edge/src/gdb-jit.h
 /branches/bleeding_edge/src/mark-compact.cc

=======================================
--- /branches/bleeding_edge/src/gdb-jit.cc      Wed Jul  3 07:58:27 2013
+++ /branches/bleeding_edge/src/gdb-jit.cc      Wed Jul  3 08:29:59 2013
@@ -2164,6 +2164,24 @@
   e->value = NULL;
   GetEntries()->Remove(code, HashForCodeObject(code));
 }
+
+
+void GDBJITInterface::RemoveCodeRange(Address start, Address end) {
+  HashMap* entries = GetEntries();
+  Zone zone(Isolate::Current());
+  ZoneList<Code*> dead_codes(1, &zone);
+
+ for (HashMap::Entry* e = entries->Start(); e != NULL; e = entries->Next(e)) {
+    Code* code = reinterpret_cast<Code*>(e->key);
+    if (code->address() >= start && code->address() < end) {
+      dead_codes.Add(code, &zone);
+    }
+  }
+
+  for (int i = 0; i < dead_codes.length(); i++) {
+    RemoveCode(dead_codes.at(i));
+  }
+}


 void GDBJITInterface::RegisterDetailedLineInfo(Code* code,
=======================================
--- /branches/bleeding_edge/src/gdb-jit.h       Wed Mar 20 04:29:46 2013
+++ /branches/bleeding_edge/src/gdb-jit.h       Wed Jul  3 08:29:59 2013
@@ -131,6 +131,8 @@

   static void RemoveCode(Code* code);

+  static void RemoveCodeRange(Address start, Address end);
+
static void RegisterDetailedLineInfo(Code* code, GDBJITLineInfo* line_info);
 };

=======================================
--- /branches/bleeding_edge/src/mark-compact.cc Wed Jul  3 02:47:22 2013
+++ /branches/bleeding_edge/src/mark-compact.cc Wed Jul  3 08:29:59 2013
@@ -3137,6 +3137,11 @@
Address free_end = object_address + offsets[live_index++] * kPointerSize;
       if (free_end != free_start) {
         space->Free(free_start, static_cast<int>(free_end - free_start));
+#ifdef ENABLE_GDB_JIT_INTERFACE
+        if (FLAG_gdbjit && space->identity() == CODE_SPACE) {
+          GDBJITInterface::RemoveCodeRange(free_start, free_end);
+        }
+#endif
       }
       HeapObject* live_object = HeapObject::FromAddress(free_end);
       ASSERT(Marking::IsBlack(Marking::MarkBitFrom(live_object)));
@@ -3163,6 +3168,11 @@
   }
   if (free_start != p->area_end()) {
     space->Free(free_start, static_cast<int>(p->area_end() - free_start));
+#ifdef ENABLE_GDB_JIT_INTERFACE
+    if (FLAG_gdbjit && space->identity() == CODE_SPACE) {
+      GDBJITInterface::RemoveCodeRange(free_start, p->area_end());
+    }
+#endif
   }
   p->ResetLiveBytes();
   if (FLAG_print_cumulative_gc_stat) {

--
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
--- You received this message because you are subscribed to the Google Groups "v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/groups/opt_out.


Reply via email to