Previously I had asked how to write then read back IR to/from a file. The read code looked like:
LLVMContext ctx;
SMDiagnostic diag;
Module *m = ParseIRFile( "my_file", diag, ctx );
However, the code I’m trying to retrofit LLVM IR into passes me just a std::istream&. How can I read IR from a std::istream?
I figured out how to use raw_os_ostream to adapt a std::ostream to a raw_ostream for writing a module, but there’s no obvious way to adapt the code for reading, e.g., no MemoryBuffer that adapts a std::istream (unless I missed it).
You should use
ParseIR()instead ofParseIRFile(). It gets aMemoryBufferas parameter, instead of a file name. You can create aMemoryBufferfrom aStringRefvia itsgetMemBuffer()factory method:And since a
StringRefcan be (even implicitly) constructed from anstd::string, all you need to do is convert yourstd::istreamtostd::string.