From: Alan Modra Date: Wed, 3 Sep 2025 01:29:54 +0000 (+0930) Subject: frag_alloc use of obstack_alloc X-Git-Tag: gdb-17-branchpoint~75 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=180075d14fab9f75eaf679589f9d175fb5448d21;p=thirdparty%2Fbinutils-gdb.git 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. --- diff --git a/gas/frags.c b/gas/frags.c index 54b98d1d735..e93ae68b806 100644 --- a/gas/frags.c +++ b/gas/frags.c @@ -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;