mit Code starten wie diesellvm optimiert mit Bibliotheksfunktionen
void lib_memset(unsigned char *dest, unsigned char c, unsigned int n)
{
while(n--)
{
*dest=c;
dest++;
}
}
llvm als Cross-Compiler
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
und es erkennt und ersetzt es mit einem echten Memset wenn der Optimierer verwendet wird
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}
aber implementiert es ohne.
Ich will nicht, dass ich will, dass es den Code kompilieren, den ich es für das Ziel gab ich gab es eher als Bibliotheksaufrufe verwenden. Ich dachte, das -disable-simplify-libcalls würde es tun, tut es aber nicht.
Ich dachte, ich hätte das vorher herausgefunden, aber kann nicht herausfinden, wie es geht. Ich brauche den Optimierer, ich möchte dieses zirkuläre Abhängigkeitsproblem nicht haben, die Bibliothek zu implementieren, und es benötigt die Bibliothek, usw. Könnte es in asm tun, um den Compiler aus der Schleife herauszunehmen, aber nicht müssen.
'-freestanding'? [dasselbe Problem?] (http://lists.cs.uiuc.edu/pipermail/llvmdev/2012-May/050112.html) –
nein, hat es nicht behoben. –
DOH! Benötigt die -disable-simplify-libcalls im opt-Schritt statt oder so gut wie llc ... das hat es behoben. –