BitReader.cpp revision 195340
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. */
22int LLVMParseBitcode(LLVMMemoryBufferRef MemBuf,
23                     LLVMModuleRef *OutModule, char **OutMessage) {
24  std::string Message;
25
26  *OutModule = wrap(ParseBitcodeFile(unwrap(MemBuf), getGlobalContext(),
27                                     &Message));
28  if (!*OutModule) {
29    if (OutMessage)
30      *OutMessage = strdup(Message.c_str());
31    return 1;
32  }
33
34  return 0;
35}
36
37int LLVMParseBitcodeInContext(LLVMMemoryBufferRef MemBuf,
38                              LLVMContextRef ContextRef,
39                              LLVMModuleRef *OutModule, char **OutMessage) {
40  std::string Message;
41
42  *OutModule = wrap(ParseBitcodeFile(unwrap(MemBuf), *unwrap(ContextRef),
43                                     &Message));
44  if (!*OutModule) {
45    if (OutMessage)
46      *OutMessage = strdup(Message.c_str());
47    return 1;
48  }
49
50  return 0;
51}
52
53/* Reads a module from the specified path, returning via the OutModule parameter
54   a module provider which performs lazy deserialization. Returns 0 on success.
55   Optionally returns a human-readable error message via OutMessage. */
56int LLVMGetBitcodeModuleProvider(LLVMMemoryBufferRef MemBuf,
57                                 LLVMModuleProviderRef *OutMP,
58                                  char **OutMessage) {
59  std::string Message;
60
61  *OutMP = wrap(getBitcodeModuleProvider(unwrap(MemBuf), getGlobalContext(),
62                                         &Message));
63
64  if (!*OutMP) {
65    if (OutMessage)
66      *OutMessage = strdup(Message.c_str());
67      return 1;
68  }
69
70  return 0;
71}
72
73int LLVMGetBitcodeModuleProviderInContext(LLVMMemoryBufferRef MemBuf,
74                                          LLVMContextRef ContextRef,
75                                          LLVMModuleProviderRef *OutMP,
76                                          char **OutMessage) {
77  std::string Message;
78
79  *OutMP = wrap(getBitcodeModuleProvider(unwrap(MemBuf), *unwrap(ContextRef),
80                                         &Message));
81  if (!*OutMP) {
82    if (OutMessage)
83      *OutMessage = strdup(Message.c_str());
84    return 1;
85  }
86
87  return 0;
88}
89