同一 asm 句内に定義がある場合はいいのですが、別の asm 句に定義があると処理できません。

同一 asm 句内に定義がある場合

[umezawa@metis:ttys000 ~]$ cat macro1.c
int main(int argc, char** argv)
{
        asm volatile(
                ".macro THENOP\n"
                "nop\n"
                ".endm\n"
                "THENOP":);
        return 0;
}
[umezawa@metis:ttys000 ~]$ clang -S -o- macro1.c
        .section        __TEXT,__text,regular,pure_instructions
        .macosx_version_min 10, 12
        .globl  _main
        .align  4, 0x90
_main:                                  ## @main
        .cfi_startproc
## BB#0:
        pushq   %rbp
Ltmp0:
        .cfi_def_cfa_offset 16
Ltmp1:
        .cfi_offset %rbp, -16
        movq    %rsp, %rbp
Ltmp2:
        .cfi_def_cfa_register %rbp
        movl    $0, -4(%rbp)
        movl    %edi, -8(%rbp)
        movq    %rsi, -16(%rbp)
        ## InlineAsm Start

        nop

        ## InlineAsm End
        xorl    %eax, %eax
        popq    %rbp
        retq
        .cfi_endproc


.subsections_via_symbols

別の asm 句内に定義がある場合

[umezawa@metis:ttys000 ~]$ cat macro2.c
int main(int argc, char** argv)
{
        asm volatile(
                ".macro THENOP\n"
                "nop\n"
                ".endm\n":);
        asm volatile(
                "THENOP":);
        return 0;
}
[umezawa@metis:ttys000 ~]$ clang -c macro2.c
macro2.c:8:3: error: invalid instruction mnemonic 'thenop'
                "THENOP":);
                ^
:1:2: note: instantiated into assembly here
        THENOP
        ^~~~~~
1 error generated.

これで何が困るかと言うと、複数の関数内で使いたいマクロを記述できないわけです。もう Clang でインラインアセンブラを使おうとするのはやめといた方がいいんじゃないかという気がしてくる。

よくもまあこんな状態で “In general, Clang is highly compatible with the GCC inline assembly extensions” などと(ry

Trackback

no comment untill now

Add your comment now