1//===-- BitReader.cpp -----------------------------------------------------===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "llvm-c/BitReader.h"
11#include "llvm/Bitcode/ReaderWriter.h"
12#include "llvm/LLVMContext.h"
13#include "llvm/Support/MemoryBuffer.h"
14#include <string>
15#include <cstring>
16
17using namespace llvm;
18
19/* Builds a module from the bitcode in the specified memory buffer, returning a
20   reference to the module via the OutModule parameter. Returns 0 on success.
21   Optionally returns a human-readable error message via OutMessage. */
22LLVMBool LLVMParseBitcode(LLVMMemoryBufferRef MemBuf,
23                          LLVMModuleRef *OutModule, char **OutMessage) {
24  return LLVMParseBitcodeInContext(wrap(&getGlobalContext()), MemBuf, OutModule,
25                                   OutMessage);
26}
27
28LLVMBool LLVMParseBitcodeInContext(LLVMContextRef ContextRef,
29                                   LLVMMemoryBufferRef MemBuf,
30                                   LLVMModuleRef *OutModule,
31                                   char **OutMessage) {
32  std::string Message;
33
34  *OutModule = wrap(ParseBitcodeFile(unwrap(MemBuf), *unwrap(ContextRef),
35                                     &Message));
36  if (!*OutModule) {
37    if (OutMessage)
38      *OutMessage = strdup(Message.c_str());
39    return 1;
40  }
41
42  return 0;
43}
44
45/* Reads a module from the specified path, returning via the OutModule parameter
46   a module provider which performs lazy deserialization. Returns 0 on success.
47   Optionally returns a human-readable error message via OutMessage. */
48LLVMBool LLVMGetBitcodeModuleInContext(LLVMContextRef ContextRef,
49                                       LLVMMemoryBufferRef MemBuf,
50                                       LLVMModuleRef *OutM,
51                                       char **OutMessage) {
52  std::string Message;
53
54  *OutM = wrap(getLazyBitcodeModule(unwrap(MemBuf), *unwrap(ContextRef),
55                                    &Message));
56  if (!*OutM) {
57    if (OutMessage)
58      *OutMessage = strdup(Message.c_str());
59    return 1;
60  }
61
62  return 0;
63
64}
65
66LLVMBool LLVMGetBitcodeModule(LLVMMemoryBufferRef MemBuf, LLVMModuleRef *OutM,
67                              char **OutMessage) {
68  return LLVMGetBitcodeModuleInContext(LLVMGetGlobalContext(), MemBuf, OutM,
69                                       OutMessage);
70}
71
72/* Deprecated: Use LLVMGetBitcodeModuleInContext instead. */
73LLVMBool LLVMGetBitcodeModuleProviderInContext(LLVMContextRef ContextRef,
74                                               LLVMMemoryBufferRef MemBuf,
75                                               LLVMModuleProviderRef *OutMP,
76                                               char **OutMessage) {
77  return LLVMGetBitcodeModuleInContext(ContextRef, MemBuf,
78                                       reinterpret_cast<LLVMModuleRef*>(OutMP),
79                                       OutMessage);
80}
81
82/* Deprecated: Use LLVMGetBitcodeModule instead. */
83LLVMBool LLVMGetBitcodeModuleProvider(LLVMMemoryBufferRef MemBuf,
84                                      LLVMModuleProviderRef *OutMP,
85                                      char **OutMessage) {
86  return LLVMGetBitcodeModuleProviderInContext(LLVMGetGlobalContext(), MemBuf,
87                                               OutMP, OutMessage);
88}
89