【问题标题】:Control of x86 registers through LLVM IR?通过 LLVM IR 控制 x86 寄存器?
【发布时间】:2017-08-24 11:23:18
【问题描述】:

我想应用一个假设寄存器 R0, R1,...,Rn 的算法。

在这种情况下,我要控制的是分配这些寄存器的顺序。

是否可以在 LLVM IR 级别控制寄存器,或者 IR 是否可以屏蔽这些低级细节?

【问题讨论】:

  • 内联汇编是可能的,这可能不是你想要的。在这方面,IR 比汇编级别更接近 C 级别。
  • 内联汇编可以调用哪些方法?
  • 我不明白这个问题?
  • 你说内联汇编可以,请问LLVM是否支持这个?
  • 尝试使用 clang 从一些 C + 内联汇编中获取 LLVM IR。

标签: x86 llvm llvm-ir


【解决方案1】:

您可以在较新版本的 llvm 上使用 llvm.read_register 和 llvm.write_register。

如果您想要一个好的示例,请尝试像这样创建一个全局变量:

register void *rsp asm("rsp");

然后尝试使用 printf 打印它。用 -S -emit-llvm 编译简单的 C 程序,可以看到使用了 llvm.read_register

%4 = call i64 @llvm.read_register.i64(metadata !0)

在文件底部你会看到元数据索引 0 是:

!0 = !{!"rsp"}

【讨论】:

  • 但这不会变成mov rax, rsp 之类的吗?它不允许您控制 %4 存储在哪个寄存器中。
  • 这并不总是正确的,但即使不是优化器也肯定会导致问题。内联汇编可能是执行 OP 具​​体想要的最佳方式
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-06-25
  • 2013-11-17
  • 2013-07-28
  • 2023-03-23
  • 1970-01-01
  • 2012-02-17
  • 2022-01-13
相关资源
最近更新 更多