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*3ee23a9eSRafael Espindola #include "llvm/IR/DiagnosticPrinter.h"
139fb823bbSChandler Carruth #include "llvm/IR/LLVMContext.h"
14dec20e43SFilip Pizlo #include "llvm/IR/Module.h"
152b0eed27SGordon Henriksen #include "llvm/Support/MemoryBuffer.h"
16*3ee23a9eSRafael Espindola #include "llvm/Support/raw_ostream.h"
17579f0713SAnton Korobeynikov #include <cstring>
18ed0881b2SChandler Carruth #include <string>
192b0eed27SGordon Henriksen 
202b0eed27SGordon Henriksen using namespace llvm;
212b0eed27SGordon Henriksen 
2234eb6d87SGordon Henriksen /* Builds a module from the bitcode in the specified memory buffer, returning a
2334eb6d87SGordon Henriksen    reference to the module via the OutModule parameter. Returns 0 on success.
2434eb6d87SGordon Henriksen    Optionally returns a human-readable error message via OutMessage. */
2525963c61SChris Lattner LLVMBool LLVMParseBitcode(LLVMMemoryBufferRef MemBuf,
2631d44e49SOwen Anderson                           LLVMModuleRef *OutModule, char **OutMessage) {
27754946c1SDaniel Dunbar   return LLVMParseBitcodeInContext(wrap(&getGlobalContext()), MemBuf, OutModule,
28754946c1SDaniel Dunbar                                    OutMessage);
2931d44e49SOwen Anderson }
3031d44e49SOwen Anderson 
3125963c61SChris Lattner LLVMBool LLVMParseBitcodeInContext(LLVMContextRef ContextRef,
3270ede484SErick Tryzelaar                                    LLVMMemoryBufferRef MemBuf,
3325963c61SChris Lattner                                    LLVMModuleRef *OutModule,
3425963c61SChris Lattner                                    char **OutMessage) {
35*3ee23a9eSRafael Espindola   MemoryBufferRef Buf = unwrap(MemBuf)->getMemBufferRef();
36*3ee23a9eSRafael Espindola   LLVMContext &Ctx = *unwrap(ContextRef);
37*3ee23a9eSRafael Espindola 
38*3ee23a9eSRafael Espindola   std::string Message;
39*3ee23a9eSRafael Espindola   raw_string_ostream Stream(Message);
40*3ee23a9eSRafael Espindola   DiagnosticPrinterRawOStream DP(Stream);
41*3ee23a9eSRafael Espindola 
42*3ee23a9eSRafael Espindola   ErrorOr<Module *> ModuleOrErr = parseBitcodeFile(
43*3ee23a9eSRafael Espindola       Buf, Ctx, [&](const DiagnosticInfo &DI) { DI.print(DP); });
44db4ed0bdSRafael Espindola   if (std::error_code EC = ModuleOrErr.getError()) {
452b0eed27SGordon Henriksen     if (OutMessage)
468f31e213SRafael Espindola       *OutMessage = strdup(EC.message().c_str());
472617dcceSCraig Topper     *OutModule = wrap((Module*)nullptr);
482b0eed27SGordon Henriksen     return 1;
492b0eed27SGordon Henriksen   }
502b0eed27SGordon Henriksen 
518f31e213SRafael Espindola   *OutModule = wrap(ModuleOrErr.get());
522b0eed27SGordon Henriksen   return 0;
532b0eed27SGordon Henriksen }
542b0eed27SGordon Henriksen 
5534eb6d87SGordon Henriksen /* Reads a module from the specified path, returning via the OutModule parameter
5634eb6d87SGordon Henriksen    a module provider which performs lazy deserialization. Returns 0 on success.
5734eb6d87SGordon Henriksen    Optionally returns a human-readable error message via OutMessage. */
58ad0e0cb0SErick Tryzelaar LLVMBool LLVMGetBitcodeModuleInContext(LLVMContextRef ContextRef,
5970ede484SErick Tryzelaar                                        LLVMMemoryBufferRef MemBuf,
60ad0e0cb0SErick Tryzelaar                                        LLVMModuleRef *OutM,
6131d44e49SOwen Anderson                                        char **OutMessage) {
6231d44e49SOwen Anderson   std::string Message;
63e2c1d77fSRafael Espindola   std::unique_ptr<MemoryBuffer> Owner(unwrap(MemBuf));
64e2c1d77fSRafael Espindola 
655b6c1e8eSRafael Espindola   ErrorOr<Module *> ModuleOrErr =
6668812157SRafael Espindola       getLazyBitcodeModule(std::move(Owner), *unwrap(ContextRef));
67e2c1d77fSRafael Espindola   Owner.release();
6831d44e49SOwen Anderson 
69db4ed0bdSRafael Espindola   if (std::error_code EC = ModuleOrErr.getError()) {
702617dcceSCraig Topper     *OutM = wrap((Module *)nullptr);
7134eb6d87SGordon Henriksen     if (OutMessage)
725b6c1e8eSRafael Espindola       *OutMessage = strdup(EC.message().c_str());
7334eb6d87SGordon Henriksen     return 1;
7434eb6d87SGordon Henriksen   }
7534eb6d87SGordon Henriksen 
765b6c1e8eSRafael Espindola   *OutM = wrap(ModuleOrErr.get());
775b6c1e8eSRafael Espindola 
7834eb6d87SGordon Henriksen   return 0;
79ad0e0cb0SErick Tryzelaar 
80ad0e0cb0SErick Tryzelaar }
81ad0e0cb0SErick Tryzelaar 
82ad0e0cb0SErick Tryzelaar LLVMBool LLVMGetBitcodeModule(LLVMMemoryBufferRef MemBuf, LLVMModuleRef *OutM,
83ad0e0cb0SErick Tryzelaar                               char **OutMessage) {
84ad0e0cb0SErick Tryzelaar   return LLVMGetBitcodeModuleInContext(LLVMGetGlobalContext(), MemBuf, OutM,
85ad0e0cb0SErick Tryzelaar                                        OutMessage);
86ad0e0cb0SErick Tryzelaar }
87ad0e0cb0SErick Tryzelaar 
88ad0e0cb0SErick Tryzelaar /* Deprecated: Use LLVMGetBitcodeModuleInContext instead. */
89ad0e0cb0SErick Tryzelaar LLVMBool LLVMGetBitcodeModuleProviderInContext(LLVMContextRef ContextRef,
90ad0e0cb0SErick Tryzelaar                                                LLVMMemoryBufferRef MemBuf,
91ad0e0cb0SErick Tryzelaar                                                LLVMModuleProviderRef *OutMP,
92ad0e0cb0SErick Tryzelaar                                                char **OutMessage) {
93ad0e0cb0SErick Tryzelaar   return LLVMGetBitcodeModuleInContext(ContextRef, MemBuf,
94ad0e0cb0SErick Tryzelaar                                        reinterpret_cast<LLVMModuleRef*>(OutMP),
95ad0e0cb0SErick Tryzelaar                                        OutMessage);
96ad0e0cb0SErick Tryzelaar }
97ad0e0cb0SErick Tryzelaar 
98ad0e0cb0SErick Tryzelaar /* Deprecated: Use LLVMGetBitcodeModule instead. */
99ad0e0cb0SErick Tryzelaar LLVMBool LLVMGetBitcodeModuleProvider(LLVMMemoryBufferRef MemBuf,
100ad0e0cb0SErick Tryzelaar                                       LLVMModuleProviderRef *OutMP,
101ad0e0cb0SErick Tryzelaar                                       char **OutMessage) {
102ad0e0cb0SErick Tryzelaar   return LLVMGetBitcodeModuleProviderInContext(LLVMGetGlobalContext(), MemBuf,
103ad0e0cb0SErick Tryzelaar                                                OutMP, OutMessage);
1042b0eed27SGordon Henriksen }
105