https://github.com/egorzhdan created https://github.com/llvm/llvm-project/pull/70975
This re-lands https://github.com/llvm/llvm-project/pull/70827 while preventing the assertion failure that occurred when generating `ASTNodeAPI.json` on non-Apple platforms. >From 07f57b151a455a9a3587bd257bfd9a92889120be Mon Sep 17 00:00:00 2001 From: Egor Zhdan <e_zh...@apple.com> Date: Wed, 1 Nov 2023 19:03:57 +0000 Subject: [PATCH 1/2] Revert "Revert "[APINotes] Upstream APINotesOptions"" This reverts commit 0e06ddf0f6896cfd817a1b97a43b78331e0b1d66. --- .../include/clang/APINotes/APINotesOptions.h | 34 +++++++++++++++++++ clang/include/clang/Driver/Options.td | 7 ++++ .../clang/Frontend/CompilerInvocation.h | 6 ++++ clang/lib/Frontend/CompilerInvocation.cpp | 12 +++++++ 4 files changed, 59 insertions(+) create mode 100644 clang/include/clang/APINotes/APINotesOptions.h diff --git a/clang/include/clang/APINotes/APINotesOptions.h b/clang/include/clang/APINotes/APINotesOptions.h new file mode 100644 index 000000000000000..e8b8a9ed2261fa1 --- /dev/null +++ b/clang/include/clang/APINotes/APINotesOptions.h @@ -0,0 +1,34 @@ +//===--- APINotesOptions.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_APINOTES_APINOTESOPTIONS_H +#define LLVM_CLANG_APINOTES_APINOTESOPTIONS_H + +#include "llvm/Support/VersionTuple.h" +#include <string> +#include <vector> + +namespace clang { + +/// Tracks various options which control how API notes are found and handled. +class APINotesOptions { +public: + /// The Swift version which should be used for API notes. + llvm::VersionTuple SwiftVersion; + + /// The set of search paths where we API notes can be found for particular + /// modules. + /// + /// The API notes in this directory are stored as <ModuleName>.apinotes, and + /// are only applied when building the module <ModuleName>. + std::vector<std::string> ModuleSearchPaths; +}; + +} // namespace clang + +#endif // LLVM_CLANG_APINOTES_APINOTESOPTIONS_H diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td index b1229b2f4562379..fcf6a4b2ccb2369 100644 --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -1733,6 +1733,10 @@ def fswift_async_fp_EQ : Joined<["-"], "fswift-async-fp=">, NormalizedValuesScope<"CodeGenOptions::SwiftAsyncFramePointerKind">, NormalizedValues<["Auto", "Always", "Never"]>, MarshallingInfoEnum<CodeGenOpts<"SwiftAsyncFramePointer">, "Always">; +def fapinotes_swift_version : Joined<["-"], "fapinotes-swift-version=">, + Group<f_clang_Group>, Visibility<[ClangOption, CC1Option]>, + MetaVarName<"<version>">, + HelpText<"Specify the Swift version to use when filtering API notes">; defm addrsig : BoolFOption<"addrsig", CodeGenOpts<"Addrsig">, DefaultFalse, @@ -4129,6 +4133,9 @@ def ibuiltininc : Flag<["-"], "ibuiltininc">, Group<clang_i_Group>, def index_header_map : Flag<["-"], "index-header-map">, Visibility<[ClangOption, CC1Option]>, HelpText<"Make the next included directory (-I or -F) an indexer header map">; +def iapinotes_modules : JoinedOrSeparate<["-"], "iapinotes-modules">, Group<clang_i_Group>, + Visibility<[ClangOption, CC1Option]>, + HelpText<"Add directory to the API notes search path referenced by module name">, MetaVarName<"<directory>">; def idirafter : JoinedOrSeparate<["-"], "idirafter">, Group<clang_i_Group>, Visibility<[ClangOption, CC1Option]>, HelpText<"Add directory to AFTER include search path">; diff --git a/clang/include/clang/Frontend/CompilerInvocation.h b/clang/include/clang/Frontend/CompilerInvocation.h index 45e263e7bc76822..d9c757a8a156861 100644 --- a/clang/include/clang/Frontend/CompilerInvocation.h +++ b/clang/include/clang/Frontend/CompilerInvocation.h @@ -9,6 +9,7 @@ #ifndef LLVM_CLANG_FRONTEND_COMPILERINVOCATION_H #define LLVM_CLANG_FRONTEND_COMPILERINVOCATION_H +#include "clang/APINotes/APINotesOptions.h" #include "clang/Basic/CodeGenOptions.h" #include "clang/Basic/DiagnosticOptions.h" #include "clang/Basic/FileSystemOptions.h" @@ -92,6 +93,9 @@ class CompilerInvocationBase { std::shared_ptr<MigratorOptions> MigratorOpts; + /// Options controlling API notes. + std::shared_ptr<APINotesOptions> APINotesOpts; + /// Options controlling IRgen and the backend. std::shared_ptr<CodeGenOptions> CodeGenOpts; @@ -131,6 +135,7 @@ class CompilerInvocationBase { const PreprocessorOptions &getPreprocessorOpts() const { return *PPOpts; } const AnalyzerOptions &getAnalyzerOpts() const { return *AnalyzerOpts; } const MigratorOptions &getMigratorOpts() const { return *MigratorOpts; } + const APINotesOptions &getAPINotesOpts() const { return *APINotesOpts; } const CodeGenOptions &getCodeGenOpts() const { return *CodeGenOpts; } const FileSystemOptions &getFileSystemOpts() const { return *FSOpts; } const FrontendOptions &getFrontendOpts() const { return *FrontendOpts; } @@ -242,6 +247,7 @@ class CompilerInvocation : public CompilerInvocationBase { PreprocessorOptions &getPreprocessorOpts() { return *PPOpts; } AnalyzerOptions &getAnalyzerOpts() { return *AnalyzerOpts; } MigratorOptions &getMigratorOpts() { return *MigratorOpts; } + APINotesOptions &getAPINotesOpts() { return *APINotesOpts; } CodeGenOptions &getCodeGenOpts() { return *CodeGenOpts; } FileSystemOptions &getFileSystemOpts() { return *FSOpts; } FrontendOptions &getFrontendOpts() { return *FrontendOpts; } diff --git a/clang/lib/Frontend/CompilerInvocation.cpp b/clang/lib/Frontend/CompilerInvocation.cpp index fd6c250efeda2a8..140feb0ff9e79ae 100644 --- a/clang/lib/Frontend/CompilerInvocation.cpp +++ b/clang/lib/Frontend/CompilerInvocation.cpp @@ -3261,6 +3261,17 @@ static bool ParseHeaderSearchArgs(HeaderSearchOptions &Opts, ArgList &Args, return Diags.getNumErrors() == NumErrorsBefore; } +static void ParseAPINotesArgs(APINotesOptions &Opts, ArgList &Args, + DiagnosticsEngine &diags) { + if (const Arg *A = Args.getLastArg(OPT_fapinotes_swift_version)) { + if (Opts.SwiftVersion.tryParse(A->getValue())) + diags.Report(diag::err_drv_invalid_value) + << A->getAsString(Args) << A->getValue(); + } + for (const Arg *A : Args.filtered(OPT_iapinotes_modules)) + Opts.ModuleSearchPaths.push_back(A->getValue()); +} + /// Check if input file kind and language standard are compatible. static bool IsInputCompatibleWithStandard(InputKind IK, const LangStandard &S) { @@ -4538,6 +4549,7 @@ bool CompilerInvocation::CreateFromArgsImpl( llvm::Triple T(Res.getTargetOpts().Triple); ParseHeaderSearchArgs(Res.getHeaderSearchOpts(), Args, Diags, Res.getFileSystemOpts().WorkingDir); + ParseAPINotesArgs(Res.getAPINotesOpts(), Args, Diags); ParseLangArgs(LangOpts, Args, DashX, T, Res.getPreprocessorOpts().Includes, Diags); >From 92773698aa91ff8c17f6152f3142507795a4186e Mon Sep 17 00:00:00 2001 From: Egor Zhdan <e_zh...@apple.com> Date: Wed, 1 Nov 2023 19:33:45 +0000 Subject: [PATCH 2/2] [APINotes] Fix assertion failure with APINotesOptions --- clang/include/clang/Frontend/CompilerInvocation.h | 2 ++ clang/lib/Frontend/CompilerInvocation.cpp | 7 +++++++ 2 files changed, 9 insertions(+) diff --git a/clang/include/clang/Frontend/CompilerInvocation.h b/clang/include/clang/Frontend/CompilerInvocation.h index d9c757a8a156861..c6528779bde7b2e 100644 --- a/clang/include/clang/Frontend/CompilerInvocation.h +++ b/clang/include/clang/Frontend/CompilerInvocation.h @@ -231,6 +231,7 @@ class CompilerInvocation : public CompilerInvocationBase { using CompilerInvocationBase::getPreprocessorOpts; using CompilerInvocationBase::getAnalyzerOpts; using CompilerInvocationBase::getMigratorOpts; + using CompilerInvocationBase::getAPINotesOpts; using CompilerInvocationBase::getCodeGenOpts; using CompilerInvocationBase::getFileSystemOpts; using CompilerInvocationBase::getFrontendOpts; @@ -374,6 +375,7 @@ class CowCompilerInvocation : public CompilerInvocationBase { PreprocessorOptions &getMutPreprocessorOpts(); AnalyzerOptions &getMutAnalyzerOpts(); MigratorOptions &getMutMigratorOpts(); + APINotesOptions &getMutAPINotesOpts(); CodeGenOptions &getMutCodeGenOpts(); FileSystemOptions &getMutFileSystemOpts(); FrontendOptions &getMutFrontendOpts(); diff --git a/clang/lib/Frontend/CompilerInvocation.cpp b/clang/lib/Frontend/CompilerInvocation.cpp index 140feb0ff9e79ae..637c6a35af6532b 100644 --- a/clang/lib/Frontend/CompilerInvocation.cpp +++ b/clang/lib/Frontend/CompilerInvocation.cpp @@ -145,6 +145,7 @@ CompilerInvocationBase::CompilerInvocationBase() PPOpts(std::make_shared<PreprocessorOptions>()), AnalyzerOpts(llvm::makeIntrusiveRefCnt<AnalyzerOptions>()), MigratorOpts(std::make_shared<MigratorOptions>()), + APINotesOpts(std::make_shared<APINotesOptions>()), CodeGenOpts(std::make_shared<CodeGenOptions>()), FSOpts(std::make_shared<FileSystemOptions>()), FrontendOpts(std::make_shared<FrontendOptions>()), @@ -161,6 +162,7 @@ CompilerInvocationBase::deep_copy_assign(const CompilerInvocationBase &X) { PPOpts = make_shared_copy(X.getPreprocessorOpts()); AnalyzerOpts = makeIntrusiveRefCntCopy(X.getAnalyzerOpts()); MigratorOpts = make_shared_copy(X.getMigratorOpts()); + APINotesOpts = make_shared_copy(X.getAPINotesOpts()); CodeGenOpts = make_shared_copy(X.getCodeGenOpts()); FSOpts = make_shared_copy(X.getFileSystemOpts()); FrontendOpts = make_shared_copy(X.getFrontendOpts()); @@ -180,6 +182,7 @@ CompilerInvocationBase::shallow_copy_assign(const CompilerInvocationBase &X) { PPOpts = X.PPOpts; AnalyzerOpts = X.AnalyzerOpts; MigratorOpts = X.MigratorOpts; + APINotesOpts = X.APINotesOpts; CodeGenOpts = X.CodeGenOpts; FSOpts = X.FSOpts; FrontendOpts = X.FrontendOpts; @@ -233,6 +236,10 @@ MigratorOptions &CowCompilerInvocation::getMutMigratorOpts() { return ensureOwned(MigratorOpts); } +APINotesOptions &CowCompilerInvocation::getMutAPINotesOpts() { + return ensureOwned(APINotesOpts); +} + CodeGenOptions &CowCompilerInvocation::getMutCodeGenOpts() { return ensureOwned(CodeGenOpts); } _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits