`__cpp`和gcc内联ARM汇编程序

时间:2013-12-20 17:27:29

标签: c++ assembly arm

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无法识别。有什么建议吗?

2 个答案:

答案 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>