BitReader.cpp revision ccf9f2b12e3a9bc2e3f7dcee298db6e04b912d3a
1bbc6597f02d108f32b5bdc7711cc67386196017bGordon Henriksen//===-- BitReader.cpp -----------------------------------------------------===// 2bbc6597f02d108f32b5bdc7711cc67386196017bGordon Henriksen// 3bbc6597f02d108f32b5bdc7711cc67386196017bGordon Henriksen// The LLVM Compiler Infrastructure 4bbc6597f02d108f32b5bdc7711cc67386196017bGordon Henriksen// 54ee451de366474b9c228b4e5fa573795a715216dChris Lattner// This file is distributed under the University of Illinois Open Source 64ee451de366474b9c228b4e5fa573795a715216dChris Lattner// License. See LICENSE.TXT for details. 7bbc6597f02d108f32b5bdc7711cc67386196017bGordon Henriksen// 8bbc6597f02d108f32b5bdc7711cc67386196017bGordon Henriksen//===----------------------------------------------------------------------===// 9bbc6597f02d108f32b5bdc7711cc67386196017bGordon Henriksen 10bbc6597f02d108f32b5bdc7711cc67386196017bGordon Henriksen#include "llvm-c/BitReader.h" 11bbc6597f02d108f32b5bdc7711cc67386196017bGordon Henriksen#include "llvm/Bitcode/ReaderWriter.h" 12c8897d9c2f9fcee6061a2c2d380028269026a836Owen Anderson#include "llvm/LLVMContext.h" 13bbc6597f02d108f32b5bdc7711cc67386196017bGordon Henriksen#include "llvm/Support/MemoryBuffer.h" 14bbc6597f02d108f32b5bdc7711cc67386196017bGordon Henriksen#include <string> 15ae9f3a3b7c915f725aef5a7250e88eaeddda03c6Anton Korobeynikov#include <cstring> 16bbc6597f02d108f32b5bdc7711cc67386196017bGordon Henriksen 17bbc6597f02d108f32b5bdc7711cc67386196017bGordon Henriksenusing namespace llvm; 18bbc6597f02d108f32b5bdc7711cc67386196017bGordon Henriksen 19da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen/* Builds a module from the bitcode in the specified memory buffer, returning a 20da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen reference to the module via the OutModule parameter. Returns 0 on success. 21da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen Optionally returns a human-readable error message via OutMessage. */ 22c8897d9c2f9fcee6061a2c2d380028269026a836Owen Andersonint LLVMParseBitcode(LLVMMemoryBufferRef MemBuf, 23da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen LLVMModuleRef *OutModule, char **OutMessage) { 24bbc6597f02d108f32b5bdc7711cc67386196017bGordon Henriksen std::string Message; 25bbc6597f02d108f32b5bdc7711cc67386196017bGordon Henriksen 26c8897d9c2f9fcee6061a2c2d380028269026a836Owen Anderson *OutModule = wrap(ParseBitcodeFile(unwrap(MemBuf), getGlobalContext(), 27c8897d9c2f9fcee6061a2c2d380028269026a836Owen Anderson &Message)); 28c8897d9c2f9fcee6061a2c2d380028269026a836Owen Anderson if (!*OutModule) { 29c8897d9c2f9fcee6061a2c2d380028269026a836Owen Anderson if (OutMessage) 30c8897d9c2f9fcee6061a2c2d380028269026a836Owen Anderson *OutMessage = strdup(Message.c_str()); 31c8897d9c2f9fcee6061a2c2d380028269026a836Owen Anderson return 1; 32c8897d9c2f9fcee6061a2c2d380028269026a836Owen Anderson } 33c8897d9c2f9fcee6061a2c2d380028269026a836Owen Anderson 34c8897d9c2f9fcee6061a2c2d380028269026a836Owen Anderson return 0; 35c8897d9c2f9fcee6061a2c2d380028269026a836Owen Anderson} 36c8897d9c2f9fcee6061a2c2d380028269026a836Owen Anderson 37ccf9f2b12e3a9bc2e3f7dcee298db6e04b912d3aErick Tryzelaarint LLVMParseBitcodeInContext(LLVMContextRef ContextRef, 38ccf9f2b12e3a9bc2e3f7dcee298db6e04b912d3aErick Tryzelaar LLVMMemoryBufferRef MemBuf, 39c8897d9c2f9fcee6061a2c2d380028269026a836Owen Anderson LLVMModuleRef *OutModule, char **OutMessage) { 40c8897d9c2f9fcee6061a2c2d380028269026a836Owen Anderson std::string Message; 41c8897d9c2f9fcee6061a2c2d380028269026a836Owen Anderson 42ccf9f2b12e3a9bc2e3f7dcee298db6e04b912d3aErick Tryzelaar *OutModule = wrap(ParseBitcodeFile(unwrap(MemBuf), *unwrap(ContextRef), 438b477ed579794ba6d76915d56b3f448a7dd20120Owen Anderson &Message)); 44da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen if (!*OutModule) { 45da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen if (OutMessage) 46bbc6597f02d108f32b5bdc7711cc67386196017bGordon Henriksen *OutMessage = strdup(Message.c_str()); 47bbc6597f02d108f32b5bdc7711cc67386196017bGordon Henriksen return 1; 48bbc6597f02d108f32b5bdc7711cc67386196017bGordon Henriksen } 49bbc6597f02d108f32b5bdc7711cc67386196017bGordon Henriksen 50da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen return 0; 51da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen} 52da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen 53da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen/* Reads a module from the specified path, returning via the OutModule parameter 54da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen a module provider which performs lazy deserialization. Returns 0 on success. 55da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen Optionally returns a human-readable error message via OutMessage. */ 56da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksenint LLVMGetBitcodeModuleProvider(LLVMMemoryBufferRef MemBuf, 57da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen LLVMModuleProviderRef *OutMP, 58c8897d9c2f9fcee6061a2c2d380028269026a836Owen Anderson char **OutMessage) { 59c8897d9c2f9fcee6061a2c2d380028269026a836Owen Anderson std::string Message; 60c8897d9c2f9fcee6061a2c2d380028269026a836Owen Anderson 61c8897d9c2f9fcee6061a2c2d380028269026a836Owen Anderson *OutMP = wrap(getBitcodeModuleProvider(unwrap(MemBuf), getGlobalContext(), 62c8897d9c2f9fcee6061a2c2d380028269026a836Owen Anderson &Message)); 63c8897d9c2f9fcee6061a2c2d380028269026a836Owen Anderson 64c8897d9c2f9fcee6061a2c2d380028269026a836Owen Anderson if (!*OutMP) { 65c8897d9c2f9fcee6061a2c2d380028269026a836Owen Anderson if (OutMessage) 66c8897d9c2f9fcee6061a2c2d380028269026a836Owen Anderson *OutMessage = strdup(Message.c_str()); 67c8897d9c2f9fcee6061a2c2d380028269026a836Owen Anderson return 1; 68c8897d9c2f9fcee6061a2c2d380028269026a836Owen Anderson } 69c8897d9c2f9fcee6061a2c2d380028269026a836Owen Anderson 70c8897d9c2f9fcee6061a2c2d380028269026a836Owen Anderson return 0; 71c8897d9c2f9fcee6061a2c2d380028269026a836Owen Anderson} 72c8897d9c2f9fcee6061a2c2d380028269026a836Owen Anderson 73ccf9f2b12e3a9bc2e3f7dcee298db6e04b912d3aErick Tryzelaarint LLVMGetBitcodeModuleProviderInContext(LLVMContextRef ContextRef, 74ccf9f2b12e3a9bc2e3f7dcee298db6e04b912d3aErick Tryzelaar LLVMMemoryBufferRef MemBuf, 75c8897d9c2f9fcee6061a2c2d380028269026a836Owen Anderson LLVMModuleProviderRef *OutMP, 76c8897d9c2f9fcee6061a2c2d380028269026a836Owen Anderson char **OutMessage) { 77da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen std::string Message; 78da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen 79ccf9f2b12e3a9bc2e3f7dcee298db6e04b912d3aErick Tryzelaar *OutMP = wrap(getBitcodeModuleProvider(unwrap(MemBuf), *unwrap(ContextRef), 808b477ed579794ba6d76915d56b3f448a7dd20120Owen Anderson &Message)); 81da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen if (!*OutMP) { 82bbc6597f02d108f32b5bdc7711cc67386196017bGordon Henriksen if (OutMessage) 83bbc6597f02d108f32b5bdc7711cc67386196017bGordon Henriksen *OutMessage = strdup(Message.c_str()); 84bbc6597f02d108f32b5bdc7711cc67386196017bGordon Henriksen return 1; 85bbc6597f02d108f32b5bdc7711cc67386196017bGordon Henriksen } 86bbc6597f02d108f32b5bdc7711cc67386196017bGordon Henriksen 87bbc6597f02d108f32b5bdc7711cc67386196017bGordon Henriksen return 0; 88bbc6597f02d108f32b5bdc7711cc67386196017bGordon Henriksen} 89