From a577b1192b8dfc546afca827ddba87c006d9286a Mon Sep 17 00:00:00 2001 From: George Burgess IV Date: Fri, 14 Jun 2019 00:35:17 +0000 Subject: [PATCH] [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 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@363346 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Basic/Targets/ARM.cpp | 33 ++++++++++++--------- lib/Basic/Targets/ARM.h | 6 ++++ test/CodeGen/arm-soft-float-abi-filtering.c | 9 ++++++ 3 files changed, 34 insertions(+), 14 deletions(-) create mode 100644 test/CodeGen/arm-soft-float-abi-filtering.c diff --git a/lib/Basic/Targets/ARM.cpp b/lib/Basic/Targets/ARM.cpp index 549cb1f611..7ed2158a47 100644 --- a/lib/Basic/Targets/ARM.cpp +++ b/lib/Basic/Targets/ARM.cpp @@ -323,6 +323,8 @@ ARMTargetInfo::ARMTargetInfo(const llvm::Triple &Triple, 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 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); @@ -405,7 +416,8 @@ bool ARMTargetInfo::handleTargetFeatures(std::vector &Features, 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(std::vector &Features, 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(std::vector &Features, 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; } diff --git a/lib/Basic/Targets/ARM.h b/lib/Basic/Targets/ARM.h index e05ceab0dc..ce87a62659 100644 --- a/lib/Basic/Targets/ARM.h +++ b/lib/Basic/Targets/ARM.h @@ -124,6 +124,12 @@ public: 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; diff --git a/test/CodeGen/arm-soft-float-abi-filtering.c b/test/CodeGen/arm-soft-float-abi-filtering.c new file mode 100644 index 0000000000..cae0bbc521 --- /dev/null +++ b/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}} -- 2.50.1