2

GCC は、__BIGGEST_ALIGNMENT__コンパイル対象のターゲット マシン上の任意のデータ型に対してこれまでに使用された最大のアラインメントである定義済みマクロを提供します。これに相当するLLVMが見つからないようです。ありますか?そうでない場合、それを理解するための最良の方法は何ですか (できればプリプロセッサを使用)?

4

2 に答える 2

3

これはプリプロセッサからはアクセスできませんが、__attribute__((aligned))or __attribute__((__aligned__))(アライメント値を省略) を使用すると、必要なアライメントが得られます。これは、x86 および ARM では 16 である、任意の組み込み型の最大のアライメントを提供することになっています。

例えば:

$ cat align.c
struct foo {
  char c;
} __attribute__((aligned)) var;
$ clang align.c -S -o - -emit-llvm
...
@var = global %struct.foo zeroinitializer, align 16

これは、_Unwind_Exception の unwind.h によって使用されます。

struct _Unwind_Exception
{
  _Unwind_Exception_Class exception_class;
  _Unwind_Exception_Cleanup_Fn exception_cleanup;
  _Unwind_Word private_1;
  _Unwind_Word private_2;

  /* @@@ The IA-64 ABI says that this structure must be double-word aligned.
     Taking that literally does not make much sense generically.  Instead we
     provide the maximum alignment required by any type for the machine.  */
} __attribute__((__aligned__));
于 2013-11-09T22:26:26.003 に答える
1

これは、TargetData::PointerABIAlign として llvm 内部にありますが、コードには公開されていないようです。アライメントされたタイプや命令セットが見られるまでにはしばらく時間がかかるように思われるので、16 バイトにハードコーディングします。

于 2012-07-25T23:19:26.743 に答える