aboutsummaryrefslogtreecommitdiff
path: root/clang/lib/Driver/ToolChains
diff options
context:
space:
mode:
Diffstat (limited to 'clang/lib/Driver/ToolChains')
-rw-r--r--clang/lib/Driver/ToolChains/AIX.cpp6
-rw-r--r--clang/lib/Driver/ToolChains/AMDGPU.cpp77
-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.cpp83
-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/HLSL.cpp4
-rw-r--r--clang/lib/Driver/ToolChains/HLSL.h2
-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
57 files changed, 438 insertions, 439 deletions
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 654a382..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"
@@ -22,6 +22,7 @@
#include "llvm/Support/Process.h"
#include "llvm/Support/VirtualFileSystem.h"
#include "llvm/TargetParser/Host.h"
+#include "llvm/TargetParser/TargetParser.h"
#include <optional>
#include <system_error>
@@ -242,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);
};
@@ -322,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;
@@ -1076,36 +1081,40 @@ 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();
+ bool IsExplicitDevice =
+ A->getBaseArg().getOption().matches(options::OPT_Xarch_device);
+
+ // Check 'xnack+' availability by default
+ llvm::StringRef Processor =
+ getProcessorFromTargetID(TC.getTriple(), TargetID);
+ auto ProcKind = TC.getTriple().isAMDGCN()
+ ? llvm::AMDGPU::parseArchAMDGCN(Processor)
+ : llvm::AMDGPU::parseArchR600(Processor);
+ auto Features = TC.getTriple().isAMDGCN()
+ ? llvm::AMDGPU::getArchAttrAMDGCN(ProcKind)
+ : llvm::AMDGPU::getArchAttrR600(ProcKind);
+ if (Features & llvm::AMDGPU::FEATURE_XNACK_ALWAYS)
+ return false;
- // For simplicity, we only allow -fsanitize=address
- SanitizerMask K = parseSanitizerValue(A->getValue(), /*AllowGroups=*/false);
- if (K != SanitizerKind::Address)
- return true;
-
+ // Look for the xnack feature in TargetID
llvm::StringMap<bool> FeatureMap;
auto OptionalGpuArch = parseTargetID(TC.getTriple(), TargetID, &FeatureMap);
-
assert(OptionalGpuArch && "Invalid Target ID");
(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 30d3e52..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);
@@ -8266,6 +8284,37 @@ void Clang::AddClangCLArgs(const ArgList &Args, types::ID InputType,
<< "/kernel";
}
+ if (const Arg *A = Args.getLastArg(options::OPT__SLASH_vlen,
+ options::OPT__SLASH_vlen_EQ_256,
+ options::OPT__SLASH_vlen_EQ_512)) {
+ 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 (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);
+ } 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);
Arg *BestCaseArg = Args.getLastArg(options::OPT__SLASH_vmb);
if (MostGeneralArg && BestCaseArg)
@@ -9051,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.
@@ -9060,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() &&
@@ -9142,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(
@@ -9214,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/HLSL.cpp b/clang/lib/Driver/ToolChains/HLSL.cpp
index 8d3fba7..5d7221b 100644
--- a/clang/lib/Driver/ToolChains/HLSL.cpp
+++ b/clang/lib/Driver/ToolChains/HLSL.cpp
@@ -567,3 +567,7 @@ bool HLSLToolChain::isLastJob(DerivedArgList &Args,
// output to the result file.
return true;
}
+
+void HLSLToolChain::addClangWarningOptions(ArgStringList &CC1Args) const {
+ CC1Args.push_back("-Wconversion");
+}
diff --git a/clang/lib/Driver/ToolChains/HLSL.h b/clang/lib/Driver/ToolChains/HLSL.h
index 3aed904..5bf385e 100644
--- a/clang/lib/Driver/ToolChains/HLSL.h
+++ b/clang/lib/Driver/ToolChains/HLSL.h
@@ -91,6 +91,8 @@ public:
// Set default DWARF version to 4 for DXIL uses version 4.
unsigned GetDefaultDwarfVersion() const override { return 4; }
+ void addClangWarningOptions(llvm::opt::ArgStringList &CC1Args) const override;
+
private:
mutable std::unique_ptr<tools::hlsl::Validator> Validator;
mutable std::unique_ptr<tools::hlsl::MetalConverter> MetalConverter;
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"