IRReader.cpp revision 249259
1249259Sdim//===---- IRReader.cpp - Reader for LLVM IR files -------------------------===// 2249259Sdim// 3249259Sdim// The LLVM Compiler Infrastructure 4249259Sdim// 5249259Sdim// This file is distributed under the University of Illinois Open Source 6249259Sdim// License. See LICENSE.TXT for details. 7249259Sdim// 8249259Sdim//===----------------------------------------------------------------------===// 9249259Sdim 10249259Sdim#include "llvm/IRReader/IRReader.h" 11249259Sdim#include "llvm/ADT/OwningPtr.h" 12249259Sdim#include "llvm/Assembly/Parser.h" 13249259Sdim#include "llvm/Bitcode/ReaderWriter.h" 14249259Sdim#include "llvm/Support/MemoryBuffer.h" 15249259Sdim#include "llvm/Support/SourceMgr.h" 16249259Sdim#include "llvm/Support/system_error.h" 17249259Sdim#include "llvm/Support/Timer.h" 18249259Sdim 19249259Sdimusing namespace llvm; 20249259Sdim 21249259Sdimnamespace llvm { 22249259Sdim extern bool TimePassesIsEnabled; 23249259Sdim} 24249259Sdim 25249259Sdimstatic const char *TimeIRParsingGroupName = "LLVM IR Parsing"; 26249259Sdimstatic const char *TimeIRParsingName = "Parse IR"; 27249259Sdim 28249259Sdim 29249259SdimModule *llvm::getLazyIRModule(MemoryBuffer *Buffer, SMDiagnostic &Err, 30249259Sdim LLVMContext &Context) { 31249259Sdim if (isBitcode((const unsigned char *)Buffer->getBufferStart(), 32249259Sdim (const unsigned char *)Buffer->getBufferEnd())) { 33249259Sdim std::string ErrMsg; 34249259Sdim Module *M = getLazyBitcodeModule(Buffer, Context, &ErrMsg); 35249259Sdim if (M == 0) { 36249259Sdim Err = SMDiagnostic(Buffer->getBufferIdentifier(), SourceMgr::DK_Error, 37249259Sdim ErrMsg); 38249259Sdim // ParseBitcodeFile does not take ownership of the Buffer in the 39249259Sdim // case of an error. 40249259Sdim delete Buffer; 41249259Sdim } 42249259Sdim return M; 43249259Sdim } 44249259Sdim 45249259Sdim return ParseAssembly(Buffer, 0, Err, Context); 46249259Sdim} 47249259Sdim 48249259SdimModule *llvm::getLazyIRFileModule(const std::string &Filename, SMDiagnostic &Err, 49249259Sdim LLVMContext &Context) { 50249259Sdim OwningPtr<MemoryBuffer> File; 51249259Sdim if (error_code ec = MemoryBuffer::getFileOrSTDIN(Filename.c_str(), File)) { 52249259Sdim Err = SMDiagnostic(Filename, SourceMgr::DK_Error, 53249259Sdim "Could not open input file: " + ec.message()); 54249259Sdim return 0; 55249259Sdim } 56249259Sdim 57249259Sdim return getLazyIRModule(File.take(), Err, Context); 58249259Sdim} 59249259Sdim 60249259SdimModule *llvm::ParseIR(MemoryBuffer *Buffer, SMDiagnostic &Err, 61249259Sdim LLVMContext &Context) { 62249259Sdim NamedRegionTimer T(TimeIRParsingName, TimeIRParsingGroupName, 63249259Sdim TimePassesIsEnabled); 64249259Sdim if (isBitcode((const unsigned char *)Buffer->getBufferStart(), 65249259Sdim (const unsigned char *)Buffer->getBufferEnd())) { 66249259Sdim std::string ErrMsg; 67249259Sdim Module *M = ParseBitcodeFile(Buffer, Context, &ErrMsg); 68249259Sdim if (M == 0) 69249259Sdim Err = SMDiagnostic(Buffer->getBufferIdentifier(), SourceMgr::DK_Error, 70249259Sdim ErrMsg); 71249259Sdim // ParseBitcodeFile does not take ownership of the Buffer. 72249259Sdim delete Buffer; 73249259Sdim return M; 74249259Sdim } 75249259Sdim 76249259Sdim return ParseAssembly(Buffer, 0, Err, Context); 77249259Sdim} 78249259Sdim 79249259SdimModule *llvm::ParseIRFile(const std::string &Filename, SMDiagnostic &Err, 80249259Sdim LLVMContext &Context) { 81249259Sdim OwningPtr<MemoryBuffer> File; 82249259Sdim if (error_code ec = MemoryBuffer::getFileOrSTDIN(Filename.c_str(), File)) { 83249259Sdim Err = SMDiagnostic(Filename, SourceMgr::DK_Error, 84249259Sdim "Could not open input file: " + ec.message()); 85249259Sdim return 0; 86249259Sdim } 87249259Sdim 88249259Sdim return ParseIR(File.take(), Err, Context); 89249259Sdim} 90