その1の続き

一つ重要なテストを忘れていました。 Extended Asm の Input Operand です。

[umezawa@metis:ttys002 ~]$ cat intel.c
int main(int argc, char** argv)
{
        int ret;
        asm volatile(
                ".intel_syntax\n"
                "mov  eax, %1\n"
                : "=a"(ret)
                : "r"(argc) );
        return ret;
}
[umezawa@metis:ttys002 ~]$ clang -masm=intel intel.c
intel.c:6:4: error: unknown token in expression
                "mov  eax, %1\n"
                 ^
:2:11: note: instantiated into assembly here
mov  eax, %edi
          ^
intel.c:6:4: error: unknown token in expression
                "mov  eax, %1\n"
                 ^
:2:11: note: instantiated into assembly here
mov  eax, %edi
          ^
2 errors generated.

Intel 記法だって言ってるのに AT&T 記法でオペランドを埋め込もうとしています。ダメじゃねぇか。

というわけで、標準コンパイラが Clang であるような世界ではインラインアセンブラの Intel 記法と input operand (の i/r/m 制約あたり)はロクに併用できないことになります。わざわざ GCC をインストールしてもいいんですが、 Mac (というか Xcode)だとそれも大変です。

よくもまあこんな状態で “In general, Clang is highly compatible with the GCC inline assembly extensions” などと書けたもんである。バグレポートはされている (1, 2) けど1年半たってるし直す気が無いらしい。

Trackback

only 1 comment untill now

  1. Clang のインラインアセンブラで Intel 記法を使う (その3)

    その2の続き Intel 記法と Input Operand (の一部の制約)は併用できないわけですが、手持ちのソースを AT&T 記法に変換するのもチョー大変なので別の方法を。 x86 の場合、こういうもの…

Add your comment now