BitReader.cpp revision e44fc85bba960ddffc1e8abaf9f919945ed218b9
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. 21d686c8e73f74e37ab5f647b65a12051ee6cbad16Chris Lattner Optionally returns a human-readable error message via OutMessage. */ 22d686c8e73f74e37ab5f647b65a12051ee6cbad16Chris LattnerLLVMBool LLVMParseBitcode(LLVMMemoryBufferRef MemBuf, 23d686c8e73f74e37ab5f647b65a12051ee6cbad16Chris Lattner LLVMModuleRef *OutModule, char **OutMessage) { 24e44fc85bba960ddffc1e8abaf9f919945ed218b9Daniel Dunbar return LLVMParseBitcodeInContext(wrap(&getGlobalContext()), MemBuf, OutModule, 25e44fc85bba960ddffc1e8abaf9f919945ed218b9Daniel Dunbar OutMessage); 26c8897d9c2f9fcee6061a2c2d380028269026a836Owen Anderson} 27c8897d9c2f9fcee6061a2c2d380028269026a836Owen Anderson 28d686c8e73f74e37ab5f647b65a12051ee6cbad16Chris LattnerLLVMBool LLVMParseBitcodeInContext(LLVMContextRef ContextRef, 29d686c8e73f74e37ab5f647b65a12051ee6cbad16Chris Lattner LLVMMemoryBufferRef MemBuf, 30d686c8e73f74e37ab5f647b65a12051ee6cbad16Chris Lattner LLVMModuleRef *OutModule, 31d686c8e73f74e37ab5f647b65a12051ee6cbad16Chris Lattner char **OutMessage) { 32c8897d9c2f9fcee6061a2c2d380028269026a836Owen Anderson std::string Message; 33c8897d9c2f9fcee6061a2c2d380028269026a836Owen Anderson 34ccf9f2b12e3a9bc2e3f7dcee298db6e04b912d3aErick Tryzelaar *OutModule = wrap(ParseBitcodeFile(unwrap(MemBuf), *unwrap(ContextRef), 358b477ed579794ba6d76915d56b3f448a7dd20120Owen Anderson &Message)); 36da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen if (!*OutModule) { 37da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen if (OutMessage) 38bbc6597f02d108f32b5bdc7711cc67386196017bGordon Henriksen *OutMessage = strdup(Message.c_str()); 39bbc6597f02d108f32b5bdc7711cc67386196017bGordon Henriksen return 1; 40bbc6597f02d108f32b5bdc7711cc67386196017bGordon Henriksen } 41bbc6597f02d108f32b5bdc7711cc67386196017bGordon Henriksen 42da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen return 0; 43da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen} 44da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen 45da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen/* Reads a module from the specified path, returning via the OutModule parameter 46da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen a module provider which performs lazy deserialization. Returns 0 on success. 47da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen Optionally returns a human-readable error message via OutMessage. */ 48d686c8e73f74e37ab5f647b65a12051ee6cbad16Chris LattnerLLVMBool LLVMGetBitcodeModuleProvider(LLVMMemoryBufferRef MemBuf, 49d686c8e73f74e37ab5f647b65a12051ee6cbad16Chris Lattner LLVMModuleProviderRef *OutMP, 50d686c8e73f74e37ab5f647b65a12051ee6cbad16Chris Lattner char **OutMessage) { 51e44fc85bba960ddffc1e8abaf9f919945ed218b9Daniel Dunbar return LLVMGetBitcodeModuleProviderInContext(wrap(&getGlobalContext()), 52e44fc85bba960ddffc1e8abaf9f919945ed218b9Daniel Dunbar MemBuf, OutMP, OutMessage); 53c8897d9c2f9fcee6061a2c2d380028269026a836Owen Anderson} 54c8897d9c2f9fcee6061a2c2d380028269026a836Owen Anderson 55d686c8e73f74e37ab5f647b65a12051ee6cbad16Chris LattnerLLVMBool LLVMGetBitcodeModuleProviderInContext(LLVMContextRef ContextRef, 56d686c8e73f74e37ab5f647b65a12051ee6cbad16Chris Lattner LLVMMemoryBufferRef MemBuf, 57d686c8e73f74e37ab5f647b65a12051ee6cbad16Chris Lattner LLVMModuleProviderRef *OutMP, 58d686c8e73f74e37ab5f647b65a12051ee6cbad16Chris Lattner char **OutMessage) { 59da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen std::string Message; 60da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen 61f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin *OutMP = reinterpret_cast<LLVMModuleProviderRef>( 62f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin getLazyBitcodeModule(unwrap(MemBuf), *unwrap(ContextRef), &Message)); 63da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen if (!*OutMP) { 64bbc6597f02d108f32b5bdc7711cc67386196017bGordon Henriksen if (OutMessage) 65bbc6597f02d108f32b5bdc7711cc67386196017bGordon Henriksen *OutMessage = strdup(Message.c_str()); 66bbc6597f02d108f32b5bdc7711cc67386196017bGordon Henriksen return 1; 67bbc6597f02d108f32b5bdc7711cc67386196017bGordon Henriksen } 68bbc6597f02d108f32b5bdc7711cc67386196017bGordon Henriksen 69bbc6597f02d108f32b5bdc7711cc67386196017bGordon Henriksen return 0; 70bbc6597f02d108f32b5bdc7711cc67386196017bGordon Henriksen} 71