0

OS X の Clang で X32 コードの一部についてバグ レポートを取得しました (エラーを以下に示します)。ユーザーは、Intel x86_64 システムで を使用してコードをコンパイルしようとしました-arch i386X32 は 32 ビット整数、long、およびポインターです。

System V Application Binary Interface、AMD64 (LP64 および ILP32 プログラミング モデルを使用) (104 ページ) によると、有効な構成は、__ILP32__単独、または__ILP32__and (およびの代わりの__x86_64__ようなフレンド)のいずれかです。amd64__x86_64__

Intel386 の SYSTEM V APPLICATION BINARY INTERFACEも確認しましたが__ILP32__、友人については言及されていません。__ILP32__したがって、純粋な 32 ビット システムに存在するべきではないと思います。

質問に答えるには上記で十分だと思いますが、OS X システムで Clang を使用しています。OS X ABI Function Call Guideはそれについて議論しておらず、多くの場合 System V ガイドに従います。ただし、参照されている System V ガイドは X32 より前の 2003 年のものであるため、処理はありません。

__ILP32__私の質問は__i386__有効な組み合わせまたは構成ですか?


完全を期すために、コードとコンパイラ エラーを次に示します。私はこの問題を解決しようとしていません。

ソースコード

BOOL_X32が環境で定義されている場合__ILP32__に定義されます。

asm volatile
(
    // save ebx in case -fPIC is being used
# if BOOL_X32 || BOOL_X64
    "pushq %%rbx; cpuid; mov %%ebx, %%edi; popq %%rbx"
# else // BOOL_X86
    "push %%ebx; cpuid; mov %%ebx, %%edi; pop %%ebx"
# endif
    : "=a" (output[0]), "=D" (output[1]), "=c" (output[2]), "=d" (output[3])
    : "a" (input), "c" (0)
);

コンパイラ エラー

X32 はほとんどが32 ビットです。ただし、アセンブリ言語を使用してスタックと対話する場合、64 ビットのレジスタと値をプッシュ/ポップする必要があります。

$ make cpu.o
clang++ -DNDEBUG -g2 -O2 -arch i386 -fPIC -pipe -c cpu.cpp
cpu.cpp:104:4: error: register %rbx is only available in 64-bit mode
                        "pushq %%rbx; cpuid; mov %%ebx, %%edi; popq %%rbx"
                        ^
<inline asm>:1:8: note: instantiated into assembly here
        pushq %rbx; cpuid; mov %ebx, %edi; popq %rbx
              ^~~~~
cpu.cpp:104:4: error: register %rbx is only available in 64-bit mode
                        "pushq %%rbx; cpuid; mov %%ebx, %%edi; popq %%rbx"
                        ^
<inline asm>:1:42: note: instantiated into assembly here
        pushq %rbx; cpuid; mov %ebx, %edi; popq %rbx
                                                ^~~~
2 errors generated.

-arch i386最後に、x86_64 システムで使用する場合の Clang のプリプロセッサ マクロを次に示します。

$ clang++ -arch i386 -dM -E - < /dev/null | egrep -i "(86|64|ilp)"
#define _ILP32 1
#define __ILP32__ 1
...
#define __i386 1
#define __i386__ 1
#define i386 1
4

1 に答える 1

2

はい、__i386__with__ILP32__は完全に有効な構成です。intこれは、 、long、およびポインターが 32 ビット幅のコンパイラーで 32 ビット x86 用のコードを作成していることを意味します。

「ILP32」のようなデータ モデル名は通常、64 ビット システムを表すために使用されますが、そのような名前の使用、または名前に関連するマクロの存在は、命令セットについてはまったく意味がありません。System V ABI は、このマクロが 32 ビット システムに存在する必要があるとは述べていませんが、存在してはならないとも述べていません。

いずれかの方法。使用中の命令セットを特定する必要がある場合は、 and を使用__i386____x86_64__ます。それが彼らの目的です。

于 2015-12-01T04:03:46.790 に答える