1932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines//===-- BitReader.cpp -----------------------------------------------------===//
2932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines//
3932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines//                     The LLVM Compiler Infrastructure
4932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines//
5932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines// This file is distributed under the University of Illinois Open Source
6932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines// License. See LICENSE.TXT for details.
7932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines//
8932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines//===----------------------------------------------------------------------===//
9932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines
10932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines#include "llvm-c/BitReader.h"
11932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines#include "llvm/Bitcode/ReaderWriter.h"
12932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines#include "llvm/LLVMContext.h"
13932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines#include "llvm/Support/MemoryBuffer.h"
14932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines#include <string>
15932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines#include <cstring>
16932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines
17932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hinesusing namespace llvm;
18932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines
19932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines/* Builds a module from the bitcode in the specified memory buffer, returning a
20932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines   reference to the module via the OutModule parameter. Returns 0 on success.
21932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines   Optionally returns a human-readable error message via OutMessage. */
22932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen HinesLLVMBool LLVMParseBitcode(LLVMMemoryBufferRef MemBuf,
23932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines                          LLVMModuleRef *OutModule, char **OutMessage) {
24932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines  return LLVMParseBitcodeInContext(wrap(&getGlobalContext()), MemBuf, OutModule,
25932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines                                   OutMessage);
26932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines}
27932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines
28932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen HinesLLVMBool LLVMParseBitcodeInContext(LLVMContextRef ContextRef,
29932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines                                   LLVMMemoryBufferRef MemBuf,
30932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines                                   LLVMModuleRef *OutModule,
31932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines                                   char **OutMessage) {
32932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines  std::string Message;
33932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines
34932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines  *OutModule = wrap(ParseBitcodeFile(unwrap(MemBuf), *unwrap(ContextRef),
35932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines                                     &Message));
36932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines  if (!*OutModule) {
37932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines    if (OutMessage)
38932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines      *OutMessage = strdup(Message.c_str());
39932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines    return 1;
40932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines  }
41932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines
42932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines  return 0;
43932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines}
44932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines
45932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines/* Reads a module from the specified path, returning via the OutModule parameter
46932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines   a module provider which performs lazy deserialization. Returns 0 on success.
47932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines   Optionally returns a human-readable error message via OutMessage. */
48932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen HinesLLVMBool LLVMGetBitcodeModuleInContext(LLVMContextRef ContextRef,
49932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines                                       LLVMMemoryBufferRef MemBuf,
50932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines                                       LLVMModuleRef *OutM,
51932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines                                       char **OutMessage) {
52932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines  std::string Message;
53932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines
54932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines  *OutM = wrap(getLazyBitcodeModule(unwrap(MemBuf), *unwrap(ContextRef),
55932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines                                    &Message));
56932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines  if (!*OutM) {
57932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines    if (OutMessage)
58932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines      *OutMessage = strdup(Message.c_str());
59932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines    return 1;
60932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines  }
61932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines
62932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines  return 0;
63932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines
64932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines}
65932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines
66932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen HinesLLVMBool LLVMGetBitcodeModule(LLVMMemoryBufferRef MemBuf, LLVMModuleRef *OutM,
67932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines                              char **OutMessage) {
68932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines  return LLVMGetBitcodeModuleInContext(LLVMGetGlobalContext(), MemBuf, OutM,
69932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines                                       OutMessage);
70932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines}
71932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines
72932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines/* Deprecated: Use LLVMGetBitcodeModuleInContext instead. */
73932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen HinesLLVMBool LLVMGetBitcodeModuleProviderInContext(LLVMContextRef ContextRef,
74932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines                                               LLVMMemoryBufferRef MemBuf,
75932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines                                               LLVMModuleProviderRef *OutMP,
76932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines                                               char **OutMessage) {
77932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines  return LLVMGetBitcodeModuleInContext(ContextRef, MemBuf,
78932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines                                       reinterpret_cast<LLVMModuleRef*>(OutMP),
79932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines                                       OutMessage);
80932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines}
81932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines
82932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines/* Deprecated: Use LLVMGetBitcodeModule instead. */
83932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen HinesLLVMBool LLVMGetBitcodeModuleProvider(LLVMMemoryBufferRef MemBuf,
84932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines                                      LLVMModuleProviderRef *OutMP,
85932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines                                      char **OutMessage) {
86932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines  return LLVMGetBitcodeModuleProviderInContext(LLVMGetGlobalContext(), MemBuf,
87932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines                                               OutMP, OutMessage);
88932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines}
89