llvm输入输出流

发布时间 2023-08-02 21:21:11作者: UFOFCZ

llvm::raw_ostream

llvm::raw_ostream是一个抽象class,有两个重要的纯虚函数由子类实现,write_impl()保存将数据写入基础流的逻辑,current_pos()返回流中当前正在写入的位置。

llvm提供了以下输出流实现:

  • outs() for writing to stdout
  • errs() for writing to stderr
  • nulls() which discards the output (like writing to /dev/null)
  • raw_fd_ostream(StringRef, std::error_code) for writing to a file descriptor
  • raw_string_ostream(std::string) for writing to a std::string

前3个流直接返回其对象引用,如

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

而fd/string流可使用抽象对象构造出来,如

//定义流对象
std::string str;
llvm::raw_string_ostream output_str(str);

std::string filename = "test_output.txt");
std::error_code ec;
llvm::raw_fd_ostream output_file(filename, ec, sys::fs::F_Text);
//定义函数,其中llvm::Value对象可直接使用流操作符输出来
void print_test(llvm::raw_ostream out) {
    llvm::Value tmp;
    out<<"test value "<< tmp;
}
//使用
print_test(output_str)
print_test(output_file)

另外,每个llvm::Value*都有一个自己的print函数,只需把llvm::raw_ostream对象传入即可。

llvm::Value tmp;
tmp->print(outs())

raw_fd_ostream构造附加内容

llvm::raw_fd_ostream在头文件llvm/Support/raw_ostream.h中声明。
共有以下6种构造方法:

//打开指定的文件(Filename)进行写入。如果发生错误,则将有关错误的信息输入EC,并应立即销毁这个stream。作为一种特殊情况,如果文件名是“-”,那么这个stream将使用STDOUT_FILENO而不是打开文件。这将不会关闭stdout描述符。
raw_fd_ostream::raw_fd_ostream (StringRef Filename, std::error_code & EC);
//CreationDisposition是枚举类型,共有4种:
//(1) CD_CreateAlways(打开文件时,如果它已经存在,截断它;如果它还不存在,创建一个新文件)截断文件的意思是打开文件的时候先将文件的内容清空,再进行写入;并不是删除文件。
//(2) CD_CreateNew(打开文件时,如果它已经存在,fail;如果它还不存在,创建一个新文件)
//(3) CD_OpenExisting(打开文件时,如果它已经存在,则打开文件,并将偏移量设置为0;如果它还不存在,fail)
//(4) CD_OpenAlways (打开文件时,如果它已经存在,则打开文件,并将偏移量设置为0;如果它还不存在,创建一个新文件)
raw_fd_ostream::raw_fd_ostream (StringRef Filename, std::error_code & EC, sys::fs::CreationDisposition Disp);
//FileAccess枚举类型:FA_Read和FA_Write。

raw_fd_ostream::raw_fd_ostream (StringRef Filename, std::error_code & EC, sys::fs::FileAccess Access)

raw_fd_ostream::raw_fd_ostream (StringRef Filename, std::error_code & EC, sys::fs::OpenFlags Flags)
/*Flags允许可选flags来控制文件将如何打开。枚举类型,共有9种:
OF_None、F_None、OF_Text(以文本模式打开)、
F_Text、OF_Append   (以追加模式打开)、
F_Append、OF_Delete (关闭时删除文件,只对windows有影响)、
OF_ChildInherit    (启动子进程时,此文件应在子进程中保持打开状态)、
OF_UpdateAtime     (强制文件在访问时更新,只对windows有影响)。
*/

raw_fd_ostream::raw_fd_ostream (StringRef Filename, std::error_code & EC, sys::fs::CreationDisposition Disp, sys::fs::FileAccess Access, sys::fs::OpenFlags Flags)

raw_fd_ostream::raw_fd_ostream (int fd, bool shouldClose, bool unbuffered = false)
// FD是它要写入的文件描述符。如果ShouldClose为true,则在stream销毁时关闭文件。但是如果FD是stdout或stderr,它将不会关闭。