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