Это ошибка в GCC или мой код неверен? - PullRequest
7 голосов
/ 06 декабря 2010

У меня есть этот код C:

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

Это компилируется в следующий код большого пальца с -Os -mthumb с использованием 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

Но с последним Android NDK r5 он компилируется в этот неработающий код:

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

Это кажется ... странным. Если anim_col меньше 0, он вернет -2 вместо того, чтобы возвращать -2, когда меньше или равно -15. Полная командная строка для воспроизведения этого выглядит следующим образом:

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

и

android-ndk-r5 / toolchains / arm-linux-androideabi-4.4.3 / prebuilt / linux-x86 / bin / arm-linux-androideabi-gcc -c -o test.o -Os test.c - save-temps -mthumb

Это известная ошибка в GCC? Мне трудно в это поверить, такого не бывает в реальной жизни! Конечно, мой код неверен?!

1 Ответ

3 голосов
/ 08 декабря 2010

Это ошибка GCC!

Начиная с NDK r5b , эта ошибка была исправлена.

Этот выпуск NDK не включать любые новые функции по сравнению с r5. Релиз r5b адресован следующие проблемы в выпуске r5:

  • Исправляет ошибку компилятора в набор инструментов arm-linux-androideabi-4.4.3. Предыдущий двоичный файл сгенерирован неверно последовательности команд большого пальца, когда работа с подписанными символами.
...