Path: blob/main/contrib/llvm-project/clang/lib/Serialization/ObjectFilePCHContainerReader.cpp
213764 views
//===--- ObjectFilePCHContainerReader.cpp ---------------------------------===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//78#include "clang/Serialization/ObjectFilePCHContainerReader.h"9#include "llvm/Object/COFF.h"10#include "llvm/Object/ObjectFile.h"1112using namespace clang;1314ArrayRef<StringRef> ObjectFilePCHContainerReader::getFormats() const {15static StringRef Formats[] = {"obj", "raw"};16return Formats;17}1819StringRef20ObjectFilePCHContainerReader::ExtractPCH(llvm::MemoryBufferRef Buffer) const {21StringRef PCH;22auto OFOrErr = llvm::object::ObjectFile::createObjectFile(Buffer);23if (OFOrErr) {24auto &OF = OFOrErr.get();25bool IsCOFF = isa<llvm::object::COFFObjectFile>(*OF);26// Find the clang AST section in the container.27for (auto &Section : OF->sections()) {28StringRef Name;29if (Expected<StringRef> NameOrErr = Section.getName())30Name = *NameOrErr;31else32consumeError(NameOrErr.takeError());3334if ((!IsCOFF && Name == "__clangast") || (IsCOFF && Name == "clangast")) {35if (Expected<StringRef> E = Section.getContents())36return *E;37else {38handleAllErrors(E.takeError(), [&](const llvm::ErrorInfoBase &EIB) {39EIB.log(llvm::errs());40});41return "";42}43}44}45}46handleAllErrors(OFOrErr.takeError(), [&](const llvm::ErrorInfoBase &EIB) {47if (EIB.convertToErrorCode() ==48llvm::object::object_error::invalid_file_type)49// As a fallback, treat the buffer as a raw AST.50PCH = Buffer.getBuffer();51else52EIB.log(llvm::errs());53});54return PCH;55}565758