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

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

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

最佳答案

It's a GCC bug!

截至 NDK r5b ,此错误已修复。

This release of the NDK does not include any new features compared to r5. The r5b release addresses the following problems in the r5 release:

  • Fixes a compiler bug in the arm-linux-androideabi-4.4.3 toolchain. The previous binary generated invalid thumb instruction sequences when dealing with signed chars.

关于gcc - 这是 GCC 中的错误还是我的代码错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4369265/

相关文章:

gcc - 在 GCC 中, "tree optimizations"与 "RTL optimizations"是什么?

c++ - 命名空间中的内联函数在 gcc 链接期间生成重复符号

windows - 从 Windows 到 ARM Linux 交叉编译 Rust

c++ - 为什么 char* 和 std::string& 的别名优化结果不同?

无法解析 Android CDT setup std

android - 导入 Android NDK 项目(解码 OGG)

gcc - 如何链接到外部 THUMB 代码?

android - 为什么使用 Android NDK 通过 JNI 将 native 数组复制回 Java 无法正确填充?

arm - Thumb-2指令的W后缀是什么意思?

assembly - objdump 和 ARM 与 Thumb