[clang] [Clang][ARM] support arm target attribute, and warning for bad typo (PR #74812)

2023-12-16 Thread via cfe-commits

https://github.com/hstk30-hw updated 
https://github.com/llvm/llvm-project/pull/74812

>From dc88d97d00f389b46f51c19a22c17397e1e89b7f Mon Sep 17 00:00:00 2001
From: hstk30-hw 
Date: Fri, 8 Dec 2023 14:29:33 +0800
Subject: [PATCH] feat: support arm target attribute, and warning for bad typo

---
 clang/lib/Basic/CMakeLists.txt|  1 +
 clang/lib/Basic/Targets/AArch64.cpp   |  6 +-
 clang/lib/Basic/Targets/ARM.cpp   | 87 +++
 clang/lib/Basic/Targets/ARM.h |  2 +
 clang/lib/Sema/SemaDeclAttr.cpp   |  3 +
 clang/test/CodeGen/arm-targetattr.c   | 13 +++
 .../arm-ignore-branch-protection-option.c |  4 +-
 .../Sema/arm-branch-protection-attr-warn.c| 10 +--
 clang/test/Sema/arm-branch-protection.c   | 32 +++
 clang/test/Sema/attr-target.c |  8 ++
 10 files changed, 142 insertions(+), 24 deletions(-)
 create mode 100644 clang/test/CodeGen/arm-targetattr.c

diff --git a/clang/lib/Basic/CMakeLists.txt b/clang/lib/Basic/CMakeLists.txt
index 2e218ba7c84cca..89c2713c93dc76 100644
--- a/clang/lib/Basic/CMakeLists.txt
+++ b/clang/lib/Basic/CMakeLists.txt
@@ -134,5 +134,6 @@ add_clang_library(clangBasic
 
 target_link_libraries(clangBasic
   PRIVATE
+  clangAST
   ${LLVM_ATOMIC_LIB}
 )
diff --git a/clang/lib/Basic/Targets/AArch64.cpp 
b/clang/lib/Basic/Targets/AArch64.cpp
index def16c032c869e..66f0c0e159c2ae 100644
--- a/clang/lib/Basic/Targets/AArch64.cpp
+++ b/clang/lib/Basic/Targets/AArch64.cpp
@@ -1085,13 +1085,17 @@ ParsedTargetAttr 
AArch64TargetInfo::parseTargetAttr(StringRef Features) const {
   FoundArch = true;
   std::pair Split =
   Feature.split("=").second.trim().split("+");
+  if (Split.first == "")
+continue;
   const std::optional AI =
   llvm::AArch64::parseArch(Split.first);
 
   // Parse the architecture version, adding the required features to
   // Ret.Features.
-  if (!AI)
+  if (!AI) {
+Ret.Features.push_back("+UNKNOWN");
 continue;
+  }
   Ret.Features.push_back(AI->ArchFeature.str());
   // Add any extra features, after the +
   SplitAndAddFeatures(Split.second, Ret.Features);
diff --git a/clang/lib/Basic/Targets/ARM.cpp b/clang/lib/Basic/Targets/ARM.cpp
index ce7e4d4639ceac..7ed64f4f44a9b5 100644
--- a/clang/lib/Basic/Targets/ARM.cpp
+++ b/clang/lib/Basic/Targets/ARM.cpp
@@ -11,6 +11,7 @@
 
//===--===//
 
 #include "ARM.h"
+#include "clang/AST/Attr.h"
 #include "clang/Basic/Builtins.h"
 #include "clang/Basic/Diagnostic.h"
 #include "clang/Basic/TargetBuiltins.h"
@@ -639,6 +640,92 @@ bool 
ARMTargetInfo::handleTargetFeatures(std::vector ,
   return true;
 }
 
+// Parse ARM Target attributes, which are a comma separated list of:
+//  "arch=" - parsed to features as per -march=..
+//  "cpu=" - parsed to features as per -mcpu=.., with CPU set to 
+//  "tune=" - TuneCPU set to 
+//  "feature", "no-feature" - Add (or remove) feature.
+//  "+feature", "+nofeature" - Add (or remove) feature.
+ParsedTargetAttr ARMTargetInfo::parseTargetAttr(StringRef Features) const {
+  ParsedTargetAttr Ret;
+  if (Features == "default")
+return Ret;
+  SmallVector AttrFeatures;
+  Features.split(AttrFeatures, ",");
+  bool FoundArch = false;
+
+  auto SplitAndAddFeatures = [](StringRef FeatString,
+std::vector ) {
+SmallVector SplitFeatures;
+FeatString.split(SplitFeatures, StringRef("+"), -1, false);
+for (StringRef Feature : SplitFeatures) {
+  StringRef FeatureName = llvm::ARM::getArchExtFeature(Feature);
+  if (!FeatureName.empty())
+Features.push_back(FeatureName.str());
+  else
+// Pushing the original feature string to give a sema error later on
+// when they get checked.
+Features.push_back(Feature.str());
+}
+  };
+
+  for (auto  : AttrFeatures) {
+Feature = Feature.trim();
+if (Feature.startswith("fpmath="))
+  continue;
+
+if (Feature.startswith("branch-protection=")) {
+  Ret.BranchProtection = Feature.split('=').second.trim();
+  continue;
+}
+
+if (Feature.startswith("arch=")) {
+  if (FoundArch)
+Ret.Duplicate = "arch=";
+  FoundArch = true;
+  std::pair Split =
+  Feature.split("=").second.trim().split("+");
+  if (Split.first == "")
+continue;
+  llvm::ARM::ArchKind ArchKind = llvm::ARM::parseArch(Split.first);
+
+  // Parse the architecture version, adding the required features to
+  // Ret.Features.
+  std::vector FeatureStrs;
+  if (ArchKind == llvm::ARM::ArchKind::INVALID) {
+Ret.Features.push_back("+UNKNOWN");
+continue;
+  }
+  std::string ArchFeature = ("+" + llvm::ARM::getArchName(ArchKind)).str();
+  Ret.Features.push_back(ArchFeature);
+  // Add any extra features, after the +
+  

[clang] [Clang][ARM] support arm target attribute, and warning for bad typo (PR #74812)

2023-12-14 Thread David Spickett via cfe-commits

DavidSpickett wrote:

I was mistaken about the `target_link_libraries`, that's what `clangBasic` 
links to not `clangAST`.

It's possible that `clangBasic` now needs to depend on `clangAST`, assuming 
cmake and the linker are ok with that.

https://github.com/llvm/llvm-project/pull/74812
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang][ARM] support arm target attribute, and warning for bad typo (PR #74812)

2023-12-14 Thread David Spickett via cfe-commits

DavidSpickett wrote:

Also it seems that `clangAST` links to `clangBasic` but it doesn't `DEPENDS` on 
them? Not sure what that is trying to achieve.

https://github.com/llvm/llvm-project/pull/74812
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang][ARM] support arm target attribute, and warning for bad typo (PR #74812)

2023-12-14 Thread David Spickett via cfe-commits

DavidSpickett wrote:

Not so sure about that:
```
LINK: command "C:\BuildTools\VC\Tools\MSVC\14.29.30133\bin\Hostx64\x64\link.exe 
/nologo 
tools\clang\tools\clang-format\CMakeFiles\clang-format.dir\ClangFormat.cpp.obj 
tools\clang\tools\clang-format\CMakeFiles\clang-format.dir\C_\ws\src\llvm\resources\windows_version_resource.rc.res
 /out:bin\clang-format.exe /implib:lib\clang-format.lib 
/pdb:bin\clang-format.pdb /version:0.0 /machine:x64 /STACK:1000 
/INCREMENTAL:NO /subsystem:console lib\LLVMSupport.lib lib\clangBasic.lib 
lib\clangFormat.lib lib\clangRewrite.lib lib\clangToolingCore.lib 
lib\clangToolingInclusions.lib lib\clangToolingCore.lib lib\clangRewrite.lib 
lib\clangLex.lib lib\clangBasic.lib lib\LLVMFrontendOpenMP.lib 
lib\LLVMScalarOpts.lib lib\LLVMAggressiveInstCombine.lib 
lib\LLVMInstCombine.lib lib\LLVMFrontendOffloading.lib 
lib\LLVMTransformUtils.lib lib\LLVMAnalysis.lib lib\LLVMProfileData.lib 
lib\LLVMSymbolize.lib lib\LLVMDebugInfoPDB.lib C:\BuildTools\DIA 
SDK\lib\amd64\diaguids.lib lib\LLVMDebugInfoMSF.lib lib\LLVMDebugInfoBTF.lib 
lib\LLVMDebugInfoDWARF.lib lib\LLVMObject.lib lib\LLVMIRReader.lib 
lib\LLVMBitReader.lib lib\LLVMAsmParser.lib lib\LLVMCore.lib 
lib\LLVMRemarks.lib lib\LLVMBitstreamReader.lib lib\LLVMMCParser.lib 
lib\LLVMMC.lib lib\LLVMDebugInfoCodeView.lib lib\LLVMTextAPI.lib 
lib\LLVMBinaryFormat.lib lib\LLVMTargetParser.lib lib\LLVMSupport.lib psapi.lib 
shell32.lib ole32.lib uuid.lib advapi32.lib WS2_32.lib delayimp.lib 
-delayload:shell32.dll -delayload:ole32.dll lib\LLVMDemangle.lib kernel32.lib 
user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib 
comdlg32.lib advapi32.lib /MANIFEST 
/MANIFESTFILE:bin\clang-format.exe.manifest" failed (exit code 1120) with the 
following output:
clangBasic.lib(ARM.cpp.obj) : error LNK2019: unresolved external symbol 
"private: void __cdecl clang::APValue::DestroyDataAndMakeUninit(void)" 
(?DestroyDataAndMakeUninit@APValue@clang@@AEAAXXZ) referenced in function 
"public: __cdecl clang::APValue::~APValue(void)" (??1APValue@clang@@QEAA@XZ)
bin\clang-format.exe : fatal error LNK1120: 1 unresolved externals
```

```
clangBasic.lib(ARM.cpp.obj) : error LNK2019: unresolved external symbol 
"private: void __cdecl clang::APValue::DestroyDataAndMakeUninit(void)"
```
Which is the file you're modifying.

I see that you have added:
```
#include "clang/AST/Attr.h"
```
`DestroyDataAndMakeUninit` is in `clang/lib/AST/APValue.cpp`, which is built 
into the library `clangAST`.

`clang/lib/Basic/Targets/ARM.cpp` is built into `clangBasic` which does not 
depend on `clangAST`, but does `target_link_libraries` for it. I'm not sure of 
the difference there, why do one or the other. (clang/lib/Basic/CMakeLists.txt)

(if you want to know what library a cpp file ends up in, look in the same 
folder for a CMakeLists.txt, that usually has the name, one folder up if not 
and so on)

So I guess that on Linux, `target_link_libraries` does what's required but on 
Windows it does not.

https://github.com/llvm/llvm-project/pull/74812
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang][ARM] support arm target attribute, and warning for bad typo (PR #74812)

2023-12-14 Thread via cfe-commits

hstk30-hw wrote:

CI fail in `ninja check-clang` build  `bin/clang-format.exe` in windows, it has 
nothing about my code. @gkistanova 

https://github.com/llvm/llvm-project/pull/74812
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang][ARM] support arm target attribute, and warning for bad typo (PR #74812)

2023-12-14 Thread via cfe-commits

https://github.com/hstk30-hw updated 
https://github.com/llvm/llvm-project/pull/74812

>From f9c6d46e73b612c261db5fdfebf49bb28003cf0d Mon Sep 17 00:00:00 2001
From: hstk30-hw 
Date: Fri, 8 Dec 2023 14:29:33 +0800
Subject: [PATCH] feat: support arm target attribute, and warning for bad typo

---
 clang/lib/Basic/Targets/AArch64.cpp   |  6 +-
 clang/lib/Basic/Targets/ARM.cpp   | 87 +++
 clang/lib/Basic/Targets/ARM.h |  2 +
 clang/lib/Sema/SemaDeclAttr.cpp   |  3 +
 clang/test/CodeGen/arm-targetattr.c   | 13 +++
 .../arm-ignore-branch-protection-option.c |  4 +-
 .../Sema/arm-branch-protection-attr-warn.c| 10 +--
 clang/test/Sema/arm-branch-protection.c   | 32 +++
 clang/test/Sema/attr-target.c |  8 ++
 9 files changed, 141 insertions(+), 24 deletions(-)
 create mode 100644 clang/test/CodeGen/arm-targetattr.c

diff --git a/clang/lib/Basic/Targets/AArch64.cpp 
b/clang/lib/Basic/Targets/AArch64.cpp
index def16c032c869e..66f0c0e159c2ae 100644
--- a/clang/lib/Basic/Targets/AArch64.cpp
+++ b/clang/lib/Basic/Targets/AArch64.cpp
@@ -1085,13 +1085,17 @@ ParsedTargetAttr 
AArch64TargetInfo::parseTargetAttr(StringRef Features) const {
   FoundArch = true;
   std::pair Split =
   Feature.split("=").second.trim().split("+");
+  if (Split.first == "")
+continue;
   const std::optional AI =
   llvm::AArch64::parseArch(Split.first);
 
   // Parse the architecture version, adding the required features to
   // Ret.Features.
-  if (!AI)
+  if (!AI) {
+Ret.Features.push_back("+UNKNOWN");
 continue;
+  }
   Ret.Features.push_back(AI->ArchFeature.str());
   // Add any extra features, after the +
   SplitAndAddFeatures(Split.second, Ret.Features);
diff --git a/clang/lib/Basic/Targets/ARM.cpp b/clang/lib/Basic/Targets/ARM.cpp
index ce7e4d4639ceac..7ed64f4f44a9b5 100644
--- a/clang/lib/Basic/Targets/ARM.cpp
+++ b/clang/lib/Basic/Targets/ARM.cpp
@@ -11,6 +11,7 @@
 
//===--===//
 
 #include "ARM.h"
+#include "clang/AST/Attr.h"
 #include "clang/Basic/Builtins.h"
 #include "clang/Basic/Diagnostic.h"
 #include "clang/Basic/TargetBuiltins.h"
@@ -639,6 +640,92 @@ bool 
ARMTargetInfo::handleTargetFeatures(std::vector ,
   return true;
 }
 
+// Parse ARM Target attributes, which are a comma separated list of:
+//  "arch=" - parsed to features as per -march=..
+//  "cpu=" - parsed to features as per -mcpu=.., with CPU set to 
+//  "tune=" - TuneCPU set to 
+//  "feature", "no-feature" - Add (or remove) feature.
+//  "+feature", "+nofeature" - Add (or remove) feature.
+ParsedTargetAttr ARMTargetInfo::parseTargetAttr(StringRef Features) const {
+  ParsedTargetAttr Ret;
+  if (Features == "default")
+return Ret;
+  SmallVector AttrFeatures;
+  Features.split(AttrFeatures, ",");
+  bool FoundArch = false;
+
+  auto SplitAndAddFeatures = [](StringRef FeatString,
+std::vector ) {
+SmallVector SplitFeatures;
+FeatString.split(SplitFeatures, StringRef("+"), -1, false);
+for (StringRef Feature : SplitFeatures) {
+  StringRef FeatureName = llvm::ARM::getArchExtFeature(Feature);
+  if (!FeatureName.empty())
+Features.push_back(FeatureName.str());
+  else
+// Pushing the original feature string to give a sema error later on
+// when they get checked.
+Features.push_back(Feature.str());
+}
+  };
+
+  for (auto  : AttrFeatures) {
+Feature = Feature.trim();
+if (Feature.startswith("fpmath="))
+  continue;
+
+if (Feature.startswith("branch-protection=")) {
+  Ret.BranchProtection = Feature.split('=').second.trim();
+  continue;
+}
+
+if (Feature.startswith("arch=")) {
+  if (FoundArch)
+Ret.Duplicate = "arch=";
+  FoundArch = true;
+  std::pair Split =
+  Feature.split("=").second.trim().split("+");
+  if (Split.first == "")
+continue;
+  llvm::ARM::ArchKind ArchKind = llvm::ARM::parseArch(Split.first);
+
+  // Parse the architecture version, adding the required features to
+  // Ret.Features.
+  std::vector FeatureStrs;
+  if (ArchKind == llvm::ARM::ArchKind::INVALID) {
+Ret.Features.push_back("+UNKNOWN");
+continue;
+  }
+  std::string ArchFeature = ("+" + llvm::ARM::getArchName(ArchKind)).str();
+  Ret.Features.push_back(ArchFeature);
+  // Add any extra features, after the +
+  SplitAndAddFeatures(Split.second, Ret.Features);
+} else if (Feature.startswith("cpu=")) {
+  if (!Ret.CPU.empty())
+Ret.Duplicate = "cpu=";
+  else {
+// Split the cpu string into "cpu=", "cortex-a710" and any remaining
+// "+feat" features.
+std::pair Split =
+Feature.split("=").second.trim().split("+");
+Ret.CPU = Split.first;
+

[clang] [Clang][ARM] support arm target attribute, and warning for bad typo (PR #74812)

2023-12-13 Thread via cfe-commits

https://github.com/hstk30-hw updated 
https://github.com/llvm/llvm-project/pull/74812

>From b6595d617c6ac0f3e402aeb782eeeb78f90c5fb1 Mon Sep 17 00:00:00 2001
From: hstk30-hw 
Date: Fri, 8 Dec 2023 14:29:33 +0800
Subject: [PATCH] feat: support arm target attribute, and warning for bad typo

---
 clang/lib/Basic/Targets/AArch64.cpp   |  6 +-
 clang/lib/Basic/Targets/ARM.cpp   | 87 +++
 clang/lib/Basic/Targets/ARM.h |  2 +
 clang/lib/Sema/SemaDeclAttr.cpp   |  3 +
 clang/test/CodeGen/arm-targetattr.c   | 13 +++
 .../arm-ignore-branch-protection-option.c |  4 +-
 .../Sema/arm-branch-protection-attr-warn.c| 10 +--
 clang/test/Sema/arm-branch-protection.c   | 32 +++
 clang/test/Sema/attr-target.c |  8 ++
 9 files changed, 141 insertions(+), 24 deletions(-)
 create mode 100644 clang/test/CodeGen/arm-targetattr.c

diff --git a/clang/lib/Basic/Targets/AArch64.cpp 
b/clang/lib/Basic/Targets/AArch64.cpp
index c71af71eba60ce..934de9d0c7b68f 100644
--- a/clang/lib/Basic/Targets/AArch64.cpp
+++ b/clang/lib/Basic/Targets/AArch64.cpp
@@ -1065,13 +1065,17 @@ ParsedTargetAttr 
AArch64TargetInfo::parseTargetAttr(StringRef Features) const {
   FoundArch = true;
   std::pair Split =
   Feature.split("=").second.trim().split("+");
+  if (Split.first == "")
+continue;
   const std::optional AI =
   llvm::AArch64::parseArch(Split.first);
 
   // Parse the architecture version, adding the required features to
   // Ret.Features.
-  if (!AI)
+  if (!AI) {
+Ret.Features.push_back("+UNKNOWN");
 continue;
+  }
   Ret.Features.push_back(AI->ArchFeature.str());
   // Add any extra features, after the +
   SplitAndAddFeatures(Split.second, Ret.Features);
diff --git a/clang/lib/Basic/Targets/ARM.cpp b/clang/lib/Basic/Targets/ARM.cpp
index ce7e4d4639ceac..7ed64f4f44a9b5 100644
--- a/clang/lib/Basic/Targets/ARM.cpp
+++ b/clang/lib/Basic/Targets/ARM.cpp
@@ -11,6 +11,7 @@
 
//===--===//
 
 #include "ARM.h"
+#include "clang/AST/Attr.h"
 #include "clang/Basic/Builtins.h"
 #include "clang/Basic/Diagnostic.h"
 #include "clang/Basic/TargetBuiltins.h"
@@ -639,6 +640,92 @@ bool 
ARMTargetInfo::handleTargetFeatures(std::vector ,
   return true;
 }
 
+// Parse ARM Target attributes, which are a comma separated list of:
+//  "arch=" - parsed to features as per -march=..
+//  "cpu=" - parsed to features as per -mcpu=.., with CPU set to 
+//  "tune=" - TuneCPU set to 
+//  "feature", "no-feature" - Add (or remove) feature.
+//  "+feature", "+nofeature" - Add (or remove) feature.
+ParsedTargetAttr ARMTargetInfo::parseTargetAttr(StringRef Features) const {
+  ParsedTargetAttr Ret;
+  if (Features == "default")
+return Ret;
+  SmallVector AttrFeatures;
+  Features.split(AttrFeatures, ",");
+  bool FoundArch = false;
+
+  auto SplitAndAddFeatures = [](StringRef FeatString,
+std::vector ) {
+SmallVector SplitFeatures;
+FeatString.split(SplitFeatures, StringRef("+"), -1, false);
+for (StringRef Feature : SplitFeatures) {
+  StringRef FeatureName = llvm::ARM::getArchExtFeature(Feature);
+  if (!FeatureName.empty())
+Features.push_back(FeatureName.str());
+  else
+// Pushing the original feature string to give a sema error later on
+// when they get checked.
+Features.push_back(Feature.str());
+}
+  };
+
+  for (auto  : AttrFeatures) {
+Feature = Feature.trim();
+if (Feature.startswith("fpmath="))
+  continue;
+
+if (Feature.startswith("branch-protection=")) {
+  Ret.BranchProtection = Feature.split('=').second.trim();
+  continue;
+}
+
+if (Feature.startswith("arch=")) {
+  if (FoundArch)
+Ret.Duplicate = "arch=";
+  FoundArch = true;
+  std::pair Split =
+  Feature.split("=").second.trim().split("+");
+  if (Split.first == "")
+continue;
+  llvm::ARM::ArchKind ArchKind = llvm::ARM::parseArch(Split.first);
+
+  // Parse the architecture version, adding the required features to
+  // Ret.Features.
+  std::vector FeatureStrs;
+  if (ArchKind == llvm::ARM::ArchKind::INVALID) {
+Ret.Features.push_back("+UNKNOWN");
+continue;
+  }
+  std::string ArchFeature = ("+" + llvm::ARM::getArchName(ArchKind)).str();
+  Ret.Features.push_back(ArchFeature);
+  // Add any extra features, after the +
+  SplitAndAddFeatures(Split.second, Ret.Features);
+} else if (Feature.startswith("cpu=")) {
+  if (!Ret.CPU.empty())
+Ret.Duplicate = "cpu=";
+  else {
+// Split the cpu string into "cpu=", "cortex-a710" and any remaining
+// "+feat" features.
+std::pair Split =
+Feature.split("=").second.trim().split("+");
+Ret.CPU = Split.first;
+

[clang] [Clang][ARM] support arm target attribute, and warning for bad typo (PR #74812)

2023-12-07 Thread via cfe-commits

https://github.com/hstk30-hw updated 
https://github.com/llvm/llvm-project/pull/74812

>From 3e4b7b9da50d742b7bfafa04cdf0c3a64d0d1b9e Mon Sep 17 00:00:00 2001
From: hstk30-hw 
Date: Fri, 8 Dec 2023 14:29:33 +0800
Subject: [PATCH] feat: support arm target attribute, and warning for bad typo

---
 clang/lib/Basic/Targets/AArch64.cpp   |  6 +-
 clang/lib/Basic/Targets/ARM.cpp   | 87 +++
 clang/lib/Basic/Targets/ARM.h |  2 +
 clang/lib/Sema/SemaDeclAttr.cpp   |  3 +
 clang/test/CodeGen/arm-targetattr.c   | 13 +++
 .../Sema/arm-branch-protection-attr-warn.c| 10 +--
 clang/test/Sema/arm-branch-protection.c   | 32 +++
 clang/test/Sema/attr-target.c |  8 ++
 8 files changed, 139 insertions(+), 22 deletions(-)
 create mode 100644 clang/test/CodeGen/arm-targetattr.c

diff --git a/clang/lib/Basic/Targets/AArch64.cpp 
b/clang/lib/Basic/Targets/AArch64.cpp
index c71af71eba60c..934de9d0c7b68 100644
--- a/clang/lib/Basic/Targets/AArch64.cpp
+++ b/clang/lib/Basic/Targets/AArch64.cpp
@@ -1065,13 +1065,17 @@ ParsedTargetAttr 
AArch64TargetInfo::parseTargetAttr(StringRef Features) const {
   FoundArch = true;
   std::pair Split =
   Feature.split("=").second.trim().split("+");
+  if (Split.first == "")
+continue;
   const std::optional AI =
   llvm::AArch64::parseArch(Split.first);
 
   // Parse the architecture version, adding the required features to
   // Ret.Features.
-  if (!AI)
+  if (!AI) {
+Ret.Features.push_back("+UNKNOWN");
 continue;
+  }
   Ret.Features.push_back(AI->ArchFeature.str());
   // Add any extra features, after the +
   SplitAndAddFeatures(Split.second, Ret.Features);
diff --git a/clang/lib/Basic/Targets/ARM.cpp b/clang/lib/Basic/Targets/ARM.cpp
index ce7e4d4639cea..7ed64f4f44a9b 100644
--- a/clang/lib/Basic/Targets/ARM.cpp
+++ b/clang/lib/Basic/Targets/ARM.cpp
@@ -11,6 +11,7 @@
 
//===--===//
 
 #include "ARM.h"
+#include "clang/AST/Attr.h"
 #include "clang/Basic/Builtins.h"
 #include "clang/Basic/Diagnostic.h"
 #include "clang/Basic/TargetBuiltins.h"
@@ -639,6 +640,92 @@ bool 
ARMTargetInfo::handleTargetFeatures(std::vector ,
   return true;
 }
 
+// Parse ARM Target attributes, which are a comma separated list of:
+//  "arch=" - parsed to features as per -march=..
+//  "cpu=" - parsed to features as per -mcpu=.., with CPU set to 
+//  "tune=" - TuneCPU set to 
+//  "feature", "no-feature" - Add (or remove) feature.
+//  "+feature", "+nofeature" - Add (or remove) feature.
+ParsedTargetAttr ARMTargetInfo::parseTargetAttr(StringRef Features) const {
+  ParsedTargetAttr Ret;
+  if (Features == "default")
+return Ret;
+  SmallVector AttrFeatures;
+  Features.split(AttrFeatures, ",");
+  bool FoundArch = false;
+
+  auto SplitAndAddFeatures = [](StringRef FeatString,
+std::vector ) {
+SmallVector SplitFeatures;
+FeatString.split(SplitFeatures, StringRef("+"), -1, false);
+for (StringRef Feature : SplitFeatures) {
+  StringRef FeatureName = llvm::ARM::getArchExtFeature(Feature);
+  if (!FeatureName.empty())
+Features.push_back(FeatureName.str());
+  else
+// Pushing the original feature string to give a sema error later on
+// when they get checked.
+Features.push_back(Feature.str());
+}
+  };
+
+  for (auto  : AttrFeatures) {
+Feature = Feature.trim();
+if (Feature.startswith("fpmath="))
+  continue;
+
+if (Feature.startswith("branch-protection=")) {
+  Ret.BranchProtection = Feature.split('=').second.trim();
+  continue;
+}
+
+if (Feature.startswith("arch=")) {
+  if (FoundArch)
+Ret.Duplicate = "arch=";
+  FoundArch = true;
+  std::pair Split =
+  Feature.split("=").second.trim().split("+");
+  if (Split.first == "")
+continue;
+  llvm::ARM::ArchKind ArchKind = llvm::ARM::parseArch(Split.first);
+
+  // Parse the architecture version, adding the required features to
+  // Ret.Features.
+  std::vector FeatureStrs;
+  if (ArchKind == llvm::ARM::ArchKind::INVALID) {
+Ret.Features.push_back("+UNKNOWN");
+continue;
+  }
+  std::string ArchFeature = ("+" + llvm::ARM::getArchName(ArchKind)).str();
+  Ret.Features.push_back(ArchFeature);
+  // Add any extra features, after the +
+  SplitAndAddFeatures(Split.second, Ret.Features);
+} else if (Feature.startswith("cpu=")) {
+  if (!Ret.CPU.empty())
+Ret.Duplicate = "cpu=";
+  else {
+// Split the cpu string into "cpu=", "cortex-a710" and any remaining
+// "+feat" features.
+std::pair Split =
+Feature.split("=").second.trim().split("+");
+Ret.CPU = Split.first;
+SplitAndAddFeatures(Split.second, Ret.Features);
+  }
+  

[clang] [Clang][ARM] support arm target attribute, and warning for bad typo (PR #74812)

2023-12-07 Thread via cfe-commits

github-actions[bot] wrote:




:warning: C/C++ code formatter, clang-format found issues in your code. 
:warning:



You can test this locally with the following command:


``bash
git-clang-format --diff 28a78e2a4a2c358900aaac1a1eb9efce17a7f5a5 
8a84eaf11bb76aba7db5243390f246d40b3f9630 -- clang/test/CodeGen/arm-targetattr.c 
clang/lib/Basic/Targets/AArch64.cpp clang/lib/Basic/Targets/ARM.cpp 
clang/lib/Basic/Targets/ARM.h clang/lib/Sema/SemaDeclAttr.cpp 
clang/test/Sema/arm-branch-protection-attr-warn.c 
clang/test/Sema/arm-branch-protection.c clang/test/Sema/attr-target.c
``





View the diff from clang-format here.


``diff
diff --git a/clang/lib/Basic/Targets/ARM.cpp b/clang/lib/Basic/Targets/ARM.cpp
index 3a7081c34e..7ed64f4f44 100644
--- a/clang/lib/Basic/Targets/ARM.cpp
+++ b/clang/lib/Basic/Targets/ARM.cpp
@@ -653,7 +653,7 @@ ParsedTargetAttr ARMTargetInfo::parseTargetAttr(StringRef 
Features) const {
   SmallVector AttrFeatures;
   Features.split(AttrFeatures, ",");
   bool FoundArch = false;
- 
+
   auto SplitAndAddFeatures = [](StringRef FeatString,
 std::vector ) {
 SmallVector SplitFeatures;
@@ -668,12 +668,12 @@ ParsedTargetAttr ARMTargetInfo::parseTargetAttr(StringRef 
Features) const {
 Features.push_back(Feature.str());
 }
   };
- 
+
   for (auto  : AttrFeatures) {
 Feature = Feature.trim();
 if (Feature.startswith("fpmath="))
   continue;
- 
+
 if (Feature.startswith("branch-protection=")) {
   Ret.BranchProtection = Feature.split('=').second.trim();
   continue;
@@ -685,7 +685,7 @@ ParsedTargetAttr ARMTargetInfo::parseTargetAttr(StringRef 
Features) const {
   FoundArch = true;
   std::pair Split =
   Feature.split("=").second.trim().split("+");
-  if (Split.first == "") 
+  if (Split.first == "")
 continue;
   llvm::ARM::ArchKind ArchKind = llvm::ARM::parseArch(Split.first);
 
diff --git a/clang/lib/Basic/Targets/ARM.h b/clang/lib/Basic/Targets/ARM.h
index 81c7379a2e..a14d10c522 100644
--- a/clang/lib/Basic/Targets/ARM.h
+++ b/clang/lib/Basic/Targets/ARM.h
@@ -135,7 +135,7 @@ public:
  StringRef CPU,
  const std::vector ) const override;
   ParsedTargetAttr parseTargetAttr(StringRef Str) const override;
-  bool supportsTargetAttributeTune() const override { return false;  }
+  bool supportsTargetAttributeTune() const override { return false; }
 
   bool isValidFeatureName(StringRef Feature) const override {
 // We pass soft-float-abi in as a -target-feature, but the backend figures

``




https://github.com/llvm/llvm-project/pull/74812
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang][ARM] support arm target attribute, and warning for bad typo (PR #74812)

2023-12-07 Thread via cfe-commits

llvmbot wrote:




@llvm/pr-subscribers-backend-arm

Author: None (hstk30-hw)


Changes

This adds support under ARM for the target("..") attributes like AArch64 
https://reviews.llvm.org/D133848 .  And warning for bad typo for "arch=".

---
Full diff: https://github.com/llvm/llvm-project/pull/74812.diff


8 Files Affected:

- (modified) clang/lib/Basic/Targets/AArch64.cpp (+5-1) 
- (modified) clang/lib/Basic/Targets/ARM.cpp (+87) 
- (modified) clang/lib/Basic/Targets/ARM.h (+2) 
- (modified) clang/lib/Sema/SemaDeclAttr.cpp (+3) 
- (added) clang/test/CodeGen/arm-targetattr.c (+13) 
- (modified) clang/test/Sema/arm-branch-protection-attr-warn.c (+5-5) 
- (modified) clang/test/Sema/arm-branch-protection.c (+16-16) 
- (modified) clang/test/Sema/attr-target.c (+8) 


``diff
diff --git a/clang/lib/Basic/Targets/AArch64.cpp 
b/clang/lib/Basic/Targets/AArch64.cpp
index c71af71eba60ce..934de9d0c7b68f 100644
--- a/clang/lib/Basic/Targets/AArch64.cpp
+++ b/clang/lib/Basic/Targets/AArch64.cpp
@@ -1065,13 +1065,17 @@ ParsedTargetAttr 
AArch64TargetInfo::parseTargetAttr(StringRef Features) const {
   FoundArch = true;
   std::pair Split =
   Feature.split("=").second.trim().split("+");
+  if (Split.first == "")
+continue;
   const std::optional AI =
   llvm::AArch64::parseArch(Split.first);
 
   // Parse the architecture version, adding the required features to
   // Ret.Features.
-  if (!AI)
+  if (!AI) {
+Ret.Features.push_back("+UNKNOWN");
 continue;
+  }
   Ret.Features.push_back(AI->ArchFeature.str());
   // Add any extra features, after the +
   SplitAndAddFeatures(Split.second, Ret.Features);
diff --git a/clang/lib/Basic/Targets/ARM.cpp b/clang/lib/Basic/Targets/ARM.cpp
index ce7e4d4639ceac..3a7081c34ebc5c 100644
--- a/clang/lib/Basic/Targets/ARM.cpp
+++ b/clang/lib/Basic/Targets/ARM.cpp
@@ -11,6 +11,7 @@
 
//===--===//
 
 #include "ARM.h"
+#include "clang/AST/Attr.h"
 #include "clang/Basic/Builtins.h"
 #include "clang/Basic/Diagnostic.h"
 #include "clang/Basic/TargetBuiltins.h"
@@ -639,6 +640,92 @@ bool 
ARMTargetInfo::handleTargetFeatures(std::vector ,
   return true;
 }
 
+// Parse ARM Target attributes, which are a comma separated list of:
+//  "arch=" - parsed to features as per -march=..
+//  "cpu=" - parsed to features as per -mcpu=.., with CPU set to 
+//  "tune=" - TuneCPU set to 
+//  "feature", "no-feature" - Add (or remove) feature.
+//  "+feature", "+nofeature" - Add (or remove) feature.
+ParsedTargetAttr ARMTargetInfo::parseTargetAttr(StringRef Features) const {
+  ParsedTargetAttr Ret;
+  if (Features == "default")
+return Ret;
+  SmallVector AttrFeatures;
+  Features.split(AttrFeatures, ",");
+  bool FoundArch = false;
+ 
+  auto SplitAndAddFeatures = [](StringRef FeatString,
+std::vector ) {
+SmallVector SplitFeatures;
+FeatString.split(SplitFeatures, StringRef("+"), -1, false);
+for (StringRef Feature : SplitFeatures) {
+  StringRef FeatureName = llvm::ARM::getArchExtFeature(Feature);
+  if (!FeatureName.empty())
+Features.push_back(FeatureName.str());
+  else
+// Pushing the original feature string to give a sema error later on
+// when they get checked.
+Features.push_back(Feature.str());
+}
+  };
+ 
+  for (auto  : AttrFeatures) {
+Feature = Feature.trim();
+if (Feature.startswith("fpmath="))
+  continue;
+ 
+if (Feature.startswith("branch-protection=")) {
+  Ret.BranchProtection = Feature.split('=').second.trim();
+  continue;
+}
+
+if (Feature.startswith("arch=")) {
+  if (FoundArch)
+Ret.Duplicate = "arch=";
+  FoundArch = true;
+  std::pair Split =
+  Feature.split("=").second.trim().split("+");
+  if (Split.first == "") 
+continue;
+  llvm::ARM::ArchKind ArchKind = llvm::ARM::parseArch(Split.first);
+
+  // Parse the architecture version, adding the required features to
+  // Ret.Features.
+  std::vector FeatureStrs;
+  if (ArchKind == llvm::ARM::ArchKind::INVALID) {
+Ret.Features.push_back("+UNKNOWN");
+continue;
+  }
+  std::string ArchFeature = ("+" + llvm::ARM::getArchName(ArchKind)).str();
+  Ret.Features.push_back(ArchFeature);
+  // Add any extra features, after the +
+  SplitAndAddFeatures(Split.second, Ret.Features);
+} else if (Feature.startswith("cpu=")) {
+  if (!Ret.CPU.empty())
+Ret.Duplicate = "cpu=";
+  else {
+// Split the cpu string into "cpu=", "cortex-a710" and any remaining
+// "+feat" features.
+std::pair Split =
+Feature.split("=").second.trim().split("+");
+Ret.CPU = Split.first;
+SplitAndAddFeatures(Split.second, Ret.Features);
+  }
+} else if (Feature.startswith("tune=")) {
+  if 

[clang] [Clang][ARM] support arm target attribute, and warning for bad typo (PR #74812)

2023-12-07 Thread via cfe-commits

https://github.com/hstk30-hw created 
https://github.com/llvm/llvm-project/pull/74812

This adds support under ARM for the target("..") attributes like AArch64 
https://reviews.llvm.org/D133848 .  And warning for bad typo for "arch=".

>From 8a84eaf11bb76aba7db5243390f246d40b3f9630 Mon Sep 17 00:00:00 2001
From: hstk30-hw 
Date: Fri, 8 Dec 2023 14:29:33 +0800
Subject: [PATCH] feat: support arm target attribute, and warning for bad typo

---
 clang/lib/Basic/Targets/AArch64.cpp   |  6 +-
 clang/lib/Basic/Targets/ARM.cpp   | 87 +++
 clang/lib/Basic/Targets/ARM.h |  2 +
 clang/lib/Sema/SemaDeclAttr.cpp   |  3 +
 clang/test/CodeGen/arm-targetattr.c   | 13 +++
 .../Sema/arm-branch-protection-attr-warn.c| 10 +--
 clang/test/Sema/arm-branch-protection.c   | 32 +++
 clang/test/Sema/attr-target.c |  8 ++
 8 files changed, 139 insertions(+), 22 deletions(-)
 create mode 100644 clang/test/CodeGen/arm-targetattr.c

diff --git a/clang/lib/Basic/Targets/AArch64.cpp 
b/clang/lib/Basic/Targets/AArch64.cpp
index c71af71eba60ce..934de9d0c7b68f 100644
--- a/clang/lib/Basic/Targets/AArch64.cpp
+++ b/clang/lib/Basic/Targets/AArch64.cpp
@@ -1065,13 +1065,17 @@ ParsedTargetAttr 
AArch64TargetInfo::parseTargetAttr(StringRef Features) const {
   FoundArch = true;
   std::pair Split =
   Feature.split("=").second.trim().split("+");
+  if (Split.first == "")
+continue;
   const std::optional AI =
   llvm::AArch64::parseArch(Split.first);
 
   // Parse the architecture version, adding the required features to
   // Ret.Features.
-  if (!AI)
+  if (!AI) {
+Ret.Features.push_back("+UNKNOWN");
 continue;
+  }
   Ret.Features.push_back(AI->ArchFeature.str());
   // Add any extra features, after the +
   SplitAndAddFeatures(Split.second, Ret.Features);
diff --git a/clang/lib/Basic/Targets/ARM.cpp b/clang/lib/Basic/Targets/ARM.cpp
index ce7e4d4639ceac..3a7081c34ebc5c 100644
--- a/clang/lib/Basic/Targets/ARM.cpp
+++ b/clang/lib/Basic/Targets/ARM.cpp
@@ -11,6 +11,7 @@
 
//===--===//
 
 #include "ARM.h"
+#include "clang/AST/Attr.h"
 #include "clang/Basic/Builtins.h"
 #include "clang/Basic/Diagnostic.h"
 #include "clang/Basic/TargetBuiltins.h"
@@ -639,6 +640,92 @@ bool 
ARMTargetInfo::handleTargetFeatures(std::vector ,
   return true;
 }
 
+// Parse ARM Target attributes, which are a comma separated list of:
+//  "arch=" - parsed to features as per -march=..
+//  "cpu=" - parsed to features as per -mcpu=.., with CPU set to 
+//  "tune=" - TuneCPU set to 
+//  "feature", "no-feature" - Add (or remove) feature.
+//  "+feature", "+nofeature" - Add (or remove) feature.
+ParsedTargetAttr ARMTargetInfo::parseTargetAttr(StringRef Features) const {
+  ParsedTargetAttr Ret;
+  if (Features == "default")
+return Ret;
+  SmallVector AttrFeatures;
+  Features.split(AttrFeatures, ",");
+  bool FoundArch = false;
+ 
+  auto SplitAndAddFeatures = [](StringRef FeatString,
+std::vector ) {
+SmallVector SplitFeatures;
+FeatString.split(SplitFeatures, StringRef("+"), -1, false);
+for (StringRef Feature : SplitFeatures) {
+  StringRef FeatureName = llvm::ARM::getArchExtFeature(Feature);
+  if (!FeatureName.empty())
+Features.push_back(FeatureName.str());
+  else
+// Pushing the original feature string to give a sema error later on
+// when they get checked.
+Features.push_back(Feature.str());
+}
+  };
+ 
+  for (auto  : AttrFeatures) {
+Feature = Feature.trim();
+if (Feature.startswith("fpmath="))
+  continue;
+ 
+if (Feature.startswith("branch-protection=")) {
+  Ret.BranchProtection = Feature.split('=').second.trim();
+  continue;
+}
+
+if (Feature.startswith("arch=")) {
+  if (FoundArch)
+Ret.Duplicate = "arch=";
+  FoundArch = true;
+  std::pair Split =
+  Feature.split("=").second.trim().split("+");
+  if (Split.first == "") 
+continue;
+  llvm::ARM::ArchKind ArchKind = llvm::ARM::parseArch(Split.first);
+
+  // Parse the architecture version, adding the required features to
+  // Ret.Features.
+  std::vector FeatureStrs;
+  if (ArchKind == llvm::ARM::ArchKind::INVALID) {
+Ret.Features.push_back("+UNKNOWN");
+continue;
+  }
+  std::string ArchFeature = ("+" + llvm::ARM::getArchName(ArchKind)).str();
+  Ret.Features.push_back(ArchFeature);
+  // Add any extra features, after the +
+  SplitAndAddFeatures(Split.second, Ret.Features);
+} else if (Feature.startswith("cpu=")) {
+  if (!Ret.CPU.empty())
+Ret.Duplicate = "cpu=";
+  else {
+// Split the cpu string into "cpu=", "cortex-a710" and any remaining
+// "+feat" features.
+std::pair Split =
+