Index: clang/lib/Basic/Targets/ARM.h =================================================================== --- clang/lib/Basic/Targets/ARM.h +++ clang/lib/Basic/Targets/ARM.h @@ -116,6 +116,12 @@ StringRef CPU, const std::vector &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 &Features, DiagnosticsEngine &Diags) override; Index: clang/lib/Basic/Targets/ARM.cpp =================================================================== --- clang/lib/Basic/Targets/ARM.cpp +++ clang/lib/Basic/Targets/ARM.cpp @@ -313,6 +313,8 @@ 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; } @@ -375,12 +377,21 @@ // Convert user-provided arm and thumb GNU target attributes to // [-|+]thumb-mode target features respectively. - std::vector 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 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); @@ -394,7 +405,8 @@ 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; @@ -405,8 +417,6 @@ for (const auto &Feature : Features) { if (Feature == "+soft-float") { SoftFloat = true; - } else if (Feature == "+soft-float-abi") { - SoftFloatABI = true; } else if (Feature == "+vfp2") { FPU |= VFP2FPU; HW_FP |= HW_FP_SP | HW_FP_DP; @@ -480,11 +490,6 @@ 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; } Index: clang/test/CodeGen/arm-soft-float-abi-filtering.c =================================================================== --- /dev/null +++ clang/test/CodeGen/arm-soft-float-abi-filtering.c @@ -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}}