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" 120b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/LLVMContext.h" 1340be1e85665d10f5444186f0e7106e368dd735b8Filip Pizlo#include "llvm/IR/Module.h" 14bbc6597f02d108f32b5bdc7711cc67386196017bGordon Henriksen#include "llvm/Support/MemoryBuffer.h" 15ae9f3a3b7c915f725aef5a7250e88eaeddda03c6Anton Korobeynikov#include <cstring> 16d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include <string> 17bbc6597f02d108f32b5bdc7711cc67386196017bGordon Henriksen 18bbc6597f02d108f32b5bdc7711cc67386196017bGordon Henriksenusing namespace llvm; 19bbc6597f02d108f32b5bdc7711cc67386196017bGordon Henriksen 20da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen/* Builds a module from the bitcode in the specified memory buffer, returning a 21da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen reference to the module via the OutModule parameter. Returns 0 on success. 22d686c8e73f74e37ab5f647b65a12051ee6cbad16Chris Lattner Optionally returns a human-readable error message via OutMessage. */ 23d686c8e73f74e37ab5f647b65a12051ee6cbad16Chris LattnerLLVMBool LLVMParseBitcode(LLVMMemoryBufferRef MemBuf, 24d686c8e73f74e37ab5f647b65a12051ee6cbad16Chris Lattner LLVMModuleRef *OutModule, char **OutMessage) { 25e44fc85bba960ddffc1e8abaf9f919945ed218b9Daniel Dunbar return LLVMParseBitcodeInContext(wrap(&getGlobalContext()), MemBuf, OutModule, 26e44fc85bba960ddffc1e8abaf9f919945ed218b9Daniel Dunbar OutMessage); 27c8897d9c2f9fcee6061a2c2d380028269026a836Owen Anderson} 28c8897d9c2f9fcee6061a2c2d380028269026a836Owen Anderson 29d686c8e73f74e37ab5f647b65a12051ee6cbad16Chris LattnerLLVMBool LLVMParseBitcodeInContext(LLVMContextRef ContextRef, 30d686c8e73f74e37ab5f647b65a12051ee6cbad16Chris Lattner LLVMMemoryBufferRef MemBuf, 31d686c8e73f74e37ab5f647b65a12051ee6cbad16Chris Lattner LLVMModuleRef *OutModule, 32d686c8e73f74e37ab5f647b65a12051ee6cbad16Chris Lattner char **OutMessage) { 3336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines ErrorOr<Module *> ModuleOrErr = 3436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines parseBitcodeFile(unwrap(MemBuf), *unwrap(ContextRef)); 35cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines if (std::error_code EC = ModuleOrErr.getError()) { 36da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen if (OutMessage) 3736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines *OutMessage = strdup(EC.message().c_str()); 38dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines *OutModule = wrap((Module*)nullptr); 39bbc6597f02d108f32b5bdc7711cc67386196017bGordon Henriksen return 1; 40bbc6597f02d108f32b5bdc7711cc67386196017bGordon Henriksen } 41170a15e98dc6900df1ae40d03c5f0622d792fb45Joe Abbey 4236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines *OutModule = wrap(ModuleOrErr.get()); 43da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen return 0; 44da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen} 45da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen 46da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen/* Reads a module from the specified path, returning via the OutModule parameter 47da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen a module provider which performs lazy deserialization. Returns 0 on success. 48170a15e98dc6900df1ae40d03c5f0622d792fb45Joe Abbey Optionally returns a human-readable error message via OutMessage. */ 49df7df075b723e926e51555bf5aff6e231279a479Erick TryzelaarLLVMBool LLVMGetBitcodeModuleInContext(LLVMContextRef ContextRef, 50df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar LLVMMemoryBufferRef MemBuf, 51df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar LLVMModuleRef *OutM, 52df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar char **OutMessage) { 53da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen std::string Message; 5436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines ErrorOr<Module *> ModuleOrErr = 5536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines getLazyBitcodeModule(unwrap(MemBuf), *unwrap(ContextRef)); 56170a15e98dc6900df1ae40d03c5f0622d792fb45Joe Abbey 57cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines if (std::error_code EC = ModuleOrErr.getError()) { 58dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines *OutM = wrap((Module *)nullptr); 59bbc6597f02d108f32b5bdc7711cc67386196017bGordon Henriksen if (OutMessage) 6036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines *OutMessage = strdup(EC.message().c_str()); 61bbc6597f02d108f32b5bdc7711cc67386196017bGordon Henriksen return 1; 62bbc6597f02d108f32b5bdc7711cc67386196017bGordon Henriksen } 63170a15e98dc6900df1ae40d03c5f0622d792fb45Joe Abbey 6436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines *OutM = wrap(ModuleOrErr.get()); 6536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 66bbc6597f02d108f32b5bdc7711cc67386196017bGordon Henriksen return 0; 67df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar 68df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar} 69df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar 70df7df075b723e926e51555bf5aff6e231279a479Erick TryzelaarLLVMBool LLVMGetBitcodeModule(LLVMMemoryBufferRef MemBuf, LLVMModuleRef *OutM, 71df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar char **OutMessage) { 72df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar return LLVMGetBitcodeModuleInContext(LLVMGetGlobalContext(), MemBuf, OutM, 73df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar OutMessage); 74df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar} 75df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar 76df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar/* Deprecated: Use LLVMGetBitcodeModuleInContext instead. */ 77df7df075b723e926e51555bf5aff6e231279a479Erick TryzelaarLLVMBool LLVMGetBitcodeModuleProviderInContext(LLVMContextRef ContextRef, 78df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar LLVMMemoryBufferRef MemBuf, 79df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar LLVMModuleProviderRef *OutMP, 80df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar char **OutMessage) { 81df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar return LLVMGetBitcodeModuleInContext(ContextRef, MemBuf, 82df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar reinterpret_cast<LLVMModuleRef*>(OutMP), 83df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar OutMessage); 84df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar} 85df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar 86df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar/* Deprecated: Use LLVMGetBitcodeModule instead. */ 87df7df075b723e926e51555bf5aff6e231279a479Erick TryzelaarLLVMBool LLVMGetBitcodeModuleProvider(LLVMMemoryBufferRef MemBuf, 88df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar LLVMModuleProviderRef *OutMP, 89df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar char **OutMessage) { 90df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar return LLVMGetBitcodeModuleProviderInContext(LLVMGetGlobalContext(), MemBuf, 91df7df075b723e926e51555bf5aff6e231279a479Erick Tryzelaar OutMP, OutMessage); 92bbc6597f02d108f32b5bdc7711cc67386196017bGordon Henriksen} 93