diff options
Diffstat (limited to 'contrib/llvm/lib/IRReader/IRReader.cpp')
-rw-r--r-- | contrib/llvm/lib/IRReader/IRReader.cpp | 40 |
1 files changed, 36 insertions, 4 deletions
diff --git a/contrib/llvm/lib/IRReader/IRReader.cpp b/contrib/llvm/lib/IRReader/IRReader.cpp index eeec14e..935e81d 100644 --- a/contrib/llvm/lib/IRReader/IRReader.cpp +++ b/contrib/llvm/lib/IRReader/IRReader.cpp @@ -11,10 +11,15 @@ #include "llvm/ADT/OwningPtr.h" #include "llvm/Assembly/Parser.h" #include "llvm/Bitcode/ReaderWriter.h" +#include "llvm/IR/LLVMContext.h" +#include "llvm/IR/Module.h" #include "llvm/Support/MemoryBuffer.h" #include "llvm/Support/SourceMgr.h" #include "llvm/Support/system_error.h" #include "llvm/Support/Timer.h" +#include "llvm/Support/raw_ostream.h" +#include "llvm-c/Core.h" +#include "llvm-c/IRReader.h" using namespace llvm; @@ -22,8 +27,8 @@ namespace llvm { extern bool TimePassesIsEnabled; } -static const char *TimeIRParsingGroupName = "LLVM IR Parsing"; -static const char *TimeIRParsingName = "Parse IR"; +static const char *const TimeIRParsingGroupName = "LLVM IR Parsing"; +static const char *const TimeIRParsingName = "Parse IR"; Module *llvm::getLazyIRModule(MemoryBuffer *Buffer, SMDiagnostic &Err, @@ -48,7 +53,7 @@ Module *llvm::getLazyIRModule(MemoryBuffer *Buffer, SMDiagnostic &Err, Module *llvm::getLazyIRFileModule(const std::string &Filename, SMDiagnostic &Err, LLVMContext &Context) { OwningPtr<MemoryBuffer> File; - if (error_code ec = MemoryBuffer::getFileOrSTDIN(Filename.c_str(), File)) { + if (error_code ec = MemoryBuffer::getFileOrSTDIN(Filename, File)) { Err = SMDiagnostic(Filename, SourceMgr::DK_Error, "Could not open input file: " + ec.message()); return 0; @@ -79,7 +84,7 @@ Module *llvm::ParseIR(MemoryBuffer *Buffer, SMDiagnostic &Err, Module *llvm::ParseIRFile(const std::string &Filename, SMDiagnostic &Err, LLVMContext &Context) { OwningPtr<MemoryBuffer> File; - if (error_code ec = MemoryBuffer::getFileOrSTDIN(Filename.c_str(), File)) { + if (error_code ec = MemoryBuffer::getFileOrSTDIN(Filename, File)) { Err = SMDiagnostic(Filename, SourceMgr::DK_Error, "Could not open input file: " + ec.message()); return 0; @@ -87,3 +92,30 @@ Module *llvm::ParseIRFile(const std::string &Filename, SMDiagnostic &Err, return ParseIR(File.take(), Err, Context); } + +//===----------------------------------------------------------------------===// +// C API. +//===----------------------------------------------------------------------===// + +LLVMBool LLVMParseIRInContext(LLVMContextRef ContextRef, + LLVMMemoryBufferRef MemBuf, LLVMModuleRef *OutM, + char **OutMessage) { + SMDiagnostic Diag; + + *OutM = wrap(ParseIR(unwrap(MemBuf), Diag, *unwrap(ContextRef))); + + if(!*OutM) { + if (OutMessage) { + std::string buf; + raw_string_ostream os(buf); + + Diag.print(NULL, os, false); + os.flush(); + + *OutMessage = strdup(buf.c_str()); + } + return 1; + } + + return 0; +} |