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) { 2431d44e49SOwen Anderson std::string Message; 2531d44e49SOwen Anderson 2631d44e49SOwen Anderson *OutModule = wrap(ParseBitcodeFile(unwrap(MemBuf), getGlobalContext(), 2731d44e49SOwen Anderson &Message)); 2831d44e49SOwen Anderson if (!*OutModule) { 2931d44e49SOwen Anderson if (OutMessage) 3031d44e49SOwen Anderson *OutMessage = strdup(Message.c_str()); 3131d44e49SOwen Anderson return 1; 3231d44e49SOwen Anderson } 3331d44e49SOwen Anderson 3431d44e49SOwen Anderson return 0; 3531d44e49SOwen Anderson } 3631d44e49SOwen Anderson 3725963c61SChris Lattner LLVMBool LLVMParseBitcodeInContext(LLVMContextRef ContextRef, 3870ede484SErick Tryzelaar LLVMMemoryBufferRef MemBuf, 3925963c61SChris Lattner LLVMModuleRef *OutModule, 4025963c61SChris Lattner char **OutMessage) { 412b0eed27SGordon Henriksen std::string Message; 422b0eed27SGordon Henriksen 431cf085d5SOwen Anderson *OutModule = wrap(ParseBitcodeFile(unwrap(MemBuf), *unwrap(ContextRef), 446773d388SOwen Anderson &Message)); 452b0eed27SGordon Henriksen if (!*OutModule) { 462b0eed27SGordon Henriksen if (OutMessage) 472b0eed27SGordon Henriksen *OutMessage = strdup(Message.c_str()); 482b0eed27SGordon Henriksen return 1; 492b0eed27SGordon Henriksen } 502b0eed27SGordon Henriksen 512b0eed27SGordon Henriksen return 0; 522b0eed27SGordon Henriksen } 532b0eed27SGordon Henriksen 5434eb6d87SGordon Henriksen /* Reads a module from the specified path, returning via the OutModule parameter 5534eb6d87SGordon Henriksen a module provider which performs lazy deserialization. Returns 0 on success. 5634eb6d87SGordon Henriksen Optionally returns a human-readable error message via OutMessage. */ 5725963c61SChris Lattner LLVMBool LLVMGetBitcodeModuleProvider(LLVMMemoryBufferRef MemBuf, 5834eb6d87SGordon Henriksen LLVMModuleProviderRef *OutMP, 5934eb6d87SGordon Henriksen char **OutMessage) { 6034eb6d87SGordon Henriksen std::string Message; 6134eb6d87SGordon Henriksen 62*091217beSJeffrey Yasskin *OutMP = reinterpret_cast<LLVMModuleProviderRef>( 63*091217beSJeffrey Yasskin getLazyBitcodeModule(unwrap(MemBuf), getGlobalContext(), &Message)); 6431d44e49SOwen Anderson 6531d44e49SOwen Anderson if (!*OutMP) { 6631d44e49SOwen Anderson if (OutMessage) 6731d44e49SOwen Anderson *OutMessage = strdup(Message.c_str()); 6831d44e49SOwen Anderson return 1; 6931d44e49SOwen Anderson } 7031d44e49SOwen Anderson 7131d44e49SOwen Anderson return 0; 7231d44e49SOwen Anderson } 7331d44e49SOwen Anderson 7425963c61SChris Lattner LLVMBool LLVMGetBitcodeModuleProviderInContext(LLVMContextRef ContextRef, 7570ede484SErick Tryzelaar LLVMMemoryBufferRef MemBuf, 7631d44e49SOwen Anderson LLVMModuleProviderRef *OutMP, 7731d44e49SOwen Anderson char **OutMessage) { 7831d44e49SOwen Anderson std::string Message; 7931d44e49SOwen Anderson 80*091217beSJeffrey Yasskin *OutMP = reinterpret_cast<LLVMModuleProviderRef>( 81*091217beSJeffrey Yasskin getLazyBitcodeModule(unwrap(MemBuf), *unwrap(ContextRef), &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