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

如何在我的通行证中使用LLVM IR中的注释?,llvm,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 %

可以在我的通行证中使用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]  
define internal void@MDFilter()#0{
条目:
;;基本块执行2次。while.cond]

任何其他获取此信息的方法都是受欢迎的。

不,没有办法以这种方式使用注释的内容,除非对IR解析器进行重大更改。但是,不需要重新发明轮子;LLVM中有一种机制,专门用于这类事情-传输信息将前端rom转换为LLVM过程——也就是说

因此,无论是什么人或任何人将此信息添加到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} 定义内部void@MDFilter()#0{ 条目: %mdContext=alloca%struct.MD5\u CTX,对齐8,!freq!1 %字节=alloca i32,对齐4 %数据=alloca[16 x i8],对齐16 调用void@MD5Init(%struct.MD5\u CTX*%mdContext) br标签%while.cond,!outedge!2 ... !1=元数据!{i32 2} !2=元数据!{float 2.0}
您的通行证需要查找这些
!freq
!outedge
节点。

没错,元数据是一种方法。我可以将元数据添加到基本块对象吗?IR也是由
llvm prof
@mishr nope生成的。但是,由于每个基本块都至少包含一条指令,所以我认为添加met是一种好方法adata到其中的第一条指令。或者,您可以只添加元数据而不将其与任何内容关联,并在元数据内容本身中列出函数和基本块(按名称)它所指的是。@mishr和re:
llvm prof
,我认为它实际上早于元数据机制。不过,看看它似乎相对容易将其更改为发出元数据。