changeset 52011:8bbd4454be32

unexmacosx.c: Sort and merge unexec regions before dumping them.
author Andrew Choi <akochoi@shaw.ca>
date Tue, 22 Jul 2003 17:54:50 +0000
parents 08ca5a28493e
children d116f572d76b
files src/ChangeLog src/unexmacosx.c
diffstat 2 files changed, 48 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/src/ChangeLog	Tue Jul 22 17:51:57 2003 +0000
+++ b/src/ChangeLog	Tue Jul 22 17:54:50 2003 +0000
@@ -1,3 +1,9 @@
+2003-07-22  Andrew Choi  <akochoi@shaw.ca>
+
+	* unexmacosx.c (unexec_regions_sort_compare):
+	(unexec_regions_merge): New functions.  Sort and merge unexec
+	regions before dumping them.
+
 2003-07-22  Dave Love  <fx@gnu.org>
 
 	* xfns.c [HAVE_PNG]: Consider both png.h and libpng/png.h.
--- a/src/unexmacosx.c	Tue Jul 22 17:51:57 2003 +0000
+++ b/src/unexmacosx.c	Tue Jul 22 17:54:50 2003 +0000
@@ -364,7 +364,7 @@
 }
 
 
-#define MAX_UNEXEC_REGIONS 30
+#define MAX_UNEXEC_REGIONS 200
 
 int num_unexec_regions;
 vm_range_t unexec_regions[MAX_UNEXEC_REGIONS];
@@ -403,6 +403,46 @@
 				      unexec_regions_recorder);
 }
 
+static int
+unexec_regions_sort_compare (const void *a, const void *b)
+{
+  vm_address_t aa = ((vm_range_t *) a)->address;
+  vm_address_t bb = ((vm_range_t *) b)->address;
+
+  if (aa < bb)
+    return -1;
+  else if (aa > bb)
+    return 1;
+  else
+    return 0;
+}
+
+static void
+unexec_regions_merge ()
+{
+  int i, n;
+  vm_range_t r;
+
+  qsort (unexec_regions, num_unexec_regions, sizeof (unexec_regions[0]),
+	 &unexec_regions_sort_compare);
+  n = 0;
+  r = unexec_regions[0];
+  for (i = 1; i < num_unexec_regions; i++)
+    {
+      if (r.address + r.size == unexec_regions[i].address)
+	{
+	  r.size += unexec_regions[i].size;
+	}
+      else
+	{
+	  unexec_regions[n++] = r;
+	  r = unexec_regions[i];
+	}
+    }
+  unexec_regions[n++] = r;
+  num_unexec_regions = n;
+}
+
 
 /* More informational messages routines.  */
 
@@ -863,6 +903,7 @@
   read_load_commands ();
 
   find_emacs_zone_regions ();
+  unexec_regions_merge ();
 
   in_dumped_exec = 1;