Messages in this thread | | | From | Nick Desaulniers <> | Date | Wed, 19 Aug 2020 11:35:11 -0700 | Subject | Re: [PATCH v2] lib/string.c: Use freestanding environment |
| |
On Wed, Aug 19, 2020 at 7:08 AM Arvind Sankar <nivedita@alum.mit.edu> wrote: > > gcc can transform the loop in a naive implementation of memset/memcpy > etc into a call to the function itself. This optimization is enabled by > -ftree-loop-distribute-patterns. > > This has been the case for a while (see eg [0]), but gcc-10.x enables > this option at -O2 rather than -O3 as in previous versions. > > Add -ffreestanding, which implicitly disables this optimization with > gcc. It is unclear whether clang performs such optimizations, but > hopefully it will also not do so in a freestanding environment. > > [0] https://gcc.gnu.org/bugzilla/show_bug.cgi?id=56888 > > Signed-off-by: Arvind Sankar <nivedita@alum.mit.edu>
For Clang: For x86_64 defconfig: This results in no change for the code generated.
For aarch64 defconfig: This results in calls to bcmp being replaced with calls to memcmp in strstr and strnstr. I plan on adding -fno-built-bcmp then removing bcmp anyways. Not a bug either way, just noting the difference is disassembly.
For arm defconfig: This results in no change for the code generated.
I should check the other architectures we support, but my local build doesn't have all backends enabled currently; we'll catch it once it's being testing in -next if it's an issue, but I don't foresee it (knocks on wood, famous last words, ...)
If it helps GCC not optimize these core functions into infinite recursion, I'm for that, especially since I'd bet these get called frequently and early on in boot, which is my least favorite time to debug.
Reviewed-by: Nick Desaulniers <ndesaulniers@google.com> Tested-by: Nick Desaulniers <ndesaulniers@google.com>
> --- > lib/Makefile | 7 ++++++- > 1 file changed, 6 insertions(+), 1 deletion(-) > > diff --git a/lib/Makefile b/lib/Makefile > index e290fc5707ea..a4a4c6864f51 100644 > --- a/lib/Makefile > +++ b/lib/Makefile > @@ -15,11 +15,16 @@ KCOV_INSTRUMENT_debugobjects.o := n > KCOV_INSTRUMENT_dynamic_debug.o := n > KCOV_INSTRUMENT_fault-inject.o := n > > +# string.o implements standard library functions like memset/memcpy etc. > +# Use -ffreestanding to ensure that the compiler does not try to "optimize" > +# them into calls to themselves. > +CFLAGS_string.o := -ffreestanding > + > # Early boot use of cmdline, don't instrument it > ifdef CONFIG_AMD_MEM_ENCRYPT > KASAN_SANITIZE_string.o := n > > -CFLAGS_string.o := -fno-stack-protector > +CFLAGS_string.o += -fno-stack-protector > endif > > # Used by KCSAN while enabled, avoid recursion. > -- > 2.26.2 >
-- Thanks, ~Nick Desaulniers
| |