在 LLVM 中创建 raw_ostream 对象

Creating raw_ostream object in LLVM

创建 raw_ostream 对象并将其用于打印的正确方法是什么?我阅读了各种文章,唯一能找到的例子是 (How to redirect llvm::outs() to file?)

raw_ostream *output = &outs();

利用了llvm::outs.

抱歉问这个问题,因为我不太熟悉 C++,但必须了解 LLVM 的工作原理。

llvm::raw_ostream是一个抽象class,有两个重要的纯虚函数,由subclasses实现; write_impl() 包含将数据写入基础流的逻辑,current_pos() return 是流中当前正在写入的位置。

llvm 提供以下输出流实现:

  • outs() 用于写入 stdout
  • errs() 用于写入 stderr
  • nulls() 丢弃输出(如写入 /dev/null
  • raw_fd_ostream(StringRef, std::error_code) 用于写入文件描述符
  • raw_string_ostream(std::string) 用于写入 std::string

前 3 个流直接 return 对其流对象的引用。例如

llvm::raw_ostream &output = llvm:outs();

对于其他流,您以旧方式构造对象。例如

std::string str;
llvm::raw_string_ostream output(str);

对于打印,每个 llvm::Value* 都有一个接受 raw_ostream 对象的 print 方法。