我有这个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错误吗?我觉得很难相信,这在现实生活中不会发生!当然我的代码错了吗?!
答案 0 :(得分:3)
自NDK r5b起,此错误已修复。
此版本的NDK没有 包括与之相比的任何新功能 R5。 r5b版本解决了这个问题 以下是r5版本中的问题:
- 修复了编译器中的错误 arm-linux-androideabi-4.4.3工具链。 先前的二进制生成无效 拇指指令序列时 处理签名的字符。