我有此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,而不仅仅是返回-2时返回-2时,小于或等于-15。复制的完整命令行如下:

Android-ndk-r4b/build/preduilt/linux-x86/arm-eabi-4.4.4.0/bin/arm-eabi-gcc -c-c-c -o test.o -os test.c-save-temps -mthumb

Android-NDK-R5/Toolchains/arm-linux-androideabi 4.4.4.3/preduilt/linux-x86/bin/arm-linux-and-linux-andoideabi-gcc -c-o test.o -os test.c-save-temps.c-save-temps -Mthumb

这是已知的海湾合作委员会错误吗?我发现很难相信,这在现实生活中不会发生!我的代码肯定错了吗?

有帮助吗?

解决方案

这是GCC错误!

作为 NDK R5B, ,此错误已修复。

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

  • 修复了Arm-Linux-androideabi-4.4.3工具链中的编译器错误。以前的二进制生成无效的拇指指令序列在处理签名的字符时。
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top