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