在 LLVM 中传播到 MC 级别的源代码上添加新属性?
Adding a new attribute on source code that propagates until MC level in LLVM?
我对以下内容的传播方式很感兴趣:
void foo(int __attribute__((aligned(16)))* p) { ... }
在这种情况下,指针的“对齐”在 MC 级别可用,但显然没有使用 LLVM-IR 元数据方法来实现这一点。对齐信息对某些目标非常重要,这些目标会根据此值更改代码生成,我认为我需要的更像是此属性。
添加一个新属性使其以与“对齐”相同的方式在编译器中传播有多困难?因此,我已经向 LLVM-IR 添加了一个新元素来执行此操作。我还希望最困难的部分是让 LLVM 的其他部分在不关心这个新元素时忽略它。
遗憾的是 LLVM 没有通用的目标独立方式将目标相关信息从解析器传递到后端。
在类似 中建议使用“DebugLoc”方法,但我认为这有点乱七八糟,因为这与调试无关。但是,如果以这种方式实现起来不那么困难,那么黑客攻击可能是可以接受的。
更新:
内联汇编而不是使用新属性在这里工作吗?如果是,pros/cons是什么?
正如您所展示的,对齐不使用元数据。
对于任何不知道的人:在所有相关说明中(隐式或显式)都提到了对齐,因此例如问题中的函数将被编译成这样的东西(注意对齐):
define void @foo(i32*) {
%2 = alloca i32*, align 16 ; Allocate a 16-aligned pointer
store i32* %0, i32** %2, align 16 ; An aligned store to place the arg there
...
现在,如果您想将一些信息附加到现有指令并让其余大部分编译器忽略它们,使用元数据是个好主意。然而,由于元数据是编译器内部的抽象事物,在某些时候您必须实际对它做一些事情。通常,通过添加您自己的通行证来使用它并执行相应的操作。
至于在哪里放置你的通行证以及如何实现它,这实际上取决于你尝试的实际信息通过及其预期效果。
我对以下内容的传播方式很感兴趣:
void foo(int __attribute__((aligned(16)))* p) { ... }
在这种情况下,指针的“对齐”在 MC 级别可用,但显然没有使用 LLVM-IR 元数据方法来实现这一点。对齐信息对某些目标非常重要,这些目标会根据此值更改代码生成,我认为我需要的更像是此属性。
添加一个新属性使其以与“对齐”相同的方式在编译器中传播有多困难?因此,我已经向 LLVM-IR 添加了一个新元素来执行此操作。我还希望最困难的部分是让 LLVM 的其他部分在不关心这个新元素时忽略它。
遗憾的是 LLVM 没有通用的目标独立方式将目标相关信息从解析器传递到后端。
在类似
更新: 内联汇编而不是使用新属性在这里工作吗?如果是,pros/cons是什么?
正如您所展示的,对齐不使用元数据。
对于任何不知道的人:在所有相关说明中(隐式或显式)都提到了对齐,因此例如问题中的函数将被编译成这样的东西(注意对齐):
define void @foo(i32*) { %2 = alloca i32*, align 16 ; Allocate a 16-aligned pointer store i32* %0, i32** %2, align 16 ; An aligned store to place the arg there ...
现在,如果您想将一些信息附加到现有指令并让其余大部分编译器忽略它们,使用元数据是个好主意。然而,由于元数据是编译器内部的抽象事物,在某些时候您必须实际对它做一些事情。通常,通过添加您自己的通行证来使用它并执行相应的操作。
至于在哪里放置你的通行证以及如何实现它,这实际上取决于你尝试的实际信息通过及其预期效果。