X-Git-Url: http://plrg.eecs.uci.edu/git/?p=oota-llvm.git;a=blobdiff_plain;f=lib%2FBitcode%2FReader%2FBitReader.cpp;h=5ac068645c8ad2bdd1da0901249f478f9c06ac02;hp=23630e552541906c0ae1bb9de2756edec351b213;hb=50005f6837d1b7fb2b885e062d1077d21110b07a;hpb=40be1e85665d10f5444186f0e7106e368dd735b8 diff --git a/lib/Bitcode/Reader/BitReader.cpp b/lib/Bitcode/Reader/BitReader.cpp index 23630e55254..5ac068645c8 100644 --- a/lib/Bitcode/Reader/BitReader.cpp +++ b/lib/Bitcode/Reader/BitReader.cpp @@ -9,9 +9,11 @@ #include "llvm-c/BitReader.h" #include "llvm/Bitcode/ReaderWriter.h" +#include "llvm/IR/DiagnosticPrinter.h" #include "llvm/IR/LLVMContext.h" #include "llvm/IR/Module.h" #include "llvm/Support/MemoryBuffer.h" +#include "llvm/Support/raw_ostream.h" #include #include @@ -26,20 +28,38 @@ LLVMBool LLVMParseBitcode(LLVMMemoryBufferRef MemBuf, OutMessage); } +static void diagnosticHandler(const DiagnosticInfo &DI, void *C) { + auto *Message = reinterpret_cast(C); + raw_string_ostream Stream(*Message); + DiagnosticPrinterRawOStream DP(Stream); + DI.print(DP); +} + LLVMBool LLVMParseBitcodeInContext(LLVMContextRef ContextRef, LLVMMemoryBufferRef MemBuf, LLVMModuleRef *OutModule, char **OutMessage) { + MemoryBufferRef Buf = unwrap(MemBuf)->getMemBufferRef(); + LLVMContext &Ctx = *unwrap(ContextRef); + + LLVMContext::DiagnosticHandlerTy OldDiagnosticHandler = + Ctx.getDiagnosticHandler(); + void *OldDiagnosticContext = Ctx.getDiagnosticContext(); std::string Message; + Ctx.setDiagnosticHandler(diagnosticHandler, &Message, true); + + ErrorOr> ModuleOrErr = parseBitcodeFile(Buf, Ctx); - *OutModule = wrap(ParseBitcodeFile(unwrap(MemBuf), *unwrap(ContextRef), - &Message)); - if (!*OutModule) { + Ctx.setDiagnosticHandler(OldDiagnosticHandler, OldDiagnosticContext, true); + + if (ModuleOrErr.getError()) { if (OutMessage) *OutMessage = strdup(Message.c_str()); + *OutModule = wrap((Module*)nullptr); return 1; } + *OutModule = wrap(ModuleOrErr.get().release()); return 0; } @@ -51,15 +71,21 @@ LLVMBool LLVMGetBitcodeModuleInContext(LLVMContextRef ContextRef, LLVMModuleRef *OutM, char **OutMessage) { std::string Message; + std::unique_ptr Owner(unwrap(MemBuf)); + + ErrorOr> ModuleOrErr = + getLazyBitcodeModule(std::move(Owner), *unwrap(ContextRef)); + Owner.release(); - *OutM = wrap(getLazyBitcodeModule(unwrap(MemBuf), *unwrap(ContextRef), - &Message)); - if (!*OutM) { + if (std::error_code EC = ModuleOrErr.getError()) { + *OutM = wrap((Module *)nullptr); if (OutMessage) - *OutMessage = strdup(Message.c_str()); + *OutMessage = strdup(EC.message().c_str()); return 1; } + *OutM = wrap(ModuleOrErr.get().release()); + return 0; } @@ -69,21 +95,3 @@ LLVMBool LLVMGetBitcodeModule(LLVMMemoryBufferRef MemBuf, LLVMModuleRef *OutM, return LLVMGetBitcodeModuleInContext(LLVMGetGlobalContext(), MemBuf, OutM, OutMessage); } - -/* Deprecated: Use LLVMGetBitcodeModuleInContext instead. */ -LLVMBool LLVMGetBitcodeModuleProviderInContext(LLVMContextRef ContextRef, - LLVMMemoryBufferRef MemBuf, - LLVMModuleProviderRef *OutMP, - char **OutMessage) { - return LLVMGetBitcodeModuleInContext(ContextRef, MemBuf, - reinterpret_cast(OutMP), - OutMessage); -} - -/* Deprecated: Use LLVMGetBitcodeModule instead. */ -LLVMBool LLVMGetBitcodeModuleProvider(LLVMMemoryBufferRef MemBuf, - LLVMModuleProviderRef *OutMP, - char **OutMessage) { - return LLVMGetBitcodeModuleProviderInContext(LLVMGetGlobalContext(), MemBuf, - OutMP, OutMessage); -}