Prevent clang from replacing code with library calls

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