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