BitReader.cpp revision e44fc85bba960ddffc1e8abaf9f919945ed218b9
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"
12c8897d9c2f9fcee6061a2c2d380028269026a836Owen Anderson#include "llvm/LLVMContext.h"
13bbc6597f02d108f32b5bdc7711cc67386196017bGordon Henriksen#include "llvm/Support/MemoryBuffer.h"
14bbc6597f02d108f32b5bdc7711cc67386196017bGordon Henriksen#include <string>
15ae9f3a3b7c915f725aef5a7250e88eaeddda03c6Anton Korobeynikov#include <cstring>
16bbc6597f02d108f32b5bdc7711cc67386196017bGordon Henriksen
17bbc6597f02d108f32b5bdc7711cc67386196017bGordon Henriksenusing namespace llvm;
18bbc6597f02d108f32b5bdc7711cc67386196017bGordon Henriksen
19da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen/* Builds a module from the bitcode in the specified memory buffer, returning a
20da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen   reference to the module via the OutModule parameter. Returns 0 on success.
21d686c8e73f74e37ab5f647b65a12051ee6cbad16Chris Lattner   Optionally returns a human-readable error message via OutMessage. */
22d686c8e73f74e37ab5f647b65a12051ee6cbad16Chris LattnerLLVMBool LLVMParseBitcode(LLVMMemoryBufferRef MemBuf,
23d686c8e73f74e37ab5f647b65a12051ee6cbad16Chris Lattner                          LLVMModuleRef *OutModule, char **OutMessage) {
24e44fc85bba960ddffc1e8abaf9f919945ed218b9Daniel Dunbar  return LLVMParseBitcodeInContext(wrap(&getGlobalContext()), MemBuf, OutModule,
25e44fc85bba960ddffc1e8abaf9f919945ed218b9Daniel Dunbar                                   OutMessage);
26c8897d9c2f9fcee6061a2c2d380028269026a836Owen Anderson}
27c8897d9c2f9fcee6061a2c2d380028269026a836Owen Anderson
28d686c8e73f74e37ab5f647b65a12051ee6cbad16Chris LattnerLLVMBool LLVMParseBitcodeInContext(LLVMContextRef ContextRef,
29d686c8e73f74e37ab5f647b65a12051ee6cbad16Chris Lattner                                   LLVMMemoryBufferRef MemBuf,
30d686c8e73f74e37ab5f647b65a12051ee6cbad16Chris Lattner                                   LLVMModuleRef *OutModule,
31d686c8e73f74e37ab5f647b65a12051ee6cbad16Chris Lattner                                   char **OutMessage) {
32c8897d9c2f9fcee6061a2c2d380028269026a836Owen Anderson  std::string Message;
33c8897d9c2f9fcee6061a2c2d380028269026a836Owen Anderson
34ccf9f2b12e3a9bc2e3f7dcee298db6e04b912d3aErick Tryzelaar  *OutModule = wrap(ParseBitcodeFile(unwrap(MemBuf), *unwrap(ContextRef),
358b477ed579794ba6d76915d56b3f448a7dd20120Owen Anderson                                     &Message));
36da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  if (!*OutModule) {
37da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen    if (OutMessage)
38bbc6597f02d108f32b5bdc7711cc67386196017bGordon Henriksen      *OutMessage = strdup(Message.c_str());
39bbc6597f02d108f32b5bdc7711cc67386196017bGordon Henriksen    return 1;
40bbc6597f02d108f32b5bdc7711cc67386196017bGordon Henriksen  }
41bbc6597f02d108f32b5bdc7711cc67386196017bGordon Henriksen
42da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  return 0;
43da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen}
44da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen
45da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen/* Reads a module from the specified path, returning via the OutModule parameter
46da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen   a module provider which performs lazy deserialization. Returns 0 on success.
47da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen   Optionally returns a human-readable error message via OutMessage. */
48d686c8e73f74e37ab5f647b65a12051ee6cbad16Chris LattnerLLVMBool LLVMGetBitcodeModuleProvider(LLVMMemoryBufferRef MemBuf,
49d686c8e73f74e37ab5f647b65a12051ee6cbad16Chris Lattner                                      LLVMModuleProviderRef *OutMP,
50d686c8e73f74e37ab5f647b65a12051ee6cbad16Chris Lattner                                      char **OutMessage) {
51e44fc85bba960ddffc1e8abaf9f919945ed218b9Daniel Dunbar  return LLVMGetBitcodeModuleProviderInContext(wrap(&getGlobalContext()),
52e44fc85bba960ddffc1e8abaf9f919945ed218b9Daniel Dunbar                                               MemBuf, OutMP, OutMessage);
53c8897d9c2f9fcee6061a2c2d380028269026a836Owen Anderson}
54c8897d9c2f9fcee6061a2c2d380028269026a836Owen Anderson
55d686c8e73f74e37ab5f647b65a12051ee6cbad16Chris LattnerLLVMBool LLVMGetBitcodeModuleProviderInContext(LLVMContextRef ContextRef,
56d686c8e73f74e37ab5f647b65a12051ee6cbad16Chris Lattner                                               LLVMMemoryBufferRef MemBuf,
57d686c8e73f74e37ab5f647b65a12051ee6cbad16Chris Lattner                                               LLVMModuleProviderRef *OutMP,
58d686c8e73f74e37ab5f647b65a12051ee6cbad16Chris Lattner                                               char **OutMessage) {
59da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  std::string Message;
60da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen
61f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin  *OutMP = reinterpret_cast<LLVMModuleProviderRef>(
62f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin    getLazyBitcodeModule(unwrap(MemBuf), *unwrap(ContextRef), &Message));
63da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  if (!*OutMP) {
64bbc6597f02d108f32b5bdc7711cc67386196017bGordon Henriksen    if (OutMessage)
65bbc6597f02d108f32b5bdc7711cc67386196017bGordon Henriksen      *OutMessage = strdup(Message.c_str());
66bbc6597f02d108f32b5bdc7711cc67386196017bGordon Henriksen    return 1;
67bbc6597f02d108f32b5bdc7711cc67386196017bGordon Henriksen  }
68bbc6597f02d108f32b5bdc7711cc67386196017bGordon Henriksen
69bbc6597f02d108f32b5bdc7711cc67386196017bGordon Henriksen  return 0;
70bbc6597f02d108f32b5bdc7711cc67386196017bGordon Henriksen}
71