From e32b818db187a6519ee5eba47e8d7dae1d58a723 Mon Sep 17 00:00:00 2001 From: Ties Stuij Date: Thu, 9 Dec 2021 09:40:46 +0000 Subject: [PATCH] [ARM][clang] Define feature test macro for the PACBTI-M extension If the extension string "+pacbti" was given in -march=... or -mcpu=... options the compiler shall define the following preprocessor macros: __ARM_FEATURE_PAUTH with value 1. __ARM_FEATURE_BTI with value 1. This patch is part of a series that adds support for the PACBTI-M extension of the Armv8.1-M architecture, as detailed here: https://community.arm.com/arm-community-blogs/b/architectures-and-processors-blog/posts/armv8-1-m-pointer-authentication-and-branch-target-identification-extension The PACBTI-M specification can be found in the Armv8-M Architecture Reference Manual: https://developer.arm.com/documentation/ddi0553/latest The following people contributed to this patch: - Momchil Velikov - Ties Stuij Reviewed By: miyuki Differential Revision: https://reviews.llvm.org/D112431 --- clang/lib/Basic/Targets/ARM.cpp | 11 +++++++++++ clang/lib/Basic/Targets/ARM.h | 2 ++ clang/test/Preprocessor/arm-target-features.c | 7 +++++++ 3 files changed, 20 insertions(+) diff --git a/clang/lib/Basic/Targets/ARM.cpp b/clang/lib/Basic/Targets/ARM.cpp index f330780..81b79cf 100644 --- a/clang/lib/Basic/Targets/ARM.cpp +++ b/clang/lib/Basic/Targets/ARM.cpp @@ -465,6 +465,8 @@ bool ARMTargetInfo::handleTargetFeatures(std::vector &Features, HWDiv = 0; DotProd = 0; HasMatMul = 0; + HasPAC = 0; + HasBTI = 0; HasFloat16 = true; ARMCDECoprocMask = 0; HasBFloat16 = false; @@ -547,6 +549,9 @@ bool ARMTargetInfo::handleTargetFeatures(std::vector &Features, HasBFloat16 = true; } else if (Feature == "-fpregs") { FPRegsDisabled = true; + } else if (Feature == "+pacbti") { + HasPAC = 1; + HasBTI = 1; } } @@ -890,6 +895,12 @@ void ARMTargetInfo::getTargetDefines(const LangOptions &Opts, if (HasMatMul) Builder.defineMacro("__ARM_FEATURE_MATMUL_INT8", "1"); + if (HasPAC) + Builder.defineMacro("__ARM_FEATURE_PAUTH", "1"); + + if (HasBTI) + Builder.defineMacro("__ARM_FEATURE_BTI", "1"); + if (HasBFloat16) { Builder.defineMacro("__ARM_FEATURE_BF16", "1"); Builder.defineMacro("__ARM_FEATURE_BF16_VECTOR_ARITHMETIC", "1"); diff --git a/clang/lib/Basic/Targets/ARM.h b/clang/lib/Basic/Targets/ARM.h index f939904..40c658f 100644 --- a/clang/lib/Basic/Targets/ARM.h +++ b/clang/lib/Basic/Targets/ARM.h @@ -79,6 +79,8 @@ class LLVM_LIBRARY_VISIBILITY ARMTargetInfo : public TargetInfo { unsigned DotProd : 1; unsigned HasMatMul : 1; unsigned FPRegsDisabled : 1; + unsigned HasPAC : 1; + unsigned HasBTI : 1; enum { LDREX_B = (1 << 0), /// byte (8-bit) diff --git a/clang/test/Preprocessor/arm-target-features.c b/clang/test/Preprocessor/arm-target-features.c index 7fb3323..49a5516 100644 --- a/clang/test/Preprocessor/arm-target-features.c +++ b/clang/test/Preprocessor/arm-target-features.c @@ -896,6 +896,13 @@ // CHECK-PAC-LEAF: #define __ARM_FEATURE_PAC_DEFAULT 5 // CHECK-PAC-BKEY-LEAF: #define __ARM_FEATURE_PAC_DEFAULT 6 +// RUN: %clang -target arm-arm-none-eabi -march=armv8.1-m.main -x c -E -dM %s -o - | FileCheck --check-prefixes=CHECK-NOBTI-EXT,CHECK-NOPAC-EXT %s +// RUN: %clang -target arm-arm-none-eabi -march=armv7-m+pacbti -x c -E -dM %s -o - | FileCheck --check-prefixes=CHECK-PACBTI-EXT %s +// CHECK-NOBTI-EXT-NOT: #define __ARM_FEATURE_BTI 1 +// CHECK-NOPAC-EXT-NOT: #define __ARM_FEATURE_PAUTH 1 +// CHECK-PACBTI-EXT: #define __ARM_FEATURE_BTI 1 +// CHECK-PACBTI-EXT: #define __ARM_FEATURE_PAUTH 1 + // ================== Check BFloat16 Extensions. // RUN: %clang -target arm-arm-none-eabi -march=armv8.6-a+bf16 -x c -E -dM %s -o - 2>&1 | FileCheck -check-prefix=CHECK-BFLOAT %s // CHECK-BFLOAT: #define __ARM_BF16_FORMAT_ALTERNATIVE 1 -- 2.7.4