IRReader.cpp (276479) | IRReader.cpp (280031) |
---|---|
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//===----------------------------------------------------------------------===// --- 15 unchanged lines hidden (view full) --- 24 25namespace llvm { 26 extern bool TimePassesIsEnabled; 27} 28 29static const char *const TimeIRParsingGroupName = "LLVM IR Parsing"; 30static const char *const TimeIRParsingName = "Parse IR"; 31 | 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//===----------------------------------------------------------------------===// --- 15 unchanged lines hidden (view full) --- 24 25namespace llvm { 26 extern bool TimePassesIsEnabled; 27} 28 29static const char *const TimeIRParsingGroupName = "LLVM IR Parsing"; 30static const char *const TimeIRParsingName = "Parse IR"; 31 |
32static Module *getLazyIRModule(MemoryBuffer *Buffer, SMDiagnostic &Err, 33 LLVMContext &Context) { | 32static std::unique_ptr<Module> 33getLazyIRModule(std::unique_ptr<MemoryBuffer> Buffer, SMDiagnostic &Err, 34 LLVMContext &Context) { |
34 if (isBitcode((const unsigned char *)Buffer->getBufferStart(), 35 (const unsigned char *)Buffer->getBufferEnd())) { | 35 if (isBitcode((const unsigned char *)Buffer->getBufferStart(), 36 (const unsigned char *)Buffer->getBufferEnd())) { |
36 std::string ErrMsg; 37 ErrorOr<Module *> ModuleOrErr = getLazyBitcodeModule(Buffer, Context); | 37 ErrorOr<Module *> ModuleOrErr = 38 getLazyBitcodeModule(std::move(Buffer), Context); |
38 if (std::error_code EC = ModuleOrErr.getError()) { 39 Err = SMDiagnostic(Buffer->getBufferIdentifier(), SourceMgr::DK_Error, 40 EC.message()); | 39 if (std::error_code EC = ModuleOrErr.getError()) { 40 Err = SMDiagnostic(Buffer->getBufferIdentifier(), SourceMgr::DK_Error, 41 EC.message()); |
41 // getLazyBitcodeModule does not take ownership of the Buffer in the 42 // case of an error. 43 delete Buffer; | |
44 return nullptr; 45 } | 42 return nullptr; 43 } |
46 return ModuleOrErr.get(); | 44 return std::unique_ptr<Module>(ModuleOrErr.get()); |
47 } 48 | 45 } 46 |
49 return ParseAssembly(Buffer, nullptr, Err, Context); | 47 return parseAssembly(Buffer->getMemBufferRef(), Err, Context); |
50} 51 | 48} 49 |
52Module *llvm::getLazyIRFileModule(const std::string &Filename, SMDiagnostic &Err, 53 LLVMContext &Context) { | 50std::unique_ptr<Module> llvm::getLazyIRFileModule(StringRef Filename, 51 SMDiagnostic &Err, 52 LLVMContext &Context) { |
54 ErrorOr<std::unique_ptr<MemoryBuffer>> FileOrErr = 55 MemoryBuffer::getFileOrSTDIN(Filename); 56 if (std::error_code EC = FileOrErr.getError()) { 57 Err = SMDiagnostic(Filename, SourceMgr::DK_Error, 58 "Could not open input file: " + EC.message()); 59 return nullptr; 60 } 61 | 53 ErrorOr<std::unique_ptr<MemoryBuffer>> FileOrErr = 54 MemoryBuffer::getFileOrSTDIN(Filename); 55 if (std::error_code EC = FileOrErr.getError()) { 56 Err = SMDiagnostic(Filename, SourceMgr::DK_Error, 57 "Could not open input file: " + EC.message()); 58 return nullptr; 59 } 60 |
62 return getLazyIRModule(FileOrErr.get().release(), Err, Context); | 61 return getLazyIRModule(std::move(FileOrErr.get()), Err, Context); |
63} 64 | 62} 63 |
65Module *llvm::ParseIR(MemoryBuffer *Buffer, SMDiagnostic &Err, 66 LLVMContext &Context) { | 64std::unique_ptr<Module> llvm::parseIR(MemoryBufferRef Buffer, SMDiagnostic &Err, 65 LLVMContext &Context) { |
67 NamedRegionTimer T(TimeIRParsingName, TimeIRParsingGroupName, 68 TimePassesIsEnabled); | 66 NamedRegionTimer T(TimeIRParsingName, TimeIRParsingGroupName, 67 TimePassesIsEnabled); |
69 if (isBitcode((const unsigned char *)Buffer->getBufferStart(), 70 (const unsigned char *)Buffer->getBufferEnd())) { | 68 if (isBitcode((const unsigned char *)Buffer.getBufferStart(), 69 (const unsigned char *)Buffer.getBufferEnd())) { |
71 ErrorOr<Module *> ModuleOrErr = parseBitcodeFile(Buffer, Context); | 70 ErrorOr<Module *> ModuleOrErr = parseBitcodeFile(Buffer, Context); |
72 Module *M = nullptr; 73 if (std::error_code EC = ModuleOrErr.getError()) 74 Err = SMDiagnostic(Buffer->getBufferIdentifier(), SourceMgr::DK_Error, | 71 if (std::error_code EC = ModuleOrErr.getError()) { 72 Err = SMDiagnostic(Buffer.getBufferIdentifier(), SourceMgr::DK_Error, |
75 EC.message()); | 73 EC.message()); |
76 else 77 M = ModuleOrErr.get(); 78 // parseBitcodeFile does not take ownership of the Buffer. 79 return M; | 74 return nullptr; 75 } 76 return std::unique_ptr<Module>(ModuleOrErr.get()); |
80 } 81 | 77 } 78 |
82 return ParseAssembly(MemoryBuffer::getMemBuffer( 83 Buffer->getBuffer(), Buffer->getBufferIdentifier()), 84 nullptr, Err, Context); | 79 return parseAssembly(Buffer, Err, Context); |
85} 86 | 80} 81 |
87Module *llvm::ParseIRFile(const std::string &Filename, SMDiagnostic &Err, 88 LLVMContext &Context) { | 82std::unique_ptr<Module> llvm::parseIRFile(StringRef Filename, SMDiagnostic &Err, 83 LLVMContext &Context) { |
89 ErrorOr<std::unique_ptr<MemoryBuffer>> FileOrErr = 90 MemoryBuffer::getFileOrSTDIN(Filename); 91 if (std::error_code EC = FileOrErr.getError()) { 92 Err = SMDiagnostic(Filename, SourceMgr::DK_Error, 93 "Could not open input file: " + EC.message()); 94 return nullptr; 95 } 96 | 84 ErrorOr<std::unique_ptr<MemoryBuffer>> FileOrErr = 85 MemoryBuffer::getFileOrSTDIN(Filename); 86 if (std::error_code EC = FileOrErr.getError()) { 87 Err = SMDiagnostic(Filename, SourceMgr::DK_Error, 88 "Could not open input file: " + EC.message()); 89 return nullptr; 90 } 91 |
97 return ParseIR(FileOrErr.get().get(), Err, Context); | 92 return parseIR(FileOrErr.get()->getMemBufferRef(), Err, Context); |
98} 99 100//===----------------------------------------------------------------------===// 101// C API. 102//===----------------------------------------------------------------------===// 103 104LLVMBool LLVMParseIRInContext(LLVMContextRef ContextRef, 105 LLVMMemoryBufferRef MemBuf, LLVMModuleRef *OutM, 106 char **OutMessage) { 107 SMDiagnostic Diag; 108 109 std::unique_ptr<MemoryBuffer> MB(unwrap(MemBuf)); | 93} 94 95//===----------------------------------------------------------------------===// 96// C API. 97//===----------------------------------------------------------------------===// 98 99LLVMBool LLVMParseIRInContext(LLVMContextRef ContextRef, 100 LLVMMemoryBufferRef MemBuf, LLVMModuleRef *OutM, 101 char **OutMessage) { 102 SMDiagnostic Diag; 103 104 std::unique_ptr<MemoryBuffer> MB(unwrap(MemBuf)); |
110 *OutM = wrap(ParseIR(MB.get(), Diag, *unwrap(ContextRef))); | 105 *OutM = 106 wrap(parseIR(MB->getMemBufferRef(), Diag, *unwrap(ContextRef)).release()); |
111 112 if(!*OutM) { 113 if (OutMessage) { 114 std::string buf; 115 raw_string_ostream os(buf); 116 117 Diag.print(nullptr, os, false); 118 os.flush(); 119 120 *OutMessage = strdup(buf.c_str()); 121 } 122 return 1; 123 } 124 125 return 0; 126} | 107 108 if(!*OutM) { 109 if (OutMessage) { 110 std::string buf; 111 raw_string_ostream os(buf); 112 113 Diag.print(nullptr, os, false); 114 os.flush(); 115 116 *OutMessage = strdup(buf.c_str()); 117 } 118 return 1; 119 } 120 121 return 0; 122} |