From: Krzysztof Parzyszek Date: Tue, 30 Aug 2016 14:17:10 +0000 (+0000) Subject: [Hexagon] Use handleTargetFeaturesGroup to process target-specific features X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=0486e5ebb75f8965331b89f7e2a113ba2cc5eb89;p=clang [Hexagon] Use handleTargetFeaturesGroup to process target-specific features git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@280093 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Basic/Targets.cpp b/lib/Basic/Targets.cpp index 9ae22ffeed..8da7d02bb0 100644 --- a/lib/Basic/Targets.cpp +++ b/lib/Basic/Targets.cpp @@ -6180,6 +6180,9 @@ public: bool handleTargetFeatures(std::vector &Features, DiagnosticsEngine &Diags) override; + void setFeatureEnabled(llvm::StringMap &Features, StringRef Name, + bool Enabled) const override; + BuiltinVaListKind getBuiltinVaListKind() const override { return TargetInfo::CharPtrBuiltinVaList; } @@ -6248,6 +6251,17 @@ void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts, } } +bool HexagonTargetInfo::initFeatureMap(llvm::StringMap &Features, + DiagnosticsEngine &Diags, StringRef CPU, + const std::vector &FeaturesVec) const { + // Default for v60: -hvx, -hvx-double. + Features["hvx"] = false; + Features["hvx-double"] = false; + Features["long-calls"] = false; + + return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec); +} + bool HexagonTargetInfo::handleTargetFeatures(std::vector &Features, DiagnosticsEngine &Diags) { for (auto &F : Features) { @@ -6262,19 +6276,22 @@ bool HexagonTargetInfo::handleTargetFeatures(std::vector &Features, if (F == "+long-calls") UseLongCalls = true; + else if (F == "-long-calls") + UseLongCalls = false; } return true; } -bool HexagonTargetInfo::initFeatureMap(llvm::StringMap &Features, - DiagnosticsEngine &Diags, StringRef CPU, - const std::vector &FeaturesVec) const { - // Default for v60: -hvx, -hvx-double. - Features["hvx"] = false; - Features["hvx-double"] = false; - Features["long-calls"] = false; - - return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec); +void HexagonTargetInfo::setFeatureEnabled(llvm::StringMap &Features, + StringRef Name, bool Enabled) const { + if (Enabled) { + if (Name == "hvx-double") + Features["hvx"] = true; + } else { + if (Name == "hvx") + Features["hvx-double"] = false; + } + Features[Name] = Enabled; } const char *const HexagonTargetInfo::GCCRegNames[] = { diff --git a/lib/Driver/Tools.cpp b/lib/Driver/Tools.cpp index e3e0a61090..f4dd61aed1 100644 --- a/lib/Driver/Tools.cpp +++ b/lib/Driver/Tools.cpp @@ -2484,32 +2484,16 @@ static void getAArch64TargetFeatures(const Driver &D, const ArgList &Args, static void getHexagonTargetFeatures(const ArgList &Args, std::vector &Features) { - bool HasHVX = false, HasHVXD = false, UseLongCalls = false; - - // FIXME: This should be able to use handleTargetFeaturesGroup except it is - // doing dependent option handling here rather than in initFeatureMap or a - // similar handler. - for (auto &A : Args) { - auto &Opt = A->getOption(); - if (Opt.matches(options::OPT_mhexagon_hvx)) - HasHVX = true; - else if (Opt.matches(options::OPT_mno_hexagon_hvx)) - HasHVXD = HasHVX = false; - else if (Opt.matches(options::OPT_mhexagon_hvx_double)) - HasHVXD = HasHVX = true; - else if (Opt.matches(options::OPT_mno_hexagon_hvx_double)) - HasHVXD = false; - else if (Opt.matches(options::OPT_mlong_calls)) + handleTargetFeaturesGroup(Args, Features, + options::OPT_m_hexagon_Features_Group); + + bool UseLongCalls = false; + if (Arg *A = Args.getLastArg(options::OPT_mlong_calls, + options::OPT_mno_long_calls)) { + if (A->getOption().matches(options::OPT_mlong_calls)) UseLongCalls = true; - else if (Opt.matches(options::OPT_mno_long_calls)) - UseLongCalls = false; - else - continue; - A->claim(); } - Features.push_back(HasHVX ? "+hvx" : "-hvx"); - Features.push_back(HasHVXD ? "+hvx-double" : "-hvx-double"); Features.push_back(UseLongCalls ? "+long-calls" : "-long-calls"); }