Начиная с такого кода
void lib_memset( unsigned char *dest, unsigned char c, unsigned int n)
{
while(n--)
{
*dest=c;
dest++;
}
}
использование llvm в качестве кросс-компилятора
clang -Wall -m32 -emit-llvm -fno-builtin --target=arm-none-eabi -c lib_memset.c -o lib_memset.bc
opt -std-compile-opts -strip-debug -march=arm -mcpu=mpcore -mtriple=arm-none-eabi lib_memset.bc -o lib_memset.opt.bc
llc -march=arm -mcpu=mpcore -disable-simplify-libcalls lib_memset.opt.bc -o lib_memset.opt.s
llc -march=arm -mcpu=mpcore -disable-simplify-libcalls lib_memset.bc -o lib_memset.s
и он обнаруживает и заменяет его реальным memset, когда используется оптимизатор
lib_memset:
push {r11, lr}
mov r3, r1
mov r11, sp
cmp r2, #0
beq .LBB0_2
mov r1, r2
mov r2, r3
bl __aeabi_memset
.LBB0_2: @ %while.end
pop {r11, pc}
но реализует его без.
Я не хочу, чтобы он компилировал код, который я ему дал, для цели, которую я ему дал, а не использовал библиотечные вызовы. Я думал, что -disable-simplify-libcalls сделает это, но это не так.
Я думал, что понял это раньше, но не могу понять, как это сделать. Мне нужен оптимизатор, я не хочу этой круговой проблемы с зависимостями реализации библиотеки и необходимости библиотеки и т. д. Можно было бы сделать это на ассемблере, чтобы вывести компилятор из цикла, но не нужно.
-ffreestanding
? та же проблема? - person artless noise   schedule 24.01.2014