Frage

Ich habe diesen C-Code:

int test(signed char anim_col)
{
    if (anim_col >= 31) {
        return 1;
    } else if (anim_col <= -15) {
        return -2;
    }
    return 0;
}

Dass compiles an folgenden Faust Code mit -Os -mthumb mit Android NDK R4b:

test:
    mov r3, #1
    cmp r0, #30
    bgt .L3
    mov r3, #0
    add r0, r0, #14
    bge .L3
    mov r3, #2
    neg r3, r3
.L3:
    mov r0, r3
    bx  lr

Aber mit dem neuesten Android NDK r5 es zu diesem gebrochenen Code kompiliert:

test:
    mov r3, #1
    cmp r0, #30
    bgt .L3
    lsl r0, r0, #24
    lsr r0, r0, #24
    mov r3, #0
    cmp r0, #127    @@ WTF?! should be <= -15 @@
    bls .L3
    mov r3, #2
    neg r3, r3
.L3:
    mov r0, r3
    bx  lr

Das scheint ... seltsam. Wenn anim_col kleiner als 0 ist, wird er zurückkehrt -2 statt nur Rückkehr -2, wenn weniger als oder gleich -15. Die vollständige Befehlszeile, dies zu reproduzieren ist wie folgt:

Android-NDK-R4b / build / prebuilt / linux-x86 / Arm-EABI-4.4.0 / bin / Arm-EABI-gcc -c -o test.o -Os test.c --save-temps - mthumb

und

Android-NDK-r5 / Werkzeugketten / Arm-linux-androideabi-4.4.3 / prebuilt / linux-x86 / bin / Arm-linux-androideabi-gcc -c -o test.o -Os test.c - save-temps -mthumb

Ist das ein GCC Fehler bekannt? Ich finde es schwer zu glauben, dass nicht im wirklichen Leben passiert! Sicherlich ist mein Code falsch?!

War es hilfreich?

Lösung

Es ist ein GCC Fehler!

Wie von NDK R5b wird dieser Fehler behoben worden ist.

Diese Version des NDK nicht umfasst alle neue Funktionen im Vergleich zu r5. Die R5b Release-Adressen der Folgende Probleme in der R 5 Release:

  • Fixes ein Compiler Fehler in der Arm-Linux-androideabi-4.4.3 Werkzeugkette. Die bisherige binäre erzeugt ungültig Daumen Befehlssequenzen, wenn Umgang mit signierten Zeichen.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top