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