我对以下内容的传播方式感兴趣:
void foo(int __attribute__((aligned(16)))* p) { ... }
在这种情况下,指针的“对齐”在 MC 级别可用,但显然没有使用 LLVM-IR 元数据方法来实现这一点。对齐信息对于某些目标非常重要,这些目标将根据此值更改代码生成,我认为我需要的更像是此属性。
添加一个新属性,使其以与“对齐”相同的方式通过编译器传播有多困难?因此,我已经向 LLVM-IR 添加了一个新元素来执行此操作。我还预计,最困难的部分是让 LLVM 的其他部分在不关心这个新元素时忽略它。
遗憾的是,LLVM 没有一种通用的目标独立方式将目标相关信息从解析器传递到后端。
在类似的文章中建议使用“DebugLoc”方法question https://stackoverflow.com/questions/45866848/do-metadata-exist-on-machine-code-level-in-llvm,但我认为这有点麻烦,因为这与调试无关。但如果这种方式的实施难度较小,那么黑客可能是可以接受的。
更新:
在这里可以使用内联汇编而不是使用新属性吗?如果是,有什么优点/缺点?
正如您所演示的,对齐不使用元数据。
-
对于任何不知道的人:所有相关指令中都提到了对齐(隐式或显式),因此例如问题中的函数将被编译为类似这样的内容(注意对齐):
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
...
现在,如果您想将一些信息附加到现有指令并让编译器的其余大部分忽略它们,那么使用元数据是一个好主意。但是,由于元数据是编译器内部的抽象事物,因此在某些时候您必须实际使用它做一些事情。通常,通过添加您自己的通行证来使用它并执行相应的操作。
As for where放置您的通票并how要实现它,它实际上取决于您尝试传递的实际信息及其预期效果。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)