Вопрос

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

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

Это компилируется в следующий код thumb с помощью -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/сборка/ предустановленный/linux-x86/arm-eabi-4.4.0/bin/arm-eabi-gcc -c -o test.o -Os test.c --сохранить-временные рамки -mthumb

и

android-ndk-r5/наборы инструментов/arm-linux-androideabi-4.4.3/готовые/linux-x86/bin/arm-linux-androideabi-gcc -c -o test.o -Os test.c --сохранить временные рамки -mthumb

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

Это было полезно?

Решение

Это ошибка GCC!

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

Этот выпуск NDK не включает никаких новых функций по сравнению с r5.В выпуске r5b решаются следующие проблемы в выпуске r5:

  • Исправлена ошибка компилятора в наборе инструментов arm-linux-androideabi-4.4.3.Предыдущий двоичный файл сгенерировал недопустимые последовательности команд thumb при работе с символами со знаком.
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top