1bbc6597f02d108f32b5bdc7711cc67386196017bGordon Henriksen//===-- BitReader.cpp -----------------------------------------------------===//
2bbc6597f02d108f32b5bdc7711cc67386196017bGordon Henriksen//
3bbc6597f02d108f32b5bdc7711cc67386196017bGordon Henriksen//                     The LLVM Compiler Infrastructure
4bbc6597f02d108f32b5bdc7711cc67386196017bGordon Henriksen//
54ee451de366474b9c228b4e5fa573795a715216dChris Lattner// This file is distributed under the University of Illinois Open Source
64ee451de366474b9c228b4e5fa573795a715216dChris Lattner// License. See LICENSE.TXT for details.
7bbc6597f02d108f32b5bdc7711cc67386196017bGordon Henriksen//
8bbc6597f02d108f32b5bdc7711cc67386196017bGordon Henriksen//===----------------------------------------------------------------------===//
9bbc6597f02d108f32b5bdc7711cc67386196017bGordon Henriksen
10bbc6597f02d108f32b5bdc7711cc67386196017bGordon Henriksen#include "llvm-c/BitReader.h"
11bbc6597f02d108f32b5bdc7711cc67386196017bGordon Henriksen#include "llvm/Bitcode/ReaderWriter.h"
120b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/LLVMContext.h"
1340be1e85665d10f5444186f0e7106e368dd735b8Filip Pizlo#include "llvm/IR/Module.h"
14bbc6597f02d108f32b5bdc7711cc67386196017bGordon Henriksen#include "llvm/Support/MemoryBuffer.h"
15ae9f3a3b7c915f725aef5a7250e88eaeddda03c6Anton Korobeynikov#include <cstring>
16d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include <string>
17bbc6597f02d108f32b5bdc7711cc67386196017bGordon Henriksen
18bbc6597f02d108f32b5bdc7711cc67386196017bGordon Henriksenusing namespace llvm;
19bbc6597f02d108f32b5bdc7711cc67386196017bGordon Henriksen
20da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen/* Builds a module from the bitcode in the specified memory buffer, returning a
21da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen   reference to the module via the OutModule parameter. Returns 0 on success.
22d686c8e73f74e37ab5f647b65a12051ee6cbad16Chris Lattner   Optionally returns a human-readable error message via OutMessage. */
23d686c8e73f74e37ab5f647b65a12051ee6cbad16Chris LattnerLLVMBool LLVMParseBitcode(LLVMMemoryBufferRef MemBuf,
24d686c8e73f74e37ab5f647b65a12051ee6cbad16Chris Lattner                          LLVMModuleRef *OutModule, char **OutMessage) {
25e44fc85bba960ddffc1e8abaf9f919945ed218b9Daniel Dunbar  return LLVMParseBitcodeInContext(wrap(&getGlobalContext()), MemBuf, OutModule,
26e44fc85bba960ddffc1e8abaf9f919945ed218b9Daniel Dunbar                                   OutMessage);
27c8897d9c2f9fcee6061a2c2d380028269026a836Owen Anderson}
28c8897d9c2f9fcee6061a2c2d380028269026a836Owen Anderson
29d686c8e73f74e37ab5f647b65a12051ee6cbad16Chris LattnerLLVMBool LLVMParseBitcodeInContext(LLVMContextRef ContextRef,
30d686c8e73f74e37ab5f647b65a12051ee6cbad16Chris Lattner                                   LLVMMemoryBufferRef MemBuf,
31d686c8e73f74e37ab5f647b65a12051ee6cbad16Chris Lattner                                   LLVMModuleRef *OutModule,
32d686c8e73f74e37ab5f647b65a12051ee6cbad16Chris Lattner                                   char **OutMessage) {
3336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  ErrorOr<Module *> ModuleOrErr =
3436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      parseBitcodeFile(unwrap(MemBuf), *unwrap(ContextRef));
35cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  if (std::error_code EC = ModuleOrErr.getError()) {
36da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen    if (OutMessage)
3736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      *OutMessage = strdup(EC.message().c_str());
38dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    *OutModule = wrap((Module*)nullptr);
39bbc6597f02d108f32b5bdc7711cc67386196017bGordon Henriksen    return 1;
40bbc6597f02d108f32b5bdc7711cc67386196017bGordon Henriksen  }
41170a15e98dc6900df1ae40d03c5f0622d792fb45Joe Abbey
4236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  *OutModule = wrap(ModuleOrErr.get());
43da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  return 0;
44da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen}
45da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen
46da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen/* Reads a module from the specified path, returning via the OutModule parameter
47da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen   a module provider which performs lazy deserialization. Returns 0 on success.
48170a15e98dc6900df1ae40d03c5f0622d792fb45Joe Abbey   Optionally returns a human-readable error message via OutMessage. */
49df7df075b723e926e51555bf5aff6e231279a479Erick TryzelaarLLVMBool LLVMGetBitcodeModuleInContext(LLVMContextRef ContextRef,
50df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar                                       LLVMMemoryBufferRef MemBuf,
51df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar                                       LLVMModuleRef *OutM,
52df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar                                       char **OutMessage) {
53da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  std::string Message;
5436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  ErrorOr<Module *> ModuleOrErr =
5536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      getLazyBitcodeModule(unwrap(MemBuf), *unwrap(ContextRef));
56170a15e98dc6900df1ae40d03c5f0622d792fb45Joe Abbey
57cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  if (std::error_code EC = ModuleOrErr.getError()) {
58dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    *OutM = wrap((Module *)nullptr);
59bbc6597f02d108f32b5bdc7711cc67386196017bGordon Henriksen    if (OutMessage)
6036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      *OutMessage = strdup(EC.message().c_str());
61bbc6597f02d108f32b5bdc7711cc67386196017bGordon Henriksen    return 1;
62bbc6597f02d108f32b5bdc7711cc67386196017bGordon Henriksen  }
63170a15e98dc6900df1ae40d03c5f0622d792fb45Joe Abbey
6436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  *OutM = wrap(ModuleOrErr.get());
6536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
66bbc6597f02d108f32b5bdc7711cc67386196017bGordon Henriksen  return 0;
67df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar
68df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar}
69df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar
70df7df075b723e926e51555bf5aff6e231279a479Erick TryzelaarLLVMBool LLVMGetBitcodeModule(LLVMMemoryBufferRef MemBuf, LLVMModuleRef *OutM,
71df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar                              char **OutMessage) {
72df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar  return LLVMGetBitcodeModuleInContext(LLVMGetGlobalContext(), MemBuf, OutM,
73df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar                                       OutMessage);
74df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar}
75df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar
76df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar/* Deprecated: Use LLVMGetBitcodeModuleInContext instead. */
77df7df075b723e926e51555bf5aff6e231279a479Erick TryzelaarLLVMBool LLVMGetBitcodeModuleProviderInContext(LLVMContextRef ContextRef,
78df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar                                               LLVMMemoryBufferRef MemBuf,
79df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar                                               LLVMModuleProviderRef *OutMP,
80df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar                                               char **OutMessage) {
81df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar  return LLVMGetBitcodeModuleInContext(ContextRef, MemBuf,
82df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar                                       reinterpret_cast<LLVMModuleRef*>(OutMP),
83df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar                                       OutMessage);
84df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar}
85df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar
86df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar/* Deprecated: Use LLVMGetBitcodeModule instead. */
87df7df075b723e926e51555bf5aff6e231279a479Erick TryzelaarLLVMBool LLVMGetBitcodeModuleProvider(LLVMMemoryBufferRef MemBuf,
88df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar                                      LLVMModuleProviderRef *OutMP,
89df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar                                      char **OutMessage) {
90df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar  return LLVMGetBitcodeModuleProviderInContext(LLVMGetGlobalContext(), MemBuf,
91df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar                                               OutMP, OutMessage);
92bbc6597f02d108f32b5bdc7711cc67386196017bGordon Henriksen}
93