[clang] Revert "Revert "[APINotes] Upstream APINotesOptions"" (PR #70975)
Egor Zhdan via cfe-commits
cfe-commits at lists.llvm.org
Wed Nov 1 12:38:59 PDT 2023
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_zhdan at 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_zhdan at 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);
}
More information about the cfe-commits
mailing list