PR29466, APP/NO_APP with .linefile
authorAlan Modra <amodra@gmail.com>
Thu, 11 Aug 2022 00:21:03 +0000 (09:51 +0930)
committerAlan Modra <amodra@gmail.com>
Thu, 11 Aug 2022 02:33:05 +0000 (12:03 +0930)
commit4d74aab7aa562fe79d4669cdad0c32610531cbc0
tree5dc95ed8fd4fc55c369c21cc9942b210b3a47350
parent5291ecf9720c97e2a82e8766a642e33529f890d1
PR29466, APP/NO_APP with .linefile

Commit 53f2b36a54b9 exposed a bug in sb_scrub_and_add_sb that could
result in losing input.  If scrubbing results in expansion past the
holding capacity of do_scrub_chars output buffer, then do_scrub_chars
stashes the extra input for the next call.  That call never came
because sb_scrub_and_add_sb wrongly decided it was done.  Fix that by
allowing sb_scrub_and_add_sb to see whether there is pending input.
Also allow a little extra space so that in most cases we won't need
to resize the output buffer.

sb_scrub_and_add_sb also limited output to the size of the input,
rather than the actual output buffer size.  Fixing that resulted in a
fail of gas/testsuite/macros/dot with an extra warning: "end of file
not at end of a line; newline inserted".  OK, so the macro in dot.s
really does finish without end-of-line.  Apparently the macro
expansion code relied on do_scrub_chars returning early.  So fix that
too by adding a newline if needed in macro_expand_body.

PR 29466
* app.c (do_scrub_pending): New function.
* as.h: Declare it.
* input-scrub.c (input_scrub_include_sb): Add extra space for
two .linefile directives.
* sb.c (sb_scrub_and_add_sb): Take into account pending input.
Allow output to max.
* macro.c (macro_expand_body): Add terminating newline.
* testsuite/config/default.exp (SIZE, SIZEFLAGS): Define.
* testsuite/gas/macros/app5.d,
* testsuite/gas/macros/app5.s: New test.
* testsuite/gas/macros/macros.exp: Run it.
gas/app.c
gas/as.h
gas/input-scrub.c
gas/macro.c
gas/sb.c
gas/testsuite/config/default.exp
gas/testsuite/gas/macros/app5.d [new file with mode: 0644]
gas/testsuite/gas/macros/app5.s [new file with mode: 0644]
gas/testsuite/gas/macros/macros.exp