C++ 从std::istream读取LLVM IR

C++ 从std::istream读取LLVM IR,c++,llvm,llvm-ir,C++,Llvm,Llvm Ir,以前我问过如何写然后从文件中读回IR。读取的代码如下所示: LLVMContext ctx; SMDiagnostic diag; Module *m = ParseIRFile( "my_file", diag, ctx ); 然而,我试图将LLVM IR改造成的代码只传递给我一个std::istream&。如何从std::istream读取IR 我想出了如何使用raw_os_ostream将std::ostream改编成raw_ostream来编写模块,但是没有明显的方法来改编代码进行读取

以前我问过如何写然后从文件中读回IR。读取的代码如下所示:

LLVMContext ctx;
SMDiagnostic diag;
Module *m = ParseIRFile( "my_file", diag, ctx );
然而,我试图将LLVM IR改造成的代码只传递给我一个
std::istream&
。如何从
std::istream
读取IR


我想出了如何使用
raw_os_ostream
std::ostream
改编成
raw_ostream
来编写模块,但是没有明显的方法来改编代码进行读取,例如,没有
MemoryBuffer
来改编
std::istream
(除非我错过了它)。

你应该使用
ParseIR()
而不是
ParseIRFile()
。它获取一个
MemoryBuffer
作为参数,而不是文件名。您可以通过
getMemBuffer()
工厂方法从
StringRef
创建
MemoryBuffer

/// 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
构造,所以您需要做的就是。

是的,这就是我最后要做的。虽然这显然是唯一可行的答案,但如果您可以直接将
istream
传递给
ParseIR()
,这样就不必不断增加
字符串,那就更好了。