frag_alloc use of obstack_alloc

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.
This commit is contained in:
Alan Modra
2025-09-03 10:59:54 +09:30
parent fcd717899e
commit 180075d14f

View 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;