Ранее я спрашивал, как записать, а затем прочитать обратно в / из файла. Код чтения выглядел так:
LLVMContext ctx;
SMDiagnostic diag;
Module *m = ParseIRFile( "my_file", diag, ctx );
Тем не менее, код, который я пытаюсь дооснастить LLVM IR, передает мне просто std::istream&
, Как я могу прочитать IR с std::istream
?
Я разобрался как пользоваться raw_os_ostream
адаптировать std::ostream
к raw_ostream
для написания модуля, но нет очевидного способа адаптировать код для чтения, например, нет MemoryBuffer
который адаптирует std::istream
(если я не пропустил это).
Вы должны использовать ParseIR()
вместо ParseIRFile()
, Это получает MemoryBuffer
в качестве параметра, а не имя файла. Вы можете создать MemoryBuffer
из StringRef
через его getMemBuffer()
заводской метод:
/// getMemBuffer - Open the specified memory range as a MemoryBuffer. Note
/// that InputData must be null terminated if RequiresNullTerminator is true.
static MemoryBuffer *getMemBuffer(StringRef InputData,
StringRef BufferName = "",
bool RequiresNullTerminator = true);
И так как StringRef
может быть (даже неявно) построен из std::string
все, что вам нужно сделать, это преобразовать ваш std::istream
в std::string
.
Других решений пока нет …