aboutsummaryrefslogtreecommitdiff
path: root/clang/lib/Driver
diff options
context:
space:
mode:
Diffstat (limited to 'clang/lib/Driver')
-rw-r--r--clang/lib/Driver/CMakeLists.txt7
-rw-r--r--clang/lib/Driver/Compilation.cpp2
-rw-r--r--clang/lib/Driver/CreateASTUnitFromArgs.cpp166
-rw-r--r--clang/lib/Driver/CreateInvocationFromArgs.cpp119
-rw-r--r--clang/lib/Driver/Driver.cpp243
-rw-r--r--clang/lib/Driver/DriverOptions.cpp52
-rw-r--r--clang/lib/Driver/OptionUtils.cpp47
-rw-r--r--clang/lib/Driver/SanitizerArgs.cpp28
-rw-r--r--clang/lib/Driver/ToolChain.cpp13
-rw-r--r--clang/lib/Driver/ToolChains/AIX.cpp6
-rw-r--r--clang/lib/Driver/ToolChains/AMDGPU.cpp62
-rw-r--r--clang/lib/Driver/ToolChains/AMDGPU.h85
-rw-r--r--clang/lib/Driver/ToolChains/AMDGPUOpenMP.cpp22
-rw-r--r--clang/lib/Driver/ToolChains/AVR.cpp2
-rw-r--r--clang/lib/Driver/ToolChains/Arch/AArch64.cpp21
-rw-r--r--clang/lib/Driver/ToolChains/Arch/ARM.cpp4
-rw-r--r--clang/lib/Driver/ToolChains/Arch/CSKY.cpp6
-rw-r--r--clang/lib/Driver/ToolChains/Arch/LoongArch.cpp5
-rw-r--r--clang/lib/Driver/ToolChains/Arch/M68k.cpp16
-rw-r--r--clang/lib/Driver/ToolChains/Arch/Mips.cpp5
-rw-r--r--clang/lib/Driver/ToolChains/Arch/PPC.cpp2
-rw-r--r--clang/lib/Driver/ToolChains/Arch/RISCV.cpp13
-rw-r--r--clang/lib/Driver/ToolChains/Arch/Sparc.cpp4
-rw-r--r--clang/lib/Driver/ToolChains/Arch/SystemZ.cpp10
-rw-r--r--clang/lib/Driver/ToolChains/Arch/VE.cpp2
-rw-r--r--clang/lib/Driver/ToolChains/Arch/X86.cpp20
-rw-r--r--clang/lib/Driver/ToolChains/BareMetal.cpp4
-rw-r--r--clang/lib/Driver/ToolChains/CSKYToolChain.cpp2
-rw-r--r--clang/lib/Driver/ToolChains/Clang.cpp69
-rw-r--r--clang/lib/Driver/ToolChains/CommonArgs.cpp260
-rw-r--r--clang/lib/Driver/ToolChains/CrossWindows.cpp2
-rw-r--r--clang/lib/Driver/ToolChains/Cuda.cpp8
-rw-r--r--clang/lib/Driver/ToolChains/Cygwin.cpp4
-rw-r--r--clang/lib/Driver/ToolChains/Darwin.cpp6
-rw-r--r--clang/lib/Driver/ToolChains/DragonFly.cpp4
-rw-r--r--clang/lib/Driver/ToolChains/Flang.cpp26
-rw-r--r--clang/lib/Driver/ToolChains/FreeBSD.cpp4
-rw-r--r--clang/lib/Driver/ToolChains/Fuchsia.cpp4
-rw-r--r--clang/lib/Driver/ToolChains/Gnu.cpp14
-rw-r--r--clang/lib/Driver/ToolChains/HIPAMD.cpp61
-rw-r--r--clang/lib/Driver/ToolChains/HIPSPV.cpp4
-rw-r--r--clang/lib/Driver/ToolChains/HIPUtility.cpp2
-rw-r--r--clang/lib/Driver/ToolChains/Hexagon.cpp2
-rw-r--r--clang/lib/Driver/ToolChains/Hurd.cpp4
-rw-r--r--clang/lib/Driver/ToolChains/Linux.cpp8
-rw-r--r--clang/lib/Driver/ToolChains/MSP430.cpp2
-rw-r--r--clang/lib/Driver/ToolChains/MSVC.cpp2
-rw-r--r--clang/lib/Driver/ToolChains/Managarm.cpp4
-rw-r--r--clang/lib/Driver/ToolChains/MinGW.cpp2
-rw-r--r--clang/lib/Driver/ToolChains/MipsLinux.cpp4
-rw-r--r--clang/lib/Driver/ToolChains/NetBSD.cpp4
-rw-r--r--clang/lib/Driver/ToolChains/OHOS.cpp4
-rw-r--r--clang/lib/Driver/ToolChains/OpenBSD.cpp4
-rw-r--r--clang/lib/Driver/ToolChains/PPCFreeBSD.cpp4
-rw-r--r--clang/lib/Driver/ToolChains/PPCLinux.cpp4
-rw-r--r--clang/lib/Driver/ToolChains/PS4CPU.cpp5
-rw-r--r--clang/lib/Driver/ToolChains/SPIRV.cpp2
-rw-r--r--clang/lib/Driver/ToolChains/SYCL.cpp2
-rw-r--r--clang/lib/Driver/ToolChains/Solaris.cpp4
-rw-r--r--clang/lib/Driver/ToolChains/UEFI.cpp2
-rw-r--r--clang/lib/Driver/ToolChains/VEToolchain.cpp6
-rw-r--r--clang/lib/Driver/ToolChains/WebAssembly.cpp6
-rw-r--r--clang/lib/Driver/ToolChains/XCore.cpp6
-rw-r--r--clang/lib/Driver/ToolChains/ZOS.cpp2
-rw-r--r--clang/lib/Driver/XRayArgs.cpp2
65 files changed, 870 insertions, 651 deletions
diff --git a/clang/lib/Driver/CMakeLists.txt b/clang/lib/Driver/CMakeLists.txt
index 7c4f70b..d987111 100644
--- a/clang/lib/Driver/CMakeLists.txt
+++ b/clang/lib/Driver/CMakeLists.txt
@@ -17,14 +17,14 @@ endif()
add_clang_library(clangDriver
Action.cpp
Compilation.cpp
+ CreateASTUnitFromArgs.cpp
+ CreateInvocationFromArgs.cpp
Distro.cpp
Driver.cpp
- DriverOptions.cpp
Job.cpp
Multilib.cpp
MultilibBuilder.cpp
OffloadBundler.cpp
- OptionUtils.cpp
Phases.cpp
SanitizerArgs.cpp
Tool.cpp
@@ -98,6 +98,9 @@ add_clang_library(clangDriver
LINK_LIBS
clangBasic
+ clangFrontend
+ clangSerialization
clangLex
+ clangOptions
${system_libs}
)
diff --git a/clang/lib/Driver/Compilation.cpp b/clang/lib/Driver/Compilation.cpp
index 4e30031..f8ca2a3 100644
--- a/clang/lib/Driver/Compilation.cpp
+++ b/clang/lib/Driver/Compilation.cpp
@@ -11,9 +11,9 @@
#include "clang/Driver/Action.h"
#include "clang/Driver/Driver.h"
#include "clang/Driver/Job.h"
-#include "clang/Driver/Options.h"
#include "clang/Driver/ToolChain.h"
#include "clang/Driver/Util.h"
+#include "clang/Options/Options.h"
#include "llvm/Option/ArgList.h"
#include "llvm/Option/OptSpecifier.h"
#include "llvm/Option/Option.h"
diff --git a/clang/lib/Driver/CreateASTUnitFromArgs.cpp b/clang/lib/Driver/CreateASTUnitFromArgs.cpp
new file mode 100644
index 0000000..ea31a8e
--- /dev/null
+++ b/clang/lib/Driver/CreateASTUnitFromArgs.cpp
@@ -0,0 +1,166 @@
+//===--- CreateASTUnitFromArgs.h - Create an ASTUnit 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 an ASTUnit from a vector of command line arguments.
+//
+//===----------------------------------------------------------------------===//
+
+#include "clang/Driver/CreateASTUnitFromArgs.h"
+#include "clang/Driver/CreateInvocationFromArgs.h"
+#include "clang/Frontend/CompilerInvocation.h"
+#include "clang/Lex/PreprocessorOptions.h"
+#include "clang/Serialization/ModuleCache.h"
+#include "llvm/Support/CrashRecoveryContext.h"
+
+using 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> clang::CreateASTUnitFromCommandLine(
+ 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) {
+ assert(Diags.get() && "no DiagnosticsEngine was provided");
+
+ // If no VFS was provided, create one that tracks the physical file system.
+ // If '-working-directory' was passed as an argument, 'createInvocation' will
+ // set this as the current working directory of the VFS.
+ if (!VFS)
+ VFS = llvm::vfs::createPhysicalFileSystem();
+
+ SmallVector<StoredDiagnostic, 4> StoredDiagnostics;
+
+ std::shared_ptr<CompilerInvocation> CI;
+
+ {
+ CaptureDroppedDiagnostics Capture(CaptureDiagnostics, *Diags,
+ &StoredDiagnostics, nullptr);
+
+ CreateInvocationOptions CIOpts;
+ CIOpts.VFS = VFS;
+ CIOpts.Diags = Diags;
+ CIOpts.ProbePrecompiled = true; // FIXME: historical default. Needed?
+ CI = createInvocation(llvm::ArrayRef(ArgBegin, ArgEnd), std::move(CIOpts));
+ if (!CI)
+ return nullptr;
+ }
+
+ // Override any files that need remapping
+ for (const auto &RemappedFile : RemappedFiles) {
+ CI->getPreprocessorOpts().addRemappedFile(RemappedFile.first,
+ RemappedFile.second);
+ }
+ PreprocessorOptions &PPOpts = CI->getPreprocessorOpts();
+ PPOpts.RemappedFilesKeepOriginalName = RemappedFilesKeepOriginalName;
+ PPOpts.AllowPCHWithCompilerErrors = AllowPCHWithCompilerErrors;
+ PPOpts.SingleFileParseMode = SingleFileParse;
+ PPOpts.RetainExcludedConditionalBlocks = RetainExcludedConditionalBlocks;
+
+ // Override the resources path.
+ CI->getHeaderSearchOpts().ResourceDir = std::string(ResourceFilesPath);
+
+ CI->getFrontendOpts().SkipFunctionBodies =
+ SkipFunctionBodies == SkipFunctionBodiesScope::PreambleAndMainFile;
+
+ if (ModuleFormat)
+ CI->getHeaderSearchOpts().ModuleFormat = std::string(*ModuleFormat);
+
+ // Create the AST unit.
+ std::unique_ptr<ASTUnit> AST;
+ AST.reset(new ASTUnit(false));
+ AST->NumStoredDiagnosticsFromDriver = StoredDiagnostics.size();
+ AST->StoredDiagnostics.swap(StoredDiagnostics);
+ ASTUnit::ConfigureDiags(Diags, *AST, CaptureDiagnostics);
+ AST->DiagOpts = DiagOpts;
+ AST->Diagnostics = Diags;
+ AST->FileSystemOpts = CI->getFileSystemOpts();
+ AST->CodeGenOpts = std::make_unique<CodeGenOptions>(CI->getCodeGenOpts());
+ VFS = createVFSFromCompilerInvocation(*CI, *Diags, VFS);
+ AST->FileMgr =
+ llvm::makeIntrusiveRefCnt<FileManager>(AST->FileSystemOpts, VFS);
+ AST->StorePreamblesInMemory = StorePreamblesInMemory;
+ AST->PreambleStoragePath = PreambleStoragePath;
+ AST->ModCache = createCrossProcessModuleCache();
+ AST->OnlyLocalDecls = OnlyLocalDecls;
+ AST->CaptureDiagnostics = CaptureDiagnostics;
+ AST->TUKind = TUKind;
+ AST->ShouldCacheCodeCompletionResults = CacheCodeCompletionResults;
+ AST->IncludeBriefCommentsInCodeCompletion =
+ IncludeBriefCommentsInCodeCompletion;
+ AST->UserFilesAreVolatile = UserFilesAreVolatile;
+ AST->Invocation = CI;
+ AST->SkipFunctionBodies = SkipFunctionBodies;
+ if (ForSerialization)
+ AST->WriterData.reset(
+ new ASTUnit::ASTWriterData(*AST->ModCache, *AST->CodeGenOpts));
+ // Zero out now to ease cleanup during crash recovery.
+ CI = nullptr;
+ Diags = nullptr;
+
+ // Recover resources if we crash before exiting this method.
+ llvm::CrashRecoveryContextCleanupRegistrar<ASTUnit> ASTUnitCleanup(AST.get());
+
+ if (AST->LoadFromCompilerInvocation(std::move(PCHContainerOps),
+ PrecompilePreambleAfterNParses, VFS)) {
+ // Some error occurred, if caller wants to examine diagnostics, pass it the
+ // ASTUnit.
+ if (ErrAST) {
+ AST->StoredDiagnostics.swap(AST->FailedParseDiagnostics);
+ ErrAST->swap(AST);
+ }
+ return nullptr;
+ }
+
+ return AST;
+}
diff --git a/clang/lib/Driver/CreateInvocationFromArgs.cpp b/clang/lib/Driver/CreateInvocationFromArgs.cpp
new file mode 100644
index 0000000..516d61f
--- /dev/null
+++ b/clang/lib/Driver/CreateInvocationFromArgs.cpp
@@ -0,0 +1,119 @@
+//===--- 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
+//
+//===----------------------------------------------------------------------===//
+//
+// Construct a compiler invocation object for command line driver arguments
+//
+//===----------------------------------------------------------------------===//
+
+#include "clang/Driver/CreateInvocationFromArgs.h"
+#include "clang/Basic/DiagnosticFrontend.h"
+#include "clang/Basic/DiagnosticOptions.h"
+#include "clang/Driver/Compilation.h"
+#include "clang/Driver/Driver.h"
+#include "clang/Driver/Tool.h"
+#include "clang/Frontend/CompilerInstance.h"
+#include "clang/Frontend/Utils.h"
+#include "clang/Options/Options.h"
+#include "llvm/ADT/STLExtras.h"
+#include "llvm/ADT/StringRef.h"
+#include "llvm/Option/ArgList.h"
+#include "llvm/Support/VirtualFileSystem.h"
+#include "llvm/TargetParser/Host.h"
+
+using namespace llvm::opt;
+
+namespace clang {
+
+std::unique_ptr<CompilerInvocation>
+createInvocation(ArrayRef<const char *> ArgList, CreateInvocationOptions Opts) {
+ assert(!ArgList.empty());
+ std::optional<DiagnosticOptions> LocalDiagOpts;
+ IntrusiveRefCntPtr<DiagnosticsEngine> Diags;
+ if (Opts.Diags) {
+ Diags = std::move(Opts.Diags);
+ } else {
+ LocalDiagOpts.emplace();
+ Diags = CompilerInstance::createDiagnostics(
+ Opts.VFS ? *Opts.VFS : *llvm::vfs::getRealFileSystem(), *LocalDiagOpts);
+ }
+
+ SmallVector<const char *, 16> Args(ArgList);
+
+ // FIXME: Find a cleaner way to force the driver into restricted modes.
+ Args.insert(
+ llvm::find_if(
+ Args, [](const char *Elem) { return llvm::StringRef(Elem) == "--"; }),
+ "-fsyntax-only");
+
+ // FIXME: We shouldn't have to pass in the path info.
+ driver::Driver TheDriver(Args[0], llvm::sys::getDefaultTargetTriple(), *Diags,
+ "clang LLVM compiler", Opts.VFS);
+
+ // Don't check that inputs exist, they may have been remapped.
+ TheDriver.setCheckInputsExist(false);
+ TheDriver.setProbePrecompiled(Opts.ProbePrecompiled);
+
+ std::unique_ptr<driver::Compilation> C(TheDriver.BuildCompilation(Args));
+ if (!C)
+ return nullptr;
+
+ if (C->getArgs().hasArg(options::OPT_fdriver_only))
+ return nullptr;
+
+ // Just print the cc1 options if -### was present.
+ if (C->getArgs().hasArg(options::OPT__HASH_HASH_HASH)) {
+ C->getJobs().Print(llvm::errs(), "\n", true);
+ return nullptr;
+ }
+
+ // We expect to get back exactly one command job, if we didn't something
+ // failed. Offload compilation is an exception as it creates multiple jobs. If
+ // that's the case, we proceed with the first job. If caller needs a
+ // particular job, it should be controlled via options (e.g.
+ // --cuda-{host|device}-only for CUDA) passed to the driver.
+ const driver::JobList &Jobs = C->getJobs();
+ bool OffloadCompilation = false;
+ if (Jobs.size() > 1) {
+ for (auto &A : C->getActions()) {
+ // On MacOSX real actions may end up being wrapped in BindArchAction
+ if (isa<driver::BindArchAction>(A))
+ A = *A->input_begin();
+ if (isa<driver::OffloadAction>(A)) {
+ OffloadCompilation = true;
+ break;
+ }
+ }
+ }
+
+ bool PickFirstOfMany = OffloadCompilation || Opts.RecoverOnError;
+ if (Jobs.size() == 0 || (Jobs.size() > 1 && !PickFirstOfMany)) {
+ SmallString<256> Msg;
+ llvm::raw_svector_ostream OS(Msg);
+ Jobs.Print(OS, "; ", true);
+ Diags->Report(diag::err_fe_expected_compiler_job) << OS.str();
+ return nullptr;
+ }
+ auto Cmd = llvm::find_if(Jobs, [](const driver::Command &Cmd) {
+ return StringRef(Cmd.getCreator().getName()) == "clang";
+ });
+ if (Cmd == Jobs.end()) {
+ Diags->Report(diag::err_fe_expected_clang_command);
+ return nullptr;
+ }
+
+ const ArgStringList &CCArgs = Cmd->getArguments();
+ if (Opts.CC1Args)
+ *Opts.CC1Args = {CCArgs.begin(), CCArgs.end()};
+ auto CI = std::make_unique<CompilerInvocation>();
+ if (!CompilerInvocation::CreateFromArgs(*CI, CCArgs, *Diags, Args[0]) &&
+ !Opts.RecoverOnError)
+ return nullptr;
+ return CI;
+}
+
+} // namespace clang
diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp
index a0b82ce..8644a27 100644
--- a/clang/lib/Driver/Driver.cpp
+++ b/clang/lib/Driver/Driver.cpp
@@ -60,16 +60,18 @@
#include "clang/Driver/Compilation.h"
#include "clang/Driver/InputInfo.h"
#include "clang/Driver/Job.h"
-#include "clang/Driver/Options.h"
#include "clang/Driver/Phases.h"
#include "clang/Driver/SanitizerArgs.h"
#include "clang/Driver/Tool.h"
#include "clang/Driver/ToolChain.h"
#include "clang/Driver/Types.h"
#include "clang/Lex/DependencyDirectivesScanner.h"
+#include "clang/Options/OptionUtils.h"
+#include "clang/Options/Options.h"
#include "llvm/ADT/ArrayRef.h"
#include "llvm/ADT/STLExtras.h"
#include "llvm/ADT/SmallSet.h"
+#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/StringExtras.h"
#include "llvm/ADT/StringRef.h"
#include "llvm/ADT/StringSet.h"
@@ -103,6 +105,7 @@
#include <memory>
#include <optional>
#include <set>
+#include <string>
#include <utility>
#if LLVM_ON_UNIX
#include <unistd.h> // getpid
@@ -123,40 +126,6 @@ template <typename F> static bool usesInput(const ArgList &Args, F &&Fn) {
});
}
-// static
-std::string Driver::GetResourcesPath(StringRef BinaryPath) {
- // Since the resource directory is embedded in the module hash, it's important
- // that all places that need it call this function, so that they get the
- // exact same string ("a/../b/" and "b/" get different hashes, for example).
-
- // Dir is bin/ or lib/, depending on where BinaryPath is.
- StringRef Dir = llvm::sys::path::parent_path(BinaryPath);
- SmallString<128> P(Dir);
-
- StringRef ConfiguredResourceDir(CLANG_RESOURCE_DIR);
- if (!ConfiguredResourceDir.empty()) {
- // FIXME: We should fix the behavior of llvm::sys::path::append so we don't
- // need to check for absolute paths here.
- if (llvm::sys::path::is_absolute(ConfiguredResourceDir))
- P = ConfiguredResourceDir;
- else
- llvm::sys::path::append(P, ConfiguredResourceDir);
- } else {
- // On Windows, libclang.dll is in bin/.
- // On non-Windows, libclang.so/.dylib is in lib/.
- // With a static-library build of libclang, LibClangPath will contain the
- // path of the embedding binary, which for LLVM binaries will be in bin/.
- // ../lib gets us to lib/ in both cases.
- P = llvm::sys::path::parent_path(Dir);
- // This search path is also created in the COFF driver of lld, so any
- // changes here also needs to happen in lld/COFF/Driver.cpp
- llvm::sys::path::append(P, CLANG_INSTALL_LIBDIR_BASENAME, "clang",
- CLANG_VERSION_MAJOR_STRING);
- }
-
- return std::string(P);
-}
-
CUIDOptions::CUIDOptions(llvm::opt::DerivedArgList &Args, const Driver &D)
: UseCUID(Kind::Hash) {
if (Arg *A = Args.getLastArg(options::OPT_fuse_cuid_EQ)) {
@@ -2050,12 +2019,17 @@ void Driver::generateCompilationDiagnostics(
InputList Inputs;
BuildInputs(C.getDefaultToolChain(), C.getArgs(), Inputs);
+ ArgStringList IRInputs;
for (InputList::iterator it = Inputs.begin(), ie = Inputs.end(); it != ie;) {
bool IgnoreInput = false;
- // Ignore input from stdin or any inputs that cannot be preprocessed.
- // Check type first as not all linker inputs have a value.
- if (types::getPreprocessedType(it->first) == types::TY_INVALID) {
+ // Save IR inputs separately, ignore input from stdin or any other inputs
+ // that cannot be preprocessed. Check type first as not all linker inputs
+ // have a value.
+ if (types::isLLVMIR(it->first)) {
+ IRInputs.push_back(it->second->getValue());
+ IgnoreInput = true;
+ } else if (types::getPreprocessedType(it->first) == types::TY_INVALID) {
IgnoreInput = true;
} else if (!strcmp(it->second->getValue(), "-")) {
Diag(clang::diag::note_drv_command_failed_diag_msg)
@@ -2072,7 +2046,7 @@ void Driver::generateCompilationDiagnostics(
}
}
- if (Inputs.empty()) {
+ if (Inputs.empty() && IRInputs.empty()) {
Diag(clang::diag::note_drv_command_failed_diag_msg)
<< "Error generating preprocessed source(s) - "
"no preprocessable inputs.";
@@ -2095,46 +2069,82 @@ void Driver::generateCompilationDiagnostics(
return;
}
- // Construct the list of abstract actions to perform for this compilation. On
- // Darwin OSes this uses the driver-driver and builds universal actions.
- const ToolChain &TC = C.getDefaultToolChain();
- if (TC.getTriple().isOSBinFormatMachO())
- BuildUniversalActions(C, TC, Inputs);
- else
- BuildActions(C, C.getArgs(), Inputs, C.getActions());
+ // If we only have IR inputs there's no need for preprocessing.
+ if (!Inputs.empty()) {
+ // Construct the list of abstract actions to perform for this compilation.
+ // On Darwin OSes this uses the driver-driver and builds universal actions.
+ const ToolChain &TC = C.getDefaultToolChain();
+ if (TC.getTriple().isOSBinFormatMachO())
+ BuildUniversalActions(C, TC, Inputs);
+ else
+ BuildActions(C, C.getArgs(), Inputs, C.getActions());
- BuildJobs(C);
+ BuildJobs(C);
- // If there were errors building the compilation, quit now.
- if (Trap.hasErrorOccurred()) {
- Diag(clang::diag::note_drv_command_failed_diag_msg)
- << "Error generating preprocessed source(s).";
- return;
- }
+ // If there were errors building the compilation, quit now.
+ if (Trap.hasErrorOccurred()) {
+ Diag(clang::diag::note_drv_command_failed_diag_msg)
+ << "Error generating preprocessed source(s).";
+ return;
+ }
+ // Generate preprocessed output.
+ SmallVector<std::pair<int, const Command *>, 4> FailingCommands;
+ C.ExecuteJobs(C.getJobs(), FailingCommands);
- // Generate preprocessed output.
- SmallVector<std::pair<int, const Command *>, 4> FailingCommands;
- C.ExecuteJobs(C.getJobs(), FailingCommands);
+ // If any of the preprocessing commands failed, clean up and exit.
+ if (!FailingCommands.empty()) {
+ Diag(clang::diag::note_drv_command_failed_diag_msg)
+ << "Error generating preprocessed source(s).";
+ return;
+ }
- // If any of the preprocessing commands failed, clean up and exit.
- if (!FailingCommands.empty()) {
- Diag(clang::diag::note_drv_command_failed_diag_msg)
- << "Error generating preprocessed source(s).";
- return;
+ const ArgStringList &TempFiles = C.getTempFiles();
+ if (TempFiles.empty()) {
+ Diag(clang::diag::note_drv_command_failed_diag_msg)
+ << "Error generating preprocessed source(s).";
+ return;
+ }
}
- const ArgStringList &TempFiles = C.getTempFiles();
- if (TempFiles.empty()) {
- Diag(clang::diag::note_drv_command_failed_diag_msg)
- << "Error generating preprocessed source(s).";
- return;
+ // Copying filenames due to ownership.
+ const ArgStringList &Files = C.getTempFiles();
+ SmallVector<std::string> TempFiles(Files.begin(), Files.end());
+
+ // We'd like to copy the IR input file into our own temp file
+ // because the build system might try to clean-up after itself.
+ for (auto const *Input : IRInputs) {
+ int FD;
+ llvm::SmallVector<char, 64> Path;
+
+ StringRef extension = llvm::sys::path::extension(Input);
+ if (!extension.empty())
+ extension = extension.drop_front();
+
+ std::error_code EC = llvm::sys::fs::createTemporaryFile(
+ llvm::sys::path::stem(Input), extension, FD, Path);
+ if (EC) {
+ Diag(clang::diag::note_drv_command_failed_diag_msg)
+ << "Error generating run script: " << "Failed copying IR input files"
+ << " " << EC.message();
+ return;
+ }
+
+ EC = llvm::sys::fs::copy_file(Input, FD);
+ if (EC) {
+ Diag(clang::diag::note_drv_command_failed_diag_msg)
+ << "Error generating run script: " << "Failed copying IR input files"
+ << " " << EC.message();
+ return;
+ }
+
+ TempFiles.push_back(std::string(Path.begin(), Path.end()));
}
Diag(clang::diag::note_drv_command_failed_diag_msg) << BugReporMsg;
SmallString<128> VFS;
SmallString<128> ReproCrashFilename;
- for (const char *TempFile : TempFiles) {
+ for (std::string &TempFile : TempFiles) {
Diag(clang::diag::note_drv_command_failed_diag_msg) << TempFile;
if (Report)
Report->TemporaryFiles.push_back(TempFile);
@@ -2151,7 +2161,7 @@ void Driver::generateCompilationDiagnostics(
}
for (const char *TempFile : SavedTemps)
- C.addTempFile(TempFile);
+ TempFiles.push_back(TempFile);
// Assume associated files are based off of the first temporary file.
CrashReportInfo CrashInfo(TempFiles[0], VFS);
@@ -4413,10 +4423,6 @@ void Driver::BuildDefaultActions(Compilation &C, DerivedArgList &Args,
options::OPT_no_offload_new_driver,
C.isOffloadingHostKind(Action::OFK_Cuda));
- bool HIPNoRDC =
- C.isOffloadingHostKind(Action::OFK_HIP) &&
- !Args.hasFlag(options::OPT_fgpu_rdc, options::OPT_fno_gpu_rdc, false);
-
// Builder to be used to build offloading actions.
std::unique_ptr<OffloadingActionBuilder> OffloadBuilder =
!UseNewOffloadingDriver
@@ -4550,7 +4556,7 @@ void Driver::BuildDefaultActions(Compilation &C, DerivedArgList &Args,
// Check if this Linker Job should emit a static library.
if (ShouldEmitStaticLibrary(Args)) {
LA = C.MakeAction<StaticLibJobAction>(LinkerInputs, types::TY_Image);
- } else if ((UseNewOffloadingDriver && !HIPNoRDC) ||
+ } else if (UseNewOffloadingDriver ||
Args.hasArg(options::OPT_offload_link)) {
LA = C.MakeAction<LinkerWrapperJobAction>(LinkerInputs, types::TY_Image);
LA->propagateHostOffloadInfo(C.getActiveOffloadKinds(),
@@ -4887,20 +4893,6 @@ Action *Driver::BuildOffloadingActions(Compilation &C,
<< "-fhip-emit-relocatable"
<< "--offload-device-only";
- // For HIP non-rdc non-device-only compilation, create a linker wrapper
- // action for each host object to link, bundle and wrap device files in
- // it.
- if ((isa<AssembleJobAction>(HostAction) ||
- (isa<BackendJobAction>(HostAction) &&
- HostAction->getType() == types::TY_LTO_BC)) &&
- HIPNoRDC && !offloadDeviceOnly()) {
- ActionList AL{HostAction};
- HostAction = C.MakeAction<LinkerWrapperJobAction>(AL, types::TY_Object);
- HostAction->propagateHostOffloadInfo(C.getActiveOffloadKinds(),
- /*BoundArch=*/nullptr);
- return HostAction;
- }
-
// Don't build offloading actions if we do not have a compile action. If
// preprocessing only ignore embedding.
if (!(isa<CompileJobAction>(HostAction) ||
@@ -4999,15 +4991,24 @@ Action *Driver::BuildOffloadingActions(Compilation &C,
// Compiling HIP in device-only non-RDC mode requires linking each action
// individually.
for (Action *&A : DeviceActions) {
- // Special handling for the HIP SPIR-V toolchain because it doesn't use
- // the SPIR-V backend yet doesn't report the output as an object.
bool IsAMDGCNSPIRV = A->getOffloadingToolChain() &&
A->getOffloadingToolChain()->getTriple().getOS() ==
llvm::Triple::OSType::AMDHSA &&
A->getOffloadingToolChain()->getTriple().isSPIRV();
+ bool UseSPIRVBackend = Args.hasFlag(options::OPT_use_spirv_backend,
+ options::OPT_no_use_spirv_backend,
+ /*Default=*/false);
+
+ // Special handling for the HIP SPIR-V toolchain in device-only.
+ // The translator path has a linking step, whereas the SPIR-V backend path
+ // does not to avoid any external dependency such as spirv-link. The
+ // linking step is skipped for the SPIR-V backend path.
+ bool IsAMDGCNSPIRVWithBackend = IsAMDGCNSPIRV && UseSPIRVBackend;
+
if ((A->getType() != types::TY_Object && !IsAMDGCNSPIRV &&
A->getType() != types::TY_LTO_BC) ||
- HIPRelocatableObj || !HIPNoRDC || !offloadDeviceOnly())
+ HIPRelocatableObj || !HIPNoRDC || !offloadDeviceOnly() ||
+ (IsAMDGCNSPIRVWithBackend && offloadDeviceOnly()))
continue;
ActionList LinkerInput = {A};
A = C.MakeAction<LinkJobAction>(LinkerInput, types::TY_Image);
@@ -5065,6 +5066,21 @@ Action *Driver::BuildOffloadingActions(Compilation &C,
DDep.add(*FatbinAction,
*C.getOffloadToolChains<Action::OFK_HIP>().first->second, nullptr,
Action::OFK_HIP);
+ } else if (HIPNoRDC) {
+ // Package all the offloading actions into a single output that can be
+ // embedded in the host and linked.
+ Action *PackagerAction =
+ C.MakeAction<OffloadPackagerJobAction>(OffloadActions, types::TY_Image);
+
+ // For HIP non-RDC compilation, wrap the device binary with linker wrapper
+ // before bundling with host code. Do not bind a specific GPU arch here,
+ // as the packaged image may contain entries for multiple GPUs.
+ ActionList AL{PackagerAction};
+ PackagerAction =
+ C.MakeAction<LinkerWrapperJobAction>(AL, types::TY_HIP_FATBIN);
+ DDep.add(*PackagerAction,
+ *C.getOffloadToolChains<Action::OFK_HIP>().first->second,
+ /*BoundArch=*/nullptr, Action::OFK_HIP);
} else {
// Package all the offloading actions into a single output that can be
// embedded in the host and linked.
@@ -5194,6 +5210,14 @@ Action *Driver::ConstructPhaseAction(
return C.MakeAction<CompileJobAction>(Input, types::TY_LLVM_BC);
}
case phases::Backend: {
+ // Skip a redundant Backend phase for HIP device code when using the new
+ // offload driver, where mid-end is done in linker wrapper.
+ if (TargetDeviceOffloadKind == Action::OFK_HIP &&
+ Args.hasFlag(options::OPT_offload_new_driver,
+ options::OPT_no_offload_new_driver, false) &&
+ !offloadDeviceOnly())
+ return Input;
+
if (isUsingLTO() && TargetDeviceOffloadKind == Action::OFK_None) {
types::ID Output;
if (Args.hasArg(options::OPT_ffat_lto_objects) &&
@@ -5210,11 +5234,28 @@ Action *Driver::ConstructPhaseAction(
Args.hasArg(options::OPT_S) ? types::TY_LTO_IR : types::TY_LTO_BC;
return C.MakeAction<BackendJobAction>(Input, Output);
}
+ bool UseSPIRVBackend = Args.hasFlag(options::OPT_use_spirv_backend,
+ options::OPT_no_use_spirv_backend,
+ /*Default=*/false);
+
+ auto OffloadingToolChain = Input->getOffloadingToolChain();
+ // For AMD SPIRV, if offloadDeviceOnly(), we call the SPIRV backend unless
+ // LLVM bitcode was requested explicitly or RDC is set. If
+ // !offloadDeviceOnly, we emit LLVM bitcode, and clang-linker-wrapper will
+ // compile it to SPIRV.
+ bool UseSPIRVBackendForHipDeviceOnlyNoRDC =
+ TargetDeviceOffloadKind == Action::OFK_HIP && OffloadingToolChain &&
+ OffloadingToolChain->getTriple().isSPIRV() && UseSPIRVBackend &&
+ offloadDeviceOnly() &&
+ !Args.hasFlag(options::OPT_fgpu_rdc, options::OPT_fno_gpu_rdc, false);
+
if (Args.hasArg(options::OPT_emit_llvm) ||
TargetDeviceOffloadKind == Action::OFK_SYCL ||
(((Input->getOffloadingToolChain() &&
- Input->getOffloadingToolChain()->getTriple().isAMDGPU()) ||
+ Input->getOffloadingToolChain()->getTriple().isAMDGPU() &&
+ TargetDeviceOffloadKind != Action::OFK_None) ||
TargetDeviceOffloadKind == Action::OFK_HIP) &&
+ !UseSPIRVBackendForHipDeviceOnlyNoRDC &&
((Args.hasFlag(options::OPT_fgpu_rdc, options::OPT_fno_gpu_rdc,
false) ||
(Args.hasFlag(options::OPT_offload_new_driver,
@@ -5236,6 +5277,19 @@ Action *Driver::ConstructPhaseAction(
: types::TY_LLVM_BC;
return C.MakeAction<BackendJobAction>(Input, Output);
}
+
+ // The SPIRV backend compilation path for HIP must avoid external
+ // dependencies. The default compilation path assembles and links its
+ // output, but the SPIRV assembler and linker are external tools. This code
+ // ensures the backend emits binary SPIRV directly to bypass those steps and
+ // avoid failures. Without -save-temps, the compiler may already skip
+ // assembling and linking. With -save-temps, these steps must be explicitly
+ // disabled, as done here. We also force skipping these steps regardless of
+ // -save-temps to avoid relying on optimizations (unless -S is set).
+ // The current HIP bundling expects the type to be types::TY_Image
+ if (UseSPIRVBackendForHipDeviceOnlyNoRDC && !Args.hasArg(options::OPT_S))
+ return C.MakeAction<BackendJobAction>(Input, types::TY_Image);
+
return C.MakeAction<BackendJobAction>(Input, types::TY_PP_Asm);
}
case phases::Assemble:
@@ -6236,12 +6290,7 @@ const char *Driver::GetNamedOutputPath(Compilation &C, const JobAction &JA,
StringRef OrigBoundArch, bool AtTopLevel,
bool MultipleArchs,
StringRef OffloadingPrefix) const {
- std::string BoundArch = OrigBoundArch.str();
- if (is_style_windows(llvm::sys::path::Style::native)) {
- // BoundArch may contains ':', which is invalid in file names on Windows,
- // therefore replace it with '%'.
- llvm::replace(BoundArch, ':', '@');
- }
+ std::string BoundArch = sanitizeTargetIDInFileName(OrigBoundArch);
llvm::PrettyStackTraceString CrashInfo("Computing output path");
// Output to a user requested destination?
diff --git a/clang/lib/Driver/DriverOptions.cpp b/clang/lib/Driver/DriverOptions.cpp
deleted file mode 100644
index cde1f898..0000000
--- a/clang/lib/Driver/DriverOptions.cpp
+++ /dev/null
@@ -1,52 +0,0 @@
-//===--- DriverOptions.cpp - Driver Options Table -------------------------===//
-//
-// 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/Driver/Options.h"
-#include "llvm/Option/OptTable.h"
-#include <cassert>
-
-using namespace clang::driver;
-using namespace clang::driver::options;
-using namespace llvm::opt;
-
-#define OPTTABLE_STR_TABLE_CODE
-#include "clang/Driver/Options.inc"
-#undef OPTTABLE_STR_TABLE_CODE
-
-#define OPTTABLE_VALUES_CODE
-#include "clang/Driver/Options.inc"
-#undef OPTTABLE_VALUES_CODE
-
-#define OPTTABLE_PREFIXES_TABLE_CODE
-#include "clang/Driver/Options.inc"
-#undef OPTTABLE_PREFIXES_TABLE_CODE
-
-#define OPTTABLE_PREFIXES_UNION_CODE
-#include "clang/Driver/Options.inc"
-#undef OPTTABLE_PREFIXES_UNION_CODE
-
-static constexpr OptTable::Info InfoTable[] = {
-#define OPTION(...) LLVM_CONSTRUCT_OPT_INFO(__VA_ARGS__),
-#include "clang/Driver/Options.inc"
-#undef OPTION
-};
-
-namespace {
-
-class DriverOptTable : public PrecomputedOptTable {
-public:
- DriverOptTable()
- : PrecomputedOptTable(OptionStrTable, OptionPrefixesTable, InfoTable,
- OptionPrefixesUnion) {}
-};
-}
-
-const llvm::opt::OptTable &clang::driver::getDriverOptTable() {
- static DriverOptTable Table;
- return Table;
-}
diff --git a/clang/lib/Driver/OptionUtils.cpp b/clang/lib/Driver/OptionUtils.cpp
deleted file mode 100644
index 1f36ffc..0000000
--- a/clang/lib/Driver/OptionUtils.cpp
+++ /dev/null
@@ -1,47 +0,0 @@
-//===--- OptionUtils.cpp - Utilities for command line arguments -----------===//
-//
-// 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/Basic/Diagnostic.h"
-#include "clang/Basic/DiagnosticDriver.h"
-#include "clang/Driver/OptionUtils.h"
-#include "llvm/Option/ArgList.h"
-
-using namespace clang;
-using namespace llvm::opt;
-
-namespace {
-template <typename IntTy>
-IntTy getLastArgIntValueImpl(const ArgList &Args, OptSpecifier Id,
- IntTy Default, DiagnosticsEngine *Diags,
- unsigned Base) {
- IntTy Res = Default;
- if (Arg *A = Args.getLastArg(Id)) {
- if (StringRef(A->getValue()).getAsInteger(Base, Res)) {
- if (Diags)
- Diags->Report(diag::err_drv_invalid_int_value)
- << A->getAsString(Args) << A->getValue();
- }
- }
- return Res;
-}
-} // namespace
-
-namespace clang {
-
-int getLastArgIntValue(const ArgList &Args, OptSpecifier Id, int Default,
- DiagnosticsEngine *Diags, unsigned Base) {
- return getLastArgIntValueImpl<int>(Args, Id, Default, Diags, Base);
-}
-
-uint64_t getLastArgUInt64Value(const ArgList &Args, OptSpecifier Id,
- uint64_t Default, DiagnosticsEngine *Diags,
- unsigned Base) {
- return getLastArgIntValueImpl<uint64_t>(Args, Id, Default, Diags, Base);
-}
-
-} // namespace clang
diff --git a/clang/lib/Driver/SanitizerArgs.cpp b/clang/lib/Driver/SanitizerArgs.cpp
index 5dd48f5..be068b2 100644
--- a/clang/lib/Driver/SanitizerArgs.cpp
+++ b/clang/lib/Driver/SanitizerArgs.cpp
@@ -8,8 +8,8 @@
#include "clang/Driver/SanitizerArgs.h"
#include "clang/Basic/Sanitizers.h"
#include "clang/Driver/Driver.h"
-#include "clang/Driver/Options.h"
#include "clang/Driver/ToolChain.h"
+#include "clang/Options/Options.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/StringRef.h"
#include "llvm/ADT/StringSwitch.h"
@@ -55,7 +55,7 @@ static const SanitizerMask SupportsCoverage =
SanitizerKind::SafeStack | SanitizerKind::ShadowCallStack |
SanitizerKind::Thread | SanitizerKind::ObjCCast | SanitizerKind::KCFI |
SanitizerKind::NumericalStability | SanitizerKind::Vptr |
- SanitizerKind::CFI;
+ SanitizerKind::CFI | SanitizerKind::AllocToken;
static const SanitizerMask RecoverableByDefault =
SanitizerKind::Undefined | SanitizerKind::Integer |
SanitizerKind::ImplicitConversion | SanitizerKind::Nullability |
@@ -358,7 +358,7 @@ bool SanitizerArgs::needsFuzzerInterceptors() const {
bool SanitizerArgs::needsUbsanRt() const {
// All of these include ubsan.
if (needsAsanRt() || needsMsanRt() || needsNsanRt() || needsHwasanRt() ||
- needsTsanRt() || needsDfsanRt() || needsLsanRt() ||
+ needsTsanRt() || needsDfsanRt() || needsLsanRt() || needsTysanRt() ||
needsCfiCrossDsoDiagRt() || (needsScudoRt() && !requiresMinimalRuntime()))
return false;
@@ -419,10 +419,16 @@ SanitizerArgs::SanitizerArgs(const ToolChain &TC,
const Driver &D = TC.getDriver();
SanitizerMask TrappingKinds = parseSanitizeTrapArgs(D, Args, DiagnoseErrors);
SanitizerMask InvalidTrappingKinds = TrappingKinds & NotAllowedWithTrap;
+ const llvm::Triple &Triple = TC.getTriple();
MinimalRuntime =
Args.hasFlag(options::OPT_fsanitize_minimal_runtime,
options::OPT_fno_sanitize_minimal_runtime, MinimalRuntime);
+ HandlerPreserveAllRegs =
+ Args.hasFlag(options::OPT_fsanitize_handler_preserve_all_regs,
+ options::OPT_fno_sanitize_handler_preserve_all_regs,
+ HandlerPreserveAllRegs) &&
+ MinimalRuntime && (Triple.isAArch64() || Triple.isX86_64());
// The object size sanitizer should not be enabled at -O0.
Arg *OptLevel = Args.getLastArg(options::OPT_O_Group);
@@ -490,7 +496,6 @@ SanitizerArgs::SanitizerArgs(const ToolChain &TC,
// -fsanitize=function and -fsanitize=kcfi instrument indirect function
// calls to load a type hash before the function label. Therefore, an
// execute-only target doesn't support the function and kcfi sanitizers.
- const llvm::Triple &Triple = TC.getTriple();
if (isExecuteOnlyTarget(Triple, Args)) {
if (SanitizerMask KindsToDiagnose =
Add & NotAllowedWithExecuteOnly & ~DiagnosedKinds) {
@@ -1176,6 +1181,13 @@ SanitizerArgs::SanitizerArgs(const ToolChain &TC,
options::OPT_fno_sanitize_alloc_token_extended, AllocTokenExtended);
}
+ if (AllAddedKinds & SanitizerKind::Type) {
+ TysanOutlineInstrumentation =
+ Args.hasFlag(options::OPT_fsanitize_type_outline_instrumentation,
+ options::OPT_fno_sanitize_type_outline_instrumentation,
+ TysanOutlineInstrumentation);
+ }
+
LinkRuntimes = Args.hasFlag(options::OPT_fsanitize_link_runtime,
options::OPT_fno_sanitize_link_runtime,
!Args.hasArg(options::OPT_r));
@@ -1469,6 +1481,9 @@ void SanitizerArgs::addArgs(const ToolChain &TC, const llvm::opt::ArgList &Args,
if (MinimalRuntime)
CmdArgs.push_back("-fsanitize-minimal-runtime");
+ if (HandlerPreserveAllRegs)
+ CmdArgs.push_back("-fsanitize-handler-preserve-all-regs");
+
if (AsanFieldPadding)
CmdArgs.push_back(Args.MakeArgString("-fsanitize-address-field-padding=" +
Twine(AsanFieldPadding)));
@@ -1500,6 +1515,11 @@ void SanitizerArgs::addArgs(const ToolChain &TC, const llvm::opt::ArgList &Args,
CmdArgs.push_back("-asan-instrumentation-with-call-threshold=0");
}
+ if (!TysanOutlineInstrumentation) {
+ CmdArgs.push_back("-mllvm");
+ CmdArgs.push_back("-tysan-outline-instrumentation=false");
+ }
+
// When emitting Stable ABI instrumentation, force outlining calls and avoid
// inlining shadow memory poisoning. While this is a big performance burden
// for now it allows full abstraction from implementation details.
diff --git a/clang/lib/Driver/ToolChain.cpp b/clang/lib/Driver/ToolChain.cpp
index eea5c2f..77a2c73 100644
--- a/clang/lib/Driver/ToolChain.cpp
+++ b/clang/lib/Driver/ToolChain.cpp
@@ -21,9 +21,9 @@
#include "clang/Driver/Driver.h"
#include "clang/Driver/InputInfo.h"
#include "clang/Driver/Job.h"
-#include "clang/Driver/Options.h"
#include "clang/Driver/SanitizerArgs.h"
#include "clang/Driver/XRayArgs.h"
+#include "clang/Options/Options.h"
#include "llvm/ADT/SmallString.h"
#include "llvm/ADT/StringExtras.h"
#include "llvm/ADT/StringRef.h"
@@ -338,7 +338,7 @@ static void getRISCVMultilibFlags(const Driver &D, const llvm::Triple &Triple,
Multilib::flags_list
ToolChain::getMultilibFlags(const llvm::opt::ArgList &Args) const {
- using namespace clang::driver::options;
+ using namespace clang::options;
std::vector<std::string> Result;
const llvm::Triple Triple(ComputeEffectiveClangTriple(Args));
@@ -851,8 +851,11 @@ void ToolChain::addFortranRuntimeLibs(const ArgList &Args,
options::OPT_fno_openmp, false)) {
Driver::OpenMPRuntimeKind OMPRuntime = getDriver().getOpenMPRuntime(Args);
ToolChain::RuntimeLibType RuntimeLib = GetRuntimeLibType(Args);
- if (OMPRuntime == Driver::OMPRT_OMP && RuntimeLib == ToolChain::RLT_Libgcc)
+ if ((OMPRuntime == Driver::OMPRT_OMP &&
+ RuntimeLib == ToolChain::RLT_Libgcc) &&
+ !getTriple().isKnownWindowsMSVCEnvironment()) {
CmdArgs.push_back("-latomic");
+ }
}
}
@@ -1636,6 +1639,8 @@ SanitizerMask ToolChain::getSupportedSanitizers() const {
Res |= SanitizerKind::ShadowCallStack;
if (getTriple().isAArch64(64))
Res |= SanitizerKind::MemTag;
+ if (getTriple().isBPF())
+ Res |= SanitizerKind::KernelAddress;
return Res;
}
@@ -1802,7 +1807,7 @@ void ToolChain::TranslateXarchArgs(
unsigned Index = BaseArgs.MakeIndex(A->getValue(ValuePos));
unsigned Prev = Index;
std::unique_ptr<llvm::opt::Arg> XarchArg(Opts.ParseOneArg(
- Args, Index, llvm::opt::Visibility(clang::driver::options::ClangOption)));
+ Args, Index, llvm::opt::Visibility(options::ClangOption)));
// If the argument parsing failed or more than one argument was
// consumed, the -Xarch_ argument's parameter tried to consume
diff --git a/clang/lib/Driver/ToolChains/AIX.cpp b/clang/lib/Driver/ToolChains/AIX.cpp
index 066b593..a8acf9c 100644
--- a/clang/lib/Driver/ToolChains/AIX.cpp
+++ b/clang/lib/Driver/ToolChains/AIX.cpp
@@ -9,8 +9,8 @@
#include "AIX.h"
#include "clang/Driver/CommonArgs.h"
#include "clang/Driver/Compilation.h"
-#include "clang/Driver/Options.h"
#include "clang/Driver/SanitizerArgs.h"
+#include "clang/Options/Options.h"
#include "llvm/ADT/StringExtras.h"
#include "llvm/Option/ArgList.h"
#include "llvm/ProfileData/InstrProf.h"
@@ -19,6 +19,7 @@
#include <set>
using AIX = clang::driver::toolchains::AIX;
+using namespace clang;
using namespace clang::driver;
using namespace clang::driver::tools;
using namespace clang::driver::toolchains;
@@ -167,8 +168,7 @@ void aix::Linker::ConstructJob(Compilation &C, const JobAction &JA,
Args.hasArg(options::OPT_coverage))
CmdArgs.push_back("-bdbg:namedsects:ss");
- if (Arg *A =
- Args.getLastArg(clang::driver::options::OPT_mxcoff_build_id_EQ)) {
+ if (Arg *A = Args.getLastArg(options::OPT_mxcoff_build_id_EQ)) {
StringRef BuildId = A->getValue();
if (BuildId[0] != '0' || BuildId[1] != 'x' ||
BuildId.find_if_not(llvm::isHexDigit, 2) != StringRef::npos)
diff --git a/clang/lib/Driver/ToolChains/AMDGPU.cpp b/clang/lib/Driver/ToolChains/AMDGPU.cpp
index 1a243fe..87ccd40 100644
--- a/clang/lib/Driver/ToolChains/AMDGPU.cpp
+++ b/clang/lib/Driver/ToolChains/AMDGPU.cpp
@@ -12,8 +12,8 @@
#include "clang/Driver/CommonArgs.h"
#include "clang/Driver/Compilation.h"
#include "clang/Driver/InputInfo.h"
-#include "clang/Driver/Options.h"
#include "clang/Driver/SanitizerArgs.h"
+#include "clang/Options/Options.h"
#include "llvm/ADT/StringExtras.h"
#include "llvm/Option/ArgList.h"
#include "llvm/Support/Error.h"
@@ -243,8 +243,15 @@ RocmInstallationDetector::getInstallationPathCandidates() {
// Some versions of the rocm llvm package install to /opt/rocm/llvm/bin
// Some versions of the aomp package install to /opt/rocm/aomp/bin
- if (ParentName == "llvm" || ParentName.starts_with("aomp"))
+ if (ParentName == "llvm" || ParentName.starts_with("aomp")) {
ParentDir = llvm::sys::path::parent_path(ParentDir);
+ ParentName = llvm::sys::path::filename(ParentDir);
+
+ // Some versions of the rocm llvm package install to
+ // /opt/rocm/lib/llvm/bin, so also back up if within the lib dir still
+ if (ParentName == "lib")
+ ParentDir = llvm::sys::path::parent_path(ParentDir);
+ }
return Candidate(ParentDir.str(), /*StrictChecking=*/true);
};
@@ -323,27 +330,24 @@ RocmInstallationDetector::RocmInstallationDetector(
const llvm::opt::ArgList &Args, bool DetectHIPRuntime, bool DetectDeviceLib)
: D(D) {
Verbose = Args.hasArg(options::OPT_v);
- RocmPathArg = Args.getLastArgValue(clang::driver::options::OPT_rocm_path_EQ);
- PrintROCmSearchDirs =
- Args.hasArg(clang::driver::options::OPT_print_rocm_search_dirs);
+ RocmPathArg = Args.getLastArgValue(options::OPT_rocm_path_EQ);
+ PrintROCmSearchDirs = Args.hasArg(options::OPT_print_rocm_search_dirs);
RocmDeviceLibPathArg =
- Args.getAllArgValues(clang::driver::options::OPT_rocm_device_lib_path_EQ);
- HIPPathArg = Args.getLastArgValue(clang::driver::options::OPT_hip_path_EQ);
- HIPStdParPathArg =
- Args.getLastArgValue(clang::driver::options::OPT_hipstdpar_path_EQ);
+ Args.getAllArgValues(options::OPT_rocm_device_lib_path_EQ);
+ HIPPathArg = Args.getLastArgValue(options::OPT_hip_path_EQ);
+ HIPStdParPathArg = Args.getLastArgValue(options::OPT_hipstdpar_path_EQ);
HasHIPStdParLibrary =
!HIPStdParPathArg.empty() && D.getVFS().exists(HIPStdParPathArg +
"/hipstdpar_lib.hpp");
HIPRocThrustPathArg =
- Args.getLastArgValue(clang::driver::options::OPT_hipstdpar_thrust_path_EQ);
+ Args.getLastArgValue(options::OPT_hipstdpar_thrust_path_EQ);
HasRocThrustLibrary = !HIPRocThrustPathArg.empty() &&
D.getVFS().exists(HIPRocThrustPathArg + "/thrust");
- HIPRocPrimPathArg =
- Args.getLastArgValue(clang::driver::options::OPT_hipstdpar_prim_path_EQ);
+ HIPRocPrimPathArg = Args.getLastArgValue(options::OPT_hipstdpar_prim_path_EQ);
HasRocPrimLibrary = !HIPRocPrimPathArg.empty() &&
D.getVFS().exists(HIPRocPrimPathArg + "/rocprim");
- if (auto *A = Args.getLastArg(clang::driver::options::OPT_hip_version_EQ)) {
+ if (auto *A = Args.getLastArg(options::OPT_hip_version_EQ)) {
HIPVersionArg = A->getValue();
unsigned Major = ~0U;
unsigned Minor = ~0U;
@@ -1077,24 +1081,9 @@ ROCMToolChain::getCommonDeviceLibNames(
bool AMDGPUToolChain::shouldSkipSanitizeOption(
const ToolChain &TC, const llvm::opt::ArgList &DriverArgs,
StringRef TargetID, const llvm::opt::Arg *A) const {
- // For actions without targetID, do nothing.
- if (TargetID.empty())
- return false;
- Option O = A->getOption();
-
- if (!O.matches(options::OPT_fsanitize_EQ))
- return false;
-
- if (!DriverArgs.hasFlag(options::OPT_fgpu_sanitize,
- options::OPT_fno_gpu_sanitize, true))
- return true;
-
auto &Diags = TC.getDriver().getDiags();
-
- // For simplicity, we only allow -fsanitize=address
- SanitizerMask K = parseSanitizerValue(A->getValue(), /*AllowGroups=*/false);
- if (K != SanitizerKind::Address)
- return true;
+ bool IsExplicitDevice =
+ A->getBaseArg().getOption().matches(options::OPT_Xarch_device);
// Check 'xnack+' availability by default
llvm::StringRef Processor =
@@ -1115,10 +1104,17 @@ bool AMDGPUToolChain::shouldSkipSanitizeOption(
(void)OptionalGpuArch;
auto Loc = FeatureMap.find("xnack");
if (Loc == FeatureMap.end() || !Loc->second) {
- Diags.Report(
- clang::diag::warn_drv_unsupported_option_for_offload_arch_req_feature)
- << A->getAsString(DriverArgs) << TargetID << "xnack+";
+ if (IsExplicitDevice) {
+ Diags.Report(
+ clang::diag::err_drv_unsupported_option_for_offload_arch_req_feature)
+ << A->getAsString(DriverArgs) << TargetID << "xnack+";
+ } else {
+ Diags.Report(
+ clang::diag::warn_drv_unsupported_option_for_offload_arch_req_feature)
+ << A->getAsString(DriverArgs) << TargetID << "xnack+";
+ }
return true;
}
+
return false;
}
diff --git a/clang/lib/Driver/ToolChains/AMDGPU.h b/clang/lib/Driver/ToolChains/AMDGPU.h
index e90a573..4dd8188 100644
--- a/clang/lib/Driver/ToolChains/AMDGPU.h
+++ b/clang/lib/Driver/ToolChains/AMDGPU.h
@@ -11,9 +11,9 @@
#include "Gnu.h"
#include "clang/Basic/TargetID.h"
-#include "clang/Driver/Options.h"
#include "clang/Driver/Tool.h"
#include "clang/Driver/ToolChain.h"
+#include "clang/Options/Options.h"
#include "llvm/ADT/SmallString.h"
#include "llvm/TargetParser/TargetParser.h"
@@ -101,7 +101,7 @@ public:
/// Needed for translating LTO options.
const char *getDefaultLinker() const override { return "ld.lld"; }
- /// Should skip sanitize options.
+ /// Should skip sanitize option.
bool shouldSkipSanitizeOption(const ToolChain &TC,
const llvm::opt::ArgList &DriverArgs,
StringRef TargetID,
@@ -155,18 +155,79 @@ public:
return SanitizerKind::Address;
}
- void diagnoseUnsupportedSanitizers(const llvm::opt::ArgList &Args) const {
- if (!Args.hasFlag(options::OPT_fgpu_sanitize, options::OPT_fno_gpu_sanitize,
- true))
- return;
+ bool diagnoseUnsupportedOption(const llvm::opt::Arg *A,
+ const llvm::opt::DerivedArgList &DAL,
+ const llvm::opt::ArgList &DriverArgs,
+ const char *Value = nullptr) const {
auto &Diags = getDriver().getDiags();
- for (auto *A : Args.filtered(options::OPT_fsanitize_EQ)) {
- SanitizerMask K =
- parseSanitizerValue(A->getValue(), /*Allow Groups*/ false);
- if (K != SanitizerKind::Address)
- Diags.Report(clang::diag::warn_drv_unsupported_option_for_target)
- << A->getAsString(Args) << getTriple().str();
+ bool IsExplicitDevice =
+ A->getBaseArg().getOption().matches(options::OPT_Xarch_device);
+
+ if (Value) {
+ unsigned DiagID =
+ IsExplicitDevice
+ ? clang::diag::err_drv_unsupported_option_part_for_target
+ : clang::diag::warn_drv_unsupported_option_part_for_target;
+ Diags.Report(DiagID) << Value << A->getAsString(DriverArgs)
+ << getTriple().str();
+ } else {
+ unsigned DiagID =
+ IsExplicitDevice
+ ? clang::diag::err_drv_unsupported_option_for_target
+ : clang::diag::warn_drv_unsupported_option_for_target;
+ Diags.Report(DiagID) << A->getAsString(DAL) << getTriple().str();
}
+ return true;
+ }
+
+ bool handleSanitizeOption(const ToolChain &TC, llvm::opt::DerivedArgList &DAL,
+ const llvm::opt::ArgList &DriverArgs,
+ StringRef TargetID, const llvm::opt::Arg *A) const {
+ if (TargetID.empty())
+ return false;
+ // If we shouldn't do sanitizing, skip it.
+ if (!DriverArgs.hasFlag(options::OPT_fgpu_sanitize,
+ options::OPT_fno_gpu_sanitize, true))
+ return true;
+ const llvm::opt::Option &Opt = A->getOption();
+ // Sanitizer coverage is currently not supported for AMDGPU, so warn/error
+ // on every related option.
+ if (Opt.matches(options::OPT_fsan_cov_Group)) {
+ diagnoseUnsupportedOption(A, DAL, DriverArgs);
+ }
+ // If this isn't a sanitizer option, don't handle it.
+ if (!Opt.matches(options::OPT_fsanitize_EQ))
+ return false;
+
+ SmallVector<const char *, 4> SupportedSanitizers;
+ SmallVector<const char *, 4> UnSupportedSanitizers;
+
+ for (const char *Value : A->getValues()) {
+ SanitizerMask K = parseSanitizerValue(Value, /*Allow Groups*/ false);
+ if (K & ROCMToolChain::getSupportedSanitizers())
+ SupportedSanitizers.push_back(Value);
+ else
+ UnSupportedSanitizers.push_back(Value);
+ }
+
+ // If there are no supported sanitizers, drop the whole argument.
+ if (SupportedSanitizers.empty()) {
+ diagnoseUnsupportedOption(A, DAL, DriverArgs);
+ return true;
+ }
+ // If only some sanitizers are unsupported, report each one individually.
+ if (!UnSupportedSanitizers.empty()) {
+ for (const char *Value : UnSupportedSanitizers) {
+ diagnoseUnsupportedOption(A, DAL, DriverArgs, Value);
+ }
+ }
+ // If we know the target arch, check if the sanitizer is supported for it.
+ if (shouldSkipSanitizeOption(TC, DriverArgs, TargetID, A))
+ return true;
+
+ // Add a new argument with only the supported sanitizers.
+ DAL.AddJoinedArg(A, A->getOption(), llvm::join(SupportedSanitizers, ","));
+ return true;
}
};
diff --git a/clang/lib/Driver/ToolChains/AMDGPUOpenMP.cpp b/clang/lib/Driver/ToolChains/AMDGPUOpenMP.cpp
index 2b41d54..1a30875 100644
--- a/clang/lib/Driver/ToolChains/AMDGPUOpenMP.cpp
+++ b/clang/lib/Driver/ToolChains/AMDGPUOpenMP.cpp
@@ -10,8 +10,8 @@
#include "AMDGPU.h"
#include "clang/Driver/Compilation.h"
#include "clang/Driver/Driver.h"
-#include "clang/Driver/Options.h"
#include "clang/Driver/Tool.h"
+#include "clang/Options/Options.h"
#include "llvm/ADT/STLExtras.h"
using namespace clang::driver;
@@ -28,8 +28,6 @@ AMDGPUOpenMPToolChain::AMDGPUOpenMPToolChain(const Driver &D,
// Lookup binaries into the driver directory, this is used to
// discover the 'amdgpu-arch' executable.
getProgramPaths().push_back(getDriver().Dir);
- // Diagnose unsupported sanitizer options only once.
- diagnoseUnsupportedSanitizers(Args);
}
void AMDGPUOpenMPToolChain::addClangTargetOptions(
@@ -66,16 +64,11 @@ llvm::opt::DerivedArgList *AMDGPUOpenMPToolChain::TranslateArgs(
const OptTable &Opts = getDriver().getOpts();
- // Skip sanitize options passed from the HostTC. Claim them early.
- // The decision to sanitize device code is computed only by
- // 'shouldSkipSanitizeOption'.
- if (DAL->hasArg(options::OPT_fsanitize_EQ))
- DAL->claimAllArgs(options::OPT_fsanitize_EQ);
-
- for (Arg *A : Args)
- if (!shouldSkipSanitizeOption(*this, Args, BoundArch, A) &&
- !llvm::is_contained(*DAL, A))
+ for (Arg *A : Args) {
+ // Filter unsupported sanitizers passed from the HostTC.
+ if (!handleSanitizeOption(*this, *DAL, Args, BoundArch, A))
DAL->append(A);
+ }
if (!BoundArch.empty()) {
DAL->eraseArg(options::OPT_march_EQ);
@@ -115,9 +108,8 @@ void AMDGPUOpenMPToolChain::AddIAMCUIncludeArgs(const ArgList &Args,
SanitizerMask AMDGPUOpenMPToolChain::getSupportedSanitizers() const {
// The AMDGPUOpenMPToolChain only supports sanitizers in the sense that it
// allows sanitizer arguments on the command line if they are supported by the
- // host toolchain. The AMDGPUOpenMPToolChain will actually ignore any command
- // line arguments for any of these "supported" sanitizers. That means that no
- // sanitization of device code is actually supported at this time.
+ // host toolchain. The AMDGPUOpenMPToolChain will later filter unsupported
+ // sanitizers from the command line arguments.
//
// This behavior is necessary because the host and device toolchains
// invocations often share the command line, so the device toolchain must
diff --git a/clang/lib/Driver/ToolChains/AVR.cpp b/clang/lib/Driver/ToolChains/AVR.cpp
index 731076d..588255d 100644
--- a/clang/lib/Driver/ToolChains/AVR.cpp
+++ b/clang/lib/Driver/ToolChains/AVR.cpp
@@ -10,7 +10,7 @@
#include "clang/Driver/CommonArgs.h"
#include "clang/Driver/Compilation.h"
#include "clang/Driver/InputInfo.h"
-#include "clang/Driver/Options.h"
+#include "clang/Options/Options.h"
#include "llvm/Option/ArgList.h"
#include "llvm/Support/FileSystem.h"
#include "llvm/Support/Path.h"
diff --git a/clang/lib/Driver/ToolChains/Arch/AArch64.cpp b/clang/lib/Driver/ToolChains/Arch/AArch64.cpp
index e8d5e38..087ae92 100644
--- a/clang/lib/Driver/ToolChains/Arch/AArch64.cpp
+++ b/clang/lib/Driver/ToolChains/Arch/AArch64.cpp
@@ -9,7 +9,7 @@
#include "AArch64.h"
#include "clang/Driver/CommonArgs.h"
#include "clang/Driver/Driver.h"
-#include "clang/Driver/Options.h"
+#include "clang/Options/Options.h"
#include "llvm/Option/ArgList.h"
#include "llvm/TargetParser/AArch64TargetParser.h"
#include "llvm/TargetParser/Host.h"
@@ -222,7 +222,7 @@ void aarch64::getAArch64TargetFeatures(const Driver &D,
// Default to 'A' profile if the architecture is not specified.
success = getAArch64ArchFeaturesFromMarch(D, "armv8-a", Args, Extensions);
- if (success && (A = Args.getLastArg(clang::driver::options::OPT_mtune_EQ)))
+ if (success && (A = Args.getLastArg(options::OPT_mtune_EQ)))
success =
getAArch64MicroArchFeaturesFromMtune(D, A->getValue(), Args, Features);
else if (success && (A = Args.getLastArg(options::OPT_mcpu_EQ)))
@@ -453,13 +453,18 @@ void aarch64::getAArch64TargetFeatures(const Driver &D,
Features.push_back("+fix-cortex-a53-835769");
else
Features.push_back("-fix-cortex-a53-835769");
- } else if (Triple.isAndroid() || Triple.isOHOSFamily()) {
- // Enabled A53 errata (835769) workaround by default on android
- Features.push_back("+fix-cortex-a53-835769");
- } else if (Triple.isOSFuchsia()) {
- std::string CPU = getCPUName(D, Args, Triple);
- if (CPU.empty() || CPU == "generic" || CPU == "cortex-a53")
+ } else if (Extensions.BaseArch &&
+ Extensions.BaseArch->Version.getMajor() == 8 &&
+ Extensions.BaseArch->Version.getMinor() == 0) {
+ if (Triple.isAndroid() || Triple.isOHOSFamily()) {
+ // Enabled A53 errata (835769) workaround by default on android, providing
+ // that the architecture allows running on a cortex-a53.
Features.push_back("+fix-cortex-a53-835769");
+ } else if (Triple.isOSFuchsia()) {
+ std::string CPU = getCPUName(D, Args, Triple);
+ if (CPU.empty() || CPU == "generic" || CPU == "cortex-a53")
+ Features.push_back("+fix-cortex-a53-835769");
+ }
}
if (Args.getLastArg(options::OPT_mno_bti_at_return_twice))
diff --git a/clang/lib/Driver/ToolChains/Arch/ARM.cpp b/clang/lib/Driver/ToolChains/Arch/ARM.cpp
index 61beb04..55eb2dc 100644
--- a/clang/lib/Driver/ToolChains/Arch/ARM.cpp
+++ b/clang/lib/Driver/ToolChains/Arch/ARM.cpp
@@ -8,7 +8,7 @@
#include "ARM.h"
#include "clang/Driver/Driver.h"
-#include "clang/Driver/Options.h"
+#include "clang/Options/Options.h"
#include "llvm/ADT/StringSwitch.h"
#include "llvm/Option/ArgList.h"
#include "llvm/TargetParser/ARMTargetParser.h"
@@ -74,7 +74,7 @@ bool arm::isARMEABIBareMetal(const llvm::Triple &Triple) {
// Get Arch/CPU from args.
void arm::getARMArchCPUFromArgs(const ArgList &Args, llvm::StringRef &Arch,
llvm::StringRef &CPU, bool FromAs) {
- if (const Arg *A = Args.getLastArg(clang::driver::options::OPT_mcpu_EQ))
+ if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
CPU = A->getValue();
if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
Arch = A->getValue();
diff --git a/clang/lib/Driver/ToolChains/Arch/CSKY.cpp b/clang/lib/Driver/ToolChains/Arch/CSKY.cpp
index 2fd2c72..65f6534 100644
--- a/clang/lib/Driver/ToolChains/Arch/CSKY.cpp
+++ b/clang/lib/Driver/ToolChains/Arch/CSKY.cpp
@@ -8,7 +8,7 @@
#include "CSKY.h"
#include "clang/Driver/Driver.h"
-#include "clang/Driver/Options.h"
+#include "clang/Options/Options.h"
#include "llvm/ADT/StringSwitch.h"
#include "llvm/Option/ArgList.h"
#include "llvm/TargetParser/CSKYTargetParser.h"
@@ -33,7 +33,7 @@ csky::getCSKYArchName(const Driver &D, const ArgList &Args,
return std::optional<llvm::StringRef>(A->getValue());
}
- if (const Arg *A = Args.getLastArg(clang::driver::options::OPT_mcpu_EQ)) {
+ if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
llvm::CSKY::ArchKind ArchKind = llvm::CSKY::parseCPUArch(A->getValue());
if (ArchKind == llvm::CSKY::ArchKind::INVALID) {
D.Diag(clang::diag::err_drv_clang_unsupported) << A->getAsString(Args);
@@ -126,7 +126,7 @@ void csky::getCSKYTargetFeatures(const Driver &D, const llvm::Triple &Triple,
archName = A->getValue();
}
- if (const Arg *A = Args.getLastArg(clang::driver::options::OPT_mcpu_EQ)) {
+ if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
llvm::CSKY::ArchKind Kind = llvm::CSKY::parseCPUArch(A->getValue());
if (Kind == llvm::CSKY::ArchKind::INVALID) {
D.Diag(clang::diag::err_drv_clang_unsupported) << A->getAsString(Args);
diff --git a/clang/lib/Driver/ToolChains/Arch/LoongArch.cpp b/clang/lib/Driver/ToolChains/Arch/LoongArch.cpp
index 156ea03..da084bd 100644
--- a/clang/lib/Driver/ToolChains/Arch/LoongArch.cpp
+++ b/clang/lib/Driver/ToolChains/Arch/LoongArch.cpp
@@ -11,7 +11,7 @@
#include "clang/Basic/DiagnosticDriver.h"
#include "clang/Driver/CommonArgs.h"
#include "clang/Driver/Driver.h"
-#include "clang/Driver/Options.h"
+#include "clang/Options/Options.h"
#include "llvm/TargetParser/Host.h"
#include "llvm/TargetParser/LoongArchTargetParser.h"
@@ -130,8 +130,7 @@ void loongarch::getLoongArchTargetFeatures(const Driver &D,
const ArgList &Args,
std::vector<StringRef> &Features) {
// Enable the `lsx` feature on 64-bit LoongArch by default.
- if (Triple.isLoongArch64() &&
- (!Args.hasArgNoClaim(clang::driver::options::OPT_march_EQ)))
+ if (Triple.isLoongArch64() && (!Args.hasArgNoClaim(options::OPT_march_EQ)))
Features.push_back("+lsx");
// -mrelax is default, unless -mno-relax is specified.
diff --git a/clang/lib/Driver/ToolChains/Arch/M68k.cpp b/clang/lib/Driver/ToolChains/Arch/M68k.cpp
index 708ec84..a620597 100644
--- a/clang/lib/Driver/ToolChains/Arch/M68k.cpp
+++ b/clang/lib/Driver/ToolChains/Arch/M68k.cpp
@@ -8,7 +8,7 @@
#include "M68k.h"
#include "clang/Driver/Driver.h"
-#include "clang/Driver/Options.h"
+#include "clang/Options/Options.h"
#include "llvm/ADT/StringSwitch.h"
#include "llvm/Option/ArgList.h"
#include "llvm/Support/Regex.h"
@@ -21,7 +21,7 @@ using namespace llvm::opt;
/// getM68kTargetCPU - Get the (LLVM) name of the 68000 cpu we are targeting.
std::string m68k::getM68kTargetCPU(const ArgList &Args) {
- if (Arg *A = Args.getLastArg(clang::driver::options::OPT_mcpu_EQ)) {
+ if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
// The canonical CPU name is captalize. However, we allow
// starting with lower case or numbers only
StringRef CPUName = A->getValue();
@@ -45,17 +45,17 @@ std::string m68k::getM68kTargetCPU(const ArgList &Args) {
.Default(CPUName.str());
}
// FIXME: Throw error when multiple sub-architecture flag exist
- if (Args.hasArg(clang::driver::options::OPT_m68000))
+ if (Args.hasArg(options::OPT_m68000))
return "M68000";
- if (Args.hasArg(clang::driver::options::OPT_m68010))
+ if (Args.hasArg(options::OPT_m68010))
return "M68010";
- if (Args.hasArg(clang::driver::options::OPT_m68020))
+ if (Args.hasArg(options::OPT_m68020))
return "M68020";
- if (Args.hasArg(clang::driver::options::OPT_m68030))
+ if (Args.hasArg(options::OPT_m68030))
return "M68030";
- if (Args.hasArg(clang::driver::options::OPT_m68040))
+ if (Args.hasArg(options::OPT_m68040))
return "M68040";
- if (Args.hasArg(clang::driver::options::OPT_m68060))
+ if (Args.hasArg(options::OPT_m68060))
return "M68060";
return "";
diff --git a/clang/lib/Driver/ToolChains/Arch/Mips.cpp b/clang/lib/Driver/ToolChains/Arch/Mips.cpp
index 8d7b85d..103aae7 100644
--- a/clang/lib/Driver/ToolChains/Arch/Mips.cpp
+++ b/clang/lib/Driver/ToolChains/Arch/Mips.cpp
@@ -9,7 +9,7 @@
#include "Mips.h"
#include "clang/Driver/CommonArgs.h"
#include "clang/Driver/Driver.h"
-#include "clang/Driver/Options.h"
+#include "clang/Options/Options.h"
#include "llvm/ADT/StringSwitch.h"
#include "llvm/Option/ArgList.h"
@@ -49,8 +49,7 @@ void mips::getMipsCPUAndABI(const ArgList &Args, const llvm::Triple &Triple,
DefMips64CPU = "mips3";
}
- if (Arg *A = Args.getLastArg(clang::driver::options::OPT_march_EQ,
- options::OPT_mcpu_EQ))
+ if (Arg *A = Args.getLastArg(options::OPT_march_EQ, options::OPT_mcpu_EQ))
CPUName = A->getValue();
if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
diff --git a/clang/lib/Driver/ToolChains/Arch/PPC.cpp b/clang/lib/Driver/ToolChains/Arch/PPC.cpp
index 361a68a..44afdd2 100644
--- a/clang/lib/Driver/ToolChains/Arch/PPC.cpp
+++ b/clang/lib/Driver/ToolChains/Arch/PPC.cpp
@@ -9,7 +9,7 @@
#include "PPC.h"
#include "clang/Driver/CommonArgs.h"
#include "clang/Driver/Driver.h"
-#include "clang/Driver/Options.h"
+#include "clang/Options/Options.h"
#include "llvm/ADT/StringSwitch.h"
#include "llvm/Option/ArgList.h"
#include "llvm/TargetParser/Host.h"
diff --git a/clang/lib/Driver/ToolChains/Arch/RISCV.cpp b/clang/lib/Driver/ToolChains/Arch/RISCV.cpp
index f2e79e7..7fda8ea 100644
--- a/clang/lib/Driver/ToolChains/Arch/RISCV.cpp
+++ b/clang/lib/Driver/ToolChains/Arch/RISCV.cpp
@@ -10,7 +10,7 @@
#include "../Clang.h"
#include "clang/Driver/CommonArgs.h"
#include "clang/Driver/Driver.h"
-#include "clang/Driver/Options.h"
+#include "clang/Options/Options.h"
#include "llvm/Option/ArgList.h"
#include "llvm/Support/Error.h"
#include "llvm/TargetParser/Host.h"
@@ -130,17 +130,10 @@ void riscv::getRISCVTargetFeatures(const Driver &D, const llvm::Triple &Triple,
#undef RESERVE_REG
// -mrelax is default, unless -mno-relax is specified.
- if (Args.hasFlag(options::OPT_mrelax, options::OPT_mno_relax, true)) {
+ if (Args.hasFlag(options::OPT_mrelax, options::OPT_mno_relax, true))
Features.push_back("+relax");
- // -gsplit-dwarf -mrelax requires DW_AT_high_pc/DW_AT_ranges/... indexing
- // into .debug_addr, which is currently not implemented.
- Arg *A;
- if (getDebugFissionKind(D, Args, A) != DwarfFissionKind::None)
- D.Diag(clang::diag::err_drv_riscv_unsupported_with_linker_relaxation)
- << A->getAsString(Args);
- } else {
+ else
Features.push_back("-relax");
- }
// If -mstrict-align, -mno-strict-align, -mscalar-strict-align, or
// -mno-scalar-strict-align is passed, use it. Otherwise, the
diff --git a/clang/lib/Driver/ToolChains/Arch/Sparc.cpp b/clang/lib/Driver/ToolChains/Arch/Sparc.cpp
index 94a94f1..49256d8 100644
--- a/clang/lib/Driver/ToolChains/Arch/Sparc.cpp
+++ b/clang/lib/Driver/ToolChains/Arch/Sparc.cpp
@@ -8,7 +8,7 @@
#include "Sparc.h"
#include "clang/Driver/Driver.h"
-#include "clang/Driver/Options.h"
+#include "clang/Options/Options.h"
#include "llvm/ADT/StringSwitch.h"
#include "llvm/Option/ArgList.h"
#include "llvm/TargetParser/Host.h"
@@ -122,7 +122,7 @@ sparc::FloatABI sparc::getSparcFloatABI(const Driver &D,
std::string sparc::getSparcTargetCPU(const Driver &D, const ArgList &Args,
const llvm::Triple &Triple) {
- if (const Arg *A = Args.getLastArg(clang::driver::options::OPT_mcpu_EQ)) {
+ if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
StringRef CPUName = A->getValue();
if (CPUName == "native") {
std::string CPU = std::string(llvm::sys::getHostCPUName());
diff --git a/clang/lib/Driver/ToolChains/Arch/SystemZ.cpp b/clang/lib/Driver/ToolChains/Arch/SystemZ.cpp
index 75b6afd..1ef6a72 100644
--- a/clang/lib/Driver/ToolChains/Arch/SystemZ.cpp
+++ b/clang/lib/Driver/ToolChains/Arch/SystemZ.cpp
@@ -8,7 +8,7 @@
#include "SystemZ.h"
#include "clang/Config/config.h"
-#include "clang/Driver/Options.h"
+#include "clang/Options/Options.h"
#include "llvm/Option/ArgList.h"
#include "llvm/TargetParser/Host.h"
@@ -25,9 +25,9 @@ systemz::FloatABI systemz::getSystemZFloatABI(const Driver &D,
D.Diag(diag::err_drv_unsupported_opt)
<< Args.getLastArg(options::OPT_mfloat_abi_EQ)->getAsString(Args);
- if (Arg *A = Args.getLastArg(clang::driver::options::OPT_msoft_float,
- options::OPT_mhard_float))
- if (A->getOption().matches(clang::driver::options::OPT_msoft_float))
+ if (Arg *A =
+ Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float))
+ if (A->getOption().matches(options::OPT_msoft_float))
ABI = systemz::FloatABI::Soft;
return ABI;
@@ -35,7 +35,7 @@ systemz::FloatABI systemz::getSystemZFloatABI(const Driver &D,
std::string systemz::getSystemZTargetCPU(const ArgList &Args,
const llvm::Triple &T) {
- if (const Arg *A = Args.getLastArg(clang::driver::options::OPT_march_EQ)) {
+ if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
llvm::StringRef CPUName = A->getValue();
if (CPUName == "native") {
diff --git a/clang/lib/Driver/ToolChains/Arch/VE.cpp b/clang/lib/Driver/ToolChains/Arch/VE.cpp
index adc0873..c8353d7 100644
--- a/clang/lib/Driver/ToolChains/Arch/VE.cpp
+++ b/clang/lib/Driver/ToolChains/Arch/VE.cpp
@@ -8,7 +8,7 @@
#include "VE.h"
#include "clang/Driver/Driver.h"
-#include "clang/Driver/Options.h"
+#include "clang/Options/Options.h"
#include "llvm/Option/ArgList.h"
using namespace clang::driver;
diff --git a/clang/lib/Driver/ToolChains/Arch/X86.cpp b/clang/lib/Driver/ToolChains/Arch/X86.cpp
index 1373905..d6e6657c 100644
--- a/clang/lib/Driver/ToolChains/Arch/X86.cpp
+++ b/clang/lib/Driver/ToolChains/Arch/X86.cpp
@@ -8,7 +8,7 @@
#include "X86.h"
#include "clang/Driver/Driver.h"
-#include "clang/Driver/Options.h"
+#include "clang/Options/Options.h"
#include "llvm/ADT/StringExtras.h"
#include "llvm/ADT/StringMap.h"
#include "llvm/Option/ArgList.h"
@@ -21,7 +21,7 @@ using namespace llvm::opt;
std::string x86::getX86TargetCPU(const Driver &D, const ArgList &Args,
const llvm::Triple &Triple) {
- if (const Arg *A = Args.getLastArg(clang::driver::options::OPT_march_EQ)) {
+ if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
StringRef CPU = A->getValue();
if (CPU != "native")
return std::string(CPU);
@@ -42,6 +42,8 @@ std::string x86::getX86TargetCPU(const Driver &D, const ArgList &Args,
{"AVX2", "haswell"},
{"AVX512F", "knl"},
{"AVX512", "skylake-avx512"},
+ {"AVX10.1", "sapphirerapids"},
+ {"AVX10.2", "diamondrapids"},
});
if (Triple.getArch() == llvm::Triple::x86) {
// 32-bit-only /arch: flags.
@@ -119,7 +121,7 @@ void x86::getX86TargetFeatures(const Driver &D, const llvm::Triple &Triple,
std::vector<StringRef> &Features) {
// Claim and report unsupported -mabi=. Note: we don't support "sysv_abi" or
// "ms_abi" as default function attributes.
- if (const Arg *A = Args.getLastArg(clang::driver::options::OPT_mabi_EQ)) {
+ if (const Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
StringRef DefaultAbi =
(Triple.isOSWindows() || Triple.isUEFI()) ? "ms" : "sysv";
if (A->getValue() != DefaultAbi)
@@ -128,7 +130,7 @@ void x86::getX86TargetFeatures(const Driver &D, const llvm::Triple &Triple,
}
// If -march=native, autodetect the feature list.
- if (const Arg *A = Args.getLastArg(clang::driver::options::OPT_march_EQ)) {
+ if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
if (StringRef(A->getValue()) == "native") {
for (auto &F : llvm::sys::getHostCPUFeatures())
Features.push_back(
@@ -163,7 +165,7 @@ void x86::getX86TargetFeatures(const Driver &D, const llvm::Triple &Triple,
// flags). This is a bit hacky but keeps existing usages working. We should
// consider deprecating this and instead warn if the user requests external
// retpoline thunks and *doesn't* request some form of retpolines.
- auto SpectreOpt = clang::driver::options::ID::OPT_INVALID;
+ auto SpectreOpt = options::ID::OPT_INVALID;
if (Args.hasArgNoClaim(options::OPT_mretpoline, options::OPT_mno_retpoline,
options::OPT_mspeculative_load_hardening,
options::OPT_mno_speculative_load_hardening)) {
@@ -189,7 +191,7 @@ void x86::getX86TargetFeatures(const Driver &D, const llvm::Triple &Triple,
SpectreOpt = options::OPT_mretpoline_external_thunk;
}
- auto LVIOpt = clang::driver::options::ID::OPT_INVALID;
+ auto LVIOpt = options::ID::OPT_INVALID;
if (Args.hasFlag(options::OPT_mlvi_hardening, options::OPT_mno_lvi_hardening,
false)) {
Features.push_back("+lvi-load-hardening");
@@ -207,7 +209,7 @@ void x86::getX86TargetFeatures(const Driver &D, const llvm::Triple &Triple,
<< D.getOpts().getOptionName(options::OPT_mlvi_hardening)
<< D.getOpts().getOptionName(options::OPT_m_seses);
- if (SpectreOpt != clang::driver::options::ID::OPT_INVALID)
+ if (SpectreOpt != options::ID::OPT_INVALID)
D.Diag(diag::err_drv_argument_not_allowed_with)
<< D.getOpts().getOptionName(SpectreOpt)
<< D.getOpts().getOptionName(options::OPT_m_seses);
@@ -219,8 +221,8 @@ void x86::getX86TargetFeatures(const Driver &D, const llvm::Triple &Triple,
}
}
- if (SpectreOpt != clang::driver::options::ID::OPT_INVALID &&
- LVIOpt != clang::driver::options::ID::OPT_INVALID) {
+ if (SpectreOpt != options::ID::OPT_INVALID &&
+ LVIOpt != options::ID::OPT_INVALID) {
D.Diag(diag::err_drv_argument_not_allowed_with)
<< D.getOpts().getOptionName(SpectreOpt)
<< D.getOpts().getOptionName(LVIOpt);
diff --git a/clang/lib/Driver/ToolChains/BareMetal.cpp b/clang/lib/Driver/ToolChains/BareMetal.cpp
index 9b7f58c..8d598be 100644
--- a/clang/lib/Driver/ToolChains/BareMetal.cpp
+++ b/clang/lib/Driver/ToolChains/BareMetal.cpp
@@ -18,7 +18,7 @@
#include "clang/Driver/Compilation.h"
#include "clang/Driver/Driver.h"
#include "clang/Driver/MultilibBuilder.h"
-#include "clang/Driver/Options.h"
+#include "clang/Options/Options.h"
#include "llvm/ADT/StringExtras.h"
#include "llvm/Option/ArgList.h"
#include "llvm/Support/Path.h"
@@ -135,7 +135,7 @@ static std::string computeClangRuntimesSysRoot(const Driver &D,
bool BareMetal::initGCCInstallation(const llvm::Triple &Triple,
const llvm::opt::ArgList &Args) {
if (Args.getLastArg(options::OPT_gcc_toolchain) ||
- Args.getLastArg(clang::driver::options::OPT_gcc_install_dir_EQ)) {
+ Args.getLastArg(clang::options::OPT_gcc_install_dir_EQ)) {
GCCInstallation.init(Triple, Args);
return GCCInstallation.isValid();
}
diff --git a/clang/lib/Driver/ToolChains/CSKYToolChain.cpp b/clang/lib/Driver/ToolChains/CSKYToolChain.cpp
index e4db330..c561d7d 100644
--- a/clang/lib/Driver/ToolChains/CSKYToolChain.cpp
+++ b/clang/lib/Driver/ToolChains/CSKYToolChain.cpp
@@ -10,7 +10,7 @@
#include "clang/Driver/CommonArgs.h"
#include "clang/Driver/Compilation.h"
#include "clang/Driver/InputInfo.h"
-#include "clang/Driver/Options.h"
+#include "clang/Options/Options.h"
#include "llvm/Option/ArgList.h"
#include "llvm/Support/FileSystem.h"
#include "llvm/Support/Path.h"
diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp
index e20963a..7187d1a 100644
--- a/clang/lib/Driver/ToolChains/Clang.cpp
+++ b/clang/lib/Driver/ToolChains/Clang.cpp
@@ -29,10 +29,11 @@
#include "clang/Driver/CommonArgs.h"
#include "clang/Driver/Distro.h"
#include "clang/Driver/InputInfo.h"
-#include "clang/Driver/Options.h"
#include "clang/Driver/SanitizerArgs.h"
#include "clang/Driver/Types.h"
#include "clang/Driver/XRayArgs.h"
+#include "clang/Options/OptionUtils.h"
+#include "clang/Options/Options.h"
#include "llvm/ADT/ScopeExit.h"
#include "llvm/ADT/SmallSet.h"
#include "llvm/ADT/StringExtras.h"
@@ -65,7 +66,7 @@ using namespace clang;
using namespace llvm::opt;
static void CheckPreprocessingOptions(const Driver &D, const ArgList &Args) {
- if (Arg *A = Args.getLastArg(clang::driver::options::OPT_C, options::OPT_CC,
+ if (Arg *A = Args.getLastArg(options::OPT_C, options::OPT_CC,
options::OPT_fminimize_whitespace,
options::OPT_fno_minimize_whitespace,
options::OPT_fkeep_system_includes,
@@ -1661,7 +1662,7 @@ void Clang::AddAArch64TargetArgs(const ArgList &Args,
AddAAPCSVolatileBitfieldArgs(Args, CmdArgs);
- if (const Arg *A = Args.getLastArg(clang::driver::options::OPT_mtune_EQ)) {
+ if (const Arg *A = Args.getLastArg(options::OPT_mtune_EQ)) {
CmdArgs.push_back("-tune-cpu");
if (strcmp(A->getValue(), "native") == 0)
CmdArgs.push_back(Args.MakeArgString(llvm::sys::getHostCPUName()));
@@ -2067,7 +2068,7 @@ void Clang::AddSparcTargetArgs(const ArgList &Args,
CmdArgs.push_back("hard");
}
- if (const Arg *A = Args.getLastArg(clang::driver::options::OPT_mtune_EQ)) {
+ if (const Arg *A = Args.getLastArg(options::OPT_mtune_EQ)) {
StringRef Name = A->getValue();
std::string TuneCPU;
if (Name == "native")
@@ -2173,12 +2174,11 @@ void Clang::AddX86TargetArgs(const ArgList &Args,
// Default to "generic" unless -march is present or targetting the PS4/PS5.
std::string TuneCPU;
- if (!Args.hasArg(clang::driver::options::OPT_march_EQ) &&
- !getToolChain().getTriple().isPS())
+ if (!Args.hasArg(options::OPT_march_EQ) && !getToolChain().getTriple().isPS())
TuneCPU = "generic";
// Override based on -mtune.
- if (const Arg *A = Args.getLastArg(clang::driver::options::OPT_mtune_EQ)) {
+ if (const Arg *A = Args.getLastArg(options::OPT_mtune_EQ)) {
StringRef Name = A->getValue();
if (Name == "native") {
@@ -4443,6 +4443,10 @@ renderDebugOptions(const ToolChain &TC, const Driver &D, const llvm::Triple &T,
DebuggerTuning != llvm::DebuggerKind::DBX)))
CmdArgs.push_back("-gno-column-info");
+ if (!Args.hasFlag(options::OPT_gcall_site_info,
+ options::OPT_gno_call_site_info, true))
+ CmdArgs.push_back("-gno-call-site-info");
+
// FIXME: Move backend command line options to the module.
if (Args.hasFlag(options::OPT_gmodules, options::OPT_gno_modules, false)) {
// If -gline-tables-only or -gline-directives-only is the last option it
@@ -5058,6 +5062,10 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Args.ClaimAllArgs(options::OPT_femit_dwarf_unwind_EQ);
}
+ bool IsAMDSPIRVForHIPDevice =
+ IsHIPDevice && getToolChain().getTriple().isSPIRV() &&
+ getToolChain().getTriple().getVendor() == llvm::Triple::AMD;
+
if (isa<AnalyzeJobAction>(JA)) {
assert(JA.getType() == types::TY_Plist && "Invalid output type.");
CmdArgs.push_back("-analyze");
@@ -5155,6 +5163,8 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,
rewriteKind = RK_Fragile;
} else if (JA.getType() == types::TY_CIR) {
CmdArgs.push_back("-emit-cir");
+ } else if (JA.getType() == types::TY_Image && IsAMDSPIRVForHIPDevice) {
+ CmdArgs.push_back("-emit-obj");
} else {
assert(JA.getType() == types::TY_PP_Asm && "Unexpected output type!");
}
@@ -5705,6 +5715,9 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,
case CodeGenOptions::FramePointerKind::Reserved:
FPKeepKindStr = "-mframe-pointer=reserved";
break;
+ case CodeGenOptions::FramePointerKind::NonLeafNoReserve:
+ FPKeepKindStr = "-mframe-pointer=non-leaf-no-reserve";
+ break;
case CodeGenOptions::FramePointerKind::NonLeaf:
FPKeepKindStr = "-mframe-pointer=non-leaf";
break;
@@ -7634,7 +7647,7 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,
CmdArgs.push_back("-fcuda-include-gpubinary");
CmdArgs.push_back(CudaDeviceInput->getFilename());
} else if (!HostOffloadingInputs.empty()) {
- if (IsCuda && !IsRDCMode) {
+ if ((IsCuda || IsHIP) && !IsRDCMode) {
assert(HostOffloadingInputs.size() == 1 && "Only one input expected");
CmdArgs.push_back("-fcuda-include-gpubinary");
CmdArgs.push_back(HostOffloadingInputs.front().getFilename());
@@ -7732,6 +7745,11 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,
addOpenMPHostOffloadingArgs(C, JA, Args, CmdArgs);
+ if (Args.hasFlag(options::OPT_fdevirtualize_speculatively,
+ options::OPT_fno_devirtualize_speculatively,
+ /*Default value*/ false))
+ CmdArgs.push_back("-fdevirtualize-speculatively");
+
bool VirtualFunctionElimination =
Args.hasFlag(options::OPT_fvirtual_function_elimination,
options::OPT_fno_virtual_function_elimination, false);
@@ -8272,22 +8290,29 @@ void Clang::AddClangCLArgs(const ArgList &Args, types::ID InputType,
llvm::Triple::ArchType AT = getToolChain().getArch();
StringRef Default = AT == llvm::Triple::x86 ? "IA32" : "SSE2";
StringRef Arch = Args.getLastArgValue(options::OPT__SLASH_arch, Default);
+ llvm::SmallSet<StringRef, 4> Arch512 = {"AVX512F", "AVX512", "AVX10.1",
+ "AVX10.2"};
if (A->getOption().matches(options::OPT__SLASH_vlen_EQ_512)) {
- if (Arch == "AVX512F" || Arch == "AVX512")
+ if (Arch512.contains(Arch))
CmdArgs.push_back("-mprefer-vector-width=512");
else
D.Diag(diag::warn_drv_argument_not_allowed_with)
<< "/vlen=512" << std::string("/arch:").append(Arch);
- }
-
- if (A->getOption().matches(options::OPT__SLASH_vlen_EQ_256)) {
- if (Arch == "AVX512F" || Arch == "AVX512")
+ } else if (A->getOption().matches(options::OPT__SLASH_vlen_EQ_256)) {
+ if (Arch512.contains(Arch))
CmdArgs.push_back("-mprefer-vector-width=256");
else if (Arch != "AVX" && Arch != "AVX2")
D.Diag(diag::warn_drv_argument_not_allowed_with)
<< "/vlen=256" << std::string("/arch:").append(Arch);
+ } else {
+ if (Arch == "AVX10.1" || Arch == "AVX10.2")
+ CmdArgs.push_back("-mprefer-vector-width=256");
}
+ } else {
+ StringRef Arch = Args.getLastArgValue(options::OPT__SLASH_arch);
+ if (Arch == "AVX10.1" || Arch == "AVX10.2")
+ CmdArgs.push_back("-mprefer-vector-width=256");
}
Arg *MostGeneralArg = Args.getLastArg(options::OPT__SLASH_vmg);
@@ -9075,7 +9100,9 @@ void LinkerWrapper::ConstructJob(Compilation &C, const JobAction &JA,
OPT_fno_lto,
OPT_flto,
OPT_flto_partitions_EQ,
- OPT_flto_EQ};
+ OPT_flto_EQ,
+ OPT_use_spirv_backend};
+
const llvm::DenseSet<unsigned> LinkerOptions{OPT_mllvm, OPT_Zlinker_input};
auto ShouldForwardForToolChain = [&](Arg *A, const ToolChain &TC) {
// Don't forward -mllvm to toolchains that don't support LLVM.
@@ -9084,7 +9111,7 @@ void LinkerWrapper::ConstructJob(Compilation &C, const JobAction &JA,
auto ShouldForward = [&](const llvm::DenseSet<unsigned> &Set, Arg *A,
const ToolChain &TC) {
// CMake hack to avoid printing verbose informatoin for HIP non-RDC mode.
- if (A->getOption().matches(OPT_v) && JA.getType() == types::TY_Object)
+ if (A->getOption().matches(OPT_v) && JA.getType() == types::TY_HIP_FATBIN)
return false;
return (Set.contains(A->getOption().getID()) ||
(A->getOption().getGroup().isValid() &&
@@ -9166,7 +9193,7 @@ void LinkerWrapper::ConstructJob(Compilation &C, const JobAction &JA,
// non-RDC mode compilation. This confuses default CMake implicit linker
// argument parsing when the language is set to HIP and the system linker is
// also `ld.lld`.
- if (Args.hasArg(options::OPT_v) && JA.getType() != types::TY_Object)
+ if (Args.hasArg(options::OPT_v) && JA.getType() != types::TY_HIP_FATBIN)
CmdArgs.push_back("--wrapper-verbose");
if (Arg *A = Args.getLastArg(options::OPT_cuda_path_EQ))
CmdArgs.push_back(
@@ -9238,14 +9265,14 @@ void LinkerWrapper::ConstructJob(Compilation &C, const JobAction &JA,
// We use action type to differentiate two use cases of the linker wrapper.
// TY_Image for normal linker wrapper work.
- // TY_Object for HIP fno-gpu-rdc embedding device binary in a relocatable
- // object.
- assert(JA.getType() == types::TY_Object || JA.getType() == types::TY_Image);
- if (JA.getType() == types::TY_Object) {
+ // TY_HIP_FATBIN for HIP fno-gpu-rdc emitting a fat binary without wrapping.
+ assert(JA.getType() == types::TY_HIP_FATBIN ||
+ JA.getType() == types::TY_Image);
+ if (JA.getType() == types::TY_HIP_FATBIN) {
+ CmdArgs.push_back("--emit-fatbin-only");
CmdArgs.append({"-o", Output.getFilename()});
for (auto Input : Inputs)
CmdArgs.push_back(Input.getFilename());
- CmdArgs.push_back("-r");
} else
for (const char *LinkArg : LinkCommand->getArguments())
CmdArgs.push_back(LinkArg);
diff --git a/clang/lib/Driver/ToolChains/CommonArgs.cpp b/clang/lib/Driver/ToolChains/CommonArgs.cpp
index ec8dcdc..882283a 100644
--- a/clang/lib/Driver/ToolChains/CommonArgs.cpp
+++ b/clang/lib/Driver/ToolChains/CommonArgs.cpp
@@ -31,11 +31,12 @@
#include "clang/Driver/Driver.h"
#include "clang/Driver/InputInfo.h"
#include "clang/Driver/Job.h"
-#include "clang/Driver/Options.h"
#include "clang/Driver/SanitizerArgs.h"
#include "clang/Driver/ToolChain.h"
#include "clang/Driver/Util.h"
#include "clang/Driver/XRayArgs.h"
+#include "clang/Frontend/CompilerInvocation.h"
+#include "clang/Options/Options.h"
#include "llvm/ADT/STLExtras.h"
#include "llvm/ADT/SmallSet.h"
#include "llvm/ADT/SmallString.h"
@@ -69,8 +70,7 @@ using namespace llvm::opt;
static bool useFramePointerForTargetByDefault(const llvm::opt::ArgList &Args,
const llvm::Triple &Triple) {
- if (Args.hasArg(clang::driver::options::OPT_pg) &&
- !Args.hasArg(clang::driver::options::OPT_mfentry))
+ if (Args.hasArg(options::OPT_pg) && !Args.hasArg(options::OPT_mfentry))
return true;
if (Triple.isAndroid())
@@ -222,26 +222,39 @@ static bool framePointerImpliesLeafFramePointer(const llvm::opt::ArgList &Args,
clang::CodeGenOptions::FramePointerKind
getFramePointerKind(const llvm::opt::ArgList &Args,
const llvm::Triple &Triple) {
- // There are three things to consider here:
+ // There are four things to consider here:
// * Should a frame record be created for non-leaf functions?
// * Should a frame record be created for leaf functions?
- // * Is the frame pointer register reserved, i.e. must it always point to
- // either a new, valid frame record or be un-modified?
+ // * Is the frame pointer register reserved in non-leaf functions?
+ // i.e. must it always point to either a new, valid frame record or be
+ // un-modified?
+ // * Is the frame pointer register reserved in leaf functions?
//
// Not all combinations of these are valid:
// * It's not useful to have leaf frame records without non-leaf ones.
// * It's not useful to have frame records without reserving the frame
// pointer.
//
- // | Non-leaf | Leaf | Reserved |
- // | N | N | N | FramePointerKind::None
- // | N | N | Y | FramePointerKind::Reserved
- // | N | Y | N | Invalid
- // | N | Y | Y | Invalid
- // | Y | N | N | Invalid
- // | Y | N | Y | FramePointerKind::NonLeaf
- // | Y | Y | N | Invalid
- // | Y | Y | Y | FramePointerKind::All
+ // | Frame Setup | Reg Reserved |
+ // |-----------------|-----------------|
+ // | Non-leaf | Leaf | Non-Leaf | Leaf |
+ // |----------|------|----------|------|
+ // | N | N | N | N | FramePointerKind::None
+ // | N | N | N | Y | Invalid
+ // | N | N | Y | N | Invalid
+ // | N | N | Y | Y | FramePointerKind::Reserved
+ // | N | Y | N | N | Invalid
+ // | N | Y | N | Y | Invalid
+ // | N | Y | Y | N | Invalid
+ // | N | Y | Y | Y | Invalid
+ // | Y | N | N | N | Invalid
+ // | Y | N | N | Y | Invalid
+ // | Y | N | Y | N | FramePointerKind::NonLeafNoReserve
+ // | Y | N | Y | Y | FramePointerKind::NonLeaf
+ // | Y | Y | N | N | Invalid
+ // | Y | Y | N | Y | Invalid
+ // | Y | Y | Y | N | Invalid
+ // | Y | Y | Y | Y | FramePointerKind::All
//
// The FramePointerKind::Reserved case is currently only reachable for Arm,
// which has the -mframe-chain= option which can (in combination with
@@ -249,24 +262,29 @@ getFramePointerKind(const llvm::opt::ArgList &Args,
// without requiring new frame records to be created.
bool DefaultFP = useFramePointerForTargetByDefault(Args, Triple);
- bool EnableFP =
- mustUseNonLeafFramePointerForTarget(Triple) ||
- Args.hasFlag(clang::driver::options::OPT_fno_omit_frame_pointer,
- clang::driver::options::OPT_fomit_frame_pointer, DefaultFP);
+ bool EnableFP = mustUseNonLeafFramePointerForTarget(Triple) ||
+ Args.hasFlag(options::OPT_fno_omit_frame_pointer,
+ options::OPT_fomit_frame_pointer, DefaultFP);
bool DefaultLeafFP =
useLeafFramePointerForTargetByDefault(Triple) ||
(EnableFP && framePointerImpliesLeafFramePointer(Args, Triple));
- bool EnableLeafFP = Args.hasFlag(
- clang::driver::options::OPT_mno_omit_leaf_frame_pointer,
- clang::driver::options::OPT_momit_leaf_frame_pointer, DefaultLeafFP);
+ bool EnableLeafFP =
+ Args.hasFlag(options::OPT_mno_omit_leaf_frame_pointer,
+ options::OPT_momit_leaf_frame_pointer, DefaultLeafFP);
- bool FPRegReserved = EnableFP || mustMaintainValidFrameChain(Args, Triple);
+ bool FPRegReserved = Args.hasFlag(options::OPT_mreserve_frame_pointer_reg,
+ options::OPT_mno_reserve_frame_pointer_reg,
+ mustMaintainValidFrameChain(Args, Triple));
if (EnableFP) {
if (EnableLeafFP)
return clang::CodeGenOptions::FramePointerKind::All;
- return clang::CodeGenOptions::FramePointerKind::NonLeaf;
+
+ if (FPRegReserved)
+ return clang::CodeGenOptions::FramePointerKind::NonLeaf;
+
+ return clang::CodeGenOptions::FramePointerKind::NonLeafNoReserve;
}
if (FPRegReserved)
return clang::CodeGenOptions::FramePointerKind::Reserved;
@@ -753,7 +771,7 @@ std::string tools::getCPUName(const Driver &D, const ArgList &Args,
case llvm::Triple::ppcle:
case llvm::Triple::ppc64:
case llvm::Triple::ppc64le:
- if (Arg *A = Args.getLastArg(clang::driver::options::OPT_mcpu_EQ))
+ if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
return std::string(
llvm::PPC::getNormalizedPPCTargetCPU(T, A->getValue()));
return std::string(llvm::PPC::getNormalizedPPCTargetCPU(T));
@@ -1078,27 +1096,14 @@ void tools::addLTOOptions(const ToolChain &ToolChain, const ArgList &Args,
CmdArgs.push_back(
Args.MakeArgString(Twine(PluginOptPrefix) + ExtraDash + "mcpu=" + CPU));
- if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
- // The optimization level matches
- // CompilerInvocation.cpp:getOptimizationLevel().
- StringRef OOpt;
- if (A->getOption().matches(options::OPT_O4) ||
- A->getOption().matches(options::OPT_Ofast))
- OOpt = "3";
- else if (A->getOption().matches(options::OPT_O)) {
- OOpt = A->getValue();
- if (OOpt == "g")
- OOpt = "1";
- else if (OOpt == "s" || OOpt == "z")
- OOpt = "2";
- } else if (A->getOption().matches(options::OPT_O0))
- OOpt = "0";
- if (!OOpt.empty()) {
+ if (Args.getLastArg(options::OPT_O_Group)) {
+ unsigned OptimizationLevel =
+ getOptimizationLevel(Args, InputKind(), D.getDiags());
+ CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) + ExtraDash +
+ "O" + Twine(OptimizationLevel)));
+ if (IsAMDGCN)
CmdArgs.push_back(
- Args.MakeArgString(Twine(PluginOptPrefix) + ExtraDash + "O" + OOpt));
- if (IsAMDGCN)
- CmdArgs.push_back(Args.MakeArgString(Twine("--lto-CGO") + OOpt));
- }
+ Args.MakeArgString(Twine("--lto-CGO") + Twine(OptimizationLevel)));
}
if (Args.hasArg(options::OPT_gsplit_dwarf)) {
@@ -1733,7 +1738,7 @@ bool tools::addSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
if (SanArgs.needsFuzzerInterceptors())
addSanitizerRuntime(TC, Args, CmdArgs, "fuzzer_interceptors", false,
true);
- if (!Args.hasArg(clang::driver::options::OPT_nostdlibxx)) {
+ if (!Args.hasArg(options::OPT_nostdlibxx)) {
bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
!Args.hasArg(options::OPT_static);
if (OnlyLibstdcxxStatic)
@@ -3381,169 +3386,6 @@ void tools::handleInterchangeLoopsArgs(const ArgList &Args,
CmdArgs.push_back("-floop-interchange");
}
-// Parse -mprefer-vector-width=. Return the Value string if well-formed.
-// Otherwise, return an empty string and issue a diagnosic message if needed.
-StringRef tools::parseMPreferVectorWidthOption(clang::DiagnosticsEngine &Diags,
- const llvm::opt::ArgList &Args) {
- Arg *A = Args.getLastArg(clang::driver::options::OPT_mprefer_vector_width_EQ);
- if (!A)
- return "";
-
- StringRef Value = A->getValue();
- unsigned Width LLVM_ATTRIBUTE_UNINITIALIZED;
-
- // Only "none" and Integer values are accepted by
- // -mprefer-vector-width=<value>.
- if (Value != "none" && Value.getAsInteger(10, Width)) {
- Diags.Report(clang::diag::err_drv_invalid_value)
- << A->getOption().getName() << Value;
- return "";
- }
-
- return Value;
-}
-
-// This is a helper function for validating the optional refinement step
-// parameter in reciprocal argument strings. Return false if there is an error
-// parsing the refinement step. Otherwise, return true and set the Position
-// of the refinement step in the input string.
-static bool getRefinementStep(StringRef In, clang::DiagnosticsEngine &Diags,
- const Arg &A, size_t &Position) {
- const char RefinementStepToken = ':';
- Position = In.find(RefinementStepToken);
- if (Position != StringRef::npos) {
- StringRef Option = A.getOption().getName();
- StringRef RefStep = In.substr(Position + 1);
- // Allow exactly one numeric character for the additional refinement
- // step parameter. This is reasonable for all currently-supported
- // operations and architectures because we would expect that a larger value
- // of refinement steps would cause the estimate "optimization" to
- // under-perform the native operation. Also, if the estimate does not
- // converge quickly, it probably will not ever converge, so further
- // refinement steps will not produce a better answer.
- if (RefStep.size() != 1) {
- Diags.Report(diag::err_drv_invalid_value) << Option << RefStep;
- return false;
- }
- char RefStepChar = RefStep[0];
- if (RefStepChar < '0' || RefStepChar > '9') {
- Diags.Report(diag::err_drv_invalid_value) << Option << RefStep;
- return false;
- }
- }
- return true;
-}
-
-// Parse -mrecip. Return the Value string if well-formed.
-// Otherwise, return an empty string and issue a diagnosic message if needed.
-StringRef tools::parseMRecipOption(clang::DiagnosticsEngine &Diags,
- const ArgList &Args) {
- StringRef DisabledPrefixIn = "!";
- StringRef DisabledPrefixOut = "!";
- StringRef EnabledPrefixOut = "";
- StringRef Out = "";
-
- Arg *A = Args.getLastArg(options::OPT_mrecip, options::OPT_mrecip_EQ);
- if (!A)
- return "";
-
- unsigned NumOptions = A->getNumValues();
- if (NumOptions == 0) {
- // No option is the same as "all".
- return "all";
- }
-
- // Pass through "all", "none", or "default" with an optional refinement step.
- if (NumOptions == 1) {
- StringRef Val = A->getValue(0);
- size_t RefStepLoc;
- if (!getRefinementStep(Val, Diags, *A, RefStepLoc))
- return "";
- StringRef ValBase = Val.slice(0, RefStepLoc);
- if (ValBase == "all" || ValBase == "none" || ValBase == "default") {
- return Val;
- }
- }
-
- // Each reciprocal type may be enabled or disabled individually.
- // Check each input value for validity, concatenate them all back together,
- // and pass through.
-
- llvm::StringMap<bool> OptionStrings;
- OptionStrings.insert(std::make_pair("divd", false));
- OptionStrings.insert(std::make_pair("divf", false));
- OptionStrings.insert(std::make_pair("divh", false));
- OptionStrings.insert(std::make_pair("vec-divd", false));
- OptionStrings.insert(std::make_pair("vec-divf", false));
- OptionStrings.insert(std::make_pair("vec-divh", false));
- OptionStrings.insert(std::make_pair("sqrtd", false));
- OptionStrings.insert(std::make_pair("sqrtf", false));
- OptionStrings.insert(std::make_pair("sqrth", false));
- OptionStrings.insert(std::make_pair("vec-sqrtd", false));
- OptionStrings.insert(std::make_pair("vec-sqrtf", false));
- OptionStrings.insert(std::make_pair("vec-sqrth", false));
-
- for (unsigned i = 0; i != NumOptions; ++i) {
- StringRef Val = A->getValue(i);
-
- bool IsDisabled = Val.starts_with(DisabledPrefixIn);
- // Ignore the disablement token for string matching.
- if (IsDisabled)
- Val = Val.substr(1);
-
- size_t RefStep;
- if (!getRefinementStep(Val, Diags, *A, RefStep))
- return "";
-
- StringRef ValBase = Val.slice(0, RefStep);
- llvm::StringMap<bool>::iterator OptionIter = OptionStrings.find(ValBase);
- if (OptionIter == OptionStrings.end()) {
- // Try again specifying float suffix.
- OptionIter = OptionStrings.find(ValBase.str() + 'f');
- if (OptionIter == OptionStrings.end()) {
- // The input name did not match any known option string.
- Diags.Report(diag::err_drv_unknown_argument) << Val;
- return "";
- }
- // The option was specified without a half or float or double suffix.
- // Make sure that the double or half entry was not already specified.
- // The float entry will be checked below.
- if (OptionStrings[ValBase.str() + 'd'] ||
- OptionStrings[ValBase.str() + 'h']) {
- Diags.Report(diag::err_drv_invalid_value)
- << A->getOption().getName() << Val;
- return "";
- }
- }
-
- if (OptionIter->second == true) {
- // Duplicate option specified.
- Diags.Report(diag::err_drv_invalid_value)
- << A->getOption().getName() << Val;
- return "";
- }
-
- // Mark the matched option as found. Do not allow duplicate specifiers.
- OptionIter->second = true;
-
- // If the precision was not specified, also mark the double and half entry
- // as found.
- if (ValBase.back() != 'f' && ValBase.back() != 'd' &&
- ValBase.back() != 'h') {
- OptionStrings[ValBase.str() + 'd'] = true;
- OptionStrings[ValBase.str() + 'h'] = true;
- }
-
- // Build the output string.
- StringRef Prefix = IsDisabled ? DisabledPrefixOut : EnabledPrefixOut;
- Out = Args.MakeArgString(Out + Prefix + Val);
- if (i != NumOptions - 1)
- Out = Args.MakeArgString(Out + ",");
- }
-
- return Out;
-}
-
std::string tools::complexRangeKindToStr(LangOptions::ComplexRangeKind Range) {
switch (Range) {
case LangOptions::ComplexRangeKind::CX_Full:
diff --git a/clang/lib/Driver/ToolChains/CrossWindows.cpp b/clang/lib/Driver/ToolChains/CrossWindows.cpp
index 51c892f..6df5315 100644
--- a/clang/lib/Driver/ToolChains/CrossWindows.cpp
+++ b/clang/lib/Driver/ToolChains/CrossWindows.cpp
@@ -10,8 +10,8 @@
#include "clang/Driver/CommonArgs.h"
#include "clang/Driver/Compilation.h"
#include "clang/Driver/Driver.h"
-#include "clang/Driver/Options.h"
#include "clang/Driver/SanitizerArgs.h"
+#include "clang/Options/Options.h"
#include "llvm/Option/ArgList.h"
#include "llvm/Support/Path.h"
diff --git a/clang/lib/Driver/ToolChains/Cuda.cpp b/clang/lib/Driver/ToolChains/Cuda.cpp
index 07201cc..6cc73ff 100644
--- a/clang/lib/Driver/ToolChains/Cuda.cpp
+++ b/clang/lib/Driver/ToolChains/Cuda.cpp
@@ -14,7 +14,7 @@
#include "clang/Driver/Distro.h"
#include "clang/Driver/Driver.h"
#include "clang/Driver/InputInfo.h"
-#include "clang/Driver/Options.h"
+#include "clang/Options/Options.h"
#include "llvm/ADT/StringExtras.h"
#include "llvm/Config/llvm-config.h" // for LLVM_HOST_TRIPLE
#include "llvm/Option/ArgList.h"
@@ -153,16 +153,16 @@ CudaInstallationDetector::CudaInstallationDetector(
std::initializer_list<const char *> Versions = {"8.0", "7.5", "7.0"};
auto &FS = D.getVFS();
- if (Args.hasArg(clang::driver::options::OPT_cuda_path_EQ)) {
+ if (Args.hasArg(options::OPT_cuda_path_EQ)) {
Candidates.emplace_back(
- Args.getLastArgValue(clang::driver::options::OPT_cuda_path_EQ).str());
+ Args.getLastArgValue(options::OPT_cuda_path_EQ).str());
} else if (HostTriple.isOSWindows()) {
for (const char *Ver : Versions)
Candidates.emplace_back(
D.SysRoot + "/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v" +
Ver);
} else {
- if (!Args.hasArg(clang::driver::options::OPT_cuda_path_ignore_env)) {
+ if (!Args.hasArg(options::OPT_cuda_path_ignore_env)) {
// Try to find ptxas binary. If the executable is located in a directory
// called 'bin/', its parent directory might be a good guess for a valid
// CUDA installation.
diff --git a/clang/lib/Driver/ToolChains/Cygwin.cpp b/clang/lib/Driver/ToolChains/Cygwin.cpp
index d9c1634..5543812 100644
--- a/clang/lib/Driver/ToolChains/Cygwin.cpp
+++ b/clang/lib/Driver/ToolChains/Cygwin.cpp
@@ -10,7 +10,7 @@
#include "clang/Config/config.h"
#include "clang/Driver/CommonArgs.h"
#include "clang/Driver/Driver.h"
-#include "clang/Driver/Options.h"
+#include "clang/Options/Options.h"
#include "llvm/Support/Path.h"
#include "llvm/Support/VirtualFileSystem.h"
@@ -58,7 +58,7 @@ void Cygwin::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
const Driver &D = getDriver();
std::string SysRoot = computeSysRoot();
- if (DriverArgs.hasArg(clang::driver::options::OPT_nostdinc))
+ if (DriverArgs.hasArg(options::OPT_nostdinc))
return;
if (!DriverArgs.hasArg(options::OPT_nostdlibinc))
diff --git a/clang/lib/Driver/ToolChains/Darwin.cpp b/clang/lib/Driver/ToolChains/Darwin.cpp
index 2fb7652..fc3cd90 100644
--- a/clang/lib/Driver/ToolChains/Darwin.cpp
+++ b/clang/lib/Driver/ToolChains/Darwin.cpp
@@ -14,8 +14,8 @@
#include "clang/Driver/CommonArgs.h"
#include "clang/Driver/Compilation.h"
#include "clang/Driver/Driver.h"
-#include "clang/Driver/Options.h"
#include "clang/Driver/SanitizerArgs.h"
+#include "clang/Options/Options.h"
#include "llvm/ADT/StringSwitch.h"
#include "llvm/Option/ArgList.h"
#include "llvm/ProfileData/InstrProf.h"
@@ -1079,7 +1079,7 @@ StringRef MachO::getMachOArchName(const ArgList &Args) const {
case llvm::Triple::thumb:
case llvm::Triple::arm:
- if (const Arg *A = Args.getLastArg(clang::driver::options::OPT_march_EQ))
+ if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
if (const char *Arch = ArmMachOArchName(A->getValue()))
return Arch;
@@ -2993,7 +2993,7 @@ DerivedArgList *MachO::TranslateArgs(const DerivedArgList &Args,
if (!BoundArch.empty()) {
StringRef Name = BoundArch;
const Option MCpu = Opts.getOption(options::OPT_mcpu_EQ);
- const Option MArch = Opts.getOption(clang::driver::options::OPT_march_EQ);
+ const Option MArch = Opts.getOption(options::OPT_march_EQ);
// This code must be kept in sync with LLVM's getArchTypeForDarwinArch,
// which defines the list of which architectures we accept.
diff --git a/clang/lib/Driver/ToolChains/DragonFly.cpp b/clang/lib/Driver/ToolChains/DragonFly.cpp
index 524f5f2..d4a6d6a 100644
--- a/clang/lib/Driver/ToolChains/DragonFly.cpp
+++ b/clang/lib/Driver/ToolChains/DragonFly.cpp
@@ -10,7 +10,7 @@
#include "clang/Driver/CommonArgs.h"
#include "clang/Driver/Compilation.h"
#include "clang/Driver/Driver.h"
-#include "clang/Driver/Options.h"
+#include "clang/Options/Options.h"
#include "llvm/Option/ArgList.h"
#include "llvm/Support/Path.h"
@@ -219,7 +219,7 @@ void DragonFly::AddClangSystemIncludeArgs(
llvm::opt::ArgStringList &CC1Args) const {
const Driver &D = getDriver();
- if (DriverArgs.hasArg(clang::driver::options::OPT_nostdinc))
+ if (DriverArgs.hasArg(options::OPT_nostdinc))
return;
if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
diff --git a/clang/lib/Driver/ToolChains/Flang.cpp b/clang/lib/Driver/ToolChains/Flang.cpp
index 88bce18..2f5e93d 100644
--- a/clang/lib/Driver/ToolChains/Flang.cpp
+++ b/clang/lib/Driver/ToolChains/Flang.cpp
@@ -11,7 +11,8 @@
#include "clang/Basic/CodeGenOptions.h"
#include "clang/Driver/CommonArgs.h"
-#include "clang/Driver/Options.h"
+#include "clang/Options/OptionUtils.h"
+#include "clang/Options/Options.h"
#include "llvm/Frontend/Debug/Options.h"
#include "llvm/Support/Path.h"
#include "llvm/TargetParser/Host.h"
@@ -230,7 +231,7 @@ void Flang::addCodegenOptions(const ArgList &Args,
options::OPT_fstack_repack_arrays, options::OPT_fno_stack_repack_arrays,
options::OPT_ftime_report, options::OPT_ftime_report_EQ,
options::OPT_funroll_loops, options::OPT_fno_unroll_loops});
- if (Args.hasArg(clang::driver::options::OPT_fcoarray))
+ if (Args.hasArg(options::OPT_fcoarray))
CmdArgs.push_back("-fcoarray");
}
@@ -822,8 +823,14 @@ static void addFloatingPointOptions(const Driver &D, const ArgList &Args,
complexRangeKindToStr(Range)));
}
- if (Args.hasArg(options::OPT_fno_fast_real_mod))
- CmdArgs.push_back("-fno-fast-real-mod");
+ if (llvm::opt::Arg *A =
+ Args.getLastArg(clang::options::OPT_ffast_real_mod,
+ clang::options::OPT_fno_fast_real_mod)) {
+ if (A->getOption().matches(clang::options::OPT_ffast_real_mod))
+ CmdArgs.push_back("-ffast-real-mod");
+ else if (A->getOption().matches(clang::options::OPT_fno_fast_real_mod))
+ CmdArgs.push_back("-fno-fast-real-mod");
+ }
if (!HonorINFs && !HonorNaNs && AssociativeMath && ReciprocalMath &&
ApproxFunc && !SignedZeros &&
@@ -952,6 +959,14 @@ void Flang::ConstructJob(Compilation &C, const JobAction &JA,
if (const Arg *A = Args.getLastArg(Opt))
D.Diag(diag::warn_drv_invalid_argument_for_flang) << A->getSpelling();
+ // Warn about options that are ignored by flang. These are options that are
+ // accepted by gfortran, but have no equivalent in flang.
+ for (const Arg *A :
+ Args.filtered(options::OPT_clang_ignored_gcc_optimization_f_Group)) {
+ D.Diag(diag::warn_ignored_gcc_optimization) << A->getAsString(Args);
+ A->claim();
+ }
+
const InputInfo &Input = Inputs[0];
types::ID InputType = Input.getType();
@@ -1071,6 +1086,9 @@ void Flang::ConstructJob(Compilation &C, const JobAction &JA,
case CodeGenOptions::FramePointerKind::Reserved:
FPKeepKindStr = "-mframe-pointer=reserved";
break;
+ case CodeGenOptions::FramePointerKind::NonLeafNoReserve:
+ FPKeepKindStr = "-mframe-pointer=non-leaf-no-reserve";
+ break;
case CodeGenOptions::FramePointerKind::NonLeaf:
FPKeepKindStr = "-mframe-pointer=non-leaf";
break;
diff --git a/clang/lib/Driver/ToolChains/FreeBSD.cpp b/clang/lib/Driver/ToolChains/FreeBSD.cpp
index b17b7623..70e66a2 100644
--- a/clang/lib/Driver/ToolChains/FreeBSD.cpp
+++ b/clang/lib/Driver/ToolChains/FreeBSD.cpp
@@ -13,8 +13,8 @@
#include "clang/Config/config.h"
#include "clang/Driver/CommonArgs.h"
#include "clang/Driver/Compilation.h"
-#include "clang/Driver/Options.h"
#include "clang/Driver/SanitizerArgs.h"
+#include "clang/Options/Options.h"
#include "llvm/Option/ArgList.h"
#include "llvm/Support/VirtualFileSystem.h"
@@ -404,7 +404,7 @@ void FreeBSD::AddClangSystemIncludeArgs(
llvm::opt::ArgStringList &CC1Args) const {
const Driver &D = getDriver();
- if (DriverArgs.hasArg(clang::driver::options::OPT_nostdinc))
+ if (DriverArgs.hasArg(options::OPT_nostdinc))
return;
if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
diff --git a/clang/lib/Driver/ToolChains/Fuchsia.cpp b/clang/lib/Driver/ToolChains/Fuchsia.cpp
index 507cc03..9edfc4d 100644
--- a/clang/lib/Driver/ToolChains/Fuchsia.cpp
+++ b/clang/lib/Driver/ToolChains/Fuchsia.cpp
@@ -12,8 +12,8 @@
#include "clang/Driver/Compilation.h"
#include "clang/Driver/Driver.h"
#include "clang/Driver/MultilibBuilder.h"
-#include "clang/Driver/Options.h"
#include "clang/Driver/SanitizerArgs.h"
+#include "clang/Options/Options.h"
#include "llvm/Option/ArgList.h"
#include "llvm/Support/FileSystem.h"
#include "llvm/Support/Path.h"
@@ -344,7 +344,7 @@ Tool *Fuchsia::buildStaticLibTool() const {
ToolChain::RuntimeLibType
Fuchsia::GetRuntimeLibType(const ArgList &Args) const {
- if (Arg *A = Args.getLastArg(clang::driver::options::OPT_rtlib_EQ)) {
+ if (Arg *A = Args.getLastArg(options::OPT_rtlib_EQ)) {
StringRef Value = A->getValue();
if (Value != "compiler-rt")
getDriver().Diag(clang::diag::err_drv_invalid_rtlib_name)
diff --git a/clang/lib/Driver/ToolChains/Gnu.cpp b/clang/lib/Driver/ToolChains/Gnu.cpp
index 7616076..1bfcd1f 100644
--- a/clang/lib/Driver/ToolChains/Gnu.cpp
+++ b/clang/lib/Driver/ToolChains/Gnu.cpp
@@ -20,9 +20,9 @@
#include "clang/Driver/Compilation.h"
#include "clang/Driver/Driver.h"
#include "clang/Driver/MultilibBuilder.h"
-#include "clang/Driver/Options.h"
#include "clang/Driver/Tool.h"
#include "clang/Driver/ToolChain.h"
+#include "clang/Options/Options.h"
#include "llvm/ADT/StringSet.h"
#include "llvm/ADT/Twine.h"
#include "llvm/Option/ArgList.h"
@@ -1750,11 +1750,11 @@ static void findRISCVBareMetalMultilibs(const Driver &D,
std::string MArch = tools::riscv::getRISCVArch(Args, TargetTriple);
for (auto Element : RISCVMultilibSet) {
addMultilibFlag(MArch == Element.march,
- Twine("-march=", Element.march).str().c_str(), Flags);
+ Twine("-march=", Element.march).str(), Flags);
if (!Added_ABIs.count(Element.mabi)) {
Added_ABIs.insert(Element.mabi);
addMultilibFlag(ABIName == Element.mabi,
- Twine("-mabi=", Element.mabi).str().c_str(), Flags);
+ Twine("-mabi=", Element.mabi).str(), Flags);
}
}
@@ -2058,7 +2058,7 @@ Generic_GCC::GCCVersion Generic_GCC::GCCVersion::Parse(StringRef VersionText) {
static llvm::StringRef getGCCToolchainDir(const ArgList &Args,
llvm::StringRef SysRoot) {
- const Arg *A = Args.getLastArg(clang::driver::options::OPT_gcc_toolchain);
+ const Arg *A = Args.getLastArg(options::OPT_gcc_toolchain);
if (A)
return A->getValue();
@@ -2111,8 +2111,7 @@ void Generic_GCC::GCCInstallationDetector::init(
CandidateBiarchTripleAliases);
// If --gcc-install-dir= is specified, skip filesystem detection.
- if (const Arg *A =
- Args.getLastArg(clang::driver::options::OPT_gcc_install_dir_EQ);
+ if (const Arg *A = Args.getLastArg(options::OPT_gcc_install_dir_EQ);
A && A->getValue()[0]) {
StringRef InstallDir = A->getValue();
if (!ScanGCCForMultilibs(TargetTriple, Args, InstallDir, false)) {
@@ -2135,8 +2134,7 @@ void Generic_GCC::GCCInstallationDetector::init(
// If --gcc-triple is specified use this instead of trying to
// auto-detect a triple.
- if (const Arg *A =
- Args.getLastArg(clang::driver::options::OPT_gcc_triple_EQ)) {
+ if (const Arg *A = Args.getLastArg(options::OPT_gcc_triple_EQ)) {
StringRef GCCTriple = A->getValue();
CandidateTripleAliases.clear();
CandidateTripleAliases.push_back(GCCTriple);
diff --git a/clang/lib/Driver/ToolChains/HIPAMD.cpp b/clang/lib/Driver/ToolChains/HIPAMD.cpp
index c0c8afe..f2f6492 100644
--- a/clang/lib/Driver/ToolChains/HIPAMD.cpp
+++ b/clang/lib/Driver/ToolChains/HIPAMD.cpp
@@ -15,8 +15,8 @@
#include "clang/Driver/Compilation.h"
#include "clang/Driver/Driver.h"
#include "clang/Driver/InputInfo.h"
-#include "clang/Driver/Options.h"
#include "clang/Driver/SanitizerArgs.h"
+#include "clang/Options/Options.h"
#include "llvm/Support/FileSystem.h"
#include "llvm/Support/Path.h"
#include "llvm/TargetParser/TargetParser.h"
@@ -159,10 +159,9 @@ void AMDGCN::Linker::constructLldCommand(Compilation &C, const JobAction &JA,
// For SPIR-V the inputs for the job are device AMDGCN SPIR-V flavoured bitcode
// and the output is either a compiled SPIR-V binary or bitcode (-emit-llvm). It
-// calls llvm-link and then the llvm-spirv translator. Once the SPIR-V BE will
-// be promoted from experimental, we will switch to using that. TODO: consider
-// if we want to run any targeted optimisations over IR here, over generic
-// SPIR-V.
+// calls llvm-link and then the llvm-spirv translator or the SPIR-V BE.
+// TODO: consider if we want to run any targeted optimisations over IR here,
+// over generic SPIR-V.
void AMDGCN::Linker::constructLinkAndEmitSpirvCommand(
Compilation &C, const JobAction &JA, const InputInfoList &Inputs,
const InputInfo &Output, const llvm::opt::ArgList &Args) const {
@@ -173,17 +172,41 @@ void AMDGCN::Linker::constructLinkAndEmitSpirvCommand(
const char *LinkedBCFilePath = HIP::getTempFile(C, LinkedBCFilePrefix, "bc");
InputInfo LinkedBCFile(&JA, LinkedBCFilePath, Output.getBaseInput());
+ bool UseSPIRVBackend =
+ Args.hasFlag(options::OPT_use_spirv_backend,
+ options::OPT_no_use_spirv_backend, /*Default=*/false);
+
constructLlvmLinkCommand(C, JA, Inputs, LinkedBCFile, Args);
- // Emit SPIR-V binary.
- llvm::opt::ArgStringList TrArgs{
- "--spirv-max-version=1.6",
- "--spirv-ext=+all",
- "--spirv-allow-unknown-intrinsics",
- "--spirv-lower-const-expr",
- "--spirv-preserve-auxdata",
- "--spirv-debug-info-version=nonsemantic-shader-200"};
- SPIRV::constructTranslateCommand(C, *this, JA, Output, LinkedBCFile, TrArgs);
+ if (UseSPIRVBackend) {
+ // This code handles the case in the new driver when --offload-device-only
+ // is unset and clang-linker-wrapper forwards the bitcode that must be
+ // compiled to SPIR-V.
+
+ llvm::opt::ArgStringList CmdArgs;
+ const char *Triple =
+ C.getArgs().MakeArgString("-triple=spirv64-amd-amdhsa");
+
+ CmdArgs.append({"-cc1", Triple, "-emit-obj", "-disable-llvm-optzns",
+ LinkedBCFile.getFilename(), "-o", Output.getFilename()});
+
+ const Driver &Driver = getToolChain().getDriver();
+ const char *Exec = Driver.getClangProgramPath();
+ C.addCommand(std::make_unique<Command>(
+ JA, *this, ResponseFileSupport::None(), Exec, CmdArgs, LinkedBCFile,
+ Output, Driver.getPrependArg()));
+ } else {
+ // Emit SPIR-V binary using the translator
+ llvm::opt::ArgStringList TrArgs{
+ "--spirv-max-version=1.6",
+ "--spirv-ext=+all",
+ "--spirv-allow-unknown-intrinsics",
+ "--spirv-lower-const-expr",
+ "--spirv-preserve-auxdata",
+ "--spirv-debug-info-version=nonsemantic-shader-200"};
+ SPIRV::constructTranslateCommand(C, *this, JA, Output, LinkedBCFile,
+ TrArgs);
+ }
}
// For amdgcn the inputs of the linker job are device bitcode and output is
@@ -219,8 +242,6 @@ HIPAMDToolChain::HIPAMDToolChain(const Driver &D, const llvm::Triple &Triple,
// Lookup binaries into the driver directory, this is used to
// discover the clang-offload-bundler executable.
getProgramPaths().push_back(getDriver().Dir);
- // Diagnose unsupported sanitizer options only once.
- diagnoseUnsupportedSanitizers(Args);
}
void HIPAMDToolChain::addClangTargetOptions(
@@ -292,7 +313,8 @@ HIPAMDToolChain::TranslateArgs(const llvm::opt::DerivedArgList &Args,
const OptTable &Opts = getDriver().getOpts();
for (Arg *A : Args) {
- if (!shouldSkipSanitizeOption(*this, Args, BoundArch, A))
+ // Filter unsupported sanitizers passed from the HostTC.
+ if (!handleSanitizeOption(*this, *DAL, Args, BoundArch, A))
DAL->append(A);
}
@@ -348,9 +370,8 @@ void HIPAMDToolChain::AddHIPIncludeArgs(const ArgList &DriverArgs,
SanitizerMask HIPAMDToolChain::getSupportedSanitizers() const {
// The HIPAMDToolChain only supports sanitizers in the sense that it allows
// sanitizer arguments on the command line if they are supported by the host
- // toolchain. The HIPAMDToolChain will actually ignore any command line
- // arguments for any of these "supported" sanitizers. That means that no
- // sanitization of device code is actually supported at this time.
+ // toolchain. The HIPAMDToolChain will later filter unsupported sanitizers
+ // from the command line arguments.
//
// This behavior is necessary because the host and device toolchains
// invocations often share the command line, so the device toolchain must
diff --git a/clang/lib/Driver/ToolChains/HIPSPV.cpp b/clang/lib/Driver/ToolChains/HIPSPV.cpp
index bce7f46..be0f49d 100644
--- a/clang/lib/Driver/ToolChains/HIPSPV.cpp
+++ b/clang/lib/Driver/ToolChains/HIPSPV.cpp
@@ -12,7 +12,7 @@
#include "clang/Driver/Compilation.h"
#include "clang/Driver/Driver.h"
#include "clang/Driver/InputInfo.h"
-#include "clang/Driver/Options.h"
+#include "clang/Options/Options.h"
#include "llvm/Support/FileSystem.h"
#include "llvm/Support/Path.h"
@@ -211,7 +211,7 @@ HIPSPVToolChain::getDeviceLibs(
// Find device libraries in --hip-device-lib-path and HIP_DEVICE_LIB_PATH.
auto HipDeviceLibPathArgs = DriverArgs.getAllArgValues(
// --hip-device-lib-path is alias to this option.
- clang::driver::options::OPT_rocm_device_lib_path_EQ);
+ options::OPT_rocm_device_lib_path_EQ);
for (auto Path : HipDeviceLibPathArgs)
LibraryPaths.push_back(DriverArgs.MakeArgString(Path));
diff --git a/clang/lib/Driver/ToolChains/HIPUtility.cpp b/clang/lib/Driver/ToolChains/HIPUtility.cpp
index 732403e..1af2ae6 100644
--- a/clang/lib/Driver/ToolChains/HIPUtility.cpp
+++ b/clang/lib/Driver/ToolChains/HIPUtility.cpp
@@ -9,7 +9,7 @@
#include "HIPUtility.h"
#include "clang/Driver/CommonArgs.h"
#include "clang/Driver/Compilation.h"
-#include "clang/Driver/Options.h"
+#include "clang/Options/Options.h"
#include "llvm/ADT/StringExtras.h"
#include "llvm/ADT/StringRef.h"
#include "llvm/Object/Archive.h"
diff --git a/clang/lib/Driver/ToolChains/Hexagon.cpp b/clang/lib/Driver/ToolChains/Hexagon.cpp
index 9f8b676..084f517 100644
--- a/clang/lib/Driver/ToolChains/Hexagon.cpp
+++ b/clang/lib/Driver/ToolChains/Hexagon.cpp
@@ -11,7 +11,7 @@
#include "clang/Driver/Compilation.h"
#include "clang/Driver/Driver.h"
#include "clang/Driver/InputInfo.h"
-#include "clang/Driver/Options.h"
+#include "clang/Options/Options.h"
#include "llvm/Option/ArgList.h"
#include "llvm/Support/FileSystem.h"
#include "llvm/Support/Path.h"
diff --git a/clang/lib/Driver/ToolChains/Hurd.cpp b/clang/lib/Driver/ToolChains/Hurd.cpp
index 4312123..53ee4d4 100644
--- a/clang/lib/Driver/ToolChains/Hurd.cpp
+++ b/clang/lib/Driver/ToolChains/Hurd.cpp
@@ -10,7 +10,7 @@
#include "clang/Config/config.h"
#include "clang/Driver/CommonArgs.h"
#include "clang/Driver/Driver.h"
-#include "clang/Driver/Options.h"
+#include "clang/Options/Options.h"
#include "llvm/Support/Path.h"
#include "llvm/Support/VirtualFileSystem.h"
@@ -168,7 +168,7 @@ void Hurd::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
const Driver &D = getDriver();
std::string SysRoot = computeSysRoot();
- if (DriverArgs.hasArg(clang::driver::options::OPT_nostdinc))
+ if (DriverArgs.hasArg(options::OPT_nostdinc))
return;
if (!DriverArgs.hasArg(options::OPT_nostdlibinc))
diff --git a/clang/lib/Driver/ToolChains/Linux.cpp b/clang/lib/Driver/ToolChains/Linux.cpp
index 94a9fe8..cdbf21f 100644
--- a/clang/lib/Driver/ToolChains/Linux.cpp
+++ b/clang/lib/Driver/ToolChains/Linux.cpp
@@ -16,8 +16,8 @@
#include "clang/Driver/CommonArgs.h"
#include "clang/Driver/Distro.h"
#include "clang/Driver/Driver.h"
-#include "clang/Driver/Options.h"
#include "clang/Driver/SanitizerArgs.h"
+#include "clang/Options/Options.h"
#include "llvm/Option/ArgList.h"
#include "llvm/ProfileData/InstrProf.h"
#include "llvm/Support/Path.h"
@@ -731,7 +731,7 @@ void Linux::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
const Driver &D = getDriver();
std::string SysRoot = computeSysRoot();
- if (DriverArgs.hasArg(clang::driver::options::OPT_nostdinc))
+ if (DriverArgs.hasArg(options::OPT_nostdinc))
return;
// Add 'include' in the resource directory, which is similar to
@@ -922,12 +922,12 @@ SanitizerMask Linux::getSupportedSanitizers() const {
if (IsX86_64 || IsMIPS64 || IsAArch64 || IsPowerPC64 || IsSystemZ ||
IsLoongArch64 || IsRISCV64)
Res |= SanitizerKind::Thread;
- if (IsX86_64 || IsAArch64)
+ if (IsX86_64 || IsAArch64 || IsSystemZ)
Res |= SanitizerKind::Type;
if (IsX86_64 || IsSystemZ || IsPowerPC64)
Res |= SanitizerKind::KernelMemory;
if (IsX86_64 || IsMIPS64 || IsAArch64 || IsX86 || IsMIPS || IsArmArch ||
- IsPowerPC64 || IsHexagon || IsLoongArch64 || IsRISCV64)
+ IsPowerPC64 || IsHexagon || IsLoongArch64 || IsRISCV64 || IsSystemZ)
Res |= SanitizerKind::Scudo;
if (IsX86_64 || IsAArch64 || IsRISCV64) {
Res |= SanitizerKind::HWAddress;
diff --git a/clang/lib/Driver/ToolChains/MSP430.cpp b/clang/lib/Driver/ToolChains/MSP430.cpp
index 9eca1ad..3cc56bb 100644
--- a/clang/lib/Driver/ToolChains/MSP430.cpp
+++ b/clang/lib/Driver/ToolChains/MSP430.cpp
@@ -12,7 +12,7 @@
#include "clang/Driver/Compilation.h"
#include "clang/Driver/InputInfo.h"
#include "clang/Driver/Multilib.h"
-#include "clang/Driver/Options.h"
+#include "clang/Options/Options.h"
#include "llvm/Option/ArgList.h"
#include "llvm/Support/Path.h"
diff --git a/clang/lib/Driver/ToolChains/MSVC.cpp b/clang/lib/Driver/ToolChains/MSVC.cpp
index bb469ff..fcae5b7 100644
--- a/clang/lib/Driver/ToolChains/MSVC.cpp
+++ b/clang/lib/Driver/ToolChains/MSVC.cpp
@@ -12,8 +12,8 @@
#include "clang/Driver/CommonArgs.h"
#include "clang/Driver/Compilation.h"
#include "clang/Driver/Driver.h"
-#include "clang/Driver/Options.h"
#include "clang/Driver/SanitizerArgs.h"
+#include "clang/Options/Options.h"
#include "llvm/Option/Arg.h"
#include "llvm/Option/ArgList.h"
#include "llvm/Support/ConvertUTF.h"
diff --git a/clang/lib/Driver/ToolChains/Managarm.cpp b/clang/lib/Driver/ToolChains/Managarm.cpp
index da4a9072..1bbabdfc 100644
--- a/clang/lib/Driver/ToolChains/Managarm.cpp
+++ b/clang/lib/Driver/ToolChains/Managarm.cpp
@@ -11,8 +11,8 @@
#include "clang/Config/config.h"
#include "clang/Driver/CommonArgs.h"
#include "clang/Driver/Driver.h"
-#include "clang/Driver/Options.h"
#include "clang/Driver/SanitizerArgs.h"
+#include "clang/Options/Options.h"
#include "llvm/Option/ArgList.h"
#include "llvm/Support/Path.h"
@@ -136,7 +136,7 @@ void Managarm::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
const Driver &D = getDriver();
std::string SysRoot = computeSysRoot();
- if (DriverArgs.hasArg(clang::driver::options::OPT_nostdinc))
+ if (DriverArgs.hasArg(options::OPT_nostdinc))
return;
if (!DriverArgs.hasArg(options::OPT_nostdlibinc))
diff --git a/clang/lib/Driver/ToolChains/MinGW.cpp b/clang/lib/Driver/ToolChains/MinGW.cpp
index 1bb9bcf..2c9a174 100644
--- a/clang/lib/Driver/ToolChains/MinGW.cpp
+++ b/clang/lib/Driver/ToolChains/MinGW.cpp
@@ -12,8 +12,8 @@
#include "clang/Driver/Compilation.h"
#include "clang/Driver/Driver.h"
#include "clang/Driver/InputInfo.h"
-#include "clang/Driver/Options.h"
#include "clang/Driver/SanitizerArgs.h"
+#include "clang/Options/Options.h"
#include "llvm/Config/llvm-config.h" // for LLVM_HOST_TRIPLE
#include "llvm/Option/ArgList.h"
#include "llvm/Support/FileSystem.h"
diff --git a/clang/lib/Driver/ToolChains/MipsLinux.cpp b/clang/lib/Driver/ToolChains/MipsLinux.cpp
index 7dd3936..58d6b50 100644
--- a/clang/lib/Driver/ToolChains/MipsLinux.cpp
+++ b/clang/lib/Driver/ToolChains/MipsLinux.cpp
@@ -9,7 +9,7 @@
#include "MipsLinux.h"
#include "Arch/Mips.h"
#include "clang/Driver/Driver.h"
-#include "clang/Driver/Options.h"
+#include "clang/Options/Options.h"
#include "llvm/Option/ArgList.h"
#include "llvm/Support/FileSystem.h"
#include "llvm/Support/Path.h"
@@ -38,7 +38,7 @@ MipsLLVMToolChain::MipsLLVMToolChain(const Driver &D,
void MipsLLVMToolChain::AddClangSystemIncludeArgs(
const ArgList &DriverArgs, ArgStringList &CC1Args) const {
- if (DriverArgs.hasArg(clang::driver::options::OPT_nostdinc))
+ if (DriverArgs.hasArg(options::OPT_nostdinc))
return;
const Driver &D = getDriver();
diff --git a/clang/lib/Driver/ToolChains/NetBSD.cpp b/clang/lib/Driver/ToolChains/NetBSD.cpp
index 8db00de..ea722b5 100644
--- a/clang/lib/Driver/ToolChains/NetBSD.cpp
+++ b/clang/lib/Driver/ToolChains/NetBSD.cpp
@@ -14,8 +14,8 @@
#include "clang/Driver/CommonArgs.h"
#include "clang/Driver/Compilation.h"
#include "clang/Driver/Driver.h"
-#include "clang/Driver/Options.h"
#include "clang/Driver/SanitizerArgs.h"
+#include "clang/Options/Options.h"
#include "llvm/Option/ArgList.h"
#include "llvm/Support/VirtualFileSystem.h"
@@ -466,7 +466,7 @@ void NetBSD::AddClangSystemIncludeArgs(
llvm::opt::ArgStringList &CC1Args) const {
const Driver &D = getDriver();
- if (DriverArgs.hasArg(clang::driver::options::OPT_nostdinc))
+ if (DriverArgs.hasArg(options::OPT_nostdinc))
return;
if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
diff --git a/clang/lib/Driver/ToolChains/OHOS.cpp b/clang/lib/Driver/ToolChains/OHOS.cpp
index 0099150..607eb71 100644
--- a/clang/lib/Driver/ToolChains/OHOS.cpp
+++ b/clang/lib/Driver/ToolChains/OHOS.cpp
@@ -12,8 +12,8 @@
#include "clang/Driver/CommonArgs.h"
#include "clang/Driver/Compilation.h"
#include "clang/Driver/Driver.h"
-#include "clang/Driver/Options.h"
#include "clang/Driver/SanitizerArgs.h"
+#include "clang/Options/Options.h"
#include "llvm/Option/ArgList.h"
#include "llvm/ProfileData/InstrProf.h"
#include "llvm/Support/FileSystem.h"
@@ -174,7 +174,7 @@ OHOS::OHOS(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
ToolChain::RuntimeLibType OHOS::GetRuntimeLibType(
const ArgList &Args) const {
- if (Arg *A = Args.getLastArg(clang::driver::options::OPT_rtlib_EQ)) {
+ if (Arg *A = Args.getLastArg(options::OPT_rtlib_EQ)) {
StringRef Value = A->getValue();
if (Value != "compiler-rt")
getDriver().Diag(clang::diag::err_drv_invalid_rtlib_name)
diff --git a/clang/lib/Driver/ToolChains/OpenBSD.cpp b/clang/lib/Driver/ToolChains/OpenBSD.cpp
index 8f58918..5e7b4f1 100644
--- a/clang/lib/Driver/ToolChains/OpenBSD.cpp
+++ b/clang/lib/Driver/ToolChains/OpenBSD.cpp
@@ -13,8 +13,8 @@
#include "clang/Config/config.h"
#include "clang/Driver/CommonArgs.h"
#include "clang/Driver/Compilation.h"
-#include "clang/Driver/Options.h"
#include "clang/Driver/SanitizerArgs.h"
+#include "clang/Options/Options.h"
#include "llvm/Option/ArgList.h"
#include "llvm/Support/Path.h"
#include "llvm/Support/VirtualFileSystem.h"
@@ -315,7 +315,7 @@ void OpenBSD::AddClangSystemIncludeArgs(
llvm::opt::ArgStringList &CC1Args) const {
const Driver &D = getDriver();
- if (DriverArgs.hasArg(clang::driver::options::OPT_nostdinc))
+ if (DriverArgs.hasArg(options::OPT_nostdinc))
return;
if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
diff --git a/clang/lib/Driver/ToolChains/PPCFreeBSD.cpp b/clang/lib/Driver/ToolChains/PPCFreeBSD.cpp
index 8d381c4..7618043 100644
--- a/clang/lib/Driver/ToolChains/PPCFreeBSD.cpp
+++ b/clang/lib/Driver/ToolChains/PPCFreeBSD.cpp
@@ -8,7 +8,7 @@
#include "PPCFreeBSD.h"
#include "clang/Driver/Driver.h"
-#include "clang/Driver/Options.h"
+#include "clang/Options/Options.h"
#include "llvm/Support/Path.h"
using namespace clang::driver::toolchains;
@@ -16,7 +16,7 @@ using namespace llvm::opt;
void PPCFreeBSDToolChain::AddClangSystemIncludeArgs(
const ArgList &DriverArgs, ArgStringList &CC1Args) const {
- if (!DriverArgs.hasArg(clang::driver::options::OPT_nostdinc) &&
+ if (!DriverArgs.hasArg(options::OPT_nostdinc) &&
!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
const Driver &D = getDriver();
SmallString<128> P(D.ResourceDir);
diff --git a/clang/lib/Driver/ToolChains/PPCLinux.cpp b/clang/lib/Driver/ToolChains/PPCLinux.cpp
index 768214e..672ebd5 100644
--- a/clang/lib/Driver/ToolChains/PPCLinux.cpp
+++ b/clang/lib/Driver/ToolChains/PPCLinux.cpp
@@ -8,7 +8,7 @@
#include "PPCLinux.h"
#include "clang/Driver/Driver.h"
-#include "clang/Driver/Options.h"
+#include "clang/Options/Options.h"
#include "llvm/Support/FileSystem.h"
#include "llvm/Support/Path.h"
@@ -58,7 +58,7 @@ PPCLinuxToolChain::PPCLinuxToolChain(const Driver &D,
void PPCLinuxToolChain::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
ArgStringList &CC1Args) const {
- if (!DriverArgs.hasArg(clang::driver::options::OPT_nostdinc) &&
+ if (!DriverArgs.hasArg(options::OPT_nostdinc) &&
!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
const Driver &D = getDriver();
SmallString<128> P(D.ResourceDir);
diff --git a/clang/lib/Driver/ToolChains/PS4CPU.cpp b/clang/lib/Driver/ToolChains/PS4CPU.cpp
index 34ec65a..5b5b560 100644
--- a/clang/lib/Driver/ToolChains/PS4CPU.cpp
+++ b/clang/lib/Driver/ToolChains/PS4CPU.cpp
@@ -11,8 +11,8 @@
#include "clang/Driver/CommonArgs.h"
#include "clang/Driver/Compilation.h"
#include "clang/Driver/Driver.h"
-#include "clang/Driver/Options.h"
#include "clang/Driver/SanitizerArgs.h"
+#include "clang/Options/Options.h"
#include "llvm/Option/ArgList.h"
#include "llvm/Support/FileSystem.h"
#include "llvm/Support/Path.h"
@@ -488,6 +488,9 @@ toolchains::PS4PS5Base::PS4PS5Base(const Driver &D, const llvm::Triple &Triple,
// control of header or library search. If we're not linking, don't check
// for missing libraries.
auto CheckSDKPartExists = [&](StringRef Dir, StringRef Desc) {
+ // In ThinLTO code generation mode SDK files are not required.
+ if (Args.hasArgNoClaim(options::OPT_fthinlto_index_EQ))
+ return true;
if (llvm::sys::fs::exists(Dir))
return true;
D.Diag(clang::diag::warn_drv_unable_to_find_directory_expected)
diff --git a/clang/lib/Driver/ToolChains/SPIRV.cpp b/clang/lib/Driver/ToolChains/SPIRV.cpp
index ea824db..27de55c 100644
--- a/clang/lib/Driver/ToolChains/SPIRV.cpp
+++ b/clang/lib/Driver/ToolChains/SPIRV.cpp
@@ -10,7 +10,7 @@
#include "clang/Driver/Compilation.h"
#include "clang/Driver/Driver.h"
#include "clang/Driver/InputInfo.h"
-#include "clang/Driver/Options.h"
+#include "clang/Options/Options.h"
using namespace clang::driver;
using namespace clang::driver::toolchains;
diff --git a/clang/lib/Driver/ToolChains/SYCL.cpp b/clang/lib/Driver/ToolChains/SYCL.cpp
index 0232b04..85859f3 100644
--- a/clang/lib/Driver/ToolChains/SYCL.cpp
+++ b/clang/lib/Driver/ToolChains/SYCL.cpp
@@ -20,7 +20,7 @@ SYCLInstallationDetector::SYCLInstallationDetector(
void SYCLInstallationDetector::addSYCLIncludeArgs(
const ArgList &DriverArgs, ArgStringList &CC1Args) const {
- if (DriverArgs.hasArg(clang::driver::options::OPT_nobuiltininc))
+ if (DriverArgs.hasArg(options::OPT_nobuiltininc))
return;
// Add the SYCL header search locations in the specified order.
diff --git a/clang/lib/Driver/ToolChains/Solaris.cpp b/clang/lib/Driver/ToolChains/Solaris.cpp
index 64c7d1c..ad0f411 100644
--- a/clang/lib/Driver/ToolChains/Solaris.cpp
+++ b/clang/lib/Driver/ToolChains/Solaris.cpp
@@ -13,9 +13,9 @@
#include "clang/Driver/CommonArgs.h"
#include "clang/Driver/Compilation.h"
#include "clang/Driver/Driver.h"
-#include "clang/Driver/Options.h"
#include "clang/Driver/SanitizerArgs.h"
#include "clang/Driver/ToolChain.h"
+#include "clang/Options/Options.h"
#include "llvm/ADT/StringSwitch.h"
#include "llvm/Option/ArgList.h"
#include "llvm/Support/FileSystem.h"
@@ -360,7 +360,7 @@ void Solaris::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
ArgStringList &CC1Args) const {
const Driver &D = getDriver();
- if (DriverArgs.hasArg(clang::driver::options::OPT_nostdinc))
+ if (DriverArgs.hasArg(options::OPT_nostdinc))
return;
if (!DriverArgs.hasArg(options::OPT_nostdlibinc))
diff --git a/clang/lib/Driver/ToolChains/UEFI.cpp b/clang/lib/Driver/ToolChains/UEFI.cpp
index d2be147..7732e37 100644
--- a/clang/lib/Driver/ToolChains/UEFI.cpp
+++ b/clang/lib/Driver/ToolChains/UEFI.cpp
@@ -11,8 +11,8 @@
#include "clang/Driver/CommonArgs.h"
#include "clang/Driver/Compilation.h"
#include "clang/Driver/Driver.h"
-#include "clang/Driver/Options.h"
#include "clang/Driver/SanitizerArgs.h"
+#include "clang/Options/Options.h"
#include "llvm/Option/Arg.h"
#include "llvm/Option/ArgList.h"
#include "llvm/Support/VirtualFileSystem.h"
diff --git a/clang/lib/Driver/ToolChains/VEToolchain.cpp b/clang/lib/Driver/ToolChains/VEToolchain.cpp
index ad91290..78509bc 100644
--- a/clang/lib/Driver/ToolChains/VEToolchain.cpp
+++ b/clang/lib/Driver/ToolChains/VEToolchain.cpp
@@ -10,7 +10,7 @@
#include "clang/Driver/CommonArgs.h"
#include "clang/Driver/Compilation.h"
#include "clang/Driver/Driver.h"
-#include "clang/Driver/Options.h"
+#include "clang/Options/Options.h"
#include "llvm/Option/ArgList.h"
#include "llvm/Support/Path.h"
#include <cstdlib> // ::getenv
@@ -78,7 +78,7 @@ bool VEToolChain::hasBlocksRuntime() const { return false; }
void VEToolChain::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
ArgStringList &CC1Args) const {
- if (DriverArgs.hasArg(clang::driver::options::OPT_nostdinc))
+ if (DriverArgs.hasArg(options::OPT_nostdinc))
return;
if (DriverArgs.hasArg(options::OPT_nobuiltininc) &&
@@ -117,7 +117,7 @@ void VEToolChain::addClangTargetOptions(const ArgList &DriverArgs,
void VEToolChain::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
ArgStringList &CC1Args) const {
- if (DriverArgs.hasArg(clang::driver::options::OPT_nostdinc) ||
+ if (DriverArgs.hasArg(options::OPT_nostdinc) ||
DriverArgs.hasArg(options::OPT_nostdlibinc) ||
DriverArgs.hasArg(options::OPT_nostdincxx))
return;
diff --git a/clang/lib/Driver/ToolChains/WebAssembly.cpp b/clang/lib/Driver/ToolChains/WebAssembly.cpp
index 5054868..15c6f19 100644
--- a/clang/lib/Driver/ToolChains/WebAssembly.cpp
+++ b/clang/lib/Driver/ToolChains/WebAssembly.cpp
@@ -12,7 +12,7 @@
#include "clang/Driver/CommonArgs.h"
#include "clang/Driver/Compilation.h"
#include "clang/Driver/Driver.h"
-#include "clang/Driver/Options.h"
+#include "clang/Options/Options.h"
#include "llvm/Config/llvm-config.h" // for LLVM_VERSION_STRING
#include "llvm/Option/ArgList.h"
#include "llvm/Support/FileSystem.h"
@@ -297,7 +297,7 @@ bool WebAssembly::HasNativeLLVMSupport() const { return true; }
void WebAssembly::addClangTargetOptions(const ArgList &DriverArgs,
ArgStringList &CC1Args,
Action::OffloadKind) const {
- if (!DriverArgs.hasFlag(clang::driver::options::OPT_fuse_init_array,
+ if (!DriverArgs.hasFlag(options::OPT_fuse_init_array,
options::OPT_fno_use_init_array, true))
CC1Args.push_back("-fno-use-init-array");
@@ -472,7 +472,7 @@ WebAssembly::GetCXXStdlibType(const ArgList &Args) const {
void WebAssembly::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
ArgStringList &CC1Args) const {
- if (DriverArgs.hasArg(clang::driver::options::OPT_nostdinc))
+ if (DriverArgs.hasArg(options::OPT_nostdinc))
return;
const Driver &D = getDriver();
diff --git a/clang/lib/Driver/ToolChains/XCore.cpp b/clang/lib/Driver/ToolChains/XCore.cpp
index 6a2a75c..dd26c11 100644
--- a/clang/lib/Driver/ToolChains/XCore.cpp
+++ b/clang/lib/Driver/ToolChains/XCore.cpp
@@ -10,7 +10,7 @@
#include "clang/Driver/CommonArgs.h"
#include "clang/Driver/Compilation.h"
#include "clang/Driver/Driver.h"
-#include "clang/Driver/Options.h"
+#include "clang/Options/Options.h"
#include "llvm/Option/ArgList.h"
#include <cstdlib> // ::getenv
@@ -113,7 +113,7 @@ bool XCoreToolChain::hasBlocksRuntime() const { return false; }
void XCoreToolChain::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
ArgStringList &CC1Args) const {
- if (DriverArgs.hasArg(clang::driver::options::OPT_nostdinc) ||
+ if (DriverArgs.hasArg(options::OPT_nostdinc) ||
DriverArgs.hasArg(options::OPT_nostdlibinc))
return;
if (const char *cl_include_dir = getenv("XCC_C_INCLUDE_PATH")) {
@@ -137,7 +137,7 @@ void XCoreToolChain::addClangTargetOptions(const ArgList &DriverArgs,
void XCoreToolChain::AddClangCXXStdlibIncludeArgs(
const ArgList &DriverArgs, ArgStringList &CC1Args) const {
- if (DriverArgs.hasArg(clang::driver::options::OPT_nostdinc) ||
+ if (DriverArgs.hasArg(options::OPT_nostdinc) ||
DriverArgs.hasArg(options::OPT_nostdlibinc) ||
DriverArgs.hasArg(options::OPT_nostdincxx))
return;
diff --git a/clang/lib/Driver/ToolChains/ZOS.cpp b/clang/lib/Driver/ToolChains/ZOS.cpp
index 9a3c453..eac8f62 100644
--- a/clang/lib/Driver/ToolChains/ZOS.cpp
+++ b/clang/lib/Driver/ToolChains/ZOS.cpp
@@ -9,7 +9,7 @@
#include "ZOS.h"
#include "clang/Driver/CommonArgs.h"
#include "clang/Driver/Compilation.h"
-#include "clang/Driver/Options.h"
+#include "clang/Options/Options.h"
#include "llvm/Option/ArgList.h"
#include "llvm/Support/VirtualFileSystem.h"
#include "llvm/Support/WithColor.h"
diff --git a/clang/lib/Driver/XRayArgs.cpp b/clang/lib/Driver/XRayArgs.cpp
index 0325296..4c2d117 100644
--- a/clang/lib/Driver/XRayArgs.cpp
+++ b/clang/lib/Driver/XRayArgs.cpp
@@ -8,8 +8,8 @@
#include "clang/Driver/XRayArgs.h"
#include "clang/Driver/CommonArgs.h"
#include "clang/Driver/Driver.h"
-#include "clang/Driver/Options.h"
#include "clang/Driver/ToolChain.h"
+#include "clang/Options/Options.h"
#include "llvm/ADT/StringExtras.h"
#include "llvm/ADT/StringSwitch.h"
#include "llvm/Support/SpecialCaseList.h"