Clang optimizes code by replacing some parts with efficient library functions.
For example the following code:
for (i=0;i<size;++i)
dest[i]=src[i];
will be compiled to (target=ARM assembly):
bl __aeabi_memcpy(PLT)
The compile cmd:
/usr/share/android-arm-l14-toolchain/bin/clang31 -cc1 -triple arm-none-linux-androideabi -S -target-abi aapcs-linux -target-cpu arm1022e -backend-option -arm-enable-ehabi -backend-option -arm-enable-ehabi-descriptors -backend-option -arm-ignore-has-ras -internal-isystem /usr/share/android-arm-l14-toolchain/lib/clang/3.1/include -internal-externc-isystem /usr/share/android-arm-l14-toolchain/bin/…/sysroot/usr/include -o myMemcpy.s -x c myMemcpy.c
Is there a flag or some other way to prevent the compiler from replacing the code with library calls?
Thanks in advance,
David
Hi David,
"-fno-builtin” is probably what you want.
-Jim
Hi Jim,
I have tried “-fno-builtin” but it didn’t help.
Thanks,
David
I’m not sure then. Clang 3.1 is rather old. It’s possible that was broken in that version. Sorry I wasn’t more help. That’s the correct option to control the behavior.
Hi,
I downloaded the latest NDK (r10) and compiled with the following cmd:
arm-linux-androideabi-clang myMemcpy.c -S -fno-builtin -o0
It still produces assembly with a call to “memcpy”. Maybe the -fno-builtin is broken also in the latest release.
Do you have some other idea that can help here?
Thanks,
David
I downloaded the latest NDK (r10) and compiled with the following cmd:
arm-linux-androideabi-clang myMemcpy.c -S -fno-builtin -o0
It still produces assembly with a call to "memcpy". Maybe the -fno-builtin
is broken also in the latest release.
It's not broken. Even freestanding implementation is supposed to
provide mem* functions.
It’s also supposed to be possible to write a memcpy() implementation in C without the compiler’s idiom recognizer just transforming it into a call to the system memcpy(). -fno-builtin is supposed to be how to do that, right?
-jim
>
>> I downloaded the latest NDK (r10) and compiled with the following cmd:
>> arm-linux-androideabi-clang myMemcpy.c -S -fno-builtin -o0
>> It still produces assembly with a call to "memcpy". Maybe the
-fno-builtin
>> is broken also in the latest release.
> It's not broken. Even freestanding implementation is supposed to
> provide mem* functions.
>
It’s also supposed to be possible to write a memcpy() implementation in C
without the compiler’s idiom recognizer just transforming it into a call to
the system memcpy(). -fno-builtin is supposed to be how to do that, right?
IIRC -ffreestanding might be the solution.
-- Sean Silva
Its seems like a syntax bug in clang. You must use optimization flag together with the no-builtin flag.
The following command produces assembly with a call to memcopy:
arm-linux-androideabi-clang -S myMemcpy.c -fno-builtin
The following command produces assembly without a call to memcopy:
arm-linux-androideabi-clang -S myMemcpy.c -fno-builtin -O1
The no-builtin flag is coupled with the optimization flag.
Thanks,
David