“__cpp”和 gcc 内联 ARM 汇编器

`__cpp` and gcc inline ARM assembler

本文关键字:内联 ARM 汇编器 gcc cpp      更新时间:2023-10-16
asm("ldr r6, [r0, #__cpp(offsetof(X, y))]tn");

我无法使用以下命令编译上述在线装配线:

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

似乎

__cpp是RealView汇编程序可用的关键字。GNU工具链没有它,我建议使用扩展的Asm语法将一些东西从C传递到内联程序集。

有关可能的解决方案,请参阅下面的代码,但是您可能需要查看扩展 Asm 文档(或其他一些教程)以使用 GCC 编写正确的内联程序集。

GCC 的offsetof称为 __builtin_offsetof,但是您使用 -fno-builtin 调用 GCC,在这种情况下,您的意图不明确(这不会禁用偏移量)。

$ cat foo.c 
typedef struct {
    int pad[32];
    void *buf_;
} VP8BitReader;
void bar() {
    asm volatile("ldr r6, [r0, %[offset]]tn" : /* 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>