asm("ldr r6, [r0, #__cpp(offsetof(X, y))]\t\n");
我无法使用以下命令编译上面的内嵌流水线:
arm-linux-gnueabi-gcc -c -lm -pg -O1 -g -pipe -fno-common \
-fno-builtin -Wall -march=armv7-a -mfpu=neon -mfloat-abi=softfp \
-mthumb-interwork -mtune=cortex-a9
错误日志是:
{standard input}: Assembler messages:
{standard input}:74: Error: ']' expected -- \
`ldr r6,[r0,#__cpp(offsetof(VP8BitReader,buf_))]'
显然__cpp
无法识别。有什么建议吗?
答案 0 :(得分:2)
似乎__cpp
是一个关键字available for RealView assembler。
GNU工具链没有它,我建议使用Extended Asm语法将一些东西从C传递给内联汇编。
答案 1 :(得分:2)
请参阅下面的代码以获取可能的解决方案,但是您可能需要检查Extended Asm文档(或其他一些tutorial)以便使用GCC编写正确的内联汇编。
GCC的 offsetof
被称为__builtin_offsetof,但是您使用-fno-builtin调用GCC,这使得您的意图在这种情况下不明确(不会禁用offsetof)。
$ cat foo.c
typedef struct {
int pad[32];
void *buf_;
} VP8BitReader;
void bar() {
asm volatile("ldr r6, [r0, %[offset]]\t\n" : /* output */ : /* input */ [offset] "J" (__builtin_offsetof(VP8BitReader, buf_)) : /* clobber */ "r6", "r0");
}
$ arm-linux-gnueabi-gcc -O2 -S -fno-common -fno-builtin -Wall foo.c
$ cat foo.s
<skipped>
#APP
@ 7 "foo.c" 1
ldr r6, [r0, #128]
<skipped>