1932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines//===-- BitReader.cpp -----------------------------------------------------===// 2932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines// 3932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines// The LLVM Compiler Infrastructure 4932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines// 5932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines// This file is distributed under the University of Illinois Open Source 6932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines// License. See LICENSE.TXT for details. 7932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines// 8932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines//===----------------------------------------------------------------------===// 9932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 10932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines#include "llvm-c/BitReader.h" 11932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines#include "llvm/Bitcode/ReaderWriter.h" 12932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines#include "llvm/LLVMContext.h" 13932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines#include "llvm/Support/MemoryBuffer.h" 14932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines#include <string> 15932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines#include <cstring> 16932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 17932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hinesusing namespace llvm; 18932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 19932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines/* Builds a module from the bitcode in the specified memory buffer, returning a 20932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines reference to the module via the OutModule parameter. Returns 0 on success. 21932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines Optionally returns a human-readable error message via OutMessage. */ 22932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen HinesLLVMBool LLVMParseBitcode(LLVMMemoryBufferRef MemBuf, 23932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines LLVMModuleRef *OutModule, char **OutMessage) { 24932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines return LLVMParseBitcodeInContext(wrap(&getGlobalContext()), MemBuf, OutModule, 25932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines OutMessage); 26932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines} 27932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 28932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen HinesLLVMBool LLVMParseBitcodeInContext(LLVMContextRef ContextRef, 29932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines LLVMMemoryBufferRef MemBuf, 30932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines LLVMModuleRef *OutModule, 31932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines char **OutMessage) { 32932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines std::string Message; 33932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 34932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines *OutModule = wrap(ParseBitcodeFile(unwrap(MemBuf), *unwrap(ContextRef), 35932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines &Message)); 36932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines if (!*OutModule) { 37932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines if (OutMessage) 38932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines *OutMessage = strdup(Message.c_str()); 39932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines return 1; 40932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines } 41932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 42932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines return 0; 43932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines} 44932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 45932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines/* Reads a module from the specified path, returning via the OutModule parameter 46932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines a module provider which performs lazy deserialization. Returns 0 on success. 47932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines Optionally returns a human-readable error message via OutMessage. */ 48932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen HinesLLVMBool LLVMGetBitcodeModuleInContext(LLVMContextRef ContextRef, 49932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines LLVMMemoryBufferRef MemBuf, 50932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines LLVMModuleRef *OutM, 51932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines char **OutMessage) { 52932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines std::string Message; 53932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 54932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines *OutM = wrap(getLazyBitcodeModule(unwrap(MemBuf), *unwrap(ContextRef), 55932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines &Message)); 56932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines if (!*OutM) { 57932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines if (OutMessage) 58932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines *OutMessage = strdup(Message.c_str()); 59932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines return 1; 60932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines } 61932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 62932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines return 0; 63932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 64932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines} 65932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 66932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen HinesLLVMBool LLVMGetBitcodeModule(LLVMMemoryBufferRef MemBuf, LLVMModuleRef *OutM, 67932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines char **OutMessage) { 68932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines return LLVMGetBitcodeModuleInContext(LLVMGetGlobalContext(), MemBuf, OutM, 69932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines OutMessage); 70932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines} 71932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 72932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines/* Deprecated: Use LLVMGetBitcodeModuleInContext instead. */ 73932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen HinesLLVMBool LLVMGetBitcodeModuleProviderInContext(LLVMContextRef ContextRef, 74932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines LLVMMemoryBufferRef MemBuf, 75932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines LLVMModuleProviderRef *OutMP, 76932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines char **OutMessage) { 77932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines return LLVMGetBitcodeModuleInContext(ContextRef, MemBuf, 78932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines reinterpret_cast<LLVMModuleRef*>(OutMP), 79932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines OutMessage); 80932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines} 81932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 82932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines/* Deprecated: Use LLVMGetBitcodeModule instead. */ 83932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen HinesLLVMBool LLVMGetBitcodeModuleProvider(LLVMMemoryBufferRef MemBuf, 84932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines LLVMModuleProviderRef *OutMP, 85932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines char **OutMessage) { 86932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines return LLVMGetBitcodeModuleProviderInContext(LLVMGetGlobalContext(), MemBuf, 87932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines OutMP, OutMessage); 88932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines} 89