Author: gbiv Date: Thu Jun 13 17:35:17 2019 New Revision: 363346 URL: http://llvm.org/viewvc/llvm-project?rev=363346&view=rev Log: [Targets] Move soft-float-abi filtering to `initFeatureMap`
ARM has a special target feature called soft-float-abi. This feature is special, since we get it passed to us explicitly in the frontend, but filter it out before it can land in any target feature strings in LLVM IR. __attribute__((target(""))) doesn't quite filter these features out properly, so today, we get warnings about soft-float-abi being an unknown feature from the backend. This CL has us filter soft-float-abi out at a slightly different point, so we don't end up passing these invalid features to the backend. Differential Revision: https://reviews.llvm.org/D61750 Added: cfe/trunk/test/CodeGen/arm-soft-float-abi-filtering.c Modified: cfe/trunk/lib/Basic/Targets/ARM.cpp cfe/trunk/lib/Basic/Targets/ARM.h Modified: cfe/trunk/lib/Basic/Targets/ARM.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Basic/Targets/ARM.cpp?rev=363346&r1=363345&r2=363346&view=diff ============================================================================== --- cfe/trunk/lib/Basic/Targets/ARM.cpp (original) +++ cfe/trunk/lib/Basic/Targets/ARM.cpp Thu Jun 13 17:35:17 2019 @@ -323,6 +323,8 @@ ARMTargetInfo::ARMTargetInfo(const llvm: this->MCountName = Opts.EABIVersion == llvm::EABI::GNU ? "\01__gnu_mcount_nc" : "\01mcount"; + + SoftFloatABI = llvm::is_contained(Opts.FeaturesAsWritten, "+soft-float-abi"); } StringRef ARMTargetInfo::getABI() const { return ABI; } @@ -385,12 +387,21 @@ bool ARMTargetInfo::initFeatureMap( // Convert user-provided arm and thumb GNU target attributes to // [-|+]thumb-mode target features respectively. - std::vector<std::string> UpdatedFeaturesVec(FeaturesVec); - for (auto &Feature : UpdatedFeaturesVec) { - if (Feature.compare("+arm") == 0) - Feature = "-thumb-mode"; - else if (Feature.compare("+thumb") == 0) - Feature = "+thumb-mode"; + std::vector<std::string> UpdatedFeaturesVec; + for (const auto &Feature : FeaturesVec) { + // Skip soft-float-abi; it's something we only use to initialize a bit of + // class state, and is otherwise unrecognized. + if (Feature == "+soft-float-abi") + continue; + + StringRef FixedFeature; + if (Feature == "+arm") + FixedFeature = "-thumb-mode"; + else if (Feature == "+thumb") + FixedFeature = "+thumb-mode"; + else + FixedFeature = Feature; + UpdatedFeaturesVec.push_back(FixedFeature.str()); } return TargetInfo::initFeatureMap(Features, Diags, CPU, UpdatedFeaturesVec); @@ -405,7 +416,8 @@ bool ARMTargetInfo::handleTargetFeatures Crypto = 0; DSP = 0; Unaligned = 1; - SoftFloat = SoftFloatABI = false; + SoftFloat = false; + // Note that SoftFloatABI is initialized in our constructor. HWDiv = 0; DotProd = 0; HasFloat16 = true; @@ -415,8 +427,6 @@ bool ARMTargetInfo::handleTargetFeatures for (const auto &Feature : Features) { if (Feature == "+soft-float") { SoftFloat = true; - } else if (Feature == "+soft-float-abi") { - SoftFloatABI = true; } else if (Feature == "+vfp2sp" || Feature == "+vfp2d16sp" || Feature == "+vfp2" || Feature == "+vfp2d16") { FPU |= VFP2FPU; @@ -510,11 +520,6 @@ bool ARMTargetInfo::handleTargetFeatures else if (FPMath == FP_VFP) Features.push_back("-neonfp"); - // Remove front-end specific options which the backend handles differently. - auto Feature = llvm::find(Features, "+soft-float-abi"); - if (Feature != Features.end()) - Features.erase(Feature); - return true; } Modified: cfe/trunk/lib/Basic/Targets/ARM.h URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Basic/Targets/ARM.h?rev=363346&r1=363345&r2=363346&view=diff ============================================================================== --- cfe/trunk/lib/Basic/Targets/ARM.h (original) +++ cfe/trunk/lib/Basic/Targets/ARM.h Thu Jun 13 17:35:17 2019 @@ -124,6 +124,12 @@ public: StringRef CPU, const std::vector<std::string> &FeaturesVec) const override; + bool isValidFeatureName(StringRef Feature) const override { + // We pass soft-float-abi in as a -target-feature, but the backend figures + // this out through other means. + return Feature != "soft-float-abi"; + } + bool handleTargetFeatures(std::vector<std::string> &Features, DiagnosticsEngine &Diags) override; Added: cfe/trunk/test/CodeGen/arm-soft-float-abi-filtering.c URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/arm-soft-float-abi-filtering.c?rev=363346&view=auto ============================================================================== --- cfe/trunk/test/CodeGen/arm-soft-float-abi-filtering.c (added) +++ cfe/trunk/test/CodeGen/arm-soft-float-abi-filtering.c Thu Jun 13 17:35:17 2019 @@ -0,0 +1,9 @@ +// REQUIRES: arm-registered-target +// RUN: %clang_cc1 -emit-llvm -o - -triple arm-none-linux-gnueabi -target-feature "+soft-float-abi" %s | FileCheck %s +// RUN: %clang_cc1 -verify -triple arm-none-linux-gnueabi -target-feature "+soft-float-abi" %s + +// CHECK-NOT: +soft-float-abi + +void foo() {} +__attribute__((target("crc"))) void bar() {} +__attribute__((target("soft-float-abi"))) void baz() {} // expected-warning{{unsupported 'soft-float-abi' in the 'target' attribute string}} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits