1//===-- BitReader.cpp -----------------------------------------------------===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9 10#include "llvm-c/BitReader.h" 11#include "llvm/Bitcode/ReaderWriter.h" 12#include "llvm/LLVMContext.h" 13#include "llvm/Support/MemoryBuffer.h" 14#include <string> 15#include <cstring> 16 17using namespace llvm; 18 19/* Builds a module from the bitcode in the specified memory buffer, returning a 20 reference to the module via the OutModule parameter. Returns 0 on success. 21 Optionally returns a human-readable error message via OutMessage. */ 22LLVMBool LLVMParseBitcode(LLVMMemoryBufferRef MemBuf, 23 LLVMModuleRef *OutModule, char **OutMessage) { 24 return LLVMParseBitcodeInContext(wrap(&getGlobalContext()), MemBuf, OutModule, 25 OutMessage); 26} 27 28LLVMBool LLVMParseBitcodeInContext(LLVMContextRef ContextRef, 29 LLVMMemoryBufferRef MemBuf, 30 LLVMModuleRef *OutModule, 31 char **OutMessage) { 32 std::string Message; 33 34 *OutModule = wrap(ParseBitcodeFile(unwrap(MemBuf), *unwrap(ContextRef), 35 &Message)); 36 if (!*OutModule) { 37 if (OutMessage) 38 *OutMessage = strdup(Message.c_str()); 39 return 1; 40 } 41 42 return 0; 43} 44 45/* Reads a module from the specified path, returning via the OutModule parameter 46 a module provider which performs lazy deserialization. Returns 0 on success. 47 Optionally returns a human-readable error message via OutMessage. */ 48LLVMBool LLVMGetBitcodeModuleInContext(LLVMContextRef ContextRef, 49 LLVMMemoryBufferRef MemBuf, 50 LLVMModuleRef *OutM, 51 char **OutMessage) { 52 std::string Message; 53 54 *OutM = wrap(getLazyBitcodeModule(unwrap(MemBuf), *unwrap(ContextRef), 55 &Message)); 56 if (!*OutM) { 57 if (OutMessage) 58 *OutMessage = strdup(Message.c_str()); 59 return 1; 60 } 61 62 return 0; 63 64} 65 66LLVMBool LLVMGetBitcodeModule(LLVMMemoryBufferRef MemBuf, LLVMModuleRef *OutM, 67 char **OutMessage) { 68 return LLVMGetBitcodeModuleInContext(LLVMGetGlobalContext(), MemBuf, OutM, 69 OutMessage); 70} 71 72/* Deprecated: Use LLVMGetBitcodeModuleInContext instead. */ 73LLVMBool LLVMGetBitcodeModuleProviderInContext(LLVMContextRef ContextRef, 74 LLVMMemoryBufferRef MemBuf, 75 LLVMModuleProviderRef *OutMP, 76 char **OutMessage) { 77 return LLVMGetBitcodeModuleInContext(ContextRef, MemBuf, 78 reinterpret_cast<LLVMModuleRef*>(OutMP), 79 OutMessage); 80} 81 82/* Deprecated: Use LLVMGetBitcodeModule instead. */ 83LLVMBool LLVMGetBitcodeModuleProvider(LLVMMemoryBufferRef MemBuf, 84 LLVMModuleProviderRef *OutMP, 85 char **OutMessage) { 86 return LLVMGetBitcodeModuleProviderInContext(LLVMGetGlobalContext(), MemBuf, 87 OutMP, OutMessage); 88} 89