OSDN Git Service

* flow.c (sbitmap_vector_alloc): Ensure sbitmaps properly aligned.
authordevans <devans@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 20 Apr 1998 16:42:50 +0000 (16:42 +0000)
committerdevans <devans@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 20 Apr 1998 16:42:50 +0000 (16:42 +0000)
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@19347 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/flow.c

index fbac26b..871f04d 100644 (file)
@@ -1,3 +1,7 @@
+Mon Apr 20 12:43:09 1998  Doug Evans  <devans@canuck.cygnus.com>
+
+       * flow.c (sbitmap_vector_alloc): Ensure sbitmaps properly aligned.
+
 Mon Apr 20 15:04:14 1998  John Wehle  (john@feith.com)
 
        * i386.md (movsf_push, movdf_push, movxf_push): Allow memory
index 8e4da8c..d9cd761 100644 (file)
@@ -3492,20 +3492,31 @@ sbitmap *
 sbitmap_vector_alloc (n_vecs, n_elms)
      int n_vecs, n_elms;
 {
-  int i, bytes, offset, elm_bytes, size, amt;
+  int i, bytes, offset, elm_bytes, size, amt, vector_bytes;
   sbitmap *bitmap_vector;
 
   size = SBITMAP_SET_SIZE (n_elms);
   bytes = size * sizeof (SBITMAP_ELT_TYPE);
   elm_bytes = (sizeof (struct simple_bitmap_def)
               + bytes - sizeof (SBITMAP_ELT_TYPE));
-  amt = (n_vecs * sizeof (sbitmap *)) + (n_vecs * elm_bytes);
-  bitmap_vector = (sbitmap *) xmalloc (amt);
+  vector_bytes = n_vecs * sizeof (sbitmap *);
 
-  /* ??? There may be alignment problems, `offset' should be rounded up
-     each time to account for alignment.  Later [if ever].  */
+  /* Round up `vector_bytes' to account for the alignment requirements
+     of an sbitmap.  One could allocate the vector-table and set of sbitmaps
+     separately, but that requires maintaining two pointers or creating
+     a cover struct to hold both pointers (so our result is still just
+     one pointer).  Neither is a bad idea, but this is simpler for now.  */
+  {
+    /* Based on DEFAULT_ALIGNMENT computation in obstack.c.  */
+    struct { char x; SBITMAP_ELT_TYPE y; } align;
+    int alignment = (char *) & align.y - & align.x;
+    vector_bytes = (vector_bytes + alignment - 1) & ~ (alignment - 1);
+  }
+
+  amt = vector_bytes + (n_vecs * elm_bytes);
+  bitmap_vector = (sbitmap *) xmalloc (amt);
 
-  for (i = 0, offset = n_vecs * sizeof (sbitmap *);
+  for (i = 0, offset = vector_bytes;
        i < n_vecs;
        i++, offset += elm_bytes)
     {