-
Notifications
You must be signed in to change notification settings - Fork 15.3k
Revert " [clang] Refactor to remove clangDriver dependency from clangFrontend and flangFrontend (#165277)" #169397
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
…Frontend and flangFrontend (llvm#165277)" This reverts commit 3773bbe (and relands the last revert attempt 40334b8).
|
@llvm/pr-subscribers-lldb @llvm/pr-subscribers-clang-tools-extra Author: Naveen Seth Hanig (naveen-seth) ChangesThis reverts commit 3773bbe and relands the last revert attempt 40334b8. Patch is 103.69 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/169397.diff 60 Files Affected:
diff --git a/clang-tools-extra/clangd/CompileCommands.cpp b/clang-tools-extra/clangd/CompileCommands.cpp
index 4eda330716f21..7990f2719e9a0 100644
--- a/clang-tools-extra/clangd/CompileCommands.cpp
+++ b/clang-tools-extra/clangd/CompileCommands.cpp
@@ -132,7 +132,8 @@ std::optional<std::string> detectSysroot() {
std::string detectStandardResourceDir() {
static int StaticForMainAddr; // Just an address in this process.
- return GetResourcesPath("clangd", (void *)&StaticForMainAddr);
+ return CompilerInvocation::GetResourcesPath("clangd",
+ (void *)&StaticForMainAddr);
}
// The path passed to argv[0] is important:
diff --git a/clang-tools-extra/clangd/Compiler.cpp b/clang-tools-extra/clangd/Compiler.cpp
index 9ea7df139382a..6ebc2eac25745 100644
--- a/clang-tools-extra/clangd/Compiler.cpp
+++ b/clang-tools-extra/clangd/Compiler.cpp
@@ -9,7 +9,6 @@
#include "Compiler.h"
#include "support/Logger.h"
#include "clang/Basic/TargetInfo.h"
-#include "clang/Driver/CreateInvocationFromArgs.h"
#include "clang/Frontend/CompilerInvocation.h"
#include "clang/Lex/PreprocessorOptions.h"
#include "clang/Serialization/PCHContainerOperations.h"
diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index b12e4539dc3a6..51f07256c5d9f 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -84,8 +84,6 @@ Potentially Breaking Changes
- Downstream projects that previously linked only against ``clangDriver`` may
now (also) need to link against the new ``clangOptions`` library, since
options-related code has been moved out of the Driver into a separate library.
-- The ``clangFrontend`` library no longer depends on ``clangDriver``, which may
- break downstream projects that relied on this transitive dependency.
C/C++ Language Potentially Breaking Changes
-------------------------------------------
diff --git a/clang/include/clang/Driver/CommonArgs.h b/clang/include/clang/Driver/CommonArgs.h
index 264bd4965f9ad..ac17d6211d882 100644
--- a/clang/include/clang/Driver/CommonArgs.h
+++ b/clang/include/clang/Driver/CommonArgs.h
@@ -291,6 +291,16 @@ void handleVectorizeLoopsArgs(const llvm::opt::ArgList &Args,
void handleVectorizeSLPArgs(const llvm::opt::ArgList &Args,
llvm::opt::ArgStringList &CmdArgs);
+// Parse -mprefer-vector-width=. Return the Value string if well-formed.
+// Otherwise, return an empty string and issue a diagnosic message if needed.
+StringRef parseMPreferVectorWidthOption(clang::DiagnosticsEngine &Diags,
+ const llvm::opt::ArgList &Args);
+
+// Parse -mrecip. Return the Value string if well-formed.
+// Otherwise, return an empty string and issue a diagnosic message if needed.
+StringRef parseMRecipOption(clang::DiagnosticsEngine &Diags,
+ const llvm::opt::ArgList &Args);
+
// Convert ComplexRangeKind to a string that can be passed as a frontend option.
std::string complexRangeKindToStr(LangOptions::ComplexRangeKind Range);
diff --git a/clang/include/clang/Driver/CreateASTUnitFromArgs.h b/clang/include/clang/Driver/CreateASTUnitFromArgs.h
deleted file mode 100644
index 30575cc04ca7c..0000000000000
--- a/clang/include/clang/Driver/CreateASTUnitFromArgs.h
+++ /dev/null
@@ -1,80 +0,0 @@
-//===-- CreateInvocationFromArgs.h - Create an ASTUnit from Args-*- 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
-//
-//===----------------------------------------------------------------------===//
-//
-// Utility for creating an ASTUnit from a vector of command line arguments.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef LLVM_CLANG_DRIVER_CREATEASTUNITFROMARGS_H
-#define LLVM_CLANG_DRIVER_CREATEASTUNITFROMARGS_H
-
-#include "clang/Frontend/ASTUnit.h"
-
-namespace clang {
-
-/// Create an ASTUnit from a vector of command line arguments, which must
-/// specify exactly one source file.
-///
-/// \param ArgBegin - The beginning of the argument vector.
-///
-/// \param ArgEnd - The end of the argument vector.
-///
-/// \param PCHContainerOps - The PCHContainerOperations to use for loading and
-/// creating modules.
-///
-/// \param Diags - The diagnostics engine to use for reporting errors; its
-/// lifetime is expected to extend past that of the returned ASTUnit.
-///
-/// \param ResourceFilesPath - The path to the compiler resource files.
-///
-/// \param StorePreamblesInMemory - Whether to store PCH in memory. If false,
-/// PCH are stored in temporary files.
-///
-/// \param PreambleStoragePath - The path to a directory, in which to create
-/// temporary PCH files. If empty, the default system temporary directory is
-/// used. This parameter is ignored if \p StorePreamblesInMemory is true.
-///
-/// \param ModuleFormat - If provided, uses the specific module format.
-///
-/// \param ErrAST - If non-null and parsing failed without any AST to return
-/// (e.g. because the PCH could not be loaded), this accepts the ASTUnit
-/// mainly to allow the caller to see the diagnostics.
-///
-/// \param VFS - A llvm::vfs::FileSystem to be used for all file accesses.
-/// Note that preamble is saved to a temporary directory on a RealFileSystem,
-/// so in order for it to be loaded correctly, VFS should have access to
-/// it(i.e., be an overlay over RealFileSystem). RealFileSystem will be used
-/// if \p VFS is nullptr.
-///
-// FIXME: Move OnlyLocalDecls, UseBumpAllocator to setters on the ASTUnit, we
-// shouldn't need to specify them at construction time.
-std::unique_ptr<ASTUnit> CreateASTUnitFromCommandLine(
- const char **ArgBegin, const char **ArgEnd,
- std::shared_ptr<PCHContainerOperations> PCHContainerOps,
- std::shared_ptr<DiagnosticOptions> DiagOpts,
- IntrusiveRefCntPtr<DiagnosticsEngine> Diags, StringRef ResourceFilesPath,
- bool StorePreamblesInMemory = false,
- StringRef PreambleStoragePath = StringRef(), bool OnlyLocalDecls = false,
- CaptureDiagsKind CaptureDiagnostics = CaptureDiagsKind::None,
- ArrayRef<ASTUnit::RemappedFile> RemappedFiles = {},
- bool RemappedFilesKeepOriginalName = true,
- unsigned PrecompilePreambleAfterNParses = 0,
- TranslationUnitKind TUKind = TU_Complete,
- bool CacheCodeCompletionResults = false,
- bool IncludeBriefCommentsInCodeCompletion = false,
- bool AllowPCHWithCompilerErrors = false,
- SkipFunctionBodiesScope SkipFunctionBodies = SkipFunctionBodiesScope::None,
- bool SingleFileParse = false, bool UserFilesAreVolatile = false,
- bool ForSerialization = false, bool RetainExcludedConditionalBlocks = false,
- std::optional<StringRef> ModuleFormat = std::nullopt,
- std::unique_ptr<ASTUnit> *ErrAST = nullptr,
- IntrusiveRefCntPtr<llvm::vfs::FileSystem> VFS = nullptr);
-
-} // namespace clang
-
-#endif // LLVM_CLANG_DRIVER_CREATEASTUNITFROMARGS_H
diff --git a/clang/include/clang/Driver/CreateInvocationFromArgs.h b/clang/include/clang/Driver/CreateInvocationFromArgs.h
deleted file mode 100644
index 0e0f67373ce87..0000000000000
--- a/clang/include/clang/Driver/CreateInvocationFromArgs.h
+++ /dev/null
@@ -1,76 +0,0 @@
-//===--- CreateInvocationFromArgs.h - CompilerInvocation from Args --------===//
-//
-// 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
-//
-//===----------------------------------------------------------------------===//
-//
-// Utility for creating a CompilerInvocation from command-line arguments, for
-// tools to use in preparation to parse a file.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef LLVM_CLANG_DRIVER_CREATEINVOCATIONFROMARGS_H
-#define LLVM_CLANG_DRIVER_CREATEINVOCATIONFROMARGS_H
-
-#include "clang/Basic/Diagnostic.h"
-#include "clang/Basic/LLVM.h"
-#include "llvm/Support/VirtualFileSystem.h"
-#include <memory>
-#include <string>
-#include <vector>
-
-namespace clang {
-
-class CompilerInvocation;
-class DiagnosticsEngine;
-
-/// Optional inputs to createInvocation.
-struct CreateInvocationOptions {
- /// Receives diagnostics encountered while parsing command-line flags.
- /// If not provided, these are printed to stderr.
- IntrusiveRefCntPtr<DiagnosticsEngine> Diags = nullptr;
- /// Used e.g. to probe for system headers locations.
- /// If not provided, the real filesystem is used.
- /// FIXME: the driver does perform some non-virtualized IO.
- IntrusiveRefCntPtr<llvm::vfs::FileSystem> VFS = nullptr;
- /// Whether to attempt to produce a non-null (possibly incorrect) invocation
- /// if any errors were encountered.
- /// By default, always return null on errors.
- bool RecoverOnError = false;
- /// Allow the driver to probe the filesystem for PCH files.
- /// This is used to replace -include with -include-pch in the cc1 args.
- /// FIXME: ProbePrecompiled=true is a poor, historical default.
- /// It misbehaves if the PCH file is from GCC, has the wrong version, etc.
- bool ProbePrecompiled = false;
- /// If set, the target is populated with the cc1 args produced by the driver.
- /// This may be populated even if createInvocation returns nullptr.
- std::vector<std::string> *CC1Args = nullptr;
-};
-
-/// Interpret clang arguments in preparation to parse a file.
-///
-/// This simulates a number of steps Clang takes when its driver is invoked:
-/// - choosing actions (e.g compile + link) to run
-/// - probing the system for settings like standard library locations
-/// - spawning a cc1 subprocess to compile code, with more explicit arguments
-/// - in the cc1 process, assembling those arguments into a CompilerInvocation
-/// which is used to configure the parser
-///
-/// This simulation is lossy, e.g. in some situations one driver run would
-/// result in multiple parses. (Multi-arch, CUDA, ...).
-/// This function tries to select a reasonable invocation that tools should use.
-///
-/// Args[0] should be the driver name, such as "clang" or "/usr/bin/g++".
-/// Absolute path is preferred - this affects searching for system headers.
-///
-/// May return nullptr if an invocation could not be determined.
-/// See CreateInvocationOptions::RecoverOnError to try harder!
-std::unique_ptr<CompilerInvocation>
-createInvocation(ArrayRef<const char *> Args,
- CreateInvocationOptions Opts = {});
-
-} // namespace clang
-
-#endif // LLVM_CLANG_DRIVER_CREATEINVOCATIONFROMARGS_H
diff --git a/clang/include/clang/Driver/Driver.h b/clang/include/clang/Driver/Driver.h
index 76a6c5a128efb..83bcb7cab550f 100644
--- a/clang/include/clang/Driver/Driver.h
+++ b/clang/include/clang/Driver/Driver.h
@@ -406,6 +406,10 @@ class Driver {
SmallString<128> &CrashDiagDir);
public:
+ /// Takes the path to a binary that's either in bin/ or lib/ and returns
+ /// the path to clang's resource directory.
+ static std::string GetResourcesPath(StringRef BinaryPath);
+
Driver(StringRef ClangExecutable, StringRef TargetTriple,
DiagnosticsEngine &Diags, std::string Title = "clang LLVM compiler",
IntrusiveRefCntPtr<llvm::vfs::FileSystem> VFS = nullptr);
diff --git a/clang/include/clang/Frontend/ASTUnit.h b/clang/include/clang/Frontend/ASTUnit.h
index 341460e1962cb..e585933a5c8be 100644
--- a/clang/include/clang/Frontend/ASTUnit.h
+++ b/clang/include/clang/Frontend/ASTUnit.h
@@ -23,13 +23,11 @@
#include "clang/Basic/SourceManager.h"
#include "clang/Basic/TargetOptions.h"
#include "clang/Frontend/PrecompiledPreamble.h"
-#include "clang/Frontend/StandaloneDiagnostic.h"
#include "clang/Lex/HeaderSearchOptions.h"
#include "clang/Lex/ModuleLoader.h"
#include "clang/Lex/PreprocessingRecord.h"
#include "clang/Sema/CodeCompleteConsumer.h"
#include "clang/Serialization/ASTBitCodes.h"
-#include "clang/Serialization/ASTWriter.h"
#include "llvm/ADT/ArrayRef.h"
#include "llvm/ADT/DenseMap.h"
#include "llvm/ADT/IntrusiveRefCntPtr.h"
@@ -38,7 +36,6 @@
#include "llvm/ADT/StringMap.h"
#include "llvm/ADT/StringRef.h"
#include "llvm/ADT/iterator_range.h"
-#include "llvm/Bitstream/BitstreamWriter.h"
#include <cassert>
#include <cstddef>
#include <cstdint>
@@ -91,6 +88,25 @@ enum class CaptureDiagsKind { None, All, AllWithoutNonErrorsFromIncludes };
/// Utility class for loading a ASTContext from an AST file.
class ASTUnit {
+public:
+ struct StandaloneFixIt {
+ std::pair<unsigned, unsigned> RemoveRange;
+ std::pair<unsigned, unsigned> InsertFromRange;
+ std::string CodeToInsert;
+ bool BeforePreviousInsertions;
+ };
+
+ struct StandaloneDiagnostic {
+ unsigned ID;
+ DiagnosticsEngine::Level Level;
+ std::string Message;
+ std::string Filename;
+ unsigned LocOffset;
+ std::vector<std::pair<unsigned, unsigned>> Ranges;
+ std::vector<StandaloneFixIt> FixIts;
+ };
+
+private:
std::unique_ptr<LangOptions> LangOpts;
std::unique_ptr<CodeGenOptions> CodeGenOpts;
// FIXME: The documentation on \c LoadFrom* member functions states that the
@@ -113,15 +129,7 @@ class ASTUnit {
bool HadModuleLoaderFatalFailure = false;
bool StorePreamblesInMemory = false;
- /// Utility struct for managing ASTWriter and its associated data streams.
- struct ASTWriterData {
- SmallString<128> Buffer;
- llvm::BitstreamWriter Stream;
- ASTWriter Writer;
-
- ASTWriterData(ModuleCache &ModCache, const CodeGenOptions &CGOpts)
- : Stream(Buffer), Writer(Stream, Buffer, ModCache, CGOpts, {}) {}
- };
+ struct ASTWriterData;
std::unique_ptr<ASTWriterData> WriterData;
FileSystemOptions FileSystemOpts;
@@ -263,6 +271,11 @@ class ASTUnit {
static void ConfigureDiags(IntrusiveRefCntPtr<DiagnosticsEngine> Diags,
ASTUnit &AST, CaptureDiagsKind CaptureDiagnostics);
+ void
+ TranslateStoredDiagnostics(FileManager &FileMgr, SourceManager &SrcMan,
+ const SmallVectorImpl<StandaloneDiagnostic> &Diags,
+ SmallVectorImpl<StoredDiagnostic> &Out);
+
void clearFileLevelDecls();
public:
@@ -821,24 +834,65 @@ class ASTUnit {
bool IncludeBriefCommentsInCodeCompletion = false,
bool UserFilesAreVolatile = false);
- friend std::unique_ptr<ASTUnit> CreateASTUnitFromCommandLine(
+ /// LoadFromCommandLine - Create an ASTUnit from a vector of command line
+ /// arguments, which must specify exactly one source file.
+ ///
+ /// \param ArgBegin - The beginning of the argument vector.
+ ///
+ /// \param ArgEnd - The end of the argument vector.
+ ///
+ /// \param PCHContainerOps - The PCHContainerOperations to use for loading and
+ /// creating modules.
+ ///
+ /// \param Diags - The diagnostics engine to use for reporting errors; its
+ /// lifetime is expected to extend past that of the returned ASTUnit.
+ ///
+ /// \param ResourceFilesPath - The path to the compiler resource files.
+ ///
+ /// \param StorePreamblesInMemory - Whether to store PCH in memory. If false,
+ /// PCH are stored in temporary files.
+ ///
+ /// \param PreambleStoragePath - The path to a directory, in which to create
+ /// temporary PCH files. If empty, the default system temporary directory is
+ /// used. This parameter is ignored if \p StorePreamblesInMemory is true.
+ ///
+ /// \param ModuleFormat - If provided, uses the specific module format.
+ ///
+ /// \param ErrAST - If non-null and parsing failed without any AST to return
+ /// (e.g. because the PCH could not be loaded), this accepts the ASTUnit
+ /// mainly to allow the caller to see the diagnostics.
+ ///
+ /// \param VFS - A llvm::vfs::FileSystem to be used for all file accesses.
+ /// Note that preamble is saved to a temporary directory on a RealFileSystem,
+ /// so in order for it to be loaded correctly, VFS should have access to
+ /// it(i.e., be an overlay over RealFileSystem). RealFileSystem will be used
+ /// if \p VFS is nullptr.
+ ///
+ // FIXME: Move OnlyLocalDecls, UseBumpAllocator to setters on the ASTUnit, we
+ // shouldn't need to specify them at construction time.
+ static std::unique_ptr<ASTUnit> LoadFromCommandLine(
const char **ArgBegin, const char **ArgEnd,
std::shared_ptr<PCHContainerOperations> PCHContainerOps,
std::shared_ptr<DiagnosticOptions> DiagOpts,
IntrusiveRefCntPtr<DiagnosticsEngine> Diags, StringRef ResourceFilesPath,
- bool StorePreamblesInMemory, StringRef PreambleStoragePath,
- bool OnlyLocalDecls, CaptureDiagsKind CaptureDiagnostics,
- ArrayRef<ASTUnit::RemappedFile> RemappedFiles,
- bool RemappedFilesKeepOriginalName,
- unsigned PrecompilePreambleAfterNParses, TranslationUnitKind TUKind,
- bool CacheCodeCompletionResults,
- bool IncludeBriefCommentsInCodeCompletion,
- bool AllowPCHWithCompilerErrors,
- SkipFunctionBodiesScope SkipFunctionBodies, bool SingleFileParse,
- bool UserFilesAreVolatile, bool ForSerialization,
- bool RetainExcludedConditionalBlocks,
- std::optional<StringRef> ModuleFormat, std::unique_ptr<ASTUnit> *ErrAST,
- IntrusiveRefCntPtr<llvm::vfs::FileSystem> VFS);
+ bool StorePreamblesInMemory = false,
+ StringRef PreambleStoragePath = StringRef(), bool OnlyLocalDecls = false,
+ CaptureDiagsKind CaptureDiagnostics = CaptureDiagsKind::None,
+ ArrayRef<RemappedFile> RemappedFiles = {},
+ bool RemappedFilesKeepOriginalName = true,
+ unsigned PrecompilePreambleAfterNParses = 0,
+ TranslationUnitKind TUKind = TU_Complete,
+ bool CacheCodeCompletionResults = false,
+ bool IncludeBriefCommentsInCodeCompletion = false,
+ bool AllowPCHWithCompilerErrors = false,
+ SkipFunctionBodiesScope SkipFunctionBodies =
+ SkipFunctionBodiesScope::None,
+ bool SingleFileParse = false, bool UserFilesAreVolatile = false,
+ bool ForSerialization = false,
+ bool RetainExcludedConditionalBlocks = false,
+ std::optional<StringRef> ModuleFormat = std::nullopt,
+ std::unique_ptr<ASTUnit> *ErrAST = nullptr,
+ IntrusiveRefCntPtr<llvm::vfs::FileSystem> VFS = nullptr);
/// Reparse the source files using the same command-line options that
/// were originally used to produce this translation unit.
@@ -909,44 +963,6 @@ class ASTUnit {
bool serialize(raw_ostream &OS);
};
-/// Diagnostic consumer that saves each diagnostic it is given.
-class FilterAndStoreDiagnosticConsumer : public DiagnosticConsumer {
- SmallVectorImpl<StoredDiagnostic> *StoredDiags;
- SmallVectorImpl<StandaloneDiagnostic> *StandaloneDiags;
- bool CaptureNonErrorsFromIncludes = true;
- const LangOptions *LangOpts = nullptr;
- SourceManager *SourceMgr = nullptr;
-
-public:
- FilterAndStoreDiagnosticConsumer(
- SmallVectorImpl<StoredDiagnostic> *StoredDiags,
- SmallVectorImpl<StandaloneDiagnostic> *StandaloneDiags,
- bool CaptureNonErrorsFromIncludes);
-
- void BeginSourceFile(const LangOptions &LangOpts,
- const Preprocessor *PP = nullptr) override;
-
- void HandleDiagnostic(DiagnosticsEngine::Level Level,
- const Diagnostic &Info) override;
-};
-
-/// RAII object that optionally captures and filters diagnostics, if
-/// there is no diagnostic client to capture them already.
-class CaptureDroppedDiagnostics {
- DiagnosticsEngine &Diags;
- FilterAndStoreDiagnosticConsumer Client;
- DiagnosticConsumer *PreviousClient = nullptr;
- std::unique_ptr<DiagnosticConsumer> OwningPreviousClient;
-
-public:
- CaptureDroppedDiagnostics(
- CaptureDiagsKind CaptureDiagnostics, DiagnosticsEngine &Diags,
- SmallVectorImpl<StoredDiagnostic> *StoredDiags,
- SmallVectorImpl<StandaloneDiagnostic> *StandaloneDiags);
-
- ~CaptureDroppedDiagnostics();
-};
-
} // namespace clang
#endif // LLVM_CLANG_FRONTEND_ASTUNIT_H
diff --git a/clang/include/clang/Frontend/CompilerInvocation.h b/clang/include/clang/Frontend/CompilerInvocation.h
index 4977ddb307d21..b19a6e1a8acc3 100644
--- a/clang/include/clang/Frontend/CompilerInvocation.h
+++ b/clang/include/clang/Frontend/CompilerInvocation.h
@@ -299,6 +299,16 @@ class CompilerInvocation : public CompilerInvocationBase {
...
[truncated]
|
|
@llvm/pr-subscribers-clang-modules Author: Naveen Seth Hanig (naveen-seth) ChangesThis reverts commit 3773bbe and relands the last revert attempt 40334b8. Patch is 103.69 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/169397.diff 60 Files Affected:
diff --git a/clang-tools-extra/clangd/CompileCommands.cpp b/clang-tools-extra/clangd/CompileCommands.cpp
index 4eda330716f21..7990f2719e9a0 100644
--- a/clang-tools-extra/clangd/CompileCommands.cpp
+++ b/clang-tools-extra/clangd/CompileCommands.cpp
@@ -132,7 +132,8 @@ std::optional<std::string> detectSysroot() {
std::string detectStandardResourceDir() {
static int StaticForMainAddr; // Just an address in this process.
- return GetResourcesPath("clangd", (void *)&StaticForMainAddr);
+ return CompilerInvocation::GetResourcesPath("clangd",
+ (void *)&StaticForMainAddr);
}
// The path passed to argv[0] is important:
diff --git a/clang-tools-extra/clangd/Compiler.cpp b/clang-tools-extra/clangd/Compiler.cpp
index 9ea7df139382a..6ebc2eac25745 100644
--- a/clang-tools-extra/clangd/Compiler.cpp
+++ b/clang-tools-extra/clangd/Compiler.cpp
@@ -9,7 +9,6 @@
#include "Compiler.h"
#include "support/Logger.h"
#include "clang/Basic/TargetInfo.h"
-#include "clang/Driver/CreateInvocationFromArgs.h"
#include "clang/Frontend/CompilerInvocation.h"
#include "clang/Lex/PreprocessorOptions.h"
#include "clang/Serialization/PCHContainerOperations.h"
diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index b12e4539dc3a6..51f07256c5d9f 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -84,8 +84,6 @@ Potentially Breaking Changes
- Downstream projects that previously linked only against ``clangDriver`` may
now (also) need to link against the new ``clangOptions`` library, since
options-related code has been moved out of the Driver into a separate library.
-- The ``clangFrontend`` library no longer depends on ``clangDriver``, which may
- break downstream projects that relied on this transitive dependency.
C/C++ Language Potentially Breaking Changes
-------------------------------------------
diff --git a/clang/include/clang/Driver/CommonArgs.h b/clang/include/clang/Driver/CommonArgs.h
index 264bd4965f9ad..ac17d6211d882 100644
--- a/clang/include/clang/Driver/CommonArgs.h
+++ b/clang/include/clang/Driver/CommonArgs.h
@@ -291,6 +291,16 @@ void handleVectorizeLoopsArgs(const llvm::opt::ArgList &Args,
void handleVectorizeSLPArgs(const llvm::opt::ArgList &Args,
llvm::opt::ArgStringList &CmdArgs);
+// Parse -mprefer-vector-width=. Return the Value string if well-formed.
+// Otherwise, return an empty string and issue a diagnosic message if needed.
+StringRef parseMPreferVectorWidthOption(clang::DiagnosticsEngine &Diags,
+ const llvm::opt::ArgList &Args);
+
+// Parse -mrecip. Return the Value string if well-formed.
+// Otherwise, return an empty string and issue a diagnosic message if needed.
+StringRef parseMRecipOption(clang::DiagnosticsEngine &Diags,
+ const llvm::opt::ArgList &Args);
+
// Convert ComplexRangeKind to a string that can be passed as a frontend option.
std::string complexRangeKindToStr(LangOptions::ComplexRangeKind Range);
diff --git a/clang/include/clang/Driver/CreateASTUnitFromArgs.h b/clang/include/clang/Driver/CreateASTUnitFromArgs.h
deleted file mode 100644
index 30575cc04ca7c..0000000000000
--- a/clang/include/clang/Driver/CreateASTUnitFromArgs.h
+++ /dev/null
@@ -1,80 +0,0 @@
-//===-- CreateInvocationFromArgs.h - Create an ASTUnit from Args-*- 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
-//
-//===----------------------------------------------------------------------===//
-//
-// Utility for creating an ASTUnit from a vector of command line arguments.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef LLVM_CLANG_DRIVER_CREATEASTUNITFROMARGS_H
-#define LLVM_CLANG_DRIVER_CREATEASTUNITFROMARGS_H
-
-#include "clang/Frontend/ASTUnit.h"
-
-namespace clang {
-
-/// Create an ASTUnit from a vector of command line arguments, which must
-/// specify exactly one source file.
-///
-/// \param ArgBegin - The beginning of the argument vector.
-///
-/// \param ArgEnd - The end of the argument vector.
-///
-/// \param PCHContainerOps - The PCHContainerOperations to use for loading and
-/// creating modules.
-///
-/// \param Diags - The diagnostics engine to use for reporting errors; its
-/// lifetime is expected to extend past that of the returned ASTUnit.
-///
-/// \param ResourceFilesPath - The path to the compiler resource files.
-///
-/// \param StorePreamblesInMemory - Whether to store PCH in memory. If false,
-/// PCH are stored in temporary files.
-///
-/// \param PreambleStoragePath - The path to a directory, in which to create
-/// temporary PCH files. If empty, the default system temporary directory is
-/// used. This parameter is ignored if \p StorePreamblesInMemory is true.
-///
-/// \param ModuleFormat - If provided, uses the specific module format.
-///
-/// \param ErrAST - If non-null and parsing failed without any AST to return
-/// (e.g. because the PCH could not be loaded), this accepts the ASTUnit
-/// mainly to allow the caller to see the diagnostics.
-///
-/// \param VFS - A llvm::vfs::FileSystem to be used for all file accesses.
-/// Note that preamble is saved to a temporary directory on a RealFileSystem,
-/// so in order for it to be loaded correctly, VFS should have access to
-/// it(i.e., be an overlay over RealFileSystem). RealFileSystem will be used
-/// if \p VFS is nullptr.
-///
-// FIXME: Move OnlyLocalDecls, UseBumpAllocator to setters on the ASTUnit, we
-// shouldn't need to specify them at construction time.
-std::unique_ptr<ASTUnit> CreateASTUnitFromCommandLine(
- const char **ArgBegin, const char **ArgEnd,
- std::shared_ptr<PCHContainerOperations> PCHContainerOps,
- std::shared_ptr<DiagnosticOptions> DiagOpts,
- IntrusiveRefCntPtr<DiagnosticsEngine> Diags, StringRef ResourceFilesPath,
- bool StorePreamblesInMemory = false,
- StringRef PreambleStoragePath = StringRef(), bool OnlyLocalDecls = false,
- CaptureDiagsKind CaptureDiagnostics = CaptureDiagsKind::None,
- ArrayRef<ASTUnit::RemappedFile> RemappedFiles = {},
- bool RemappedFilesKeepOriginalName = true,
- unsigned PrecompilePreambleAfterNParses = 0,
- TranslationUnitKind TUKind = TU_Complete,
- bool CacheCodeCompletionResults = false,
- bool IncludeBriefCommentsInCodeCompletion = false,
- bool AllowPCHWithCompilerErrors = false,
- SkipFunctionBodiesScope SkipFunctionBodies = SkipFunctionBodiesScope::None,
- bool SingleFileParse = false, bool UserFilesAreVolatile = false,
- bool ForSerialization = false, bool RetainExcludedConditionalBlocks = false,
- std::optional<StringRef> ModuleFormat = std::nullopt,
- std::unique_ptr<ASTUnit> *ErrAST = nullptr,
- IntrusiveRefCntPtr<llvm::vfs::FileSystem> VFS = nullptr);
-
-} // namespace clang
-
-#endif // LLVM_CLANG_DRIVER_CREATEASTUNITFROMARGS_H
diff --git a/clang/include/clang/Driver/CreateInvocationFromArgs.h b/clang/include/clang/Driver/CreateInvocationFromArgs.h
deleted file mode 100644
index 0e0f67373ce87..0000000000000
--- a/clang/include/clang/Driver/CreateInvocationFromArgs.h
+++ /dev/null
@@ -1,76 +0,0 @@
-//===--- CreateInvocationFromArgs.h - CompilerInvocation from Args --------===//
-//
-// 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
-//
-//===----------------------------------------------------------------------===//
-//
-// Utility for creating a CompilerInvocation from command-line arguments, for
-// tools to use in preparation to parse a file.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef LLVM_CLANG_DRIVER_CREATEINVOCATIONFROMARGS_H
-#define LLVM_CLANG_DRIVER_CREATEINVOCATIONFROMARGS_H
-
-#include "clang/Basic/Diagnostic.h"
-#include "clang/Basic/LLVM.h"
-#include "llvm/Support/VirtualFileSystem.h"
-#include <memory>
-#include <string>
-#include <vector>
-
-namespace clang {
-
-class CompilerInvocation;
-class DiagnosticsEngine;
-
-/// Optional inputs to createInvocation.
-struct CreateInvocationOptions {
- /// Receives diagnostics encountered while parsing command-line flags.
- /// If not provided, these are printed to stderr.
- IntrusiveRefCntPtr<DiagnosticsEngine> Diags = nullptr;
- /// Used e.g. to probe for system headers locations.
- /// If not provided, the real filesystem is used.
- /// FIXME: the driver does perform some non-virtualized IO.
- IntrusiveRefCntPtr<llvm::vfs::FileSystem> VFS = nullptr;
- /// Whether to attempt to produce a non-null (possibly incorrect) invocation
- /// if any errors were encountered.
- /// By default, always return null on errors.
- bool RecoverOnError = false;
- /// Allow the driver to probe the filesystem for PCH files.
- /// This is used to replace -include with -include-pch in the cc1 args.
- /// FIXME: ProbePrecompiled=true is a poor, historical default.
- /// It misbehaves if the PCH file is from GCC, has the wrong version, etc.
- bool ProbePrecompiled = false;
- /// If set, the target is populated with the cc1 args produced by the driver.
- /// This may be populated even if createInvocation returns nullptr.
- std::vector<std::string> *CC1Args = nullptr;
-};
-
-/// Interpret clang arguments in preparation to parse a file.
-///
-/// This simulates a number of steps Clang takes when its driver is invoked:
-/// - choosing actions (e.g compile + link) to run
-/// - probing the system for settings like standard library locations
-/// - spawning a cc1 subprocess to compile code, with more explicit arguments
-/// - in the cc1 process, assembling those arguments into a CompilerInvocation
-/// which is used to configure the parser
-///
-/// This simulation is lossy, e.g. in some situations one driver run would
-/// result in multiple parses. (Multi-arch, CUDA, ...).
-/// This function tries to select a reasonable invocation that tools should use.
-///
-/// Args[0] should be the driver name, such as "clang" or "/usr/bin/g++".
-/// Absolute path is preferred - this affects searching for system headers.
-///
-/// May return nullptr if an invocation could not be determined.
-/// See CreateInvocationOptions::RecoverOnError to try harder!
-std::unique_ptr<CompilerInvocation>
-createInvocation(ArrayRef<const char *> Args,
- CreateInvocationOptions Opts = {});
-
-} // namespace clang
-
-#endif // LLVM_CLANG_DRIVER_CREATEINVOCATIONFROMARGS_H
diff --git a/clang/include/clang/Driver/Driver.h b/clang/include/clang/Driver/Driver.h
index 76a6c5a128efb..83bcb7cab550f 100644
--- a/clang/include/clang/Driver/Driver.h
+++ b/clang/include/clang/Driver/Driver.h
@@ -406,6 +406,10 @@ class Driver {
SmallString<128> &CrashDiagDir);
public:
+ /// Takes the path to a binary that's either in bin/ or lib/ and returns
+ /// the path to clang's resource directory.
+ static std::string GetResourcesPath(StringRef BinaryPath);
+
Driver(StringRef ClangExecutable, StringRef TargetTriple,
DiagnosticsEngine &Diags, std::string Title = "clang LLVM compiler",
IntrusiveRefCntPtr<llvm::vfs::FileSystem> VFS = nullptr);
diff --git a/clang/include/clang/Frontend/ASTUnit.h b/clang/include/clang/Frontend/ASTUnit.h
index 341460e1962cb..e585933a5c8be 100644
--- a/clang/include/clang/Frontend/ASTUnit.h
+++ b/clang/include/clang/Frontend/ASTUnit.h
@@ -23,13 +23,11 @@
#include "clang/Basic/SourceManager.h"
#include "clang/Basic/TargetOptions.h"
#include "clang/Frontend/PrecompiledPreamble.h"
-#include "clang/Frontend/StandaloneDiagnostic.h"
#include "clang/Lex/HeaderSearchOptions.h"
#include "clang/Lex/ModuleLoader.h"
#include "clang/Lex/PreprocessingRecord.h"
#include "clang/Sema/CodeCompleteConsumer.h"
#include "clang/Serialization/ASTBitCodes.h"
-#include "clang/Serialization/ASTWriter.h"
#include "llvm/ADT/ArrayRef.h"
#include "llvm/ADT/DenseMap.h"
#include "llvm/ADT/IntrusiveRefCntPtr.h"
@@ -38,7 +36,6 @@
#include "llvm/ADT/StringMap.h"
#include "llvm/ADT/StringRef.h"
#include "llvm/ADT/iterator_range.h"
-#include "llvm/Bitstream/BitstreamWriter.h"
#include <cassert>
#include <cstddef>
#include <cstdint>
@@ -91,6 +88,25 @@ enum class CaptureDiagsKind { None, All, AllWithoutNonErrorsFromIncludes };
/// Utility class for loading a ASTContext from an AST file.
class ASTUnit {
+public:
+ struct StandaloneFixIt {
+ std::pair<unsigned, unsigned> RemoveRange;
+ std::pair<unsigned, unsigned> InsertFromRange;
+ std::string CodeToInsert;
+ bool BeforePreviousInsertions;
+ };
+
+ struct StandaloneDiagnostic {
+ unsigned ID;
+ DiagnosticsEngine::Level Level;
+ std::string Message;
+ std::string Filename;
+ unsigned LocOffset;
+ std::vector<std::pair<unsigned, unsigned>> Ranges;
+ std::vector<StandaloneFixIt> FixIts;
+ };
+
+private:
std::unique_ptr<LangOptions> LangOpts;
std::unique_ptr<CodeGenOptions> CodeGenOpts;
// FIXME: The documentation on \c LoadFrom* member functions states that the
@@ -113,15 +129,7 @@ class ASTUnit {
bool HadModuleLoaderFatalFailure = false;
bool StorePreamblesInMemory = false;
- /// Utility struct for managing ASTWriter and its associated data streams.
- struct ASTWriterData {
- SmallString<128> Buffer;
- llvm::BitstreamWriter Stream;
- ASTWriter Writer;
-
- ASTWriterData(ModuleCache &ModCache, const CodeGenOptions &CGOpts)
- : Stream(Buffer), Writer(Stream, Buffer, ModCache, CGOpts, {}) {}
- };
+ struct ASTWriterData;
std::unique_ptr<ASTWriterData> WriterData;
FileSystemOptions FileSystemOpts;
@@ -263,6 +271,11 @@ class ASTUnit {
static void ConfigureDiags(IntrusiveRefCntPtr<DiagnosticsEngine> Diags,
ASTUnit &AST, CaptureDiagsKind CaptureDiagnostics);
+ void
+ TranslateStoredDiagnostics(FileManager &FileMgr, SourceManager &SrcMan,
+ const SmallVectorImpl<StandaloneDiagnostic> &Diags,
+ SmallVectorImpl<StoredDiagnostic> &Out);
+
void clearFileLevelDecls();
public:
@@ -821,24 +834,65 @@ class ASTUnit {
bool IncludeBriefCommentsInCodeCompletion = false,
bool UserFilesAreVolatile = false);
- friend std::unique_ptr<ASTUnit> CreateASTUnitFromCommandLine(
+ /// LoadFromCommandLine - Create an ASTUnit from a vector of command line
+ /// arguments, which must specify exactly one source file.
+ ///
+ /// \param ArgBegin - The beginning of the argument vector.
+ ///
+ /// \param ArgEnd - The end of the argument vector.
+ ///
+ /// \param PCHContainerOps - The PCHContainerOperations to use for loading and
+ /// creating modules.
+ ///
+ /// \param Diags - The diagnostics engine to use for reporting errors; its
+ /// lifetime is expected to extend past that of the returned ASTUnit.
+ ///
+ /// \param ResourceFilesPath - The path to the compiler resource files.
+ ///
+ /// \param StorePreamblesInMemory - Whether to store PCH in memory. If false,
+ /// PCH are stored in temporary files.
+ ///
+ /// \param PreambleStoragePath - The path to a directory, in which to create
+ /// temporary PCH files. If empty, the default system temporary directory is
+ /// used. This parameter is ignored if \p StorePreamblesInMemory is true.
+ ///
+ /// \param ModuleFormat - If provided, uses the specific module format.
+ ///
+ /// \param ErrAST - If non-null and parsing failed without any AST to return
+ /// (e.g. because the PCH could not be loaded), this accepts the ASTUnit
+ /// mainly to allow the caller to see the diagnostics.
+ ///
+ /// \param VFS - A llvm::vfs::FileSystem to be used for all file accesses.
+ /// Note that preamble is saved to a temporary directory on a RealFileSystem,
+ /// so in order for it to be loaded correctly, VFS should have access to
+ /// it(i.e., be an overlay over RealFileSystem). RealFileSystem will be used
+ /// if \p VFS is nullptr.
+ ///
+ // FIXME: Move OnlyLocalDecls, UseBumpAllocator to setters on the ASTUnit, we
+ // shouldn't need to specify them at construction time.
+ static std::unique_ptr<ASTUnit> LoadFromCommandLine(
const char **ArgBegin, const char **ArgEnd,
std::shared_ptr<PCHContainerOperations> PCHContainerOps,
std::shared_ptr<DiagnosticOptions> DiagOpts,
IntrusiveRefCntPtr<DiagnosticsEngine> Diags, StringRef ResourceFilesPath,
- bool StorePreamblesInMemory, StringRef PreambleStoragePath,
- bool OnlyLocalDecls, CaptureDiagsKind CaptureDiagnostics,
- ArrayRef<ASTUnit::RemappedFile> RemappedFiles,
- bool RemappedFilesKeepOriginalName,
- unsigned PrecompilePreambleAfterNParses, TranslationUnitKind TUKind,
- bool CacheCodeCompletionResults,
- bool IncludeBriefCommentsInCodeCompletion,
- bool AllowPCHWithCompilerErrors,
- SkipFunctionBodiesScope SkipFunctionBodies, bool SingleFileParse,
- bool UserFilesAreVolatile, bool ForSerialization,
- bool RetainExcludedConditionalBlocks,
- std::optional<StringRef> ModuleFormat, std::unique_ptr<ASTUnit> *ErrAST,
- IntrusiveRefCntPtr<llvm::vfs::FileSystem> VFS);
+ bool StorePreamblesInMemory = false,
+ StringRef PreambleStoragePath = StringRef(), bool OnlyLocalDecls = false,
+ CaptureDiagsKind CaptureDiagnostics = CaptureDiagsKind::None,
+ ArrayRef<RemappedFile> RemappedFiles = {},
+ bool RemappedFilesKeepOriginalName = true,
+ unsigned PrecompilePreambleAfterNParses = 0,
+ TranslationUnitKind TUKind = TU_Complete,
+ bool CacheCodeCompletionResults = false,
+ bool IncludeBriefCommentsInCodeCompletion = false,
+ bool AllowPCHWithCompilerErrors = false,
+ SkipFunctionBodiesScope SkipFunctionBodies =
+ SkipFunctionBodiesScope::None,
+ bool SingleFileParse = false, bool UserFilesAreVolatile = false,
+ bool ForSerialization = false,
+ bool RetainExcludedConditionalBlocks = false,
+ std::optional<StringRef> ModuleFormat = std::nullopt,
+ std::unique_ptr<ASTUnit> *ErrAST = nullptr,
+ IntrusiveRefCntPtr<llvm::vfs::FileSystem> VFS = nullptr);
/// Reparse the source files using the same command-line options that
/// were originally used to produce this translation unit.
@@ -909,44 +963,6 @@ class ASTUnit {
bool serialize(raw_ostream &OS);
};
-/// Diagnostic consumer that saves each diagnostic it is given.
-class FilterAndStoreDiagnosticConsumer : public DiagnosticConsumer {
- SmallVectorImpl<StoredDiagnostic> *StoredDiags;
- SmallVectorImpl<StandaloneDiagnostic> *StandaloneDiags;
- bool CaptureNonErrorsFromIncludes = true;
- const LangOptions *LangOpts = nullptr;
- SourceManager *SourceMgr = nullptr;
-
-public:
- FilterAndStoreDiagnosticConsumer(
- SmallVectorImpl<StoredDiagnostic> *StoredDiags,
- SmallVectorImpl<StandaloneDiagnostic> *StandaloneDiags,
- bool CaptureNonErrorsFromIncludes);
-
- void BeginSourceFile(const LangOptions &LangOpts,
- const Preprocessor *PP = nullptr) override;
-
- void HandleDiagnostic(DiagnosticsEngine::Level Level,
- const Diagnostic &Info) override;
-};
-
-/// RAII object that optionally captures and filters diagnostics, if
-/// there is no diagnostic client to capture them already.
-class CaptureDroppedDiagnostics {
- DiagnosticsEngine &Diags;
- FilterAndStoreDiagnosticConsumer Client;
- DiagnosticConsumer *PreviousClient = nullptr;
- std::unique_ptr<DiagnosticConsumer> OwningPreviousClient;
-
-public:
- CaptureDroppedDiagnostics(
- CaptureDiagsKind CaptureDiagnostics, DiagnosticsEngine &Diags,
- SmallVectorImpl<StoredDiagnostic> *StoredDiags,
- SmallVectorImpl<StandaloneDiagnostic> *StandaloneDiags);
-
- ~CaptureDroppedDiagnostics();
-};
-
} // namespace clang
#endif // LLVM_CLANG_FRONTEND_ASTUNIT_H
diff --git a/clang/include/clang/Frontend/CompilerInvocation.h b/clang/include/clang/Frontend/CompilerInvocation.h
index 4977ddb307d21..b19a6e1a8acc3 100644
--- a/clang/include/clang/Frontend/CompilerInvocation.h
+++ b/clang/include/clang/Frontend/CompilerInvocation.h
@@ -299,6 +299,16 @@ class CompilerInvocation : public CompilerInvocationBase {
...
[truncated]
|
|
@llvm/pr-subscribers-flang-driver Author: Naveen Seth Hanig (naveen-seth) ChangesThis reverts commit 3773bbe and relands the last revert attempt 40334b8. Patch is 103.69 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/169397.diff 60 Files Affected:
diff --git a/clang-tools-extra/clangd/CompileCommands.cpp b/clang-tools-extra/clangd/CompileCommands.cpp
index 4eda330716f21..7990f2719e9a0 100644
--- a/clang-tools-extra/clangd/CompileCommands.cpp
+++ b/clang-tools-extra/clangd/CompileCommands.cpp
@@ -132,7 +132,8 @@ std::optional<std::string> detectSysroot() {
std::string detectStandardResourceDir() {
static int StaticForMainAddr; // Just an address in this process.
- return GetResourcesPath("clangd", (void *)&StaticForMainAddr);
+ return CompilerInvocation::GetResourcesPath("clangd",
+ (void *)&StaticForMainAddr);
}
// The path passed to argv[0] is important:
diff --git a/clang-tools-extra/clangd/Compiler.cpp b/clang-tools-extra/clangd/Compiler.cpp
index 9ea7df139382a..6ebc2eac25745 100644
--- a/clang-tools-extra/clangd/Compiler.cpp
+++ b/clang-tools-extra/clangd/Compiler.cpp
@@ -9,7 +9,6 @@
#include "Compiler.h"
#include "support/Logger.h"
#include "clang/Basic/TargetInfo.h"
-#include "clang/Driver/CreateInvocationFromArgs.h"
#include "clang/Frontend/CompilerInvocation.h"
#include "clang/Lex/PreprocessorOptions.h"
#include "clang/Serialization/PCHContainerOperations.h"
diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index b12e4539dc3a6..51f07256c5d9f 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -84,8 +84,6 @@ Potentially Breaking Changes
- Downstream projects that previously linked only against ``clangDriver`` may
now (also) need to link against the new ``clangOptions`` library, since
options-related code has been moved out of the Driver into a separate library.
-- The ``clangFrontend`` library no longer depends on ``clangDriver``, which may
- break downstream projects that relied on this transitive dependency.
C/C++ Language Potentially Breaking Changes
-------------------------------------------
diff --git a/clang/include/clang/Driver/CommonArgs.h b/clang/include/clang/Driver/CommonArgs.h
index 264bd4965f9ad..ac17d6211d882 100644
--- a/clang/include/clang/Driver/CommonArgs.h
+++ b/clang/include/clang/Driver/CommonArgs.h
@@ -291,6 +291,16 @@ void handleVectorizeLoopsArgs(const llvm::opt::ArgList &Args,
void handleVectorizeSLPArgs(const llvm::opt::ArgList &Args,
llvm::opt::ArgStringList &CmdArgs);
+// Parse -mprefer-vector-width=. Return the Value string if well-formed.
+// Otherwise, return an empty string and issue a diagnosic message if needed.
+StringRef parseMPreferVectorWidthOption(clang::DiagnosticsEngine &Diags,
+ const llvm::opt::ArgList &Args);
+
+// Parse -mrecip. Return the Value string if well-formed.
+// Otherwise, return an empty string and issue a diagnosic message if needed.
+StringRef parseMRecipOption(clang::DiagnosticsEngine &Diags,
+ const llvm::opt::ArgList &Args);
+
// Convert ComplexRangeKind to a string that can be passed as a frontend option.
std::string complexRangeKindToStr(LangOptions::ComplexRangeKind Range);
diff --git a/clang/include/clang/Driver/CreateASTUnitFromArgs.h b/clang/include/clang/Driver/CreateASTUnitFromArgs.h
deleted file mode 100644
index 30575cc04ca7c..0000000000000
--- a/clang/include/clang/Driver/CreateASTUnitFromArgs.h
+++ /dev/null
@@ -1,80 +0,0 @@
-//===-- CreateInvocationFromArgs.h - Create an ASTUnit from Args-*- 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
-//
-//===----------------------------------------------------------------------===//
-//
-// Utility for creating an ASTUnit from a vector of command line arguments.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef LLVM_CLANG_DRIVER_CREATEASTUNITFROMARGS_H
-#define LLVM_CLANG_DRIVER_CREATEASTUNITFROMARGS_H
-
-#include "clang/Frontend/ASTUnit.h"
-
-namespace clang {
-
-/// Create an ASTUnit from a vector of command line arguments, which must
-/// specify exactly one source file.
-///
-/// \param ArgBegin - The beginning of the argument vector.
-///
-/// \param ArgEnd - The end of the argument vector.
-///
-/// \param PCHContainerOps - The PCHContainerOperations to use for loading and
-/// creating modules.
-///
-/// \param Diags - The diagnostics engine to use for reporting errors; its
-/// lifetime is expected to extend past that of the returned ASTUnit.
-///
-/// \param ResourceFilesPath - The path to the compiler resource files.
-///
-/// \param StorePreamblesInMemory - Whether to store PCH in memory. If false,
-/// PCH are stored in temporary files.
-///
-/// \param PreambleStoragePath - The path to a directory, in which to create
-/// temporary PCH files. If empty, the default system temporary directory is
-/// used. This parameter is ignored if \p StorePreamblesInMemory is true.
-///
-/// \param ModuleFormat - If provided, uses the specific module format.
-///
-/// \param ErrAST - If non-null and parsing failed without any AST to return
-/// (e.g. because the PCH could not be loaded), this accepts the ASTUnit
-/// mainly to allow the caller to see the diagnostics.
-///
-/// \param VFS - A llvm::vfs::FileSystem to be used for all file accesses.
-/// Note that preamble is saved to a temporary directory on a RealFileSystem,
-/// so in order for it to be loaded correctly, VFS should have access to
-/// it(i.e., be an overlay over RealFileSystem). RealFileSystem will be used
-/// if \p VFS is nullptr.
-///
-// FIXME: Move OnlyLocalDecls, UseBumpAllocator to setters on the ASTUnit, we
-// shouldn't need to specify them at construction time.
-std::unique_ptr<ASTUnit> CreateASTUnitFromCommandLine(
- const char **ArgBegin, const char **ArgEnd,
- std::shared_ptr<PCHContainerOperations> PCHContainerOps,
- std::shared_ptr<DiagnosticOptions> DiagOpts,
- IntrusiveRefCntPtr<DiagnosticsEngine> Diags, StringRef ResourceFilesPath,
- bool StorePreamblesInMemory = false,
- StringRef PreambleStoragePath = StringRef(), bool OnlyLocalDecls = false,
- CaptureDiagsKind CaptureDiagnostics = CaptureDiagsKind::None,
- ArrayRef<ASTUnit::RemappedFile> RemappedFiles = {},
- bool RemappedFilesKeepOriginalName = true,
- unsigned PrecompilePreambleAfterNParses = 0,
- TranslationUnitKind TUKind = TU_Complete,
- bool CacheCodeCompletionResults = false,
- bool IncludeBriefCommentsInCodeCompletion = false,
- bool AllowPCHWithCompilerErrors = false,
- SkipFunctionBodiesScope SkipFunctionBodies = SkipFunctionBodiesScope::None,
- bool SingleFileParse = false, bool UserFilesAreVolatile = false,
- bool ForSerialization = false, bool RetainExcludedConditionalBlocks = false,
- std::optional<StringRef> ModuleFormat = std::nullopt,
- std::unique_ptr<ASTUnit> *ErrAST = nullptr,
- IntrusiveRefCntPtr<llvm::vfs::FileSystem> VFS = nullptr);
-
-} // namespace clang
-
-#endif // LLVM_CLANG_DRIVER_CREATEASTUNITFROMARGS_H
diff --git a/clang/include/clang/Driver/CreateInvocationFromArgs.h b/clang/include/clang/Driver/CreateInvocationFromArgs.h
deleted file mode 100644
index 0e0f67373ce87..0000000000000
--- a/clang/include/clang/Driver/CreateInvocationFromArgs.h
+++ /dev/null
@@ -1,76 +0,0 @@
-//===--- CreateInvocationFromArgs.h - CompilerInvocation from Args --------===//
-//
-// 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
-//
-//===----------------------------------------------------------------------===//
-//
-// Utility for creating a CompilerInvocation from command-line arguments, for
-// tools to use in preparation to parse a file.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef LLVM_CLANG_DRIVER_CREATEINVOCATIONFROMARGS_H
-#define LLVM_CLANG_DRIVER_CREATEINVOCATIONFROMARGS_H
-
-#include "clang/Basic/Diagnostic.h"
-#include "clang/Basic/LLVM.h"
-#include "llvm/Support/VirtualFileSystem.h"
-#include <memory>
-#include <string>
-#include <vector>
-
-namespace clang {
-
-class CompilerInvocation;
-class DiagnosticsEngine;
-
-/// Optional inputs to createInvocation.
-struct CreateInvocationOptions {
- /// Receives diagnostics encountered while parsing command-line flags.
- /// If not provided, these are printed to stderr.
- IntrusiveRefCntPtr<DiagnosticsEngine> Diags = nullptr;
- /// Used e.g. to probe for system headers locations.
- /// If not provided, the real filesystem is used.
- /// FIXME: the driver does perform some non-virtualized IO.
- IntrusiveRefCntPtr<llvm::vfs::FileSystem> VFS = nullptr;
- /// Whether to attempt to produce a non-null (possibly incorrect) invocation
- /// if any errors were encountered.
- /// By default, always return null on errors.
- bool RecoverOnError = false;
- /// Allow the driver to probe the filesystem for PCH files.
- /// This is used to replace -include with -include-pch in the cc1 args.
- /// FIXME: ProbePrecompiled=true is a poor, historical default.
- /// It misbehaves if the PCH file is from GCC, has the wrong version, etc.
- bool ProbePrecompiled = false;
- /// If set, the target is populated with the cc1 args produced by the driver.
- /// This may be populated even if createInvocation returns nullptr.
- std::vector<std::string> *CC1Args = nullptr;
-};
-
-/// Interpret clang arguments in preparation to parse a file.
-///
-/// This simulates a number of steps Clang takes when its driver is invoked:
-/// - choosing actions (e.g compile + link) to run
-/// - probing the system for settings like standard library locations
-/// - spawning a cc1 subprocess to compile code, with more explicit arguments
-/// - in the cc1 process, assembling those arguments into a CompilerInvocation
-/// which is used to configure the parser
-///
-/// This simulation is lossy, e.g. in some situations one driver run would
-/// result in multiple parses. (Multi-arch, CUDA, ...).
-/// This function tries to select a reasonable invocation that tools should use.
-///
-/// Args[0] should be the driver name, such as "clang" or "/usr/bin/g++".
-/// Absolute path is preferred - this affects searching for system headers.
-///
-/// May return nullptr if an invocation could not be determined.
-/// See CreateInvocationOptions::RecoverOnError to try harder!
-std::unique_ptr<CompilerInvocation>
-createInvocation(ArrayRef<const char *> Args,
- CreateInvocationOptions Opts = {});
-
-} // namespace clang
-
-#endif // LLVM_CLANG_DRIVER_CREATEINVOCATIONFROMARGS_H
diff --git a/clang/include/clang/Driver/Driver.h b/clang/include/clang/Driver/Driver.h
index 76a6c5a128efb..83bcb7cab550f 100644
--- a/clang/include/clang/Driver/Driver.h
+++ b/clang/include/clang/Driver/Driver.h
@@ -406,6 +406,10 @@ class Driver {
SmallString<128> &CrashDiagDir);
public:
+ /// Takes the path to a binary that's either in bin/ or lib/ and returns
+ /// the path to clang's resource directory.
+ static std::string GetResourcesPath(StringRef BinaryPath);
+
Driver(StringRef ClangExecutable, StringRef TargetTriple,
DiagnosticsEngine &Diags, std::string Title = "clang LLVM compiler",
IntrusiveRefCntPtr<llvm::vfs::FileSystem> VFS = nullptr);
diff --git a/clang/include/clang/Frontend/ASTUnit.h b/clang/include/clang/Frontend/ASTUnit.h
index 341460e1962cb..e585933a5c8be 100644
--- a/clang/include/clang/Frontend/ASTUnit.h
+++ b/clang/include/clang/Frontend/ASTUnit.h
@@ -23,13 +23,11 @@
#include "clang/Basic/SourceManager.h"
#include "clang/Basic/TargetOptions.h"
#include "clang/Frontend/PrecompiledPreamble.h"
-#include "clang/Frontend/StandaloneDiagnostic.h"
#include "clang/Lex/HeaderSearchOptions.h"
#include "clang/Lex/ModuleLoader.h"
#include "clang/Lex/PreprocessingRecord.h"
#include "clang/Sema/CodeCompleteConsumer.h"
#include "clang/Serialization/ASTBitCodes.h"
-#include "clang/Serialization/ASTWriter.h"
#include "llvm/ADT/ArrayRef.h"
#include "llvm/ADT/DenseMap.h"
#include "llvm/ADT/IntrusiveRefCntPtr.h"
@@ -38,7 +36,6 @@
#include "llvm/ADT/StringMap.h"
#include "llvm/ADT/StringRef.h"
#include "llvm/ADT/iterator_range.h"
-#include "llvm/Bitstream/BitstreamWriter.h"
#include <cassert>
#include <cstddef>
#include <cstdint>
@@ -91,6 +88,25 @@ enum class CaptureDiagsKind { None, All, AllWithoutNonErrorsFromIncludes };
/// Utility class for loading a ASTContext from an AST file.
class ASTUnit {
+public:
+ struct StandaloneFixIt {
+ std::pair<unsigned, unsigned> RemoveRange;
+ std::pair<unsigned, unsigned> InsertFromRange;
+ std::string CodeToInsert;
+ bool BeforePreviousInsertions;
+ };
+
+ struct StandaloneDiagnostic {
+ unsigned ID;
+ DiagnosticsEngine::Level Level;
+ std::string Message;
+ std::string Filename;
+ unsigned LocOffset;
+ std::vector<std::pair<unsigned, unsigned>> Ranges;
+ std::vector<StandaloneFixIt> FixIts;
+ };
+
+private:
std::unique_ptr<LangOptions> LangOpts;
std::unique_ptr<CodeGenOptions> CodeGenOpts;
// FIXME: The documentation on \c LoadFrom* member functions states that the
@@ -113,15 +129,7 @@ class ASTUnit {
bool HadModuleLoaderFatalFailure = false;
bool StorePreamblesInMemory = false;
- /// Utility struct for managing ASTWriter and its associated data streams.
- struct ASTWriterData {
- SmallString<128> Buffer;
- llvm::BitstreamWriter Stream;
- ASTWriter Writer;
-
- ASTWriterData(ModuleCache &ModCache, const CodeGenOptions &CGOpts)
- : Stream(Buffer), Writer(Stream, Buffer, ModCache, CGOpts, {}) {}
- };
+ struct ASTWriterData;
std::unique_ptr<ASTWriterData> WriterData;
FileSystemOptions FileSystemOpts;
@@ -263,6 +271,11 @@ class ASTUnit {
static void ConfigureDiags(IntrusiveRefCntPtr<DiagnosticsEngine> Diags,
ASTUnit &AST, CaptureDiagsKind CaptureDiagnostics);
+ void
+ TranslateStoredDiagnostics(FileManager &FileMgr, SourceManager &SrcMan,
+ const SmallVectorImpl<StandaloneDiagnostic> &Diags,
+ SmallVectorImpl<StoredDiagnostic> &Out);
+
void clearFileLevelDecls();
public:
@@ -821,24 +834,65 @@ class ASTUnit {
bool IncludeBriefCommentsInCodeCompletion = false,
bool UserFilesAreVolatile = false);
- friend std::unique_ptr<ASTUnit> CreateASTUnitFromCommandLine(
+ /// LoadFromCommandLine - Create an ASTUnit from a vector of command line
+ /// arguments, which must specify exactly one source file.
+ ///
+ /// \param ArgBegin - The beginning of the argument vector.
+ ///
+ /// \param ArgEnd - The end of the argument vector.
+ ///
+ /// \param PCHContainerOps - The PCHContainerOperations to use for loading and
+ /// creating modules.
+ ///
+ /// \param Diags - The diagnostics engine to use for reporting errors; its
+ /// lifetime is expected to extend past that of the returned ASTUnit.
+ ///
+ /// \param ResourceFilesPath - The path to the compiler resource files.
+ ///
+ /// \param StorePreamblesInMemory - Whether to store PCH in memory. If false,
+ /// PCH are stored in temporary files.
+ ///
+ /// \param PreambleStoragePath - The path to a directory, in which to create
+ /// temporary PCH files. If empty, the default system temporary directory is
+ /// used. This parameter is ignored if \p StorePreamblesInMemory is true.
+ ///
+ /// \param ModuleFormat - If provided, uses the specific module format.
+ ///
+ /// \param ErrAST - If non-null and parsing failed without any AST to return
+ /// (e.g. because the PCH could not be loaded), this accepts the ASTUnit
+ /// mainly to allow the caller to see the diagnostics.
+ ///
+ /// \param VFS - A llvm::vfs::FileSystem to be used for all file accesses.
+ /// Note that preamble is saved to a temporary directory on a RealFileSystem,
+ /// so in order for it to be loaded correctly, VFS should have access to
+ /// it(i.e., be an overlay over RealFileSystem). RealFileSystem will be used
+ /// if \p VFS is nullptr.
+ ///
+ // FIXME: Move OnlyLocalDecls, UseBumpAllocator to setters on the ASTUnit, we
+ // shouldn't need to specify them at construction time.
+ static std::unique_ptr<ASTUnit> LoadFromCommandLine(
const char **ArgBegin, const char **ArgEnd,
std::shared_ptr<PCHContainerOperations> PCHContainerOps,
std::shared_ptr<DiagnosticOptions> DiagOpts,
IntrusiveRefCntPtr<DiagnosticsEngine> Diags, StringRef ResourceFilesPath,
- bool StorePreamblesInMemory, StringRef PreambleStoragePath,
- bool OnlyLocalDecls, CaptureDiagsKind CaptureDiagnostics,
- ArrayRef<ASTUnit::RemappedFile> RemappedFiles,
- bool RemappedFilesKeepOriginalName,
- unsigned PrecompilePreambleAfterNParses, TranslationUnitKind TUKind,
- bool CacheCodeCompletionResults,
- bool IncludeBriefCommentsInCodeCompletion,
- bool AllowPCHWithCompilerErrors,
- SkipFunctionBodiesScope SkipFunctionBodies, bool SingleFileParse,
- bool UserFilesAreVolatile, bool ForSerialization,
- bool RetainExcludedConditionalBlocks,
- std::optional<StringRef> ModuleFormat, std::unique_ptr<ASTUnit> *ErrAST,
- IntrusiveRefCntPtr<llvm::vfs::FileSystem> VFS);
+ bool StorePreamblesInMemory = false,
+ StringRef PreambleStoragePath = StringRef(), bool OnlyLocalDecls = false,
+ CaptureDiagsKind CaptureDiagnostics = CaptureDiagsKind::None,
+ ArrayRef<RemappedFile> RemappedFiles = {},
+ bool RemappedFilesKeepOriginalName = true,
+ unsigned PrecompilePreambleAfterNParses = 0,
+ TranslationUnitKind TUKind = TU_Complete,
+ bool CacheCodeCompletionResults = false,
+ bool IncludeBriefCommentsInCodeCompletion = false,
+ bool AllowPCHWithCompilerErrors = false,
+ SkipFunctionBodiesScope SkipFunctionBodies =
+ SkipFunctionBodiesScope::None,
+ bool SingleFileParse = false, bool UserFilesAreVolatile = false,
+ bool ForSerialization = false,
+ bool RetainExcludedConditionalBlocks = false,
+ std::optional<StringRef> ModuleFormat = std::nullopt,
+ std::unique_ptr<ASTUnit> *ErrAST = nullptr,
+ IntrusiveRefCntPtr<llvm::vfs::FileSystem> VFS = nullptr);
/// Reparse the source files using the same command-line options that
/// were originally used to produce this translation unit.
@@ -909,44 +963,6 @@ class ASTUnit {
bool serialize(raw_ostream &OS);
};
-/// Diagnostic consumer that saves each diagnostic it is given.
-class FilterAndStoreDiagnosticConsumer : public DiagnosticConsumer {
- SmallVectorImpl<StoredDiagnostic> *StoredDiags;
- SmallVectorImpl<StandaloneDiagnostic> *StandaloneDiags;
- bool CaptureNonErrorsFromIncludes = true;
- const LangOptions *LangOpts = nullptr;
- SourceManager *SourceMgr = nullptr;
-
-public:
- FilterAndStoreDiagnosticConsumer(
- SmallVectorImpl<StoredDiagnostic> *StoredDiags,
- SmallVectorImpl<StandaloneDiagnostic> *StandaloneDiags,
- bool CaptureNonErrorsFromIncludes);
-
- void BeginSourceFile(const LangOptions &LangOpts,
- const Preprocessor *PP = nullptr) override;
-
- void HandleDiagnostic(DiagnosticsEngine::Level Level,
- const Diagnostic &Info) override;
-};
-
-/// RAII object that optionally captures and filters diagnostics, if
-/// there is no diagnostic client to capture them already.
-class CaptureDroppedDiagnostics {
- DiagnosticsEngine &Diags;
- FilterAndStoreDiagnosticConsumer Client;
- DiagnosticConsumer *PreviousClient = nullptr;
- std::unique_ptr<DiagnosticConsumer> OwningPreviousClient;
-
-public:
- CaptureDroppedDiagnostics(
- CaptureDiagsKind CaptureDiagnostics, DiagnosticsEngine &Diags,
- SmallVectorImpl<StoredDiagnostic> *StoredDiags,
- SmallVectorImpl<StandaloneDiagnostic> *StandaloneDiags);
-
- ~CaptureDroppedDiagnostics();
-};
-
} // namespace clang
#endif // LLVM_CLANG_FRONTEND_ASTUNIT_H
diff --git a/clang/include/clang/Frontend/CompilerInvocation.h b/clang/include/clang/Frontend/CompilerInvocation.h
index 4977ddb307d21..b19a6e1a8acc3 100644
--- a/clang/include/clang/Frontend/CompilerInvocation.h
+++ b/clang/include/clang/Frontend/CompilerInvocation.h
@@ -299,6 +299,16 @@ class CompilerInvocation : public CompilerInvocationBase {
...
[truncated]
|
|
Also 0e86510 |
|
I’m working on a reland right now. Sorry for the trouble. I’m trying to finish it as soon as possible, but the CMake configuration for the failing build (described here) compiles without issues on my local machine (x86_64 Linux). I’m not sure how to resolve this. @shiltian, tagging you in case you have any insight into what might be causing the cycle. |
|
The two builders with |
|
Thanks for the revert. Please let me know if any other information is needed from me. |
|
@shiltian, can you do the following for me?
diff --git a/llvm/CMakeLists.txt b/llvm/CMakeLists.txt
index 908580f791f3..d08f062fac4f 100644
--- a/llvm/CMakeLists.txt
+++ b/llvm/CMakeLists.txt
@@ -1,6 +1,9 @@
# See docs/CMake.html for instructions about how to build LLVM with CMake.
cmake_minimum_required(VERSION 3.20.0)
+set_property(GLOBAL PROPERTY GLOBAL_DEPENDS_NO_CYCLES ON)
+set_property(GLOBAL PROPERTY GLOBAL_DEPENDS_DEBUG_MODE ON)
+
include(CMakeDependentOption)
set(LLVM_COMMON_CMAKE_UTILS ${CMAKE_CURRENT_SOURCE_DIR}/../cmake)
With these CMake properties enabled, CMake should print the dependency lists for each target and detect any cycles ahead of time, with output like: For me, this does not report any cyclic dependency errors. The exact dependency list also don’t list |
|
|
With (To confirm this, I also tested configurations where I intentionally introduced direct and transitive cycles, and CMake correctly failed with an error during the configuration step in those cases.)
Is this the output from running ninja in for the build which generated the logs you have attached? If not, and your build still fails after re-running ninja, can you attach your |
|
It is not CMake that reports the cycle error. It is ninja build.
It is, and right after I ran the cmake command. |
|
Hm, I believe that with Since I can't reproduce the issue, I want to find the exact cause of the dependency cycle. #############################################
# Link the shared library lib/libclangFrontend.so.22.0git
...Otherwise the GraphViz files might show why the cycle is caused. And thank you for the logs! |
|
Thank you! The section in I just happened to talk with Ben Boeckel from CMake during the bi-weekly modules meeting. He suggested trying the build without If this doesn't help resolve the issue, then I might be out of ideas. 😅 |
|
Aha, removing |
…Frontend and flangFrontend (llvm#165277)" This relands llvm#165277 by reverting llvm#169397. This also relands the corresponding bazel port by reverting llvm#169410. The original revert was due to a report of a broken build, which was later resolved by fully clearing the build directory.
…Frontend and flangFrontend (llvm#165277)" (llvm#169397) This reverts commit 3773bbe and relands the last revert attempt 40334b8. 3773bbe broke the build for the build configuration described in here: llvm#165277 (comment)
…rontend and flangFrontend" (llvm#169599) This relands llvm#165277 by reverting llvm#169397. This also relands the corresponding Bazel port by reverting llvm#169410. The original revert was due to a report of a broken build, which was later resolved by fully clearing the build directory.
…rontend and flangFrontend" (llvm#169599) This relands llvm#165277 by reverting llvm#169397. This also relands the corresponding Bazel port by reverting llvm#169410. The original revert was due to a report of a broken build, which was later resolved by fully clearing the build directory.
This reverts commit 3773bbe and relands the last revert attempt 40334b8.
3773bbe broke the build for the build configuration described in here:
#165277 (comment)