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"
1231d44e49SOwen 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. */
2225963c61SChris Lattner LLVMBool LLVMParseBitcode(LLVMMemoryBufferRef MemBuf,
2331d44e49SOwen Anderson                           LLVMModuleRef *OutModule, char **OutMessage) {
24*754946c1SDaniel Dunbar   return LLVMParseBitcodeInContext(wrap(&getGlobalContext()), MemBuf, OutModule,
25*754946c1SDaniel Dunbar                                    OutMessage);
2631d44e49SOwen Anderson }
2731d44e49SOwen Anderson 
2825963c61SChris Lattner LLVMBool LLVMParseBitcodeInContext(LLVMContextRef ContextRef,
2970ede484SErick Tryzelaar                                    LLVMMemoryBufferRef MemBuf,
3025963c61SChris Lattner                                    LLVMModuleRef *OutModule,
3125963c61SChris Lattner                                    char **OutMessage) {
322b0eed27SGordon Henriksen   std::string Message;
332b0eed27SGordon Henriksen 
341cf085d5SOwen Anderson   *OutModule = wrap(ParseBitcodeFile(unwrap(MemBuf), *unwrap(ContextRef),
356773d388SOwen Anderson                                      &Message));
362b0eed27SGordon Henriksen   if (!*OutModule) {
372b0eed27SGordon Henriksen     if (OutMessage)
382b0eed27SGordon Henriksen       *OutMessage = strdup(Message.c_str());
392b0eed27SGordon Henriksen     return 1;
402b0eed27SGordon Henriksen   }
412b0eed27SGordon Henriksen 
422b0eed27SGordon Henriksen   return 0;
432b0eed27SGordon Henriksen }
442b0eed27SGordon Henriksen 
4534eb6d87SGordon Henriksen /* Reads a module from the specified path, returning via the OutModule parameter
4634eb6d87SGordon Henriksen    a module provider which performs lazy deserialization. Returns 0 on success.
4734eb6d87SGordon Henriksen    Optionally returns a human-readable error message via OutMessage. */
4825963c61SChris Lattner LLVMBool LLVMGetBitcodeModuleProvider(LLVMMemoryBufferRef MemBuf,
4934eb6d87SGordon Henriksen                                       LLVMModuleProviderRef *OutMP,
5034eb6d87SGordon Henriksen                                       char **OutMessage) {
51*754946c1SDaniel Dunbar   return LLVMGetBitcodeModuleProviderInContext(wrap(&getGlobalContext()),
52*754946c1SDaniel Dunbar                                                MemBuf, OutMP, OutMessage);
5331d44e49SOwen Anderson }
5431d44e49SOwen Anderson 
5525963c61SChris Lattner LLVMBool LLVMGetBitcodeModuleProviderInContext(LLVMContextRef ContextRef,
5670ede484SErick Tryzelaar                                                LLVMMemoryBufferRef MemBuf,
5731d44e49SOwen Anderson                                                LLVMModuleProviderRef *OutMP,
5831d44e49SOwen Anderson                                                char **OutMessage) {
5931d44e49SOwen Anderson   std::string Message;
6031d44e49SOwen Anderson 
61091217beSJeffrey Yasskin   *OutMP = reinterpret_cast<LLVMModuleProviderRef>(
62091217beSJeffrey Yasskin     getLazyBitcodeModule(unwrap(MemBuf), *unwrap(ContextRef), &Message));
6334eb6d87SGordon Henriksen   if (!*OutMP) {
6434eb6d87SGordon Henriksen     if (OutMessage)
6534eb6d87SGordon Henriksen       *OutMessage = strdup(Message.c_str());
6634eb6d87SGordon Henriksen     return 1;
6734eb6d87SGordon Henriksen   }
6834eb6d87SGordon Henriksen 
6934eb6d87SGordon Henriksen   return 0;
702b0eed27SGordon Henriksen }
71