如何将 llvm::outs() 重定向到文件?

2024-01-02

我正在使用一些 LLVM 工具(例如llvm-nm)作为静态库。 IE。我复制了源llvm-nm.cpp,重命名main(..) to llvm_nm(..)并将其编译为静态库。我想将标准输出转发到我的文件。

我尝试使用下一个方法:

  int    out_fd, err_fd;
  fpos_t out_pos, err_pos;

  // redirect out
  fflush(stdout);
  fgetpos(stdout, &out_pos);
  out_fd = dup(fileno(stdout));
  freopen(outFilename, "w", stdout);

  // execute
  int ret = llvm_nm(argc_, argv_);

  // restore output
  fflush(stdout);
  dup2(out_fd, fileno(stdout));
  close(out_fd);
  clearerr(stdout);
  fsetpos(stdout, &out_pos); 

问题是它没有转发(如果我添加它就可以工作)printf()在 nm 源代码中,但不适用于nm输出)。我查看了源代码,我可以看到输出是使用完成的llvm::outs() stream:

outs() << "Archive map" << "\n";

And 它已实施 http://llvm.org/docs/doxygen/html/raw__ostream_8cpp_source.html下一个方法:

/// outs() - This returns a reference to a raw_ostream for standard output.
00702 /// Use it like: outs() << "foo" << "bar";
00703 raw_ostream &llvm::outs() {
00704   // Set buffer settings to model stdout behavior.
00705   // Delete the file descriptor when the program exits, forcing error
00706   // detection. If you don't want this behavior, don't use outs().
00707   static raw_fd_ostream S(STDOUT_FILENO, true);
00708   return S;
00709 }

我如何将该输出重定向到我的文件?


我意识到这是一个老问题,但是,我在查找 llvm 的 outs() 流的一些简单信息时发现了它here http://llvm.org/docs/doxygen/html/raw__ostream_8h.html.

llvm“BrainF”附带的示例之一如下使用它:

  ...

  raw_ostream *out = &outs();
  if (!JIT) {
    if (OutputFilename == "") {
      std::string base = InputFilename;
      if (InputFilename == "-") { base = "a"; }

      // Use default filename.
      OutputFilename = base+".bc";
    }
    if (OutputFilename != "-") {
      std::error_code EC;
      out = new raw_fd_ostream(OutputFilename, EC, sys::fs::F_None);
    }
  }

  ...

  if (out != &outs())
    delete out;

  ...

所以这似乎表明您可以安全地重定向。

注意:在此示例中,OutputFilename/InputFilename 是使用 llvm 支持库创建的 std::string 类型命令行 http://llvm.org/docs/CommandLine.html.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将 llvm::outs() 重定向到文件? 的相关文章

随机推荐