diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2015-12-30 11:46:15 +0000 | 
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2015-12-30 11:46:15 +0000 | 
| commit | dd58ef019b700900793a1eb48b52123db01b654e (patch) | |
| tree | fcfbb4df56a744f4ddc6122c50521dd3f1c5e196 /lib/Bitcode/Reader/BitReader.cpp | |
| parent | 2fe5752e3a7c345cdb59e869278d36af33c13fa4 (diff) | |
Notes
Diffstat (limited to 'lib/Bitcode/Reader/BitReader.cpp')
| -rw-r--r-- | lib/Bitcode/Reader/BitReader.cpp | 105 | 
1 files changed, 74 insertions, 31 deletions
| diff --git a/lib/Bitcode/Reader/BitReader.cpp b/lib/Bitcode/Reader/BitReader.cpp index 289c76e85b4b..385c18a40006 100644 --- a/lib/Bitcode/Reader/BitReader.cpp +++ b/lib/Bitcode/Reader/BitReader.cpp @@ -8,6 +8,7 @@  //===----------------------------------------------------------------------===//  #include "llvm-c/BitReader.h" +#include "llvm-c/Core.h"  #include "llvm/Bitcode/ReaderWriter.h"  #include "llvm/IR/DiagnosticPrinter.h"  #include "llvm/IR/LLVMContext.h" @@ -22,12 +23,25 @@ using namespace llvm;  /* Builds a module from the bitcode in the specified memory buffer, returning a     reference to the module via the OutModule parameter. Returns 0 on success.     Optionally returns a human-readable error message via OutMessage. */ -LLVMBool LLVMParseBitcode(LLVMMemoryBufferRef MemBuf, -                          LLVMModuleRef *OutModule, char **OutMessage) { +LLVMBool LLVMParseBitcode(LLVMMemoryBufferRef MemBuf, LLVMModuleRef *OutModule, +                          char **OutMessage) {    return LLVMParseBitcodeInContext(wrap(&getGlobalContext()), MemBuf, OutModule,                                     OutMessage);  } +LLVMBool LLVMParseBitcode2(LLVMMemoryBufferRef MemBuf, +                           LLVMModuleRef *OutModule) { +  return LLVMParseBitcodeInContext2(wrap(&getGlobalContext()), MemBuf, +                                    OutModule); +} + +static void diagnosticHandler(const DiagnosticInfo &DI, void *C) { +  auto *Message = reinterpret_cast<std::string *>(C); +  raw_string_ostream Stream(*Message); +  DiagnosticPrinterRawOStream DP(Stream); +  DI.print(DP); +} +  LLVMBool LLVMParseBitcodeInContext(LLVMContextRef ContextRef,                                     LLVMMemoryBufferRef MemBuf,                                     LLVMModuleRef *OutModule, @@ -35,18 +49,36 @@ LLVMBool LLVMParseBitcodeInContext(LLVMContextRef ContextRef,    MemoryBufferRef Buf = unwrap(MemBuf)->getMemBufferRef();    LLVMContext &Ctx = *unwrap(ContextRef); +  LLVMContext::DiagnosticHandlerTy OldDiagnosticHandler = +      Ctx.getDiagnosticHandler(); +  void *OldDiagnosticContext = Ctx.getDiagnosticContext();    std::string Message; -  raw_string_ostream Stream(Message); -  DiagnosticPrinterRawOStream DP(Stream); +  Ctx.setDiagnosticHandler(diagnosticHandler, &Message, true); + +  ErrorOr<std::unique_ptr<Module>> ModuleOrErr = parseBitcodeFile(Buf, Ctx); + +  Ctx.setDiagnosticHandler(OldDiagnosticHandler, OldDiagnosticContext, true); -  ErrorOr<std::unique_ptr<Module>> ModuleOrErr = parseBitcodeFile( -      Buf, Ctx, [&](const DiagnosticInfo &DI) { DI.print(DP); });    if (ModuleOrErr.getError()) { -    if (OutMessage) { -      Stream.flush(); +    if (OutMessage)        *OutMessage = strdup(Message.c_str()); -    } -    *OutModule = wrap((Module*)nullptr); +    *OutModule = wrap((Module *)nullptr); +    return 1; +  } + +  *OutModule = wrap(ModuleOrErr.get().release()); +  return 0; +} + +LLVMBool LLVMParseBitcodeInContext2(LLVMContextRef ContextRef, +                                    LLVMMemoryBufferRef MemBuf, +                                    LLVMModuleRef *OutModule) { +  MemoryBufferRef Buf = unwrap(MemBuf)->getMemBufferRef(); +  LLVMContext &Ctx = *unwrap(ContextRef); + +  ErrorOr<std::unique_ptr<Module>> ModuleOrErr = parseBitcodeFile(Buf, Ctx); +  if (ModuleOrErr.getError()) { +    *OutModule = wrap((Module *)nullptr);      return 1;    } @@ -59,26 +91,50 @@ LLVMBool LLVMParseBitcodeInContext(LLVMContextRef ContextRef,     Optionally returns a human-readable error message via OutMessage. */  LLVMBool LLVMGetBitcodeModuleInContext(LLVMContextRef ContextRef,                                         LLVMMemoryBufferRef MemBuf, -                                       LLVMModuleRef *OutM, -                                       char **OutMessage) { +                                       LLVMModuleRef *OutM, char **OutMessage) { +  LLVMContext &Ctx = *unwrap(ContextRef); +  LLVMContext::DiagnosticHandlerTy OldDiagnosticHandler = +      Ctx.getDiagnosticHandler(); +  void *OldDiagnosticContext = Ctx.getDiagnosticContext(); +    std::string Message; +  Ctx.setDiagnosticHandler(diagnosticHandler, &Message, true);    std::unique_ptr<MemoryBuffer> Owner(unwrap(MemBuf));    ErrorOr<std::unique_ptr<Module>> ModuleOrErr = -      getLazyBitcodeModule(std::move(Owner), *unwrap(ContextRef)); +      getLazyBitcodeModule(std::move(Owner), Ctx);    Owner.release(); +  Ctx.setDiagnosticHandler(OldDiagnosticHandler, OldDiagnosticContext, true); -  if (std::error_code EC = ModuleOrErr.getError()) { +  if (ModuleOrErr.getError()) {      *OutM = wrap((Module *)nullptr);      if (OutMessage) -      *OutMessage = strdup(EC.message().c_str()); +      *OutMessage = strdup(Message.c_str());      return 1;    }    *OutM = wrap(ModuleOrErr.get().release());    return 0; +} + +LLVMBool LLVMGetBitcodeModuleInContext2(LLVMContextRef ContextRef, +                                        LLVMMemoryBufferRef MemBuf, +                                        LLVMModuleRef *OutM) { +  LLVMContext &Ctx = *unwrap(ContextRef); +  std::unique_ptr<MemoryBuffer> Owner(unwrap(MemBuf)); + +  ErrorOr<std::unique_ptr<Module>> ModuleOrErr = +      getLazyBitcodeModule(std::move(Owner), Ctx); +  Owner.release(); +  if (ModuleOrErr.getError()) { +    *OutM = wrap((Module *)nullptr); +    return 1; +  } + +  *OutM = wrap(ModuleOrErr.get().release()); +  return 0;  }  LLVMBool LLVMGetBitcodeModule(LLVMMemoryBufferRef MemBuf, LLVMModuleRef *OutM, @@ -87,20 +143,7 @@ LLVMBool LLVMGetBitcodeModule(LLVMMemoryBufferRef MemBuf, LLVMModuleRef *OutM,                                         OutMessage);  } -/* Deprecated: Use LLVMGetBitcodeModuleInContext instead. */ -LLVMBool LLVMGetBitcodeModuleProviderInContext(LLVMContextRef ContextRef, -                                               LLVMMemoryBufferRef MemBuf, -                                               LLVMModuleProviderRef *OutMP, -                                               char **OutMessage) { -  return LLVMGetBitcodeModuleInContext(ContextRef, MemBuf, -                                       reinterpret_cast<LLVMModuleRef*>(OutMP), -                                       OutMessage); -} - -/* Deprecated: Use LLVMGetBitcodeModule instead. */ -LLVMBool LLVMGetBitcodeModuleProvider(LLVMMemoryBufferRef MemBuf, -                                      LLVMModuleProviderRef *OutMP, -                                      char **OutMessage) { -  return LLVMGetBitcodeModuleProviderInContext(LLVMGetGlobalContext(), MemBuf, -                                               OutMP, OutMessage); +LLVMBool LLVMGetBitcodeModule2(LLVMMemoryBufferRef MemBuf, +                               LLVMModuleRef *OutM) { +  return LLVMGetBitcodeModuleInContext2(LLVMGetGlobalContext(), MemBuf, OutM);  } | 
