Author: Zi Xuan Wu (Zeson) Date: 2022-05-23T10:44:55+08:00 New Revision: b86440ecde5c1dec5b898a3f1bc08ab9853d5ed9
URL: https://github.com/llvm/llvm-project/commit/b86440ecde5c1dec5b898a3f1bc08ab9853d5ed9 DIFF: https://github.com/llvm/llvm-project/commit/b86440ecde5c1dec5b898a3f1bc08ab9853d5ed9.diff LOG: [CSKY] Fix the conflict of default fpu features and -mfpu option The arch or cpu has its default fpu features and versions such as fpuv2_sf/fpuv3_sf. And there is also -mfpu option to specify and override fpu version and features. For example, C860 has fpuv3_sf/fpuv3_df feature as default, when -mfpu=fpv2 is given, fpuv3_sf/fpuv3_df is replaced with fpuv2_sf/fpuv2_df. Added: clang/test/Driver/csky-mfpu.c Modified: clang/lib/Basic/Targets/CSKY.cpp clang/lib/Basic/Targets/CSKY.h clang/lib/Driver/ToolChains/Arch/CSKY.cpp llvm/lib/Support/CSKYTargetParser.cpp Removed: ################################################################################ diff --git a/clang/lib/Basic/Targets/CSKY.cpp b/clang/lib/Basic/Targets/CSKY.cpp index 40004da982594..adcffd90ae780 100644 --- a/clang/lib/Basic/Targets/CSKY.cpp +++ b/clang/lib/Basic/Targets/CSKY.cpp @@ -95,17 +95,36 @@ void CSKYTargetInfo::getTargetDefines(const LangOptions &Opts, } } +bool CSKYTargetInfo::hasFeature(StringRef Feature) const { + return llvm::StringSwitch<bool>(Feature) + .Case("hard-float", HardFloat) + .Case("hard-float-abi", HardFloatABI) + .Case("fpuv2_sf", FPUV2_SF) + .Case("fpuv2_df", FPUV2_DF) + .Case("fpuv3_sf", FPUV3_SF) + .Case("fpuv3_df", FPUV3_DF) + .Case("vdspv2", VDSPV2) + .Case("dspv2", DSPV2) + .Case("vdspv1", VDSPV1) + .Case("3e3r1", is3E3R1) + .Default(false); +} + bool CSKYTargetInfo::handleTargetFeatures(std::vector<std::string> &Features, DiagnosticsEngine &Diags) { - HardFloat = false; - VDSPV2 = false; - VDSPV1 = false; - DSPV2 = false; - is3E3R1 = false; - for (const auto &Feature : Features) { if (Feature == "+hard-float") HardFloat = true; + if (Feature == "+hard-float-abi") + HardFloatABI = true; + if (Feature == "+fpuv2_sf") + FPUV2_SF = true; + if (Feature == "+fpuv2_df") + FPUV2_DF = true; + if (Feature == "+fpuv3_sf") + FPUV3_SF = true; + if (Feature == "+fpuv3_df") + FPUV3_DF = true; if (Feature == "+vdspv2") VDSPV2 = true; if (Feature == "+dspv2") diff --git a/clang/lib/Basic/Targets/CSKY.h b/clang/lib/Basic/Targets/CSKY.h index 17e5f30d3cd87..7e932e7c86b1c 100644 --- a/clang/lib/Basic/Targets/CSKY.h +++ b/clang/lib/Basic/Targets/CSKY.h @@ -26,11 +26,16 @@ class LLVM_LIBRARY_VISIBILITY CSKYTargetInfo : public TargetInfo { llvm::CSKY::ArchKind Arch = llvm::CSKY::ArchKind::INVALID; std::string CPU; - bool HardFloat; - bool VDSPV2; - bool VDSPV1; - bool DSPV2; - bool is3E3R1; + bool HardFloat = false; + bool HardFloatABI = false; + bool FPUV2_SF = false; + bool FPUV2_DF = false; + bool FPUV3_SF = false; + bool FPUV3_DF = false; + bool VDSPV2 = false; + bool VDSPV1 = false; + bool DSPV2 = false; + bool is3E3R1 = false; public: CSKYTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts) @@ -81,6 +86,7 @@ class LLVM_LIBRARY_VISIBILITY CSKYTargetInfo : public TargetInfo { void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder) const override; + bool hasFeature(StringRef Feature) const override; bool handleTargetFeatures(std::vector<std::string> &Features, DiagnosticsEngine &Diags) override; diff --git a/clang/lib/Driver/ToolChains/Arch/CSKY.cpp b/clang/lib/Driver/ToolChains/Arch/CSKY.cpp index fb809956afa80..3a8f927856092 100644 --- a/clang/lib/Driver/ToolChains/Arch/CSKY.cpp +++ b/clang/lib/Driver/ToolChains/Arch/CSKY.cpp @@ -91,6 +91,22 @@ getCSKYFPUFeatures(const Driver &D, const Arg *A, const ArgList &Args, .Case("fpv3_hsf", llvm::CSKY::FK_FPV3_HSF) .Case("fpv3_sdf", llvm::CSKY::FK_FPV3_SDF) .Default(llvm::CSKY::FK_INVALID); + if (FPUID == llvm::CSKY::FK_INVALID) { + D.Diag(clang::diag::err_drv_clang_unsupported) << A->getAsString(Args); + return llvm::CSKY::FK_INVALID; + } + + auto RemoveTargetFPUFeature = + [&Features](ArrayRef<const char *> FPUFeatures) { + for (auto FPUFeature : FPUFeatures) { + auto it = std::find(Features.begin(), Features.end(), FPUFeature); + if (it != Features.end()) + Features.erase(it); + } + }; + + RemoveTargetFPUFeature({"+fpuv2_sf", "+fpuv2_df", "+fdivdu", "+fpuv3_hi", + "+fpuv3_hf", "+fpuv3_sf", "+fpuv3_df"}); if (!llvm::CSKY::getFPUFeatures(FPUID, Features)) { D.Diag(clang::diag::err_drv_clang_unsupported) << A->getAsString(Args); @@ -126,6 +142,8 @@ void csky::getCSKYTargetFeatures(const Driver &D, const llvm::Triple &Triple, return; } cpuName = A->getValue(); + if (archName.empty()) + archName = llvm::CSKY::getArchName(Kind); } if (archName.empty() && cpuName.empty()) { @@ -144,11 +162,9 @@ void csky::getCSKYTargetFeatures(const Driver &D, const llvm::Triple &Triple, Features.push_back("+hard-float"); } - if (const Arg *FPUArg = Args.getLastArg(options::OPT_mfpu_EQ)) - getCSKYFPUFeatures(D, FPUArg, Args, FPUArg->getValue(), Features); - else if (FloatABI != csky::FloatABI::Soft && archName.empty()) - llvm::CSKY::getFPUFeatures(llvm::CSKY::FK_AUTO, Features); - uint64_t Extension = llvm::CSKY::getDefaultExtensions(cpuName); llvm::CSKY::getExtensionFeatures(Extension, Features); + + if (const Arg *FPUArg = Args.getLastArg(options::OPT_mfpu_EQ)) + getCSKYFPUFeatures(D, FPUArg, Args, FPUArg->getValue(), Features); } diff --git a/clang/test/Driver/csky-mfpu.c b/clang/test/Driver/csky-mfpu.c new file mode 100644 index 0000000000000..092ac56de92e4 --- /dev/null +++ b/clang/test/Driver/csky-mfpu.c @@ -0,0 +1,93 @@ +// Test that diff erent values of -mfpu pick correct CSKY FPU target-feature(s). + +// RUN: %clang -target csky-unknown-linux %s -### -o %t.o 2>&1 \ +// RUN: | FileCheck --check-prefix=CHECK-DEFAULT %s +// CHECK-DEFAULT-NOT: "-target-feature" "+hard-float" +// CHECK-DEFAULT-NOT: "-target-feature" "+hard-float-abi" +// CHECK-DEFAULT-NOT: "-target-feature" "+fpuv2_sf" +// CHECK-DEFAULT-NOT: "-target-feature" "+fpuv2_df" + +// RUN: %clang -target csky-unknown-linux %s -mfpu=fpv2 -### -o %t.o 2>&1 \ +// RUN: | FileCheck --check-prefix=CHECK-FPV2 %s +// CHECK-FPV2-NOT: "-target-feature" "+hard-float" +// CHECK-FPV2-NOT: "-target-feature" "+hard-float-abi" +// CHECK-FPV2: "-target-feature" "+fpuv2_sf" +// CHECK-FPV2: "-target-feature" "+fpuv2_df" + +// RUN: %clang -target csky-unknown-linux %s -mfpu=fpv2 -mhard-float -### -o %t.o 2>&1 \ +// RUN: | FileCheck --check-prefix=CHECK-FPV2-HARD %s +// CHECK-FPV2-HARD: "-target-feature" "+hard-float-abi" +// CHECK-FPV2-HARD: "-target-feature" "+hard-float" +// CHECK-FPV2-HARD: "-target-feature" "+fpuv2_sf" +// CHECK-FPV2-HARD: "-target-feature" "+fpuv2_df" + +// RUN: %clang -target csky-unknown-linux %s -mfpu=fpv2_divd -mhard-float -### -o %t.o 2>&1 \ +// RUN: | FileCheck --check-prefix=CHECK-FPV2DIVD-HARD %s +// CHECK-FPV2DIVD-HARD: "-target-feature" "+hard-float-abi" +// CHECK-FPV2DIVD-HARD: "-target-feature" "+hard-float" +// CHECK-FPV2DIVD-HARD: "-target-feature" "+fpuv2_sf" +// CHECK-FPV2DIVD-HARD: "-target-feature" "+fpuv2_df" +// CHECK-FPV2DIVD-HARD: "-target-feature" "+fdivdu" + +// RUN: %clang -target csky-unknown-linux %s -mfpu=auto -mhard-float -### -o %t.o 2>&1 \ +// RUN: | FileCheck --check-prefix=CHECK-AUTO-HARD %s +// CHECK-AUTO-HARD: "-target-feature" "+hard-float-abi" +// CHECK-AUTO-HARD: "-target-feature" "+hard-float" +// CHECK-AUTO-HARD: "-target-feature" "+fpuv2_sf" +// CHECK-AUTO-HARD: "-target-feature" "+fpuv2_df" +// CHECK-AUTO-HARD: "-target-feature" "+fdivdu" + +// RUN: %clang -target csky-unknown-linux %s -mfpu=fpv2_sf -mhard-float -### -o %t.o 2>&1 \ +// RUN: | FileCheck --check-prefix=CHECK-FPV2SF-HARD %s +// CHECK-FPV2SF-HARD: "-target-feature" "+hard-float-abi" +// CHECK-FPV2SF-HARD: "-target-feature" "+hard-float" +// CHECK-FPV2SF-HARD: "-target-feature" "+fpuv2_sf" + +// RUN: %clang -target csky-unknown-linux %s -mfpu=fpv3 -mhard-float -### -o %t.o 2>&1 \ +// RUN: | FileCheck --check-prefix=CHECK-FPV3-HARD %s +// CHECK-FPV3-HARD: "-target-feature" "+hard-float-abi" +// CHECK-FPV3-HARD: "-target-feature" "+hard-float" +// CHECK-FPV3-HARD: "-target-feature" "+fpuv3_hf" +// CHECK-FPV3-HARD: "-target-feature" "+fpuv3_hi" +// CHECK-FPV3-HARD: "-target-feature" "+fpuv3_sf" +// CHECK-FPV3-HARD: "-target-feature" "+fpuv3_df" + +// RUN: %clang -target csky-unknown-linux %s -mfpu=fpv3_hf -mhard-float -### -o %t.o 2>&1 \ +// RUN: | FileCheck --check-prefix=CHECK-FPV3HF-HARD %s +// CHECK-FPV3HF-HARD: "-target-feature" "+hard-float-abi" +// CHECK-FPV3HF-HARD: "-target-feature" "+hard-float" +// CHECK-FPV3HF-HARD: "-target-feature" "+fpuv3_hf" +// CHECK-FPV3HF-HARD: "-target-feature" "+fpuv3_hi" + +// RUN: %clang -target csky-unknown-linux %s -mfpu=fpv3_hsf -mhard-float -### -o %t.o 2>&1 \ +// RUN: | FileCheck --check-prefix=CHECK-FPV3HSF-HARD %s +// CHECK-FPV3HSF-HARD: "-target-feature" "+hard-float-abi" +// CHECK-FPV3HSF-HARD: "-target-feature" "+hard-float" +// CHECK-FPV3HSF-HARD: "-target-feature" "+fpuv3_hf" +// CHECK-FPV3HSF-HARD: "-target-feature" "+fpuv3_hi" +// CHECK-FPV3HSF-HARD: "-target-feature" "+fpuv3_sf" + +// RUN: %clang -target csky-unknown-linux %s -mfpu=fpv3_sdf -mhard-float -### -o %t.o 2>&1 \ +// RUN: | FileCheck --check-prefix=CHECK-FPV3DF-HARD %s +// CHECK-FPV3DF-HARD: "-target-feature" "+hard-float-abi" +// CHECK-FPV3DF-HARD: "-target-feature" "+hard-float" +// CHECK-FPV3DF-HARD: "-target-feature" "+fpuv3_sf" +// CHECK-FPV3DF-HARD: "-target-feature" "+fpuv3_df" + +// RUN: %clang -target csky-unknown-linux %s -mcpu=c810 -mfpu=fpv3 -mhard-float -### -o %t.o 2>&1 \ +// RUN: | FileCheck --check-prefix=CHECK-FPV3-C810 %s +// CHECK-FPV3-C810: "-target-feature" "+hard-float-abi" +// CHECK-FPV3-C810: "-target-feature" "+hard-float" +// CHECK-FPV3-C810: "-target-feature" "+fpuv3_hf" +// CHECK-FPV3-C810: "-target-feature" "+fpuv3_hi" +// CHECK-FPV3-C810: "-target-feature" "+fpuv3_sf" +// CHECK-FPV3-C810: "-target-feature" "+fpuv3_df" +// CHECK-FPV3-C810-NOT: "-target-feature" "+fpuv2" + +// RUN: %clang -target csky-unknown-linux %s -mcpu=c860 -mfpu=fpv2 -mhard-float -### -o %t.o 2>&1 \ +// RUN: | FileCheck --check-prefix=CHECK-FPV2-C860 %s +// CHECK-FPV2-C860: "-target-feature" "+hard-float-abi" +// CHECK-FPV2-C860: "-target-feature" "+hard-float" +// CHECK-FPV2-C860: "-target-feature" "+fpuv2_sf" +// CHECK-FPV2-C860: "-target-feature" "+fpuv2_df" +// CHECK-FPV2-C860-NOT: "-target-feature" "+fpuv3" \ No newline at end of file diff --git a/llvm/lib/Support/CSKYTargetParser.cpp b/llvm/lib/Support/CSKYTargetParser.cpp index 2273b6dce0c75..7e9d2ca0428d7 100644 --- a/llvm/lib/Support/CSKYTargetParser.cpp +++ b/llvm/lib/Support/CSKYTargetParser.cpp @@ -43,14 +43,17 @@ bool CSKY::getFPUFeatures(CSKYFPUKind CSKYFPUKind, break; case FK_FPV3: Features.push_back("+fpuv3_hf"); + Features.push_back("+fpuv3_hi"); Features.push_back("+fpuv3_sf"); Features.push_back("+fpuv3_df"); break; case FK_FPV3_HF: Features.push_back("+fpuv3_hf"); + Features.push_back("+fpuv3_hi"); break; case FK_FPV3_HSF: Features.push_back("+fpuv3_hf"); + Features.push_back("+fpuv3_hi"); Features.push_back("+fpuv3_sf"); break; case FK_FPV3_SDF: _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits