]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
frag_alloc use of obstack_alloc
authorAlan Modra <amodra@gmail.com>
Wed, 3 Sep 2025 01:29:54 +0000 (10:59 +0930)
committerAlan Modra <amodra@gmail.com>
Wed, 3 Sep 2025 01:44:21 +0000 (11:14 +0930)
Avoid the alignment hackery necessary when obstack_alloc is used.
obstack_alloc expands to obstack_blank plus obstack_finish, and the
latter call is where alignment of the tail of the obstack happens.

The docs say obstack_alloc "is invoked almost like malloc", which
implies a fixed size allocation and you don't need other obstack calls
in its use.  So I think trying to use obstack_alloc in frag_alloc was
always a poor choice.

* frags.c (frag_alloc): Replace obstack_alloc with obstack_blank.

gas/frags.c

index 54b98d1d73575be185754ec896f5b6fa59e1d24e..e93ae68b806a1264402dca5852baa6e8afccd204 100644 (file)
@@ -76,18 +76,17 @@ fragS *
 frag_alloc (struct obstack *ob, size_t extra)
 {
   fragS *ptr;
-  int oalign;
 
   /* This will align the obstack so the next struct we allocate on it
      will begin at a correct boundary.  */
   (void) obstack_finish (ob);
-  /* Turn off alignment as otherwise obstack_alloc will align the end
-     of the frag (obstack next_free pointer), making it seem like the
-     frag already has contents in fr_literal.  */
-  oalign = obstack_alignment_mask (ob);
-  obstack_alignment_mask (ob) = 0;
-  ptr = obstack_alloc (ob, extra + SIZEOF_STRUCT_FRAG);
-  obstack_alignment_mask (ob) = oalign;
+  /* Do not use obstack_alloc here.  If you do, you'll need to turn
+     off alignment as otherwise obstack_alloc will align the end of
+     the frag (via obstack_finish adjusting obstack next_free
+     pointer), making it seem like the frag already has contents in
+     fr_literal.  */
+  obstack_blank (ob, extra + SIZEOF_STRUCT_FRAG);
+  ptr = obstack_base (ob);
   memset (ptr, 0, SIZEOF_STRUCT_FRAG);
   totalfrags++;
   return ptr;