diff options
author | Chuanqi Xu <yedeng.yd@linux.alibaba.com> | 2024-07-23 23:55:31 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-07-23 23:55:31 +0800 |
commit | d64eccf4335e99360132b724d060d704892fbb02 (patch) | |
tree | a1ea759f651d6507648d44bd6af199da6b098fed /clang/lib/Serialization/ObjectFilePCHContainerReader.cpp | |
parent | a138d754cc1833e624aa89d4ac9fdb2086259e9a (diff) | |
download | llvm-d64eccf4335e99360132b724d060d704892fbb02.zip llvm-d64eccf4335e99360132b724d060d704892fbb02.tar.gz llvm-d64eccf4335e99360132b724d060d704892fbb02.tar.bz2 |
[clang] Split ObjectFilePCHContainerReader from ObjectFilePCHContainerWriter (#99599)
Close https://github.com/llvm/llvm-project/issues/99479
See https://github.com/llvm/llvm-project/issues/99479 for details
Diffstat (limited to 'clang/lib/Serialization/ObjectFilePCHContainerReader.cpp')
-rw-r--r-- | clang/lib/Serialization/ObjectFilePCHContainerReader.cpp | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/clang/lib/Serialization/ObjectFilePCHContainerReader.cpp b/clang/lib/Serialization/ObjectFilePCHContainerReader.cpp new file mode 100644 index 0000000..59fc469 --- /dev/null +++ b/clang/lib/Serialization/ObjectFilePCHContainerReader.cpp @@ -0,0 +1,56 @@ +//===--- ObjectFilePCHContainerReader.cpp ---------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "clang/Serialization/ObjectFilePCHContainerReader.h" +#include "llvm/Object/COFF.h" +#include "llvm/Object/ObjectFile.h" + +using namespace clang; + +ArrayRef<StringRef> ObjectFilePCHContainerReader::getFormats() const { + static StringRef Formats[] = {"obj", "raw"}; + return Formats; +} + +StringRef +ObjectFilePCHContainerReader::ExtractPCH(llvm::MemoryBufferRef Buffer) const { + StringRef PCH; + 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->sections()) { + StringRef Name; + if (Expected<StringRef> NameOrErr = Section.getName()) + Name = *NameOrErr; + else + consumeError(NameOrErr.takeError()); + + if ((!IsCOFF && Name == "__clangast") || (IsCOFF && Name == "clangast")) { + if (Expected<StringRef> E = Section.getContents()) + return *E; + else { + handleAllErrors(E.takeError(), [&](const llvm::ErrorInfoBase &EIB) { + EIB.log(llvm::errs()); + }); + return ""; + } + } + } + } + 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. + PCH = Buffer.getBuffer(); + else + EIB.log(llvm::errs()); + }); + return PCH; +} |