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