3

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

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]  

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

4

1 回答 1

6

不,没有办法以这种方式使用评论的内容,除非显着改变 IR 解析器。但是,没有必要重新发明轮子。LLVM 中有一种机制正是针对这类事情而设计的——将信息从前端传输到 LLVM 通道中——这就是元数据

因此,无论或谁将这些信息添加到 IR,都应该将其与元数据一起添加 - 有关如何执行此操作的更多信息,请参阅这些来源:

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

最后,IR 应该类似于:

定义内部 void @MDFilter() #0 {  
入口:  
  %mdContext = alloca %struct.MD5_CTX, 对齐 8 , !freq !1
  %bytes = alloca i32,对齐 4  
  %data = alloca [16 x i8],对齐 16  
  调用 void @MD5Init(%struct.MD5_CTX* %mdContext)  
  br 标签 %while.cond , !outedge !2

...

!1 = 元数据 !{i32 2}
!2 = 元数据 !{float 2.0}

而你的通行证需要寻找这些!freq!outedge节点。

于 2013-06-21T14:18:34.343 回答