[clang] [Clang][ARM] support arm target attribute, and warning for bad typo (PR #74812)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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 = +