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

Reply via email to