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 | |
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
16 files changed, 96 insertions, 65 deletions
diff --git a/clang/include/clang/CodeGen/ObjectFilePCHContainerOperations.h b/clang/include/clang/CodeGen/ObjectFilePCHContainerWriter.h index 7a02d87..26ee9f2 100644 --- a/clang/include/clang/CodeGen/ObjectFilePCHContainerOperations.h +++ b/clang/include/clang/CodeGen/ObjectFilePCHContainerWriter.h @@ -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 diff --git a/clang/include/clang/Serialization/ObjectFilePCHContainerReader.h b/clang/include/clang/Serialization/ObjectFilePCHContainerReader.h new file mode 100644 index 0000000..6281a3f --- /dev/null +++ b/clang/include/clang/Serialization/ObjectFilePCHContainerReader.h @@ -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 diff --git a/clang/lib/CodeGen/CMakeLists.txt b/clang/lib/CodeGen/CMakeLists.txt index 2a179de..deb7b27 100644 --- a/clang/lib/CodeGen/CMakeLists.txt +++ b/clang/lib/CodeGen/CMakeLists.txt @@ -110,7 +110,7 @@ add_clang_library(clangCodeGen MacroPPCallbacks.cpp MicrosoftCXXABI.cpp ModuleBuilder.cpp - ObjectFilePCHContainerOperations.cpp + ObjectFilePCHContainerWriter.cpp PatternInit.cpp SanitizerMetadata.cpp SwiftCallingConv.cpp diff --git a/clang/lib/CodeGen/ObjectFilePCHContainerOperations.cpp b/clang/lib/CodeGen/ObjectFilePCHContainerWriter.cpp index ee543e4..3a1f745 100644 --- a/clang/lib/CodeGen/ObjectFilePCHContainerOperations.cpp +++ b/clang/lib/CodeGen/ObjectFilePCHContainerWriter.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; -} diff --git a/clang/lib/Interpreter/Interpreter.cpp b/clang/lib/Interpreter/Interpreter.cpp index b4882ab..7209a332 100644 --- a/clang/lib/Interpreter/Interpreter.cpp +++ b/clang/lib/Interpreter/Interpreter.cpp @@ -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" diff --git a/clang/lib/Interpreter/InterpreterUtils.h b/clang/lib/Interpreter/InterpreterUtils.h index 8df158c..c7b405b 100644 --- a/clang/lib/Interpreter/InterpreterUtils.h +++ b/clang/lib/Interpreter/InterpreterUtils.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" diff --git a/clang/lib/Serialization/CMakeLists.txt b/clang/lib/Serialization/CMakeLists.txt index 5a4b3a5..99c47c1 100644 --- a/clang/lib/Serialization/CMakeLists.txt +++ b/clang/lib/Serialization/CMakeLists.txt @@ -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 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; +} diff --git a/clang/lib/Tooling/DependencyScanning/CMakeLists.txt b/clang/lib/Tooling/DependencyScanning/CMakeLists.txt index bc807e1..66795b0 100644 --- a/clang/lib/Tooling/DependencyScanning/CMakeLists.txt +++ b/clang/lib/Tooling/DependencyScanning/CMakeLists.txt @@ -19,7 +19,6 @@ add_clang_library(clangDependencyScanning LINK_LIBS clangAST clangBasic - clangCodeGen clangDriver clangFrontend clangLex diff --git a/clang/lib/Tooling/DependencyScanning/DependencyScanningWorker.cpp b/clang/lib/Tooling/DependencyScanning/DependencyScanningWorker.cpp index 0f82f22..9184262 100644 --- a/clang/lib/Tooling/DependencyScanning/DependencyScanningWorker.cpp +++ b/clang/lib/Tooling/DependencyScanning/DependencyScanningWorker.cpp @@ -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" diff --git a/clang/tools/c-index-test/CMakeLists.txt b/clang/tools/c-index-test/CMakeLists.txt index 0ae1b4e..24e7c96 100644 --- a/clang/tools/c-index-test/CMakeLists.txt +++ b/clang/tools/c-index-test/CMakeLists.txt @@ -27,7 +27,6 @@ else() libclang clangAST clangBasic - clangCodeGen clangFrontend clangIndex clangSerialization diff --git a/clang/tools/c-index-test/core_main.cpp b/clang/tools/c-index-test/core_main.cpp index c552466..003b1ba 100644 --- a/clang/tools/c-index-test/core_main.cpp +++ b/clang/tools/c-index-test/core_main.cpp @@ -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" diff --git a/clang/tools/clang-check/ClangCheck.cpp b/clang/tools/clang-check/ClangCheck.cpp index 0524bec..fa6dd06 100644 --- a/clang/tools/clang-check/ClangCheck.cpp +++ b/clang/tools/clang-check/ClangCheck.cpp @@ -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" diff --git a/clang/tools/driver/cc1_main.cpp b/clang/tools/driver/cc1_main.cpp index f5e5fad..554dc95 100644 --- a/clang/tools/driver/cc1_main.cpp +++ b/clang/tools/driver/cc1_main.cpp @@ -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" diff --git a/lldb/source/Commands/CommandObjectTarget.cpp b/lldb/source/Commands/CommandObjectTarget.cpp index d594330..cc381a2 100644 --- a/lldb/source/Commands/CommandObjectTarget.cpp +++ b/lldb/source/Commands/CommandObjectTarget.cpp @@ -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" diff --git a/lldb/tools/lldb-instr/Instrument.cpp b/lldb/tools/lldb-instr/Instrument.cpp index 4b87253..d07ccf1 100644 --- a/lldb/tools/lldb-instr/Instrument.cpp +++ b/lldb/tools/lldb-instr/Instrument.cpp @@ -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" |