Pregunta

Tengo este código C:

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

a que compila el siguiente código pulgar con -Os -mthumb usando 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

Sin embargo, con la última Android NDK R5 que recopile con este código roto:

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

Esto parece ... extraño. Si anim_col es menor que 0 se volverá -2 en lugar de solamente regresar cuando -2 menor o igual a -15. La línea de comandos completa para reproducir este es el siguiente:

android-NDK-R4b / build / prebuilt / Linux-x86 / brazo-EABI-4.4.0 / bin / brazo-EABI-gcc -c -o test.o -OS test.c --save-temps - mthumb

y

android-NDK-r5 / toolchains / brazo-linux-androideabi-4.4.3 / prebuilt / Linux-x86 / bin / brazo-linux-androideabi-gcc -c -o test.o -Os test.c - parada en temps -mthumb

Es este un error conocido de GCC? Me resulta difícil de creer, que no sucede en la vida real! Sin duda, mi código es incorrecto?!

¿Fue útil?

Solución

Es un error CCG!

A partir de NDK R5b , este error se ha corregido.

Esta versión de la NDK no lo hace incluir todas las nuevas características en comparación con R5. Las direcciones de liberación de los R5b siguientes problemas en la liberación r5:

  • corrige un error en el compilador arm-linux-4.4.3-androideabi cadena de herramientas. El binario anterior genera inválida secuencias de instrucciones pulgar cuando se trata de caracteres firmados.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top