[clang] Multilib support for libraries with exceptions (PR #75031)
https://github.com/domin144 approved this pull request. https://github.com/llvm/llvm-project/pull/75031 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [clang][AArch64] multilib: fix deduction of "-march=" option (PR #81474)
https://github.com/domin144 created https://github.com/llvm/llvm-project/pull/81474 The deduced "-march=" option always started with aarch64, which is not a valid value. There was also no way to distinguish between armv8-r and armv8-a. After this commit, the deduced "-march=" option will start with greatest available "armv*-a" value or "armv8-r". From 8f8d2b304aa90c0aea00d67e86d285ecd870e443 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20W=C3=B3jt?= Date: Mon, 12 Feb 2024 13:38:14 +0100 Subject: [PATCH] [clang][AArch64] multilib: fix deduction of "-march=" option The deduced "-march=" option always started with aarch64, which is not a valid value. There was also no way to distinguish between armv8-r and armv8-a. After this commit, the deduced "-march=" option will start with greatest available "armv*-a" value or "armv8-r". --- clang/lib/Driver/ToolChain.cpp | 6 +- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/clang/lib/Driver/ToolChain.cpp b/clang/lib/Driver/ToolChain.cpp index 388030592b4836..bfc80ac79df1e3 100644 --- a/clang/lib/Driver/ToolChain.cpp +++ b/clang/lib/Driver/ToolChain.cpp @@ -191,7 +191,11 @@ static void getAArch64MultilibFlags(const Driver &D, for (const auto &Ext : AArch64::Extensions) if (FeatureSet.contains(Ext.NegFeature)) MArch.push_back(("no" + Ext.Name).str()); - MArch.insert(MArch.begin(), ("-march=" + Triple.getArchName()).str()); + StringRef ArchName; + for (const auto &ArchInfo : AArch64::ArchInfos) +if (FeatureSet.contains(ArchInfo->ArchFeature)) + ArchName = ArchInfo->Name; + MArch.insert(MArch.begin(), ("-march=" + ArchName).str()); Result.push_back(llvm::join(MArch, "+")); } ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [clang][AArch64] multilib: fix deduction of "-march=" option (PR #81474)
https://github.com/domin144 updated https://github.com/llvm/llvm-project/pull/81474 From 8f8d2b304aa90c0aea00d67e86d285ecd870e443 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20W=C3=B3jt?= Date: Mon, 12 Feb 2024 13:38:14 +0100 Subject: [PATCH 1/2] [clang][AArch64] multilib: fix deduction of "-march=" option The deduced "-march=" option always started with aarch64, which is not a valid value. There was also no way to distinguish between armv8-r and armv8-a. After this commit, the deduced "-march=" option will start with greatest available "armv*-a" value or "armv8-r". --- clang/lib/Driver/ToolChain.cpp | 6 +- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/clang/lib/Driver/ToolChain.cpp b/clang/lib/Driver/ToolChain.cpp index 388030592b4836..bfc80ac79df1e3 100644 --- a/clang/lib/Driver/ToolChain.cpp +++ b/clang/lib/Driver/ToolChain.cpp @@ -191,7 +191,11 @@ static void getAArch64MultilibFlags(const Driver &D, for (const auto &Ext : AArch64::Extensions) if (FeatureSet.contains(Ext.NegFeature)) MArch.push_back(("no" + Ext.Name).str()); - MArch.insert(MArch.begin(), ("-march=" + Triple.getArchName()).str()); + StringRef ArchName; + for (const auto &ArchInfo : AArch64::ArchInfos) +if (FeatureSet.contains(ArchInfo->ArchFeature)) + ArchName = ArchInfo->Name; + MArch.insert(MArch.begin(), ("-march=" + ArchName).str()); Result.push_back(llvm::join(MArch, "+")); } From deb4c5a8c331996383492862ee2cdd48b349de72 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20W=C3=B3jt?= Date: Mon, 12 Feb 2024 14:46:26 +0100 Subject: [PATCH 2/2] fix tests --- clang/test/Driver/print-multi-selection-flags.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/clang/test/Driver/print-multi-selection-flags.c b/clang/test/Driver/print-multi-selection-flags.c index 248d9a3cdf49b2..06a12db9d97792 100644 --- a/clang/test/Driver/print-multi-selection-flags.c +++ b/clang/test/Driver/print-multi-selection-flags.c @@ -51,9 +51,10 @@ // CHECK-M85_NO_FP_DP: -mfpu=fp-armv8-fullfp16-sp-d16 // RUN: %clang -print-multi-flags-experimental --target=aarch64-none-elf -march=armv8-a+lse | FileCheck --check-prefix=CHECK-LSE %s -// CHECK-LSE: -march=aarch64{{.*}}+lse{{.*}} +// CHECK-LSE: --target=aarch64-none-unknown-elf +// CHECK-LSE: -march=armv8-a{{.*}}+lse{{.*}} // RUN: %clang -print-multi-flags-experimental --target=aarch64-none-elf -march=armv8.5-a+sve+sve2 | FileCheck --check-prefix=CHECK-SVE2 %s // RUN: %clang -print-multi-flags-experimental --target=aarch64-none-elf -march=armv9-a| FileCheck --check-prefix=CHECK-SVE2 %s // CHECK-SVE2: --target=aarch64-none-unknown-elf -// CHECK-SVE2: -march=aarch64{{.*}}+simd{{.*}}+sve{{.*}}+sve2{{.*}} +// CHECK-SVE2: -march=armv{{.*}}-a{{.*}}+simd{{.*}}+sve{{.*}}+sve2{{.*}} ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [clang][AArch64] multilib: fix deduction of "-march=" option (PR #81474)
https://github.com/domin144 closed https://github.com/llvm/llvm-project/pull/81474 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] Multilib support for libraries with exceptions (PR #75031)
@@ -264,6 +273,14 @@ ToolChain::getMultilibFlags(const llvm::opt::ArgList &Args) const { break; } + // Include fno-exceptions and fno-rtti + // to improve multilib selection + if (getRTTIMode() == ToolChain::RTTIMode::RM_Disabled) +Result.push_back("-fno-rtti"); + + if (getExceptionsMode() == ToolChain::ExceptionsMode::EM_Disabled) +Result.push_back("-fno-exceptions"); domin144 wrote: And a positive one here, too? https://github.com/llvm/llvm-project/pull/75031 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] Multilib support for libraries with exceptions (PR #75031)
@@ -264,6 +273,14 @@ ToolChain::getMultilibFlags(const llvm::opt::ArgList &Args) const { break; } + // Include fno-exceptions and fno-rtti + // to improve multilib selection + if (getRTTIMode() == ToolChain::RTTIMode::RM_Disabled) +Result.push_back("-fno-rtti"); domin144 wrote: Could we have a positive flag, too? I know it is not useful for now, as we are not able to say, that some feature of a standard library is available - only that it is allowed. However, if in the future such mechanism was added, than I think it would be more natural to say: "If user specifies '-frtti', then the library candidate also needs '-frtti'" than to say: "If user specifies '-fno-rtti', than the library is allowed to have '-fno-rtti'". https://github.com/llvm/llvm-project/pull/75031 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] Multilib support for libraries with exceptions (PR #75031)
https://github.com/domin144 edited https://github.com/llvm/llvm-project/pull/75031 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [ARM] fix "+fp.dp" in multilib selection (PR #67412)
https://github.com/domin144 created https://github.com/llvm/llvm-project/pull/67412 When the FPU was selected with "+(no)fp(.dp)" extensions in "-march" or "-mcpu" options, the FPU used for multilib selection was still the default one for given architecture or CPU. From 4cc2328982cc8260263aa803f2b02bff7d7b4a85 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20W=C3=B3jt?= Date: Wed, 20 Sep 2023 16:39:27 +0200 Subject: [PATCH] [ARM] fix "+fp.dp" in multilib selection When the FPU was selected with "+(no)fp(.dp)" extensions in "-march" or "-mcpu" options, the FPU used for multilib selection was still the default one for given architecture or CPU. --- clang/lib/Driver/ToolChains/Arch/ARM.cpp | 5 ++ .../test/Driver/print-multi-selection-flags.c | 10 +++ .../llvm/TargetParser/ARMTargetParser.h | 8 +++ llvm/lib/TargetParser/ARMTargetParser.cpp | 69 +++ 4 files changed, 77 insertions(+), 15 deletions(-) diff --git a/clang/lib/Driver/ToolChains/Arch/ARM.cpp b/clang/lib/Driver/ToolChains/Arch/ARM.cpp index bb66db5feae8c3b..9a042d351bda0b6 100644 --- a/clang/lib/Driver/ToolChains/Arch/ARM.cpp +++ b/clang/lib/Driver/ToolChains/Arch/ARM.cpp @@ -626,6 +626,11 @@ llvm::ARM::FPUKind arm::getARMTargetFeatures(const Driver &D, if (!llvm::ARM::getFPUFeatures(FPUKind, Features)) D.Diag(clang::diag::err_drv_clang_unsupported) << std::string("-mfpu=") + AndroidFPU; + } else if (ArchArgFPUKind != llvm::ARM::FK_INVALID || + CPUArgFPUKind != llvm::ARM::FK_INVALID) { +FPUKind = +CPUArgFPUKind != llvm::ARM::FK_INVALID ? CPUArgFPUKind : ArchArgFPUKind; +(void)llvm::ARM::getFPUFeatures(FPUKind, Features); } else { if (!ForAS) { std::string CPU = arm::getARMTargetCPU(CPUName, ArchName, Triple); diff --git a/clang/test/Driver/print-multi-selection-flags.c b/clang/test/Driver/print-multi-selection-flags.c index 819ff242ced0026..f020a22ea128aac 100644 --- a/clang/test/Driver/print-multi-selection-flags.c +++ b/clang/test/Driver/print-multi-selection-flags.c @@ -35,6 +35,16 @@ // CHECK-MVENOFP-NOT: -march=thumbv8.1m.main{{.*}}+mve.fp{{.*}} // CHECK-MVENOFP: -mfpu=none +// RUN: %clang -print-multi-flags-experimental --target=arm-none-eabihf -march=armv8.1m.main+fp.dp | FileCheck --check-prefix=CHECK-V8_1_FP_DP %s +// CHECK-V8_1_FP_DP: -march=thumbv8.1m.main{{.*}} +// CHECK-V8_1_FP_DP: -mfloat-abi=hard +// CHECK-V8_1_FP_DP: -mfpu=fp-armv8-fullfp16-d16 + +// RUN: %clang -print-multi-flags-experimental --target=arm-none-eabihf -mcpu=cortex-m85+nofp.dp | FileCheck --check-prefix=CHECK-M85_NO_FP_DP %s +// CHECK-M85_NO_FP_DP: -march=thumbv8.1m.main{{.*}} +// CHECK-M85_NO_FP_DP: -mfloat-abi=hard +// CHECK-M85_NO_FP_DP: -mfpu=fp-armv8-fullfp16-sp-d16 + // RUN: %clang -print-multi-flags-experimental --target=aarch64-none-elf -march=armv8-a+lse | FileCheck --check-prefix=CHECK-LSE %s // CHECK-LSE: -march=aarch64{{.*}}+lse{{.*}} diff --git a/llvm/include/llvm/TargetParser/ARMTargetParser.h b/llvm/include/llvm/TargetParser/ARMTargetParser.h index b893eab1902f81b..c42d66f048fccc0 100644 --- a/llvm/include/llvm/TargetParser/ARMTargetParser.h +++ b/llvm/include/llvm/TargetParser/ARMTargetParser.h @@ -143,6 +143,14 @@ enum class FPURestriction { SP_D16///< Only single-precision instructions, with 16 D registers }; +inline bool isDoublePrecision(const FPURestriction restriction) { + return restriction != FPURestriction::SP_D16; +} + +inline bool has32Regs(const FPURestriction restriction) { + return restriction == FPURestriction::None; +} + // An FPU name implies one of three levels of Neon support: enum class NeonSupportLevel { None = 0, ///< No Neon diff --git a/llvm/lib/TargetParser/ARMTargetParser.cpp b/llvm/lib/TargetParser/ARMTargetParser.cpp index c84928eeb07b140..524bb4e0fd0db22 100644 --- a/llvm/lib/TargetParser/ARMTargetParser.cpp +++ b/llvm/lib/TargetParser/ARMTargetParser.cpp @@ -366,26 +366,50 @@ StringRef ARM::getArchExtFeature(StringRef ArchExt) { } static ARM::FPUKind findDoublePrecisionFPU(ARM::FPUKind InputFPUKind) { + if (InputFPUKind == ARM::FK_INVALID || InputFPUKind == ARM::FK_NONE) +return ARM::FK_INVALID; + + const ARM::FPUName &InputFPU = ARM::FPUNames[InputFPUKind]; + + if (ARM::isDoublePrecision(InputFPU.Restriction)) +return InputFPUKind; + + // Otherwise, look for an FPU entry with all the same fields, except + // that it supports double precision. + for (const ARM::FPUName &CandidateFPU : ARM::FPUNames) { +if (CandidateFPU.FPUVer == InputFPU.FPUVer && +CandidateFPU.NeonSupport == InputFPU.NeonSupport && +ARM::has32Regs(CandidateFPU.Restriction) == +ARM::has32Regs(InputFPU.Restriction) && +ARM::isDoublePrecision(CandidateFPU.Restriction)) { + return CandidateFPU.ID; +} + } + + // nothing found + return ARM::FK_INVALID; +} + +static ARM::FPUKind findSinglePrecisionFPU(ARM::FPUKind InputFPUKind) { + if (InputFPUKin
[clang] [ARM] fix "+fp.dp" in multilib selection (PR #67412)
@@ -366,26 +366,50 @@ StringRef ARM::getArchExtFeature(StringRef ArchExt) { } static ARM::FPUKind findDoublePrecisionFPU(ARM::FPUKind InputFPUKind) { + if (InputFPUKind == ARM::FK_INVALID || InputFPUKind == ARM::FK_NONE) +return ARM::FK_INVALID; + + const ARM::FPUName &InputFPU = ARM::FPUNames[InputFPUKind]; + + if (ARM::isDoublePrecision(InputFPU.Restriction)) +return InputFPUKind; + + // Otherwise, look for an FPU entry with all the same fields, except + // that it supports double precision. + for (const ARM::FPUName &CandidateFPU : ARM::FPUNames) { +if (CandidateFPU.FPUVer == InputFPU.FPUVer && +CandidateFPU.NeonSupport == InputFPU.NeonSupport && +ARM::has32Regs(CandidateFPU.Restriction) == +ARM::has32Regs(InputFPU.Restriction) && +ARM::isDoublePrecision(CandidateFPU.Restriction)) { + return CandidateFPU.ID; +} + } + + // nothing found + return ARM::FK_INVALID; +} + +static ARM::FPUKind findSinglePrecisionFPU(ARM::FPUKind InputFPUKind) { + if (InputFPUKind == ARM::FK_INVALID || InputFPUKind == ARM::FK_NONE) +return ARM::FK_INVALID; + const ARM::FPUName &InputFPU = ARM::FPUNames[InputFPUKind]; // If the input FPU already supports double-precision, then there // isn't any different FPU we can return here. domin144 wrote: Indeed. Thanks for spotting this. https://github.com/llvm/llvm-project/pull/67412 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [ARM] fix "+fp.dp" in multilib selection (PR #67412)
@@ -420,20 +444,35 @@ bool ARM::appendArchExtFeatures(StringRef CPU, ARM::ArchKind AK, CPU = "generic"; if (ArchExt == "fp" || ArchExt == "fp.dp") { +const ARM::FPUKind DefaultFPU = getDefaultFPU(CPU, AK); ARM::FPUKind FPUKind; if (ArchExt == "fp.dp") { + const bool IsDP = ArgFPUKind != ARM::FK_INVALID && +ArgFPUKind != ARM::FK_NONE && +isDoublePrecision(getFPURestriction(ArgFPUKind)); domin144 wrote: The `appendArchExtFeatures` is called repeatedly in `DecodeARMFeatures`. There can be multiple FPU related extensions specified. e.g. `-march=armv8-m.main+nofp+fp+nofp.dp` should disable FPU, enable default FPU(fpv5-d16) and then switch to single precission equivalent FPU(fpv5-sp-d16). https://github.com/llvm/llvm-project/pull/67412 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [ARM] fix "+fp.dp" in multilib selection (PR #67412)
@@ -420,20 +444,35 @@ bool ARM::appendArchExtFeatures(StringRef CPU, ARM::ArchKind AK, CPU = "generic"; if (ArchExt == "fp" || ArchExt == "fp.dp") { +const ARM::FPUKind DefaultFPU = getDefaultFPU(CPU, AK); ARM::FPUKind FPUKind; if (ArchExt == "fp.dp") { + const bool IsDP = ArgFPUKind != ARM::FK_INVALID && +ArgFPUKind != ARM::FK_NONE && +isDoublePrecision(getFPURestriction(ArgFPUKind)); domin144 wrote: I will add a test case for this. https://github.com/llvm/llvm-project/pull/67412 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [ARM] fix "+fp.dp" in multilib selection (PR #67412)
https://github.com/domin144 updated https://github.com/llvm/llvm-project/pull/67412 From 4cc2328982cc8260263aa803f2b02bff7d7b4a85 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20W=C3=B3jt?= Date: Wed, 20 Sep 2023 16:39:27 +0200 Subject: [PATCH 1/2] [ARM] fix "+fp.dp" in multilib selection When the FPU was selected with "+(no)fp(.dp)" extensions in "-march" or "-mcpu" options, the FPU used for multilib selection was still the default one for given architecture or CPU. --- clang/lib/Driver/ToolChains/Arch/ARM.cpp | 5 ++ .../test/Driver/print-multi-selection-flags.c | 10 +++ .../llvm/TargetParser/ARMTargetParser.h | 8 +++ llvm/lib/TargetParser/ARMTargetParser.cpp | 69 +++ 4 files changed, 77 insertions(+), 15 deletions(-) diff --git a/clang/lib/Driver/ToolChains/Arch/ARM.cpp b/clang/lib/Driver/ToolChains/Arch/ARM.cpp index bb66db5feae8c3b..9a042d351bda0b6 100644 --- a/clang/lib/Driver/ToolChains/Arch/ARM.cpp +++ b/clang/lib/Driver/ToolChains/Arch/ARM.cpp @@ -626,6 +626,11 @@ llvm::ARM::FPUKind arm::getARMTargetFeatures(const Driver &D, if (!llvm::ARM::getFPUFeatures(FPUKind, Features)) D.Diag(clang::diag::err_drv_clang_unsupported) << std::string("-mfpu=") + AndroidFPU; + } else if (ArchArgFPUKind != llvm::ARM::FK_INVALID || + CPUArgFPUKind != llvm::ARM::FK_INVALID) { +FPUKind = +CPUArgFPUKind != llvm::ARM::FK_INVALID ? CPUArgFPUKind : ArchArgFPUKind; +(void)llvm::ARM::getFPUFeatures(FPUKind, Features); } else { if (!ForAS) { std::string CPU = arm::getARMTargetCPU(CPUName, ArchName, Triple); diff --git a/clang/test/Driver/print-multi-selection-flags.c b/clang/test/Driver/print-multi-selection-flags.c index 819ff242ced0026..f020a22ea128aac 100644 --- a/clang/test/Driver/print-multi-selection-flags.c +++ b/clang/test/Driver/print-multi-selection-flags.c @@ -35,6 +35,16 @@ // CHECK-MVENOFP-NOT: -march=thumbv8.1m.main{{.*}}+mve.fp{{.*}} // CHECK-MVENOFP: -mfpu=none +// RUN: %clang -print-multi-flags-experimental --target=arm-none-eabihf -march=armv8.1m.main+fp.dp | FileCheck --check-prefix=CHECK-V8_1_FP_DP %s +// CHECK-V8_1_FP_DP: -march=thumbv8.1m.main{{.*}} +// CHECK-V8_1_FP_DP: -mfloat-abi=hard +// CHECK-V8_1_FP_DP: -mfpu=fp-armv8-fullfp16-d16 + +// RUN: %clang -print-multi-flags-experimental --target=arm-none-eabihf -mcpu=cortex-m85+nofp.dp | FileCheck --check-prefix=CHECK-M85_NO_FP_DP %s +// CHECK-M85_NO_FP_DP: -march=thumbv8.1m.main{{.*}} +// CHECK-M85_NO_FP_DP: -mfloat-abi=hard +// CHECK-M85_NO_FP_DP: -mfpu=fp-armv8-fullfp16-sp-d16 + // RUN: %clang -print-multi-flags-experimental --target=aarch64-none-elf -march=armv8-a+lse | FileCheck --check-prefix=CHECK-LSE %s // CHECK-LSE: -march=aarch64{{.*}}+lse{{.*}} diff --git a/llvm/include/llvm/TargetParser/ARMTargetParser.h b/llvm/include/llvm/TargetParser/ARMTargetParser.h index b893eab1902f81b..c42d66f048fccc0 100644 --- a/llvm/include/llvm/TargetParser/ARMTargetParser.h +++ b/llvm/include/llvm/TargetParser/ARMTargetParser.h @@ -143,6 +143,14 @@ enum class FPURestriction { SP_D16///< Only single-precision instructions, with 16 D registers }; +inline bool isDoublePrecision(const FPURestriction restriction) { + return restriction != FPURestriction::SP_D16; +} + +inline bool has32Regs(const FPURestriction restriction) { + return restriction == FPURestriction::None; +} + // An FPU name implies one of three levels of Neon support: enum class NeonSupportLevel { None = 0, ///< No Neon diff --git a/llvm/lib/TargetParser/ARMTargetParser.cpp b/llvm/lib/TargetParser/ARMTargetParser.cpp index c84928eeb07b140..524bb4e0fd0db22 100644 --- a/llvm/lib/TargetParser/ARMTargetParser.cpp +++ b/llvm/lib/TargetParser/ARMTargetParser.cpp @@ -366,26 +366,50 @@ StringRef ARM::getArchExtFeature(StringRef ArchExt) { } static ARM::FPUKind findDoublePrecisionFPU(ARM::FPUKind InputFPUKind) { + if (InputFPUKind == ARM::FK_INVALID || InputFPUKind == ARM::FK_NONE) +return ARM::FK_INVALID; + + const ARM::FPUName &InputFPU = ARM::FPUNames[InputFPUKind]; + + if (ARM::isDoublePrecision(InputFPU.Restriction)) +return InputFPUKind; + + // Otherwise, look for an FPU entry with all the same fields, except + // that it supports double precision. + for (const ARM::FPUName &CandidateFPU : ARM::FPUNames) { +if (CandidateFPU.FPUVer == InputFPU.FPUVer && +CandidateFPU.NeonSupport == InputFPU.NeonSupport && +ARM::has32Regs(CandidateFPU.Restriction) == +ARM::has32Regs(InputFPU.Restriction) && +ARM::isDoublePrecision(CandidateFPU.Restriction)) { + return CandidateFPU.ID; +} + } + + // nothing found + return ARM::FK_INVALID; +} + +static ARM::FPUKind findSinglePrecisionFPU(ARM::FPUKind InputFPUKind) { + if (InputFPUKind == ARM::FK_INVALID || InputFPUKind == ARM::FK_NONE) +return ARM::FK_INVALID; + const ARM::FPUName &InputFPU = ARM::FPUNames[InputFPUKind]; // If the input FPU already
[clang] [ARM] fix "+fp.dp" in multilib selection (PR #67412)
https://github.com/domin144 updated https://github.com/llvm/llvm-project/pull/67412 From e20234c6a73a2dded9e5a34e2900e7757ac9460f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20W=C3=B3jt?= Date: Wed, 20 Sep 2023 16:39:27 +0200 Subject: [PATCH 1/2] [ARM] fix "+fp.dp" in multilib selection When the FPU was selected with "+(no)fp(.dp)" extensions in "-march" or "-mcpu" options, the FPU used for multilib selection was still the default one for given architecture or CPU. --- clang/lib/Driver/ToolChains/Arch/ARM.cpp | 5 ++ .../test/Driver/print-multi-selection-flags.c | 10 +++ .../llvm/TargetParser/ARMTargetParser.h | 8 +++ llvm/lib/TargetParser/ARMTargetParser.cpp | 69 +++ 4 files changed, 77 insertions(+), 15 deletions(-) diff --git a/clang/lib/Driver/ToolChains/Arch/ARM.cpp b/clang/lib/Driver/ToolChains/Arch/ARM.cpp index 8e1cff0b443eeeb..f1d7aeb555f8bd0 100644 --- a/clang/lib/Driver/ToolChains/Arch/ARM.cpp +++ b/clang/lib/Driver/ToolChains/Arch/ARM.cpp @@ -627,6 +627,11 @@ llvm::ARM::FPUKind arm::getARMTargetFeatures(const Driver &D, if (!llvm::ARM::getFPUFeatures(FPUKind, Features)) D.Diag(clang::diag::err_drv_clang_unsupported) << std::string("-mfpu=") + AndroidFPU; + } else if (ArchArgFPUKind != llvm::ARM::FK_INVALID || + CPUArgFPUKind != llvm::ARM::FK_INVALID) { +FPUKind = +CPUArgFPUKind != llvm::ARM::FK_INVALID ? CPUArgFPUKind : ArchArgFPUKind; +(void)llvm::ARM::getFPUFeatures(FPUKind, Features); } else { if (!ForAS) { std::string CPU = arm::getARMTargetCPU(CPUName, ArchName, Triple); diff --git a/clang/test/Driver/print-multi-selection-flags.c b/clang/test/Driver/print-multi-selection-flags.c index 819ff242ced0026..f020a22ea128aac 100644 --- a/clang/test/Driver/print-multi-selection-flags.c +++ b/clang/test/Driver/print-multi-selection-flags.c @@ -35,6 +35,16 @@ // CHECK-MVENOFP-NOT: -march=thumbv8.1m.main{{.*}}+mve.fp{{.*}} // CHECK-MVENOFP: -mfpu=none +// RUN: %clang -print-multi-flags-experimental --target=arm-none-eabihf -march=armv8.1m.main+fp.dp | FileCheck --check-prefix=CHECK-V8_1_FP_DP %s +// CHECK-V8_1_FP_DP: -march=thumbv8.1m.main{{.*}} +// CHECK-V8_1_FP_DP: -mfloat-abi=hard +// CHECK-V8_1_FP_DP: -mfpu=fp-armv8-fullfp16-d16 + +// RUN: %clang -print-multi-flags-experimental --target=arm-none-eabihf -mcpu=cortex-m85+nofp.dp | FileCheck --check-prefix=CHECK-M85_NO_FP_DP %s +// CHECK-M85_NO_FP_DP: -march=thumbv8.1m.main{{.*}} +// CHECK-M85_NO_FP_DP: -mfloat-abi=hard +// CHECK-M85_NO_FP_DP: -mfpu=fp-armv8-fullfp16-sp-d16 + // RUN: %clang -print-multi-flags-experimental --target=aarch64-none-elf -march=armv8-a+lse | FileCheck --check-prefix=CHECK-LSE %s // CHECK-LSE: -march=aarch64{{.*}}+lse{{.*}} diff --git a/llvm/include/llvm/TargetParser/ARMTargetParser.h b/llvm/include/llvm/TargetParser/ARMTargetParser.h index b893eab1902f81b..c42d66f048fccc0 100644 --- a/llvm/include/llvm/TargetParser/ARMTargetParser.h +++ b/llvm/include/llvm/TargetParser/ARMTargetParser.h @@ -143,6 +143,14 @@ enum class FPURestriction { SP_D16///< Only single-precision instructions, with 16 D registers }; +inline bool isDoublePrecision(const FPURestriction restriction) { + return restriction != FPURestriction::SP_D16; +} + +inline bool has32Regs(const FPURestriction restriction) { + return restriction == FPURestriction::None; +} + // An FPU name implies one of three levels of Neon support: enum class NeonSupportLevel { None = 0, ///< No Neon diff --git a/llvm/lib/TargetParser/ARMTargetParser.cpp b/llvm/lib/TargetParser/ARMTargetParser.cpp index 20225232b3cccb7..671063d831e2bd6 100644 --- a/llvm/lib/TargetParser/ARMTargetParser.cpp +++ b/llvm/lib/TargetParser/ARMTargetParser.cpp @@ -366,26 +366,50 @@ StringRef ARM::getArchExtFeature(StringRef ArchExt) { } static ARM::FPUKind findDoublePrecisionFPU(ARM::FPUKind InputFPUKind) { + if (InputFPUKind == ARM::FK_INVALID || InputFPUKind == ARM::FK_NONE) +return ARM::FK_INVALID; + + const ARM::FPUName &InputFPU = ARM::FPUNames[InputFPUKind]; + + if (ARM::isDoublePrecision(InputFPU.Restriction)) +return InputFPUKind; + + // Otherwise, look for an FPU entry with all the same fields, except + // that it supports double precision. + for (const ARM::FPUName &CandidateFPU : ARM::FPUNames) { +if (CandidateFPU.FPUVer == InputFPU.FPUVer && +CandidateFPU.NeonSupport == InputFPU.NeonSupport && +ARM::has32Regs(CandidateFPU.Restriction) == +ARM::has32Regs(InputFPU.Restriction) && +ARM::isDoublePrecision(CandidateFPU.Restriction)) { + return CandidateFPU.ID; +} + } + + // nothing found + return ARM::FK_INVALID; +} + +static ARM::FPUKind findSinglePrecisionFPU(ARM::FPUKind InputFPUKind) { + if (InputFPUKind == ARM::FK_INVALID || InputFPUKind == ARM::FK_NONE) +return ARM::FK_INVALID; + const ARM::FPUName &InputFPU = ARM::FPUNames[InputFPUKind]; // If the input FPU already
[clang] [clang][AArch64] multilib: fix deduction of "-march=" option (PR #81474)
https://github.com/domin144 updated https://github.com/llvm/llvm-project/pull/81474 From 9ffef2685c2766c6944e368a739b8c94e9b68092 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20W=C3=B3jt?= Date: Mon, 12 Feb 2024 13:38:14 +0100 Subject: [PATCH 1/2] [clang][AArch64] multilib: fix deduction of "-march=" option The deduced "-march=" option always started with aarch64, which is not a valid value. There was also no way to distinguish between armv8-r and armv8-a. After this commit, the deduced "-march=" option will start with greatest available "armv*-a" value or "armv8-r". --- clang/lib/Driver/ToolChain.cpp | 6 +- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/clang/lib/Driver/ToolChain.cpp b/clang/lib/Driver/ToolChain.cpp index 657577cea6c7d8..623d52e9471f23 100644 --- a/clang/lib/Driver/ToolChain.cpp +++ b/clang/lib/Driver/ToolChain.cpp @@ -191,7 +191,11 @@ static void getAArch64MultilibFlags(const Driver &D, for (const auto &Ext : AArch64::Extensions) if (FeatureSet.contains(Ext.NegFeature)) MArch.push_back(("no" + Ext.Name).str()); - MArch.insert(MArch.begin(), ("-march=" + Triple.getArchName()).str()); + StringRef ArchName; + for (const auto &ArchInfo : AArch64::ArchInfos) +if (FeatureSet.contains(ArchInfo->ArchFeature)) + ArchName = ArchInfo->Name; + MArch.insert(MArch.begin(), ("-march=" + ArchName).str()); Result.push_back(llvm::join(MArch, "+")); } From 548e0f8d53096cb945e4807bf4898e193fde854d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20W=C3=B3jt?= Date: Mon, 12 Feb 2024 14:46:26 +0100 Subject: [PATCH 2/2] fix tests --- clang/test/Driver/print-multi-selection-flags.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/clang/test/Driver/print-multi-selection-flags.c b/clang/test/Driver/print-multi-selection-flags.c index 248d9a3cdf49b2..06a12db9d97792 100644 --- a/clang/test/Driver/print-multi-selection-flags.c +++ b/clang/test/Driver/print-multi-selection-flags.c @@ -51,9 +51,10 @@ // CHECK-M85_NO_FP_DP: -mfpu=fp-armv8-fullfp16-sp-d16 // RUN: %clang -print-multi-flags-experimental --target=aarch64-none-elf -march=armv8-a+lse | FileCheck --check-prefix=CHECK-LSE %s -// CHECK-LSE: -march=aarch64{{.*}}+lse{{.*}} +// CHECK-LSE: --target=aarch64-none-unknown-elf +// CHECK-LSE: -march=armv8-a{{.*}}+lse{{.*}} // RUN: %clang -print-multi-flags-experimental --target=aarch64-none-elf -march=armv8.5-a+sve+sve2 | FileCheck --check-prefix=CHECK-SVE2 %s // RUN: %clang -print-multi-flags-experimental --target=aarch64-none-elf -march=armv9-a| FileCheck --check-prefix=CHECK-SVE2 %s // CHECK-SVE2: --target=aarch64-none-unknown-elf -// CHECK-SVE2: -march=aarch64{{.*}}+simd{{.*}}+sve{{.*}}+sve2{{.*}} +// CHECK-SVE2: -march=armv{{.*}}-a{{.*}}+simd{{.*}}+sve{{.*}}+sve2{{.*}} ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [clang][AArch64] multilib: fix deduction of "-march=" option (PR #81474)
https://github.com/domin144 updated https://github.com/llvm/llvm-project/pull/81474 From e25d580c7297071f067200639d8b8fe3be74eec6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20W=C3=B3jt?= Date: Mon, 12 Feb 2024 13:38:14 +0100 Subject: [PATCH 1/2] [clang][AArch64] multilib: fix deduction of "-march=" option The deduced "-march=" option always started with aarch64, which is not a valid value. There was also no way to distinguish between armv8-r and armv8-a. After this commit, the deduced "-march=" option will start with greatest available "armv*-a" value or "armv8-r". --- clang/lib/Driver/ToolChain.cpp | 6 +- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/clang/lib/Driver/ToolChain.cpp b/clang/lib/Driver/ToolChain.cpp index 657577cea6c7d8..623d52e9471f23 100644 --- a/clang/lib/Driver/ToolChain.cpp +++ b/clang/lib/Driver/ToolChain.cpp @@ -191,7 +191,11 @@ static void getAArch64MultilibFlags(const Driver &D, for (const auto &Ext : AArch64::Extensions) if (FeatureSet.contains(Ext.NegFeature)) MArch.push_back(("no" + Ext.Name).str()); - MArch.insert(MArch.begin(), ("-march=" + Triple.getArchName()).str()); + StringRef ArchName; + for (const auto &ArchInfo : AArch64::ArchInfos) +if (FeatureSet.contains(ArchInfo->ArchFeature)) + ArchName = ArchInfo->Name; + MArch.insert(MArch.begin(), ("-march=" + ArchName).str()); Result.push_back(llvm::join(MArch, "+")); } From e3c59b8e5915881ce34f7b064c31268f8b1a843a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20W=C3=B3jt?= Date: Mon, 12 Feb 2024 14:46:26 +0100 Subject: [PATCH 2/2] fix tests --- clang/test/Driver/print-multi-selection-flags.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/clang/test/Driver/print-multi-selection-flags.c b/clang/test/Driver/print-multi-selection-flags.c index 248d9a3cdf49b2..06a12db9d97792 100644 --- a/clang/test/Driver/print-multi-selection-flags.c +++ b/clang/test/Driver/print-multi-selection-flags.c @@ -51,9 +51,10 @@ // CHECK-M85_NO_FP_DP: -mfpu=fp-armv8-fullfp16-sp-d16 // RUN: %clang -print-multi-flags-experimental --target=aarch64-none-elf -march=armv8-a+lse | FileCheck --check-prefix=CHECK-LSE %s -// CHECK-LSE: -march=aarch64{{.*}}+lse{{.*}} +// CHECK-LSE: --target=aarch64-none-unknown-elf +// CHECK-LSE: -march=armv8-a{{.*}}+lse{{.*}} // RUN: %clang -print-multi-flags-experimental --target=aarch64-none-elf -march=armv8.5-a+sve+sve2 | FileCheck --check-prefix=CHECK-SVE2 %s // RUN: %clang -print-multi-flags-experimental --target=aarch64-none-elf -march=armv9-a| FileCheck --check-prefix=CHECK-SVE2 %s // CHECK-SVE2: --target=aarch64-none-unknown-elf -// CHECK-SVE2: -march=aarch64{{.*}}+simd{{.*}}+sve{{.*}}+sve2{{.*}} +// CHECK-SVE2: -march=armv{{.*}}-a{{.*}}+simd{{.*}}+sve{{.*}}+sve2{{.*}} ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [clang][AArch64] multilib: fix deduction of "-march=" option (PR #81474)
domin144 wrote: @MaskRay @petrhosek @smithp35 @mplatings Looking at previous reviews for multilib related changes you might be interested. (ingore the buildkite failure for now. It seems unrelated.) https://github.com/llvm/llvm-project/pull/81474 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [clang][AArch64] multilib: fix deduction of "-march=" option (PR #81474)
https://github.com/domin144 updated https://github.com/llvm/llvm-project/pull/81474 From da3ef3a5705ca4eec5683e0c048dd93da8c58b5d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20W=C3=B3jt?= Date: Mon, 12 Feb 2024 13:38:14 +0100 Subject: [PATCH 1/3] [clang][AArch64] multilib: fix deduction of "-march=" option The deduced "-march=" option always started with aarch64, which is not a valid value. There was also no way to distinguish between armv8-r and armv8-a. After this commit, the deduced "-march=" option will start with greatest available "armv*-a" value or "armv8-r". --- clang/lib/Driver/ToolChain.cpp | 6 +- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/clang/lib/Driver/ToolChain.cpp b/clang/lib/Driver/ToolChain.cpp index 657577cea6c7d8..623d52e9471f23 100644 --- a/clang/lib/Driver/ToolChain.cpp +++ b/clang/lib/Driver/ToolChain.cpp @@ -191,7 +191,11 @@ static void getAArch64MultilibFlags(const Driver &D, for (const auto &Ext : AArch64::Extensions) if (FeatureSet.contains(Ext.NegFeature)) MArch.push_back(("no" + Ext.Name).str()); - MArch.insert(MArch.begin(), ("-march=" + Triple.getArchName()).str()); + StringRef ArchName; + for (const auto &ArchInfo : AArch64::ArchInfos) +if (FeatureSet.contains(ArchInfo->ArchFeature)) + ArchName = ArchInfo->Name; + MArch.insert(MArch.begin(), ("-march=" + ArchName).str()); Result.push_back(llvm::join(MArch, "+")); } From 9617abcb6e911a1c6d44b9e5a6bb161e17a0f267 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20W=C3=B3jt?= Date: Mon, 12 Feb 2024 14:46:26 +0100 Subject: [PATCH 2/3] fix tests --- clang/test/Driver/print-multi-selection-flags.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/clang/test/Driver/print-multi-selection-flags.c b/clang/test/Driver/print-multi-selection-flags.c index 248d9a3cdf49b2..06a12db9d97792 100644 --- a/clang/test/Driver/print-multi-selection-flags.c +++ b/clang/test/Driver/print-multi-selection-flags.c @@ -51,9 +51,10 @@ // CHECK-M85_NO_FP_DP: -mfpu=fp-armv8-fullfp16-sp-d16 // RUN: %clang -print-multi-flags-experimental --target=aarch64-none-elf -march=armv8-a+lse | FileCheck --check-prefix=CHECK-LSE %s -// CHECK-LSE: -march=aarch64{{.*}}+lse{{.*}} +// CHECK-LSE: --target=aarch64-none-unknown-elf +// CHECK-LSE: -march=armv8-a{{.*}}+lse{{.*}} // RUN: %clang -print-multi-flags-experimental --target=aarch64-none-elf -march=armv8.5-a+sve+sve2 | FileCheck --check-prefix=CHECK-SVE2 %s // RUN: %clang -print-multi-flags-experimental --target=aarch64-none-elf -march=armv9-a| FileCheck --check-prefix=CHECK-SVE2 %s // CHECK-SVE2: --target=aarch64-none-unknown-elf -// CHECK-SVE2: -march=aarch64{{.*}}+simd{{.*}}+sve{{.*}}+sve2{{.*}} +// CHECK-SVE2: -march=armv{{.*}}-a{{.*}}+simd{{.*}}+sve{{.*}}+sve2{{.*}} From b7da6a6eeae688ba5ac03d51d6cc34c2dea798b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20W=C3=B3jt?= Date: Thu, 15 Feb 2024 12:55:11 +0100 Subject: [PATCH 3/3] add assert for missing arch feature --- clang/lib/Driver/ToolChain.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/clang/lib/Driver/ToolChain.cpp b/clang/lib/Driver/ToolChain.cpp index 623d52e9471f23..0415e37f2e32f0 100644 --- a/clang/lib/Driver/ToolChain.cpp +++ b/clang/lib/Driver/ToolChain.cpp @@ -195,6 +195,7 @@ static void getAArch64MultilibFlags(const Driver &D, for (const auto &ArchInfo : AArch64::ArchInfos) if (FeatureSet.contains(ArchInfo->ArchFeature)) ArchName = ArchInfo->Name; + assert(!ArchName.empty() && "at least one architecture should be found"); MArch.insert(MArch.begin(), ("-march=" + ArchName).str()); Result.push_back(llvm::join(MArch, "+")); } ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [clang][AArch64] multilib: fix deduction of "-march=" option (PR #81474)
@@ -191,7 +191,11 @@ static void getAArch64MultilibFlags(const Driver &D, for (const auto &Ext : AArch64::Extensions) if (FeatureSet.contains(Ext.NegFeature)) MArch.push_back(("no" + Ext.Name).str()); - MArch.insert(MArch.begin(), ("-march=" + Triple.getArchName()).str()); + StringRef ArchName; + for (const auto &ArchInfo : AArch64::ArchInfos) +if (FeatureSet.contains(ArchInfo->ArchFeature)) + ArchName = ArchInfo->Name; domin144 wrote: There should be at least one arch feature in the list: there is an if-else chain with every branch setting one in getAArch64TargetFeatures. I agree it's better to add an assert just in case something changed. For the case of multiple arch features: I think getAArch64TargetFeatures does not do that, but if it did, it should still be ok. "armv*-a" are ordered in AArch64::ArchInfos in a way that every arch feature represents a superset of previous one. This loop will select the greatest one, which is nice. I think it would be an error to have both "-a" and "-r" features, but checking this would need more code and I think this is not the right place for such check. https://github.com/llvm/llvm-project/pull/81474 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [clang][AArch64] multilib: fix deduction of "-march=" option (PR #81474)
https://github.com/domin144 updated https://github.com/llvm/llvm-project/pull/81474 From 4eda12594dbc07e3d3509a309d6691dcc983e5cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20W=C3=B3jt?= Date: Mon, 12 Feb 2024 13:38:14 +0100 Subject: [PATCH 1/3] [clang][AArch64] multilib: fix deduction of "-march=" option The deduced "-march=" option always started with aarch64, which is not a valid value. There was also no way to distinguish between armv8-r and armv8-a. After this commit, the deduced "-march=" option will start with greatest available "armv*-a" value or "armv8-r". --- clang/lib/Driver/ToolChain.cpp | 6 +- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/clang/lib/Driver/ToolChain.cpp b/clang/lib/Driver/ToolChain.cpp index 657577cea6c7d8..623d52e9471f23 100644 --- a/clang/lib/Driver/ToolChain.cpp +++ b/clang/lib/Driver/ToolChain.cpp @@ -191,7 +191,11 @@ static void getAArch64MultilibFlags(const Driver &D, for (const auto &Ext : AArch64::Extensions) if (FeatureSet.contains(Ext.NegFeature)) MArch.push_back(("no" + Ext.Name).str()); - MArch.insert(MArch.begin(), ("-march=" + Triple.getArchName()).str()); + StringRef ArchName; + for (const auto &ArchInfo : AArch64::ArchInfos) +if (FeatureSet.contains(ArchInfo->ArchFeature)) + ArchName = ArchInfo->Name; + MArch.insert(MArch.begin(), ("-march=" + ArchName).str()); Result.push_back(llvm::join(MArch, "+")); } From 35e57e5825e1a12734dae0ce8eabfd3b145d2b23 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20W=C3=B3jt?= Date: Mon, 12 Feb 2024 14:46:26 +0100 Subject: [PATCH 2/3] fix tests --- clang/test/Driver/print-multi-selection-flags.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/clang/test/Driver/print-multi-selection-flags.c b/clang/test/Driver/print-multi-selection-flags.c index 248d9a3cdf49b2..06a12db9d97792 100644 --- a/clang/test/Driver/print-multi-selection-flags.c +++ b/clang/test/Driver/print-multi-selection-flags.c @@ -51,9 +51,10 @@ // CHECK-M85_NO_FP_DP: -mfpu=fp-armv8-fullfp16-sp-d16 // RUN: %clang -print-multi-flags-experimental --target=aarch64-none-elf -march=armv8-a+lse | FileCheck --check-prefix=CHECK-LSE %s -// CHECK-LSE: -march=aarch64{{.*}}+lse{{.*}} +// CHECK-LSE: --target=aarch64-none-unknown-elf +// CHECK-LSE: -march=armv8-a{{.*}}+lse{{.*}} // RUN: %clang -print-multi-flags-experimental --target=aarch64-none-elf -march=armv8.5-a+sve+sve2 | FileCheck --check-prefix=CHECK-SVE2 %s // RUN: %clang -print-multi-flags-experimental --target=aarch64-none-elf -march=armv9-a| FileCheck --check-prefix=CHECK-SVE2 %s // CHECK-SVE2: --target=aarch64-none-unknown-elf -// CHECK-SVE2: -march=aarch64{{.*}}+simd{{.*}}+sve{{.*}}+sve2{{.*}} +// CHECK-SVE2: -march=armv{{.*}}-a{{.*}}+simd{{.*}}+sve{{.*}}+sve2{{.*}} From 5f1590d8a40f62caa9c95a60160f29dff849dacc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20W=C3=B3jt?= Date: Thu, 15 Feb 2024 12:55:11 +0100 Subject: [PATCH 3/3] add assert for missing arch feature --- clang/lib/Driver/ToolChain.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/clang/lib/Driver/ToolChain.cpp b/clang/lib/Driver/ToolChain.cpp index 623d52e9471f23..0415e37f2e32f0 100644 --- a/clang/lib/Driver/ToolChain.cpp +++ b/clang/lib/Driver/ToolChain.cpp @@ -195,6 +195,7 @@ static void getAArch64MultilibFlags(const Driver &D, for (const auto &ArchInfo : AArch64::ArchInfos) if (FeatureSet.contains(ArchInfo->ArchFeature)) ArchName = ArchInfo->Name; + assert(!ArchName.empty() && "at least one architecture should be found"); MArch.insert(MArch.begin(), ("-march=" + ArchName).str()); Result.push_back(llvm::join(MArch, "+")); } ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [clang][AArch64] multilib: fix deduction of "-march=" option (PR #81474)
domin144 wrote: @mplatings Can you merge for me? I don't have needed rights. I rebased hoping the check will pass now, but there are still some unrelated failures on windows. https://github.com/llvm/llvm-project/pull/81474 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits