获取LLVM IR解析器的块名

获取LLVM IR解析器的块名,llvm,llvm-clang,llvm-ir,Llvm,Llvm Clang,Llvm Ir,我正在编写一个LLVM解析器来分析一个程序是否遵循某种编程范式。为此,我需要分析IR的每个模块,并检查某些说明。创建.ll文件时,我看不到标签名称,而是一个地址: ; <label>:4 ; preds = %0 %5 = load i32* %c, align 4 %6 = add nsw i32 %5, 10 store i32 %6, i32* %c, align 4 br label

我正在编写一个LLVM解析器来分析一个程序是否遵循某种编程范式。为此,我需要分析IR的每个模块,并检查某些说明。创建.ll文件时,我看不到标签名称,而是一个地址:

; <label>:4                                       ; preds = %0
  %5 = load i32* %c, align 4
  %6 = add nsw i32 %5, 10
  store i32 %6, i32* %c, align 4
  br label %10

; <label>:7                                       ; preds = %0
  %8 = load i32* %c, align 4
  %9 = add nsw i32 %8, 15
  store i32 %9, i32* %c, align 4
  br label %10

; <label>:10                                      ; preds = %7, %4
  %11 = load i32* %1
  ret i32 %11 
对于第二种格式,我可以使用
getName()
获取块的名称:即:“if.then”、“if.else”等


但对于第1种格式,这是不可能的,因为它没有名称。但是我使用
printAsOperand(errs(),true)
进行了测试,我可以从中打印地址,如:'%4,%7%10'。我的问题是,如何将这些地址(或操作数)添加到stings列表中?或者获取这些值并分配给某个变量。

指令/基本块名是一种调试功能,它简化了IR级过程的开发,但不保证它们的正确性。例如,它们可能被简单地剥离,可能会产生误导,等等。您不应该依赖它们来获得任何有意义的东西(通常,它们可能与原始源代码没有任何联系)。通常,在LLVM的发布版本中不会生成名称。您需要在调试(或发布+断言)模式下构建所有内容

应在
printAsOperand()
方法中使用
raw_ostream
,以将所需地址输入变量:

以下是我用于此目的的方法:

#include "llvm/Support/raw_ostream.h"

std::string get_block_reference(BasicBlock *BB){
    std::string block_address;
    raw_string_ostream string_stream(block_address);
    BB->printAsOperand(string_stream, false);

    return string_stream.str();
}
#include "llvm/Support/raw_ostream.h"

std::string get_block_reference(BasicBlock *BB){
    std::string block_address;
    raw_string_ostream string_stream(block_address);
    BB->printAsOperand(string_stream, false);

    return string_stream.str();
}