Backend emitting to string instead of file

I can use llc to compile my IR module to amdgcn with some non-zero output. However, if try to write the output (assembly or object) to a string (via buffer_ostream) the resulting string has always zero length. Here the code changes I do:

Original llc:

   if \(Target\->addPassesToEmitFile\(PM, \*OS,
                                   DwoOut ? &DwoOut\->os\(\) : nullptr,
                                   FileType, NoVerify, MMIWP\)\)

Now, with this tiny change I was hoping to write to a string instead of the output stream defined by the command line parameters:

std::string outStr;
raw_string_ostream stream(outStr);
buffer_ostream pstream(stream);
if (Target->addPassesToEmitFile(PM, pstream,
DwoOut ? &DwoOut->os() : nullptr,
FileType, NoVerify, MMIWP))

later, e.g., after*M), I check the string for content with

WithColor::warning(errs(), argv[0]) << "with flush, output size: " << outStr.length() << "\n";

But this always yields "with flush, output size: 0"

I tried to flush the raw_string_ostream before using the string, same result.

The used command line was

llc -march=amdgcn -mcpu=gfx906 < module.ll

Anyone see what's wrong with the code?


I think buffer_ostream has an internal buffer that doesn’t flush until its destructor runs. What happens
if you just pass “stream” instead of pstream?

When passing in “stream” instead I get

error: non-const lvalue reference to type ‘llvm::raw_pwrite_stream’ cannot bind to a value of unrelated type ‘llvm::raw_string_ostream’

I am not sure what else to try.


Yes, the destructor hint was golden.