2

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
  • 399
  • 2
  • 12

1 Answers1

8

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. Ex

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

For the other streams you construct objects the old way. Ex

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

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

droptop
  • 1,152
  • 10
  • 21