如何在我的通行证中使用LLVM IR中的注释?

时间:2013-06-21 12:40:48

标签: llvm

我可以在通行证中使用IR中的评论吗?基本上我想使用带有基本块频率的IR注释,这是用注释写的,如下所示,我需要传递中的频率值。我知道这是天真的方法,但它就足够了。

define internal void @MDFilter() #0 {  
entry:  
    ;;; Basic block executed 2 times.  <-- I NEED THIS COMMENT AS A STRING IN MY PASS
  %mdContext = alloca %struct.MD5_CTX, align 8  
  %bytes = alloca i32, align 4  
  %data = alloca [16 x i8], align 16  
  call void @MD5Init(%struct.MD5_CTX* %mdContext)  
  br label %while.cond  
    ;;; Out-edge counts: [2.000000e+00 -> while.cond]  

也欢迎任何其他获取此信息的方法。

1 个答案:

答案 0 :(得分:6)

不,没有办法以这种方式使用评论的内容,而不是没有显着改变IR解析器。但是,没有必要重新发明轮子; LLVM中有一种机制,对于这些类型的东西精确 - 将信息从前端传输到LLVM传递 - 即metadata

因此,无论是将此信息添加到IR的任何人或任何人都应该添加元数据 - 请参阅这些来源以获取有关如何执行此操作的更多信息:

如果您无法控制数据的生成,那么您应该添加一些预处理步骤,将注释转换为元数据。

最后,IR应该看起来像:

define internal void @MDFilter() #0 {  
entry:  
  %mdContext = alloca %struct.MD5_CTX, align 8, !freq !1
  %bytes = alloca i32, align 4  
  %data = alloca [16 x i8], align 16  
  call void @MD5Init(%struct.MD5_CTX* %mdContext)  
  br label %while.cond, !outedge !2

...

!1 = metadata !{i32 2}
!2 = metadata !{float 2.0}

您的通行证需要查找这些!freq!outedge个节点。