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 LLVMContextRef ContextRef, 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 int LLVMGetBitcodeModuleProviderInContext(LLVMMemoryBufferRef MemBuf, 75 LLVMContextRef ContextRef, 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