How do I stop GCC from optimizing this byte-for-byte copy into a memcpy call?
One thing that seems to be sufficient here: instead of using -fno-builtin-memcpy
use -fno-builtin
for compiling the translation unit of memcpy
alone!
An alternative would be to pass -fno-tree-loop-distribute-patterns
; though this might be brittle as it forbids the compiler from reorganizing the loop code first and then replacing part of them with calls to mem*
functions.
Or, since you cannot rely anything in the C library, perhaps using -ffreestanding
could be in order.
This won't work (memcpy unconditionally calls itself), and it causes a segfault.
Redefining memcpy
is undefined behavior.
How do I disable the optimization that causes the copy to be transformed into a memcpy call (preferably while still compiling with -O3)?
Don't. The best approach is fixing your code instead:
In most cases, you should use another name.
In the rare case you are really implementing a C library (as discussed in the comments), and you really want to reimplement
memcpy
, then you should be using compiler-specific options to achieve that. For GCC, see-fno-builtin*
and-ffreestanding
, as well as-nodefaultlibs
and-nostdlib
.