通过LLVM IR控制x86寄存器?

通过LLVM IR控制x86寄存器?,x86,llvm,llvm-ir,X86,Llvm,Llvm Ir,我想应用一种算法,它假设寄存器R0,R1,…,Rn 在这种情况下,我想要控制的是这些寄存器的分配顺序 在LLVM IR级别是否可以控制寄存器,或者IR是否屏蔽了这些低级细节?您可以在较新版本的LLVM上使用LLVM.read\u寄存器和LLVM.write\u寄存器 如果您想要一个好的示例,请尝试创建如下全局变量: register void *rsp asm("rsp"); 然后尝试用printf打印它。用-S-emit llvm编译简单的C程序,您可以看到llvm.read\u寄存器被使用

我想应用一种算法,它假设寄存器
R0,R1,…,Rn

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


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

您可以在较新版本的LLVM上使用LLVM.read\u寄存器和LLVM.write\u寄存器

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

register void *rsp asm("rsp");
然后尝试用printf打印它。用-S-emit llvm编译简单的C程序,您可以看到llvm.read\u寄存器被使用

%4 = call i64 @llvm.read_register.i64(metadata !0)
在文件的底部,您将看到元数据索引0是:

!0 = !{!"rsp"}

您可以在更新版本的llvm上使用llvm.read_寄存器和llvm.write_寄存器

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

register void *rsp asm("rsp");
然后尝试用printf打印它。用-S-emit llvm编译简单的C程序,您可以看到llvm.read\u寄存器被使用

%4 = call i64 @llvm.read_register.i64(metadata !0)
在文件的底部,您将看到元数据索引0是:

!0 = !{!"rsp"}

内联汇编是可能的,这可能不是您想要的。在这方面,IR更像是C级而不是程序集级。内联程序集可以使用什么方法调用?我不明白这个问题?你说内联程序集可以,所以我问LLVM是否支持这一点?尝试使用clang从一些C+内联asm获取LLVM IR。内联程序集可以,这可能不是你想要的。在这方面,IR更多的是C级而不是汇编级。内联汇编可以使用什么方法调用?我不明白这个问题。你说内联汇编是可能的,所以我问LLVM是否支持这一点?尝试使用clang从一些C+内联asm获取LLVM IR。但这不会变成
mov rax、rsp
或其他什么吗?它不允许您控制寄存器
%4
的存储位置。这并不总是正确的,但即使不是,优化器也肯定会导致问题。内联汇编可能是OP想要的最好的方式,但这不会变成一个
mov-rax、rsp
或其他什么吗?它不允许您控制寄存器
%4
的存储位置。这并不总是正确的,但即使不是,优化器也肯定会导致问题。内联汇编可能是执行OP特别想要的操作的最佳方式