# HG changeset patch # User Andrew Choi # Date 1058896490 0 # Node ID 8bbd4454be32a4759e9be0b646436a3ade5f66ef # Parent 08ca5a28493e7f891d21ad4199352eb6789426fc unexmacosx.c: Sort and merge unexec regions before dumping them. diff -r 08ca5a28493e -r 8bbd4454be32 src/ChangeLog --- 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 + + * unexmacosx.c (unexec_regions_sort_compare): + (unexec_regions_merge): New functions. Sort and merge unexec + regions before dumping them. + 2003-07-22 Dave Love * xfns.c [HAVE_PNG]: Consider both png.h and libpng/png.h. diff -r 08ca5a28493e -r 8bbd4454be32 src/unexmacosx.c --- 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;