12b0eed27SGordon Henriksen //===-- BitReader.cpp -----------------------------------------------------===//
22b0eed27SGordon Henriksen //
32b0eed27SGordon Henriksen //                     The LLVM Compiler Infrastructure
42b0eed27SGordon Henriksen //
5f3ebc3f3SChris Lattner // This file is distributed under the University of Illinois Open Source
6f3ebc3f3SChris Lattner // License. See LICENSE.TXT for details.
72b0eed27SGordon Henriksen //
82b0eed27SGordon Henriksen //===----------------------------------------------------------------------===//
92b0eed27SGordon Henriksen 
102b0eed27SGordon Henriksen #include "llvm-c/BitReader.h"
112b0eed27SGordon Henriksen #include "llvm/Bitcode/ReaderWriter.h"
12*31d44e49SOwen Anderson #include "llvm/LLVMContext.h"
132b0eed27SGordon Henriksen #include "llvm/Support/MemoryBuffer.h"
142b0eed27SGordon Henriksen #include <string>
15579f0713SAnton Korobeynikov #include <cstring>
162b0eed27SGordon Henriksen 
172b0eed27SGordon Henriksen using namespace llvm;
182b0eed27SGordon Henriksen 
1934eb6d87SGordon Henriksen /* Builds a module from the bitcode in the specified memory buffer, returning a
2034eb6d87SGordon Henriksen    reference to the module via the OutModule parameter. Returns 0 on success.
2134eb6d87SGordon Henriksen    Optionally returns a human-readable error message via OutMessage. */
22*31d44e49SOwen Anderson int LLVMParseBitcode(LLVMMemoryBufferRef MemBuf,
23*31d44e49SOwen Anderson                      LLVMModuleRef *OutModule, char **OutMessage) {
24*31d44e49SOwen Anderson   std::string Message;
25*31d44e49SOwen Anderson 
26*31d44e49SOwen Anderson   *OutModule = wrap(ParseBitcodeFile(unwrap(MemBuf), getGlobalContext(),
27*31d44e49SOwen Anderson                                      &Message));
28*31d44e49SOwen Anderson   if (!*OutModule) {
29*31d44e49SOwen Anderson     if (OutMessage)
30*31d44e49SOwen Anderson       *OutMessage = strdup(Message.c_str());
31*31d44e49SOwen Anderson     return 1;
32*31d44e49SOwen Anderson   }
33*31d44e49SOwen Anderson 
34*31d44e49SOwen Anderson   return 0;
35*31d44e49SOwen Anderson }
36*31d44e49SOwen Anderson 
37*31d44e49SOwen Anderson int LLVMParseBitcodeInContext(LLVMMemoryBufferRef MemBuf,
38*31d44e49SOwen Anderson                               LLVMContextRef ContextRef,
3934eb6d87SGordon Henriksen                               LLVMModuleRef *OutModule, char **OutMessage) {
402b0eed27SGordon Henriksen   std::string Message;
412b0eed27SGordon Henriksen 
421cf085d5SOwen Anderson   *OutModule = wrap(ParseBitcodeFile(unwrap(MemBuf), *unwrap(ContextRef),
436773d388SOwen Anderson                                      &Message));
442b0eed27SGordon Henriksen   if (!*OutModule) {
452b0eed27SGordon Henriksen     if (OutMessage)
462b0eed27SGordon Henriksen       *OutMessage = strdup(Message.c_str());
472b0eed27SGordon Henriksen     return 1;
482b0eed27SGordon Henriksen   }
492b0eed27SGordon Henriksen 
502b0eed27SGordon Henriksen   return 0;
512b0eed27SGordon Henriksen }
522b0eed27SGordon Henriksen 
5334eb6d87SGordon Henriksen /* Reads a module from the specified path, returning via the OutModule parameter
5434eb6d87SGordon Henriksen    a module provider which performs lazy deserialization. Returns 0 on success.
5534eb6d87SGordon Henriksen    Optionally returns a human-readable error message via OutMessage. */
5634eb6d87SGordon Henriksen int LLVMGetBitcodeModuleProvider(LLVMMemoryBufferRef MemBuf,
576773d388SOwen Anderson                                  LLVMContextRef ContextRef,
5834eb6d87SGordon Henriksen                                  LLVMModuleProviderRef *OutMP,
5934eb6d87SGordon Henriksen                                   char **OutMessage) {
6034eb6d87SGordon Henriksen   std::string Message;
6134eb6d87SGordon Henriksen 
62*31d44e49SOwen Anderson   *OutMP = wrap(getBitcodeModuleProvider(unwrap(MemBuf), getGlobalContext(),
63*31d44e49SOwen Anderson                                          &Message));
64*31d44e49SOwen Anderson 
65*31d44e49SOwen Anderson   if (!*OutMP) {
66*31d44e49SOwen Anderson     if (OutMessage)
67*31d44e49SOwen Anderson       *OutMessage = strdup(Message.c_str());
68*31d44e49SOwen Anderson       return 1;
69*31d44e49SOwen Anderson   }
70*31d44e49SOwen Anderson 
71*31d44e49SOwen Anderson   return 0;
72*31d44e49SOwen Anderson }
73*31d44e49SOwen Anderson 
74*31d44e49SOwen Anderson int LLVMGetBitcodeModuleProviderInContext(LLVMMemoryBufferRef MemBuf,
75*31d44e49SOwen Anderson                                           LLVMContextRef ContextRef,
76*31d44e49SOwen Anderson                                           LLVMModuleProviderRef *OutMP,
77*31d44e49SOwen Anderson                                           char **OutMessage) {
78*31d44e49SOwen Anderson   std::string Message;
79*31d44e49SOwen Anderson 
801cf085d5SOwen Anderson   *OutMP = wrap(getBitcodeModuleProvider(unwrap(MemBuf), *unwrap(ContextRef),
816773d388SOwen Anderson                                          &Message));
8234eb6d87SGordon Henriksen   if (!*OutMP) {
8334eb6d87SGordon Henriksen     if (OutMessage)
8434eb6d87SGordon Henriksen       *OutMessage = strdup(Message.c_str());
8534eb6d87SGordon Henriksen     return 1;
8634eb6d87SGordon Henriksen   }
8734eb6d87SGordon Henriksen 
8834eb6d87SGordon Henriksen   return 0;
892b0eed27SGordon Henriksen }
90