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