Domanda

Ho questo codice C:

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

che compila il seguente codice di pollice con -Os -mthumb utilizzando 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

Ma con l'ultima Android NDK R5 si compila a questo codice rotto:

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

Questo sembra ... strana. Se anim_col è minore di 0 verrà restituito -2 anziché soltanto tornare -2 quando inferiore o uguale a -15. La riga di comando completa per riprodurre questo è il seguente:

Android-NDK-R4B / build / precompilati / linux-x86 / braccio-EABI-4.4.0 / bin / braccio-EABI-gcc -c -o test.o -Os test.c --save-temps - mthumb

e

Android-NDK-R5 / toolchain / arm-linux-androideabi-4.4.3 / precompilati / linux-x86 / bin / arm-linux-androideabi-gcc -c -o test.o -Os test.c - Salva-temps -mthumb

Si tratta di un noto GCC bug? Trovo difficile credere, che non accade nella vita reale! Sicuramente il mio codice è sbagliato?!

È stato utile?

Soluzione

Si tratta di un bug di GCC!

NDK R5B , questo bug è stato corretto.

  

Questa versione della NDK non lo fa   contiene nuove funzionalità rispetto a   R5. Gli indirizzi di rilascio R5B le   a seguito dei problemi nel rilascio r5:

     
      
  • corregge un bug nel compilatore   arm-linux-androideabi-4.4.3 toolchain.   Il binario precedente generato non valida   sequenze di istruzioni pollice quando   trattare con caratteri firmati.
  •   
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top