这是GCC中的错误还是我的代码错了?

时间:2010-12-06 17:41:43

标签: gcc android-ndk thumb

我有这个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 -mthumb

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

1 个答案:

答案 0 :(得分:3)

It's a GCC bug!

NDK r5b起,此错误已修复。

  

此版本的NDK没有   包括与之相比的任何新功能   R5。 r5b版本解决了这个问题   以下是r5版本中的问题:

     
      
  • 修复了编译器中的错误   arm-linux-androideabi-4.4.3工具链。   先前的二进制生成无效   拇指指令序列时   处理签名的字符。
  •