musllibc: workaround -Os breaks memcpy on riscv32 When memcpy is built with -Os the use of __may_alias__ does not work as intended; expressions like typedef uint32_t __attribute__((__may_alias__)) u32; x = *(u32 *)(s+2); emit code that does the equivalent of: x = *(u32 *)(s+0); This results in unaligned accesses that crash capdl-loader (when built with ZF_LOG enabled). Workaround this by forcing CFLAGS_MEMOPS to include -O3. This has minimal effect on the memory footprint: $ diff /tmp/libc-sizes /tmp/libc-sizes-with-change 962,963c962,963 < 38 0 0 38 26 memcmp.o (ex libc.a) < 866 0 0 866 362 memcpy.o (ex libc.a) Change-Id: I012b30f90a85d73e919438ce3afde8f12616e630 --- > 36 0 0 36 24 memcmp.o (ex libc.a) > 1008 0 0 1008 3f0 memcpy.o (ex libc.a) 965c965 < 238 0 0 238 ee memmove.o (ex libc.a) --- > 396 0 0 396 18c memmove.o (ex libc.a) 968c968 < 186 0 0 186 ba memset.o (ex libc.a) --- > 198 0 0 198 c6 memset.o (ex libc.a) Change-Id: Ic47a075b830b0b2d0f66d8904f2cb461b904c5aa
diff --git a/configure b/configure index 2373557..c1e7354 100755 --- a/configure +++ b/configure
@@ -386,6 +386,11 @@ # tryflag CFLAGS_MEMOPS -fno-tree-loop-distribute-patterns +# HACK workaround for bug compiling memcpy with -Os (__may_alias__ has +# no effect on rval's), override any -Os in CFLAGS_AUTO (we assume +# CFLAGS_MEMOPS is last in the CFLAGS when building memcpy.o +tryflag CFLAGS_MEMOPS -O3 + # # Enable debugging if requessted. #