BitReader.cpp revision 249423
168349Sobrien//===-- BitReader.cpp -----------------------------------------------------===//
2133359Sobrien//
3133359Sobrien//                     The LLVM Compiler Infrastructure
4133359Sobrien//
5133359Sobrien// This file is distributed under the University of Illinois Open Source
6133359Sobrien// License. See LICENSE.TXT for details.
7133359Sobrien//
8133359Sobrien//===----------------------------------------------------------------------===//
9133359Sobrien
10133359Sobrien#include "llvm-c/BitReader.h"
11133359Sobrien#include "llvm/Bitcode/ReaderWriter.h"
12133359Sobrien#include "llvm/IR/LLVMContext.h"
13133359Sobrien#include "llvm/Support/MemoryBuffer.h"
14133359Sobrien#include <cstring>
15133359Sobrien#include <string>
16133359Sobrien
17133359Sobrienusing namespace llvm;
18133359Sobrien
19133359Sobrien/* Builds a module from the bitcode in the specified memory buffer, returning a
20133359Sobrien   reference to the module via the OutModule parameter. Returns 0 on success.
21133359Sobrien   Optionally returns a human-readable error message via OutMessage. */
22133359SobrienLLVMBool LLVMParseBitcode(LLVMMemoryBufferRef MemBuf,
23133359Sobrien                          LLVMModuleRef *OutModule, char **OutMessage) {
24133359Sobrien  return LLVMParseBitcodeInContext(wrap(&getGlobalContext()), MemBuf, OutModule,
25133359Sobrien                                   OutMessage);
26133359Sobrien}
27133359Sobrien
28133359SobrienLLVMBool LLVMParseBitcodeInContext(LLVMContextRef ContextRef,
2968349Sobrien                                   LLVMMemoryBufferRef MemBuf,
3068349Sobrien                                   LLVMModuleRef *OutModule,
3168349Sobrien                                   char **OutMessage) {
3280588Sobrien  std::string Message;
33191736Sobrien
34191736Sobrien  *OutModule = wrap(ParseBitcodeFile(unwrap(MemBuf), *unwrap(ContextRef),
35330569Sgordon                                     &Message));
36191736Sobrien  if (!*OutModule) {
37191736Sobrien    if (OutMessage)
38133359Sobrien      *OutMessage = strdup(Message.c_str());
3968349Sobrien    return 1;
4084685Sobrien  }
4184685Sobrien
4284685Sobrien  return 0;
43267843Sdelphij}
44267843Sdelphij
45267843Sdelphij/* Reads a module from the specified path, returning via the OutModule parameter
4668349Sobrien   a module provider which performs lazy deserialization. Returns 0 on success.
47169942Sobrien   Optionally returns a human-readable error message via OutMessage. */
4868349SobrienLLVMBool LLVMGetBitcodeModuleInContext(LLVMContextRef ContextRef,
49103373Sobrien                                       LLVMMemoryBufferRef MemBuf,
5074784Sobrien                                       LLVMModuleRef *OutM,
5174784Sobrien                                       char **OutMessage) {
5274784Sobrien  std::string Message;
53186690Sobrien
54267843Sdelphij  *OutM = wrap(getLazyBitcodeModule(unwrap(MemBuf), *unwrap(ContextRef),
55267843Sdelphij                                    &Message));
56267843Sdelphij  if (!*OutM) {
5768349Sobrien    if (OutMessage)
58267843Sdelphij      *OutMessage = strdup(Message.c_str());
59267843Sdelphij    return 1;
60267843Sdelphij  }
61267843Sdelphij
62267843Sdelphij  return 0;
63267843Sdelphij
6468349Sobrien}
6568349Sobrien
6668349SobrienLLVMBool LLVMGetBitcodeModule(LLVMMemoryBufferRef MemBuf, LLVMModuleRef *OutM,
6768349Sobrien                              char **OutMessage) {
6875937Sobrien  return LLVMGetBitcodeModuleInContext(LLVMGetGlobalContext(), MemBuf, OutM,
6975937Sobrien                                       OutMessage);
7075937Sobrien}
7175937Sobrien
7275937Sobrien/* Deprecated: Use LLVMGetBitcodeModuleInContext instead. */
7375937SobrienLLVMBool LLVMGetBitcodeModuleProviderInContext(LLVMContextRef ContextRef,
7475937Sobrien                                               LLVMMemoryBufferRef MemBuf,
7575937Sobrien                                               LLVMModuleProviderRef *OutMP,
7675937Sobrien                                               char **OutMessage) {
7768349Sobrien  return LLVMGetBitcodeModuleInContext(ContextRef, MemBuf,
7875937Sobrien                                       reinterpret_cast<LLVMModuleRef*>(OutMP),
7975937Sobrien                                       OutMessage);
8075937Sobrien}
8168349Sobrien
8275937Sobrien/* Deprecated: Use LLVMGetBitcodeModule instead. */
8375937SobrienLLVMBool LLVMGetBitcodeModuleProvider(LLVMMemoryBufferRef MemBuf,
8475937Sobrien                                      LLVMModuleProviderRef *OutMP,
8575937Sobrien                                      char **OutMessage) {
86267843Sdelphij  return LLVMGetBitcodeModuleProviderInContext(LLVMGetGlobalContext(), MemBuf,
87267843Sdelphij                                               OutMP, OutMessage);
88267843Sdelphij}
89330569Sgordon