7

我有这个 C 代码:

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

使用 Android NDK r4b 编译为以下带有 -Os -mthumb 的拇指代码:

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 而不是仅在小于或等于 -15 时返回 -2。重现这一点的完整命令行如下:

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 -拇指

这是一个已知的 GCC 错误吗?我很难相信,这在现实生活中不会发生!我的代码肯定是错的?!

4

1 回答 1

3

这是一个 GCC 错误!

NDK r5b 开始,此错误已得到修复。

与 r5 相比,此版本的 NDK 不包含任何新功能。r5b 版本解决了 r5 版本中的以下问题:

  • 修复了 arm-linux-androideabi-4.4.3 工具链中的编译器错误。之前的二进制文件在处理有符号字符时生成了无效的拇指指令序列。
于 2010-12-08T09:54:18.003 回答