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.h 用于 _Unwind_Exception:

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

这在 llvm 内部是 TargetData::PointerABIAlign,但它似乎没有暴露给代码。我只是硬编码为 16 个字节,因为我们似乎需要一段时间才能看到更多对齐的类型或指令集。

于 2012-07-25T23:19:26.743 回答