[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
This commit is contained in:
parent
a138d754cc
commit
d64eccf433
@ -1,4 +1,4 @@
|
||||
//===-- CodeGen/ObjectFilePCHContainerOperations.h - ------------*- C++ -*-===//
|
||||
//===-- CodeGen/ObjectFilePCHContainerWriter.h ------------------*- C++ -*-===//
|
||||
//
|
||||
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
||||
// See https://llvm.org/LICENSE.txt for license information.
|
||||
@ -29,14 +29,6 @@ class ObjectFilePCHContainerWriter : public PCHContainerWriter {
|
||||
std::shared_ptr<PCHBuffer> Buffer) const override;
|
||||
};
|
||||
|
||||
/// A PCHContainerReader implementation that uses LLVM to
|
||||
/// wraps Clang modules inside a COFF, ELF, or Mach-O container.
|
||||
class ObjectFilePCHContainerReader : public PCHContainerReader {
|
||||
ArrayRef<StringRef> getFormats() const override;
|
||||
|
||||
/// Returns the serialized AST inside the PCH container Buffer.
|
||||
StringRef ExtractPCH(llvm::MemoryBufferRef Buffer) const override;
|
||||
};
|
||||
}
|
||||
|
||||
#endif
|
@ -0,0 +1,25 @@
|
||||
//===-- Serialization/ObjectFilePCHContainerReader.h ------------*- C++ -*-===//
|
||||
//
|
||||
// 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
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#ifndef LLVM_CLANG_SERIALIZATION_OBJECTFILEPCHCONTAINERREADER_H
|
||||
#define LLVM_CLANG_SERIALIZATION_OBJECTFILEPCHCONTAINERREADER_H
|
||||
|
||||
#include "clang/Frontend/PCHContainerOperations.h"
|
||||
|
||||
namespace clang {
|
||||
/// A PCHContainerReader implementation that uses LLVM to
|
||||
/// wraps Clang modules inside a COFF, ELF, or Mach-O container.
|
||||
class ObjectFilePCHContainerReader : public PCHContainerReader {
|
||||
ArrayRef<StringRef> getFormats() const override;
|
||||
|
||||
/// Returns the serialized AST inside the PCH container Buffer.
|
||||
StringRef ExtractPCH(llvm::MemoryBufferRef Buffer) const override;
|
||||
};
|
||||
} // namespace clang
|
||||
|
||||
#endif
|
@ -110,7 +110,7 @@ add_clang_library(clangCodeGen
|
||||
MacroPPCallbacks.cpp
|
||||
MicrosoftCXXABI.cpp
|
||||
ModuleBuilder.cpp
|
||||
ObjectFilePCHContainerOperations.cpp
|
||||
ObjectFilePCHContainerWriter.cpp
|
||||
PatternInit.cpp
|
||||
SanitizerMetadata.cpp
|
||||
SwiftCallingConv.cpp
|
||||
|
@ -1,4 +1,4 @@
|
||||
//===--- ObjectFilePCHContainerOperations.cpp -----------------------------===//
|
||||
//===--- ObjectFilePCHContainerWriter.cpp -----------------------------===//
|
||||
//
|
||||
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
||||
// See https://llvm.org/LICENSE.txt for license information.
|
||||
@ -6,7 +6,7 @@
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include "clang/CodeGen/ObjectFilePCHContainerOperations.h"
|
||||
#include "clang/CodeGen/ObjectFilePCHContainerWriter.h"
|
||||
#include "CGDebugInfo.h"
|
||||
#include "CodeGenModule.h"
|
||||
#include "clang/AST/ASTContext.h"
|
||||
@ -351,46 +351,3 @@ ObjectFilePCHContainerWriter::CreatePCHContainerGenerator(
|
||||
return std::make_unique<PCHContainerGenerator>(
|
||||
CI, MainFileName, OutputFileName, std::move(OS), Buffer);
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
@ -26,7 +26,7 @@
|
||||
#include "clang/Basic/TargetInfo.h"
|
||||
#include "clang/CodeGen/CodeGenAction.h"
|
||||
#include "clang/CodeGen/ModuleBuilder.h"
|
||||
#include "clang/CodeGen/ObjectFilePCHContainerOperations.h"
|
||||
#include "clang/CodeGen/ObjectFilePCHContainerWriter.h"
|
||||
#include "clang/Driver/Compilation.h"
|
||||
#include "clang/Driver/Driver.h"
|
||||
#include "clang/Driver/Job.h"
|
||||
@ -38,6 +38,7 @@
|
||||
#include "clang/Interpreter/Value.h"
|
||||
#include "clang/Lex/PreprocessorOptions.h"
|
||||
#include "clang/Sema/Lookup.h"
|
||||
#include "clang/Serialization/ObjectFilePCHContainerReader.h"
|
||||
#include "llvm/ExecutionEngine/JITSymbol.h"
|
||||
#include "llvm/ExecutionEngine/Orc/LLJIT.h"
|
||||
#include "llvm/IR/Module.h"
|
||||
|
@ -18,7 +18,6 @@
|
||||
#include "clang/AST/TypeVisitor.h"
|
||||
#include "clang/Basic/TargetInfo.h"
|
||||
#include "clang/CodeGen/ModuleBuilder.h"
|
||||
#include "clang/CodeGen/ObjectFilePCHContainerOperations.h"
|
||||
#include "clang/Driver/Compilation.h"
|
||||
#include "clang/Driver/Driver.h"
|
||||
#include "clang/Driver/Job.h"
|
||||
|
@ -1,6 +1,7 @@
|
||||
set(LLVM_LINK_COMPONENTS
|
||||
BitReader
|
||||
BitstreamReader
|
||||
Object
|
||||
Support
|
||||
TargetParser
|
||||
)
|
||||
@ -21,6 +22,7 @@ add_clang_library(clangSerialization
|
||||
ModuleFileExtension.cpp
|
||||
ModuleManager.cpp
|
||||
PCHContainerOperations.cpp
|
||||
ObjectFilePCHContainerReader.cpp
|
||||
|
||||
ADDITIONAL_HEADERS
|
||||
ASTCommon.h
|
||||
|
56
clang/lib/Serialization/ObjectFilePCHContainerReader.cpp
Normal file
56
clang/lib/Serialization/ObjectFilePCHContainerReader.cpp
Normal file
@ -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;
|
||||
}
|
@ -19,7 +19,6 @@ add_clang_library(clangDependencyScanning
|
||||
LINK_LIBS
|
||||
clangAST
|
||||
clangBasic
|
||||
clangCodeGen
|
||||
clangDriver
|
||||
clangFrontend
|
||||
clangLex
|
||||
|
@ -10,7 +10,6 @@
|
||||
#include "clang/Basic/DiagnosticDriver.h"
|
||||
#include "clang/Basic/DiagnosticFrontend.h"
|
||||
#include "clang/Basic/DiagnosticSerialization.h"
|
||||
#include "clang/CodeGen/ObjectFilePCHContainerOperations.h"
|
||||
#include "clang/Driver/Compilation.h"
|
||||
#include "clang/Driver/Driver.h"
|
||||
#include "clang/Driver/Job.h"
|
||||
@ -21,6 +20,7 @@
|
||||
#include "clang/Frontend/TextDiagnosticPrinter.h"
|
||||
#include "clang/Frontend/Utils.h"
|
||||
#include "clang/Lex/PreprocessorOptions.h"
|
||||
#include "clang/Serialization/ObjectFilePCHContainerReader.h"
|
||||
#include "clang/Tooling/DependencyScanning/DependencyScanningService.h"
|
||||
#include "clang/Tooling/DependencyScanning/ModuleDepCollector.h"
|
||||
#include "clang/Tooling/Tooling.h"
|
||||
|
@ -27,7 +27,6 @@ else()
|
||||
libclang
|
||||
clangAST
|
||||
clangBasic
|
||||
clangCodeGen
|
||||
clangFrontend
|
||||
clangIndex
|
||||
clangSerialization
|
||||
|
@ -8,7 +8,6 @@
|
||||
|
||||
#include "clang/AST/Mangle.h"
|
||||
#include "clang/Basic/LangOptions.h"
|
||||
#include "clang/CodeGen/ObjectFilePCHContainerOperations.h"
|
||||
#include "clang/Frontend/ASTUnit.h"
|
||||
#include "clang/Frontend/CompilerInstance.h"
|
||||
#include "clang/Frontend/CompilerInvocation.h"
|
||||
@ -19,6 +18,7 @@
|
||||
#include "clang/Index/USRGeneration.h"
|
||||
#include "clang/Lex/Preprocessor.h"
|
||||
#include "clang/Serialization/ASTReader.h"
|
||||
#include "clang/Serialization/ObjectFilePCHContainerReader.h"
|
||||
#include "llvm/Support/CommandLine.h"
|
||||
#include "llvm/Support/FileSystem.h"
|
||||
#include "llvm/Support/PrettyStackTrace.h"
|
||||
|
@ -16,7 +16,6 @@
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include "clang/AST/ASTConsumer.h"
|
||||
#include "clang/CodeGen/ObjectFilePCHContainerOperations.h"
|
||||
#include "clang/Driver/Options.h"
|
||||
#include "clang/Frontend/ASTConsumers.h"
|
||||
#include "clang/Frontend/CompilerInstance.h"
|
||||
|
@ -14,7 +14,7 @@
|
||||
|
||||
#include "clang/Basic/Stack.h"
|
||||
#include "clang/Basic/TargetOptions.h"
|
||||
#include "clang/CodeGen/ObjectFilePCHContainerOperations.h"
|
||||
#include "clang/CodeGen/ObjectFilePCHContainerWriter.h"
|
||||
#include "clang/Config/config.h"
|
||||
#include "clang/Driver/DriverDiagnostic.h"
|
||||
#include "clang/Driver/Options.h"
|
||||
@ -25,6 +25,7 @@
|
||||
#include "clang/Frontend/TextDiagnosticPrinter.h"
|
||||
#include "clang/Frontend/Utils.h"
|
||||
#include "clang/FrontendTool/Utils.h"
|
||||
#include "clang/Serialization/ObjectFilePCHContainerReader.h"
|
||||
#include "llvm/ADT/Statistic.h"
|
||||
#include "llvm/ADT/StringExtras.h"
|
||||
#include "llvm/Config/llvm-config.h"
|
||||
|
@ -59,10 +59,10 @@
|
||||
#include "lldb/lldb-enumerations.h"
|
||||
#include "lldb/lldb-private-enumerations.h"
|
||||
|
||||
#include "clang/CodeGen/ObjectFilePCHContainerOperations.h"
|
||||
#include "clang/Frontend/CompilerInstance.h"
|
||||
#include "clang/Frontend/CompilerInvocation.h"
|
||||
#include "clang/Frontend/FrontendActions.h"
|
||||
#include "clang/Serialization/ObjectFilePCHContainerReader.h"
|
||||
#include "llvm/ADT/ScopeExit.h"
|
||||
#include "llvm/ADT/StringRef.h"
|
||||
#include "llvm/Support/FileSystem.h"
|
||||
|
@ -1,11 +1,12 @@
|
||||
#include "clang/AST/AST.h"
|
||||
#include "clang/AST/ASTConsumer.h"
|
||||
#include "clang/AST/RecursiveASTVisitor.h"
|
||||
#include "clang/CodeGen/ObjectFilePCHContainerOperations.h"
|
||||
#include "clang/CodeGen/ObjectFilePCHContainerWriter.h"
|
||||
#include "clang/Frontend/ASTConsumers.h"
|
||||
#include "clang/Frontend/CompilerInstance.h"
|
||||
#include "clang/Frontend/FrontendActions.h"
|
||||
#include "clang/Rewrite/Core/Rewriter.h"
|
||||
#include "clang/Serialization/ObjectFilePCHContainerReader.h"
|
||||
#include "clang/Tooling/CommonOptionsParser.h"
|
||||
#include "clang/Tooling/Tooling.h"
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user