diff options
author | Adrian Prantl <aprantl@apple.com> | 2016-08-17 23:13:53 +0000 |
---|---|---|
committer | Adrian Prantl <aprantl@apple.com> | 2016-08-17 23:13:53 +0000 |
commit | 576b2dbec5c737020a95e46b70d9111200b5f9e7 (patch) | |
tree | 897ae705b6ecac65abd3677dbca70f6b39109f61 /clang/lib/CodeGen/ObjectFilePCHContainerOperations.cpp | |
parent | 0e3bde821611bed2947beeccaaf4f5f26bcdddbf (diff) | |
download | llvm-576b2dbec5c737020a95e46b70d9111200b5f9e7.zip llvm-576b2dbec5c737020a95e46b70d9111200b5f9e7.tar.gz llvm-576b2dbec5c737020a95e46b70d9111200b5f9e7.tar.bz2 |
Support object-file-wrapped modules in clang -module-file-info.
rdar://problem/24504815
llvm-svn: 279004
Diffstat (limited to 'clang/lib/CodeGen/ObjectFilePCHContainerOperations.cpp')
-rw-r--r-- | clang/lib/CodeGen/ObjectFilePCHContainerOperations.cpp | 30 |
1 files changed, 17 insertions, 13 deletions
diff --git a/clang/lib/CodeGen/ObjectFilePCHContainerOperations.cpp b/clang/lib/CodeGen/ObjectFilePCHContainerOperations.cpp index de40e41..f2090f9 100644 --- a/clang/lib/CodeGen/ObjectFilePCHContainerOperations.cpp +++ b/clang/lib/CodeGen/ObjectFilePCHContainerOperations.cpp @@ -314,25 +314,29 @@ ObjectFilePCHContainerWriter::CreatePCHContainerGenerator( void ObjectFilePCHContainerReader::ExtractPCH( llvm::MemoryBufferRef Buffer, llvm::BitstreamReader &StreamFile) const { - if (auto OF = llvm::object::ObjectFile::createObjectFile(Buffer)) { - auto *Obj = OF.get().get(); - bool IsCOFF = isa<llvm::object::COFFObjectFile>(Obj); + auto OFOrErr = llvm::object::ObjectFile::createObjectFile(Buffer); + if (OFOrErr) { + auto &OF = OFOrErr.get(); + bool IsCOFF = isa<llvm::object::COFFObjectFile>(*OF); // Find the clang AST section in the container. - for (auto &Section : OF->get()->sections()) { + for (auto &Section : OF->sections()) { StringRef Name; Section.getName(Name); - if ((!IsCOFF && Name == "__clangast") || - ( IsCOFF && Name == "clangast")) { + if ((!IsCOFF && Name == "__clangast") || (IsCOFF && Name == "clangast")) { StringRef Buf; Section.getContents(Buf); - StreamFile.init((const unsigned char *)Buf.begin(), - (const unsigned char *)Buf.end()); - return; + return StreamFile.init((const unsigned char *)Buf.begin(), + (const unsigned char *)Buf.end()); } } } - - // As a fallback, treat the buffer as a raw AST. - StreamFile.init((const unsigned char *)Buffer.getBufferStart(), - (const unsigned char *)Buffer.getBufferEnd()); + handleAllErrors(OFOrErr.takeError(), [&](const llvm::ErrorInfoBase &EIB) { + if (EIB.convertToErrorCode() == + llvm::object::object_error::invalid_file_type) + // As a fallback, treat the buffer as a raw AST. + StreamFile.init((const unsigned char *)Buffer.getBufferStart(), + (const unsigned char *)Buffer.getBufferEnd()); + else + EIB.log(llvm::errs()); + }); } |