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" 129fb823bbSChandler Carruth #include "llvm/IR/LLVMContext.h" 13dec20e43SFilip Pizlo #include "llvm/IR/Module.h" 142b0eed27SGordon Henriksen #include "llvm/Support/MemoryBuffer.h" 15579f0713SAnton Korobeynikov #include <cstring> 16ed0881b2SChandler Carruth #include <string> 172b0eed27SGordon Henriksen 182b0eed27SGordon Henriksen using namespace llvm; 192b0eed27SGordon Henriksen 2034eb6d87SGordon Henriksen /* Builds a module from the bitcode in the specified memory buffer, returning a 2134eb6d87SGordon Henriksen reference to the module via the OutModule parameter. Returns 0 on success. 2234eb6d87SGordon Henriksen Optionally returns a human-readable error message via OutMessage. */ 2325963c61SChris Lattner LLVMBool LLVMParseBitcode(LLVMMemoryBufferRef MemBuf, 2431d44e49SOwen Anderson LLVMModuleRef *OutModule, char **OutMessage) { 25754946c1SDaniel Dunbar return LLVMParseBitcodeInContext(wrap(&getGlobalContext()), MemBuf, OutModule, 26754946c1SDaniel Dunbar OutMessage); 2731d44e49SOwen Anderson } 2831d44e49SOwen Anderson 2925963c61SChris Lattner LLVMBool LLVMParseBitcodeInContext(LLVMContextRef ContextRef, 3070ede484SErick Tryzelaar LLVMMemoryBufferRef MemBuf, 3125963c61SChris Lattner LLVMModuleRef *OutModule, 3225963c61SChris Lattner char **OutMessage) { 338f31e213SRafael Espindola ErrorOr<Module *> ModuleOrErr = 34d96d553dSRafael Espindola parseBitcodeFile(unwrap(MemBuf)->getMemBufferRef(), *unwrap(ContextRef)); 35db4ed0bdSRafael Espindola if (std::error_code EC = ModuleOrErr.getError()) { 362b0eed27SGordon Henriksen if (OutMessage) 378f31e213SRafael Espindola *OutMessage = strdup(EC.message().c_str()); 382617dcceSCraig Topper *OutModule = wrap((Module*)nullptr); 392b0eed27SGordon Henriksen return 1; 402b0eed27SGordon Henriksen } 412b0eed27SGordon Henriksen 428f31e213SRafael Espindola *OutModule = wrap(ModuleOrErr.get()); 432b0eed27SGordon Henriksen return 0; 442b0eed27SGordon Henriksen } 452b0eed27SGordon Henriksen 4634eb6d87SGordon Henriksen /* Reads a module from the specified path, returning via the OutModule parameter 4734eb6d87SGordon Henriksen a module provider which performs lazy deserialization. Returns 0 on success. 4834eb6d87SGordon Henriksen Optionally returns a human-readable error message via OutMessage. */ 49ad0e0cb0SErick Tryzelaar LLVMBool LLVMGetBitcodeModuleInContext(LLVMContextRef ContextRef, 5070ede484SErick Tryzelaar LLVMMemoryBufferRef MemBuf, 51ad0e0cb0SErick Tryzelaar LLVMModuleRef *OutM, 5231d44e49SOwen Anderson char **OutMessage) { 5331d44e49SOwen Anderson std::string Message; 54*e2c1d77fSRafael Espindola std::unique_ptr<MemoryBuffer> Owner(unwrap(MemBuf)); 55*e2c1d77fSRafael Espindola 565b6c1e8eSRafael Espindola ErrorOr<Module *> ModuleOrErr = 57*e2c1d77fSRafael Espindola getLazyBitcodeModule(Owner, *unwrap(ContextRef)); 58*e2c1d77fSRafael Espindola Owner.release(); 5931d44e49SOwen Anderson 60db4ed0bdSRafael Espindola if (std::error_code EC = ModuleOrErr.getError()) { 612617dcceSCraig Topper *OutM = wrap((Module *)nullptr); 6234eb6d87SGordon Henriksen if (OutMessage) 635b6c1e8eSRafael Espindola *OutMessage = strdup(EC.message().c_str()); 6434eb6d87SGordon Henriksen return 1; 6534eb6d87SGordon Henriksen } 6634eb6d87SGordon Henriksen 675b6c1e8eSRafael Espindola *OutM = wrap(ModuleOrErr.get()); 685b6c1e8eSRafael Espindola 6934eb6d87SGordon Henriksen return 0; 70ad0e0cb0SErick Tryzelaar 71ad0e0cb0SErick Tryzelaar } 72ad0e0cb0SErick Tryzelaar 73ad0e0cb0SErick Tryzelaar LLVMBool LLVMGetBitcodeModule(LLVMMemoryBufferRef MemBuf, LLVMModuleRef *OutM, 74ad0e0cb0SErick Tryzelaar char **OutMessage) { 75ad0e0cb0SErick Tryzelaar return LLVMGetBitcodeModuleInContext(LLVMGetGlobalContext(), MemBuf, OutM, 76ad0e0cb0SErick Tryzelaar OutMessage); 77ad0e0cb0SErick Tryzelaar } 78ad0e0cb0SErick Tryzelaar 79ad0e0cb0SErick Tryzelaar /* Deprecated: Use LLVMGetBitcodeModuleInContext instead. */ 80ad0e0cb0SErick Tryzelaar LLVMBool LLVMGetBitcodeModuleProviderInContext(LLVMContextRef ContextRef, 81ad0e0cb0SErick Tryzelaar LLVMMemoryBufferRef MemBuf, 82ad0e0cb0SErick Tryzelaar LLVMModuleProviderRef *OutMP, 83ad0e0cb0SErick Tryzelaar char **OutMessage) { 84ad0e0cb0SErick Tryzelaar return LLVMGetBitcodeModuleInContext(ContextRef, MemBuf, 85ad0e0cb0SErick Tryzelaar reinterpret_cast<LLVMModuleRef*>(OutMP), 86ad0e0cb0SErick Tryzelaar OutMessage); 87ad0e0cb0SErick Tryzelaar } 88ad0e0cb0SErick Tryzelaar 89ad0e0cb0SErick Tryzelaar /* Deprecated: Use LLVMGetBitcodeModule instead. */ 90ad0e0cb0SErick Tryzelaar LLVMBool LLVMGetBitcodeModuleProvider(LLVMMemoryBufferRef MemBuf, 91ad0e0cb0SErick Tryzelaar LLVMModuleProviderRef *OutMP, 92ad0e0cb0SErick Tryzelaar char **OutMessage) { 93ad0e0cb0SErick Tryzelaar return LLVMGetBitcodeModuleProviderInContext(LLVMGetGlobalContext(), MemBuf, 94ad0e0cb0SErick Tryzelaar OutMP, OutMessage); 952b0eed27SGordon Henriksen } 96