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 std::string Message; 25 26 *OutModule = wrap(ParseBitcodeFile(unwrap(MemBuf), getGlobalContext(), 27 &Message)); 28 if (!*OutModule) { 29 if (OutMessage) 30 *OutMessage = strdup(Message.c_str()); 31 return 1; 32 } 33 34 return 0; 35 } 36 37 LLVMBool LLVMParseBitcodeInContext(LLVMContextRef ContextRef, 38 LLVMMemoryBufferRef MemBuf, 39 LLVMModuleRef *OutModule, 40 char **OutMessage) { 41 std::string Message; 42 43 *OutModule = wrap(ParseBitcodeFile(unwrap(MemBuf), *unwrap(ContextRef), 44 &Message)); 45 if (!*OutModule) { 46 if (OutMessage) 47 *OutMessage = strdup(Message.c_str()); 48 return 1; 49 } 50 51 return 0; 52 } 53 54 /* Reads a module from the specified path, returning via the OutModule parameter 55 a module provider which performs lazy deserialization. Returns 0 on success. 56 Optionally returns a human-readable error message via OutMessage. */ 57 LLVMBool LLVMGetBitcodeModuleProvider(LLVMMemoryBufferRef MemBuf, 58 LLVMModuleProviderRef *OutMP, 59 char **OutMessage) { 60 std::string Message; 61 62 *OutMP = wrap(getBitcodeModuleProvider(unwrap(MemBuf), getGlobalContext(), 63 &Message)); 64 65 if (!*OutMP) { 66 if (OutMessage) 67 *OutMessage = strdup(Message.c_str()); 68 return 1; 69 } 70 71 return 0; 72 } 73 74 LLVMBool LLVMGetBitcodeModuleProviderInContext(LLVMContextRef ContextRef, 75 LLVMMemoryBufferRef MemBuf, 76 LLVMModuleProviderRef *OutMP, 77 char **OutMessage) { 78 std::string Message; 79 80 *OutMP = wrap(getBitcodeModuleProvider(unwrap(MemBuf), *unwrap(ContextRef), 81 &Message)); 82 if (!*OutMP) { 83 if (OutMessage) 84 *OutMessage = strdup(Message.c_str()); 85 return 1; 86 } 87 88 return 0; 89 } 90