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 17 using 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. */ 22 LLVMBool LLVMParseBitcode(LLVMMemoryBufferRef MemBuf, 23 LLVMModuleRef *OutModule, char **OutMessage) { 24 return LLVMParseBitcodeInContext(wrap(&getGlobalContext()), MemBuf, OutModule, 25 OutMessage); 26 } 27 28 LLVMBool 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. */ 48 LLVMBool LLVMGetBitcodeModuleProvider(LLVMMemoryBufferRef MemBuf, 49 LLVMModuleProviderRef *OutMP, 50 char **OutMessage) { 51 return LLVMGetBitcodeModuleProviderInContext(wrap(&getGlobalContext()), 52 MemBuf, OutMP, OutMessage); 53 } 54 55 LLVMBool LLVMGetBitcodeModuleProviderInContext(LLVMContextRef ContextRef, 56 LLVMMemoryBufferRef MemBuf, 57 LLVMModuleProviderRef *OutMP, 58 char **OutMessage) { 59 std::string Message; 60 61 *OutMP = reinterpret_cast<LLVMModuleProviderRef>( 62 getLazyBitcodeModule(unwrap(MemBuf), *unwrap(ContextRef), &Message)); 63 if (!*OutMP) { 64 if (OutMessage) 65 *OutMessage = strdup(Message.c_str()); 66 return 1; 67 } 68 69 return 0; 70 } 71