Re: [PATCH 0/4] -ffreestanding/-fno-builtin-* patches

From: Arvind Sankar
Date: Mon Aug 24 2020 - 13:36:45 EST


On Tue, Aug 25, 2020 at 12:57:22AM +0900, Masahiro Yamada wrote:
>
>
> To prevent transformation from foo() into bar(),
> there are two ways in Clang to do that;
> -fno-builtin-foo, and -fno-builtin-bar.
> There is only one in GCC; -fno-buitin-foo.
>
> Is this correct?
>

It looked that way from previous experimentation, but...

>
>
> I just played the optimization
> from printf("helloworld\n") to puts("helloworld").
>
> https://godbolt.org/z/5s4ded
>
>
> -fno-builtin-puts cannot prevent clang
> from emitting puts.
> Is it because clang does not support
> -fno-builtin-puts?

Ugh. clang doesn't have __builtin_puts() but it optimizes printf() into
puts(). It doesn't have __builtin_putchar() but will optimize
printf("c") into putchar('c').

And it has .. half of __builtin_fwrite()? fwrite() of a single byte gets
optimized into fputc(), fprintf() of a string literal gets optimized
into fwrite(), -fno-builtin-fwrite prevents both optimizations, but
__builtin_fwrite() gives a compile error.

I give up.