https://github.com/fhossein-quic updated https://github.com/llvm/llvm-project/pull/182073
>From 6b5d307a6f538ad728ccde333aef7f6e33c82417 Mon Sep 17 00:00:00 2001 From: Sumanth Gundapaneni <[email protected]> Date: Mon, 10 Jul 2023 14:56:37 -0700 Subject: [PATCH] Refactor HVX target feature addition(NFC) Refactor Hexagon HVX target-feature handling by centralizing HVX version/enable logic and simplifying feature emission. Co-authored-by: Sumanth Gundapaneni <[email protected]> --- clang/lib/Driver/ToolChains/Hexagon.cpp | 70 +++++++++++++++---------- clang/lib/Driver/ToolChains/Hexagon.h | 2 + clang/test/Driver/hexagon-hvx.c | 4 ++ 3 files changed, 47 insertions(+), 29 deletions(-) diff --git a/clang/lib/Driver/ToolChains/Hexagon.cpp b/clang/lib/Driver/ToolChains/Hexagon.cpp index 084f51721315c..9ff6f46307ca5 100644 --- a/clang/lib/Driver/ToolChains/Hexagon.cpp +++ b/clang/lib/Driver/ToolChains/Hexagon.cpp @@ -64,35 +64,16 @@ static void handleHVXTargetFeatures(const Driver &D, const ArgList &Args, return "-" + S.str(); }; - // Drop tiny core suffix for HVX version. - std::string HvxVer = - (Cpu.back() == 'T' || Cpu.back() == 't' ? Cpu.drop_back(1) : Cpu).str(); HasHVX = false; - - // Handle -mhvx, -mhvx=, -mno-hvx. If versioned and versionless flags - // are both present, the last one wins. - Arg *HvxEnablingArg = - Args.getLastArg(options::OPT_mhexagon_hvx, options::OPT_mhexagon_hvx_EQ, - options::OPT_mno_hexagon_hvx); - if (HvxEnablingArg) { - if (HvxEnablingArg->getOption().matches(options::OPT_mno_hexagon_hvx)) - HvxEnablingArg = nullptr; - } - - if (HvxEnablingArg) { - // If -mhvx[=] was given, it takes precedence. - if (Arg *A = Args.getLastArg(options::OPT_mhexagon_hvx, - options::OPT_mhexagon_hvx_EQ)) { - // If the version was given, set HvxVer. Otherwise HvxVer - // will remain equal to the CPU version. - if (A->getOption().matches(options::OPT_mhexagon_hvx_EQ)) - HvxVer = StringRef(A->getValue()).lower(); - } - HasHVX = true; + std::string HvxVer = + toolchains::HexagonToolChain::GetHVXVersion(Args, HasHVX); + if (HasHVX) Features.push_back(makeFeature(Twine("hvx") + HvxVer, true)); - } else if (Arg *A = Args.getLastArg(options::OPT_mno_hexagon_hvx)) { - // If there was an explicit -mno-hvx, add -hvx to target features. - Features.push_back(makeFeature(A->getOption().getName(), false)); + else { + if (Arg *A = Args.getLastArg(options::OPT_mno_hexagon_hvx)) { + // If there was an explicit -mno-hvx, add -hvx to target features. + Features.push_back(makeFeature(A->getOption().getName(), false)); + } } StringRef HvxLen = getDefaultHvxLength(HvxVer); @@ -111,9 +92,11 @@ static void handleHVXTargetFeatures(const Driver &D, const ArgList &Args, Features.push_back(L); } - unsigned HvxVerNum; + unsigned HvxVerNum = 0; // getAsInteger returns 'true' on error. - if (StringRef(HvxVer).drop_front(1).getAsInteger(10, HvxVerNum)) + StringRef HvxVerRef(HvxVer); + if (HasHVX && (HvxVerRef.size() <= 1 || + HvxVerRef.drop_front(1).getAsInteger(10, HvxVerNum))) HvxVerNum = 0; // Handle HVX floating point flags. @@ -812,3 +795,32 @@ StringRef HexagonToolChain::GetTargetCPUVersion(const ArgList &Args) { CPU.consume_front("hexagon"); return CPU; } + +std::string HexagonToolChain::GetHVXVersion(const ArgList &Args, bool &HasHVX) { + HasHVX = false; + + // Handle -mh[v]x= and -mno-hvx. If versioned and versionless flags + // are both present, the last one wins. + Arg *HvxEnablingArg = + Args.getLastArg(options::OPT_mhexagon_hvx, options::OPT_mhexagon_hvx_EQ, + options::OPT_mno_hexagon_hvx); + if (!HvxEnablingArg || + HvxEnablingArg->getOption().matches(options::OPT_mno_hexagon_hvx)) + return ""; + + HasHVX = true; + + StringRef Cpu(toolchains::HexagonToolChain::GetTargetCPUVersion(Args)); + std::string HvxVer; + if (!Cpu.empty() && (Cpu.back() == 'T' || Cpu.back() == 't')) + HvxVer = Cpu.drop_back(1).str(); + else + HvxVer = Cpu.str(); + + if (HvxEnablingArg->getOption().matches(options::OPT_mhexagon_hvx_EQ)) + HvxVer = StringRef(HvxEnablingArg->getValue()).lower(); + + return HvxVer; +} + +// End Hexagon diff --git a/clang/lib/Driver/ToolChains/Hexagon.h b/clang/lib/Driver/ToolChains/Hexagon.h index 033d9b48cae10..2c9e99b48c996 100644 --- a/clang/lib/Driver/ToolChains/Hexagon.h +++ b/clang/lib/Driver/ToolChains/Hexagon.h @@ -110,6 +110,8 @@ class LLVM_LIBRARY_VISIBILITY HexagonToolChain : public Linux { static std::optional<unsigned> getSmallDataThreshold(const llvm::opt::ArgList &Args); + static std::string GetHVXVersion(const llvm::opt::ArgList &Args, + bool &HasHVX); }; } // end namespace toolchains diff --git a/clang/test/Driver/hexagon-hvx.c b/clang/test/Driver/hexagon-hvx.c index d21d88701ba5e..9a2363ee42488 100644 --- a/clang/test/Driver/hexagon-hvx.c +++ b/clang/test/Driver/hexagon-hvx.c @@ -34,6 +34,8 @@ // RUN: 2>&1 | FileCheck -check-prefix=CHECK-HVX-OFF %s // RUN: %clang -c %s -### --target=hexagon-unknown-elf -mv73 \ // RUN: 2>&1 | FileCheck -check-prefix=CHECK-HVX-OFF %s +// RUN: %clang -c %s -### --target=hexagon-unknown-elf -mv73 -mno-hvx \ +// RUN: 2>&1 | FileCheck -check-prefix=CHECK-HVX-OFF %s // Infer HVX version from flag: @@ -247,6 +249,8 @@ // RUN: 2>&1 | FileCheck -check-prefix=CHECK-NEEDS-HVX %s // RUN: not %clang -c %s -### --target=hexagon-unknown-elf -mv69 -mhvx-ieee-fp \ // RUN: 2>&1 | FileCheck -check-prefix=CHECK-NEEDS-HVX %s +// RUN: not %clang -c %s -### --target=hexagon-unknown-elf -mv73 -mno-hvx -mhvx-qfloat \ +// RUN: 2>&1 | FileCheck -check-prefix=CHECK-NEEDS-HVX %s // Invalid HVX length: _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
