7

What is the correct way to create a raw_ostream object and use it for printing? I read various articles and the only example I can find is (How to redirect llvm::outs() to file?)

raw_ostream *output = &outs();

which made use of llvm::outs.

Sorry for asking this because I am not too familiar with C++ but had to understand how LLVM works.

localacct
  • 611
  • 5
  • 13

1 Answers1

17

llvm::raw_ostream is an abstract class with two important pure virtual functions implemented by subclasses; write_impl() which holds the logic for writing data to the underlying stream and current_pos() which returns the position currently being written to in the stream.

LLVM provides the following output stream implementations:

  • 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

The first 3 streams directly return a reference to their stream objects. For example:

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

For the other streams, you construct objects the old way. For example:

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

For printing, every llvm::Value* has a print method that accepts a raw_ostream object.

MaGaroo
  • 164
  • 1
  • 1
  • 13
droptop
  • 1,372
  • 13
  • 24
  • Hi, I have a question, How does one set create a raw_ostream object for a file, in order to make the llvm:Value* print function print it to a file? – Supriya Bhide May 11 '23 at 16:48
  • @SupriyaBhide You could create an output stream that writes to a file based on `raw_fd_ostream` and pass this output stream object to the print() member function of the Value class. See here for more information on the member functions of the Value class: https://llvm.org/doxygen/classllvm_1_1Value.html – Hari Jun 12 '23 at 13:01