re PR bootstrap/12804 (zone allocator is broken on 64bit)
authorDaniel Jacobowitz <dan@debian.org>
Mon, 26 Jul 2004 15:11:53 +0000 (15:11 +0000)
committerDaniel Jacobowitz <drow@gcc.gnu.org>
Mon, 26 Jul 2004 15:11:53 +0000 (15:11 +0000)
PR bootstrap/12804
* ggc-zone.c (struct alloc_chunk): Remove attribute packed.
(MAX_FREE_BIN_SIZE): Increase on 64-bit targets.
(ggc_free): Remove incorrect freeing.
(sweep_pages): Advance PP for large pages.  Fix indentation.

From-SVN: r85194

gcc/ChangeLog
gcc/ggc-zone.c

index 87eb2754359676cf9459e8a784899b2a4d7f3479..3763470caa56c5487a4ab3878fbee9fd967ed2f4 100644 (file)
@@ -1,3 +1,11 @@
+2004-07-26  Daniel Jacobowitz  <dan@debian.org>
+
+       PR bootstrap/12804
+       * ggc-zone.c (struct alloc_chunk): Remove attribute packed.
+       (MAX_FREE_BIN_SIZE): Increase on 64-bit targets.
+       (ggc_free): Remove incorrect freeing.
+       (sweep_pages): Advance PP for large pages.  Fix indentation.
+
 2004-07-26  Richard Sandiford  <rsandifo@redhat.com>
 
        PR rtl-optimization/16643
index da58116fabba410ef0d57519777addedb4d798bf..509ea92bd5b0edd6c981a712302e901f4a7ac0d9 100644 (file)
@@ -162,7 +162,7 @@ struct alloc_chunk {
     double align_d;
 #endif
   } u;
-} __attribute__ ((packed));
+};
 
 #define CHUNK_OVERHEAD (offsetof (struct alloc_chunk, u))
 
@@ -177,7 +177,7 @@ struct alloc_chunk {
    on a PowerPC G4 7450 - 667 mhz, and a Pentium 4 - 2.8ghz,
    these were determined to be the optimal values.  */
 #define NUM_FREE_BINS          64
-#define MAX_FREE_BIN_SIZE      256
+#define MAX_FREE_BIN_SIZE      (64 * sizeof (void *))
 #define FREE_BIN_DELTA         (MAX_FREE_BIN_SIZE / NUM_FREE_BINS)
 #define SIZE_BIN_UP(SIZE)      (((SIZE) + FREE_BIN_DELTA - 1) / FREE_BIN_DELTA)
 #define SIZE_BIN_DOWN(SIZE)    ((SIZE) / FREE_BIN_DELTA)
@@ -761,10 +761,6 @@ ggc_free (void *p)
   
   /* Poison the chunk.  */
   poison_chunk (chunk, ggc_get_size (p));
-
-  /* XXX: We only deal with explicitly freeing large objects ATM.  */
-  if (chunk->large)
-    free (p);
 }
 
 /* If P is not marked, mark it and return false.  Otherwise return true.
@@ -990,13 +986,14 @@ sweep_pages (struct alloc_zone *zone)
          if (((struct alloc_chunk *)p->page)->mark == 1)
            {
              ((struct alloc_chunk *)p->page)->mark = 0;
+             pp = &p->next;
            }
          else
            {
              *pp = next;
 #ifdef ENABLE_GC_CHECKING
-         /* Poison the page.  */
-         memset (p->page, 0xb5, p->bytes);
+             /* Poison the page.  */
+             memset (p->page, 0xb5, p->bytes);
 #endif
              free_page (p);
            }