如何使用llvm内部函数@ llvm.read_register? [英] how to use llvm intrinsics @llvm.read_register?

查看:71
本文介绍了如何使用llvm内部函数@ llvm.read_register?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我注意到 llvm.read_register()可以读取堆栈指针的值,以及 llvm.write_register()可以设置堆栈指针的值.我将主要功能添加到 stackpointer.ll 中,该功能可以在llvm src中找到:

I noticed that llvm.read_register() could read the value of stack pointer, as well as llvm.write_register() could set the value of stack pointer. I add main function to the stackpointer.ll which could be found in the llvm src:

;stackpointer.ll  
 define i32 @get_stack() nounwind {  
  %sp = call i32 @llvm.read_register.i32(metadata !0)  
  ret i32 %sp  
}

declare i32 @llvm.read_register.i32(metadata) nounwind  
!0 = metadata !{metadata !"sp\00"}

define i32 @main() {  
 %1 = call i32 @get_stack()  
 ret i32 %1  
}

我在运行ubuntu 11.04的armv7板上进行了测试:

I tested on an armv7 board running ubuntu 11.04:

lli stackpointer.ll

然后,我得到了一个堆栈转储:

then, I get a stack dump:

ARMCodeEmitter::emitPseudoInstruction  
UNREACHABLE executed at ARMCodeEmitter.cpp:847! 
Stack dump:  
0.  Program arguments: lli stackpointer.ll  
1.  Running pass 'ARM Machine Code Emitter' on function '@main'  
Aborted

我也尝试过llc:

llc stackpointer.ll -o stackpointer.s

错误消息:

Can't get register for value!  
UNREACHABLE executed at ARMCodeEmitter.cpp:1183!   
Stack dump:  
0.  Program arguments: llc stackpointer.ll -o stackpointer.s  
1.  Running pass 'Function Pass Manager' on moulude 'stackpointer.ll'  
2.  Running pass 'ARM Instruction Selection' on function '@get_stack'  
Aborted  

我也在x86-64平台上尝试过,但是没有用.使用这些内在函数的正确方法是什么?

I also tried on x86-64 platform, it didn't work. What is the correct way to use these intrinsics?

推荐答案

我的lli不喜欢您的元数据定义.

My lli didn't like your metadata definition.

我喜欢你的

!0 =元数据!{metadata!"sp \ 00"}

!0 = !{!"sp\00"}

它奏效了.(好吧,因为我使用的是x86-64,所以我也到处都将i32更改为i64,将sp更改为rsp.)

And it worked. (Well, since I'm on x86-64, I have also changed everywhere i32 to i64 and sp to rsp).

此外,您的格式中有错误的空格符号,但我认为这可能是由于StackOverflow/html或其他原因造成的.

Plus there were bad whitespace symbols in your formatting, but I think it might be due to StackOverflow/html or something).

这篇关于如何使用llvm内部函数@ llvm.read_register?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆