raw_ostream为LLVM内部封装的输入输出流。不仅支持标准的输入输出流,还可以支持文件以及string的输入输出流,常常用于内部打印等其他操作。
write_impl()raw_ostream重要实现,为它保存将数据写入底层流的逻辑,并current_pos()返回当前写入流中的位置。
llvm提供的raw_ostream形式支持:
-
outs()用于写入标准输出 -
errs()用于写入标准错误 -
nulls()丢弃输出(如写入/dev/null) -
raw_fd_ostream(StringRef, std::error_code)?用于写入文件描述符 -
raw_string_ostream(std::string)用于写入std::string
前三个是标准输入输入流,直接返回对齐流对象引用:
llvm::raw_ostream &output = llvm:outs();
以官方提供的hello pass 为例子,说明errs()打印使用方式:
bool runOnFunction(Function &F) override {
++HelloCounter;
errs() << "Hello: ";
errs().write_escaped(F.getName()) << '\n';
return false;
}
通常按照标准的c++ 流操作方式都支持,write_escaped为后续追加打印内容,并将'\','\t', ', '"'和任何不满足llvm::isPrint的内容转换为转义序列。
除了支持常用各种操作之外,还支持各种扩展功能,详细可以查看官网说明接口LLVM: llvm::raw_ostream Class Reference:
- write_hex (unsigned long long ?? ?N? ):将其N输出转换成十六进制。
- write (unsigned char C):添加字符
- 等等其他操作可以详细查看
LLVM 另外一个特色就是,每个基础类都提供了相应的printf()功能,用于打印该类的详细信息,通过将raw_ostream作为输入输出流参数,非常方便用于调试。
例如上述例子中打印Function详细信息到errs()中:
bool runOnFunction(Function &F) override {
F->print(errs());
return false;
}
|