c++llvm-ir

Creating raw_ostream object in LLVM


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.


Solution

  • 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:

    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.