Re: [PATCH v2 5/6] Eliminate CONFIG_CC_HAS_ASM_GOTO_TIED_OUTPUT

From: Nathan Chancellor

Date: Thu Nov 12 2026 - 12:52:14 EST


On Thu, Nov 12, 2026 at 12:34:50PM +0100, Nicolas Schier wrote:
> On Wed, Nov 11, 2026 at 05:52:07PM -0700, Nathan Chancellor wrote:
> > -config CC_HAS_ASM_GOTO_TIED_OUTPUT
> > - depends on CC_HAS_ASM_GOTO_OUTPUT
> > - # Detect buggy gcc and clang, fixed in gcc-11 clang-14.
> > - def_bool $(success,echo 'int foo(int *x) { asm goto (".long (%l[bar]) - .": "+m"(*x) ::: bar); return *x; bar: return 0; }' | $CC -x c - -c -o /dev/null)
>
> The comments reads as if gcc 8 to 10 are affected. Is the comment
> somehow misleading, or should we still keep this until gcc-10 is the
> minimum gcc version?

It is a little misleading. GCC 11 was the first version that supported
asm goto with outputs, so this program will not compile with GCC 8 to 10
as a result:

<stdin>: In function 'foo':
<stdin>:1:51: error: expected ':' before string constant

The bug that it is trying to trigger was fixed during the GCC 11
development cycle between the initial asm goto with outputs commit and
the final release. As a result, for GCC, if it supports asm goto with
outputs, it supports tied outputs in the expected manner.

This test was mostly to catch buggy versions of clang, as asm goto with
outputs was first shipped in clang-11 but using tied outputs breaks the
build until they were fixed to be compatible with GCC in clang-14:

<stdin>:1:29: error: invalid operand in inline asm: '.long (${1:l}) - .'
int foo(int *x) { asm goto (".long (%l[bar]) - .": "+m"(*x) ::: bar); return *x; bar: return 0; }
^
<stdin>:1:29: error: unknown token in expression in '.long' directive
<inline asm>:1:9: note: instantiated into assembly here
.long () - .
^
2 errors generated.

So if the compiler results in CONFIG_CC_HAS_ASM_GOTO_OUTPUT=y, we know
that CONFIG_CC_HAS_ASM_GOTO_TIED_OUTPUT=y will be present as well.

--
Cheers,
Nathan