LLVM API Documentation

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
IRReader.cpp
Go to the documentation of this file.
1 //===---- IRReader.cpp - Reader for LLVM IR files -------------------------===//
2 //
3 // The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 
10 #include "llvm/IRReader/IRReader.h"
11 #include "llvm/ADT/OwningPtr.h"
12 #include "llvm/Assembly/Parser.h"
14 #include "llvm/IR/LLVMContext.h"
15 #include "llvm/IR/Module.h"
17 #include "llvm/Support/SourceMgr.h"
19 #include "llvm/Support/Timer.h"
21 #include "llvm-c/Core.h"
22 #include "llvm-c/IRReader.h"
23 
24 using namespace llvm;
25 
26 namespace llvm {
27  extern bool TimePassesIsEnabled;
28 }
29 
30 static const char *const TimeIRParsingGroupName = "LLVM IR Parsing";
31 static const char *const TimeIRParsingName = "Parse IR";
32 
33 
35  LLVMContext &Context) {
36  if (isBitcode((const unsigned char *)Buffer->getBufferStart(),
37  (const unsigned char *)Buffer->getBufferEnd())) {
38  std::string ErrMsg;
39  Module *M = getLazyBitcodeModule(Buffer, Context, &ErrMsg);
40  if (M == 0) {
42  ErrMsg);
43  // ParseBitcodeFile does not take ownership of the Buffer in the
44  // case of an error.
45  delete Buffer;
46  }
47  return M;
48  }
49 
50  return ParseAssembly(Buffer, 0, Err, Context);
51 }
52 
53 Module *llvm::getLazyIRFileModule(const std::string &Filename, SMDiagnostic &Err,
54  LLVMContext &Context) {
56  if (error_code ec = MemoryBuffer::getFileOrSTDIN(Filename, File)) {
57  Err = SMDiagnostic(Filename, SourceMgr::DK_Error,
58  "Could not open input file: " + ec.message());
59  return 0;
60  }
61 
62  return getLazyIRModule(File.take(), Err, Context);
63 }
64 
66  LLVMContext &Context) {
69  if (isBitcode((const unsigned char *)Buffer->getBufferStart(),
70  (const unsigned char *)Buffer->getBufferEnd())) {
71  std::string ErrMsg;
72  Module *M = ParseBitcodeFile(Buffer, Context, &ErrMsg);
73  if (M == 0)
75  ErrMsg);
76  // ParseBitcodeFile does not take ownership of the Buffer.
77  delete Buffer;
78  return M;
79  }
80 
81  return ParseAssembly(Buffer, 0, Err, Context);
82 }
83 
84 Module *llvm::ParseIRFile(const std::string &Filename, SMDiagnostic &Err,
85  LLVMContext &Context) {
87  if (error_code ec = MemoryBuffer::getFileOrSTDIN(Filename, File)) {
88  Err = SMDiagnostic(Filename, SourceMgr::DK_Error,
89  "Could not open input file: " + ec.message());
90  return 0;
91  }
92 
93  return ParseIR(File.take(), Err, Context);
94 }
95 
96 //===----------------------------------------------------------------------===//
97 // C API.
98 //===----------------------------------------------------------------------===//
99 
101  LLVMMemoryBufferRef MemBuf, LLVMModuleRef *OutM,
102  char **OutMessage) {
103  SMDiagnostic Diag;
104 
105  *OutM = wrap(ParseIR(unwrap(MemBuf), Diag, *unwrap(ContextRef)));
106 
107  if(!*OutM) {
108  if (OutMessage) {
109  std::string buf;
110  raw_string_ostream os(buf);
111 
112  Diag.print(NULL, os, false);
113  os.flush();
114 
115  *OutMessage = strdup(buf.c_str());
116  }
117  return 1;
118  }
119 
120  return 0;
121 }
const char * getBufferStart() const
Definition: MemoryBuffer.h:51
Module * getLazyBitcodeModule(MemoryBuffer *Buffer, LLVMContext &Context, std::string *ErrMsg=0)
The main container class for the LLVM Intermediate Representation.
Definition: Module.h:112
Module * getLazyIRModule(MemoryBuffer *Buffer, SMDiagnostic &Err, LLVMContext &Context)
Definition: IRReader.cpp:34
int LLVMBool
Definition: Core.h:65
Module * ParseIR(MemoryBuffer *Buffer, SMDiagnostic &Err, LLVMContext &Context)
Definition: IRReader.cpp:65
LLVMContext ** unwrap(LLVMContextRef *Tys)
Definition: LLVMContext.h:119
Module * ParseAssembly(MemoryBuffer *F, Module *M, SMDiagnostic &Err, LLVMContext &Context)
Parse LLVM Assembly from a MemoryBuffer. This function always takes ownership of the MemoryBuffer...
Definition: Parser.cpp:25
virtual const char * getBufferIdentifier() const
Definition: MemoryBuffer.h:61
struct LLVMOpaqueMemoryBuffer * LLVMMemoryBufferRef
Definition: Core.h:122
#define T
static error_code getFileOrSTDIN(StringRef Filename, OwningPtr< MemoryBuffer > &result, int64_t FileSize=-1)
static const char *const TimeIRParsingName
Definition: IRReader.cpp:31
struct LLVMOpaqueContext * LLVMContextRef
Definition: Core.h:72
char *strdup(const char *s1);
Module * ParseIRFile(const std::string &Filename, SMDiagnostic &Err, LLVMContext &Context)
Definition: IRReader.cpp:84
bool isBitcode(const unsigned char *BufPtr, const unsigned char *BufEnd)
Definition: ReaderWriter.h:102
Module * getLazyIRFileModule(const std::string &Filename, SMDiagnostic &Err, LLVMContext &Context)
Definition: IRReader.cpp:53
LLVMContextRef * wrap(const LLVMContext **Tys)
Definition: LLVMContext.h:123
LLVMBool LLVMParseIRInContext(LLVMContextRef ContextRef, LLVMMemoryBufferRef MemBuf, LLVMModuleRef *OutM, char **OutMessage)
Definition: IRReader.cpp:100
void print(const char *ProgName, raw_ostream &S, bool ShowColors=true) const
Definition: SourceMgr.cpp:348
static const char *const TimeIRParsingGroupName
Definition: IRReader.cpp:30
Module * ParseBitcodeFile(MemoryBuffer *Buffer, LLVMContext &Context, std::string *ErrMsg=0)
const char * getBufferEnd() const
Definition: MemoryBuffer.h:52
struct LLVMOpaqueModule * LLVMModuleRef
Definition: Core.h:80
bool TimePassesIsEnabled
This is the storage for the -time-passes option.
Definition: IRReader.cpp:27