Author: Mikhail Maltsev Date: 2020-03-09T16:14:06Z New Revision: cdeeb548bbebdff7661fb20b72839b920be0adbe
URL: https://github.com/llvm/llvm-project/commit/cdeeb548bbebdff7661fb20b72839b920be0adbe DIFF: https://github.com/llvm/llvm-project/commit/cdeeb548bbebdff7661fb20b72839b920be0adbe.diff LOG: [ARM,CDE] Implement CDE feature test macros Summary: This patch implements feature test macros for the CDE extension according to the upcoming ACLE specification. The following 2 macros are being added: - __ARM_FEATURE_CDE - defined as '1' when any coprocessor is configured as a CDE coprocessor - __ARM_FEATURE_CDE_COPROC - defined as an 8-bit mask, each bit of the mask corresponds to a coprocessor and is set when the corresponding coprocessor is configured as CDE (and cleared otherwise). The patch also exposes the value of __ARM_FEATURE_CDE_COPROC in the target-independent method TargetInfo::getARMCDECorpocMask, the method will be used in follow-up patches implementing semantic checks of CDE intrinsics (we want to diagnose the cases when CDE intrinsics are used with coprocessors that are not configured as CDE). Reviewers: simon_tatham, dmgreen, ostannard, MarkMurrayARM Reviewed By: simon_tatham Subscribers: kristof.beyls, danielkiss, cfe-commits Tags: #clang Differential Revision: https://reviews.llvm.org/D75843 Added: Modified: clang/include/clang/Basic/TargetInfo.h clang/lib/Basic/TargetInfo.cpp clang/lib/Basic/Targets/ARM.cpp clang/lib/Basic/Targets/ARM.h clang/test/Preprocessor/arm-target-features.c Removed: ################################################################################ diff --git a/clang/include/clang/Basic/TargetInfo.h b/clang/include/clang/Basic/TargetInfo.h index 80581eabe1b7..cbfcece1b666 100644 --- a/clang/include/clang/Basic/TargetInfo.h +++ b/clang/include/clang/Basic/TargetInfo.h @@ -210,6 +210,8 @@ class TargetInfo : public virtual TransferrableTargetInfo, unsigned HasAArch64SVETypes : 1; + unsigned ARMCDECoprocMask : 8; + // TargetInfo Constructor. Default initializes all fields. TargetInfo(const llvm::Triple &T); @@ -808,6 +810,10 @@ class TargetInfo : public virtual TransferrableTargetInfo, /// available on this target. bool hasAArch64SVETypes() const { return HasAArch64SVETypes; } + /// For ARM targets returns a mask defining which coprocessors are configured + /// as Custom Datapath. + uint32_t getARMCDECoprocMask() const { return ARMCDECoprocMask; } + /// Returns whether the passed in string is a valid clobber in an /// inline asm statement. /// diff --git a/clang/lib/Basic/TargetInfo.cpp b/clang/lib/Basic/TargetInfo.cpp index 3a21a19e1f19..58d018c5bd3e 100644 --- a/clang/lib/Basic/TargetInfo.cpp +++ b/clang/lib/Basic/TargetInfo.cpp @@ -113,6 +113,7 @@ TargetInfo::TargetInfo(const llvm::Triple &T) : TargetOpts(), Triple(T) { HasBuiltinMSVaList = false; IsRenderScriptTarget = false; HasAArch64SVETypes = false; + ARMCDECoprocMask = 0; // Default to no types using fpret. RealTypeUsesObjCFPRet = 0; diff --git a/clang/lib/Basic/Targets/ARM.cpp b/clang/lib/Basic/Targets/ARM.cpp index 02144c6ebe85..4ab794ef3c09 100644 --- a/clang/lib/Basic/Targets/ARM.cpp +++ b/clang/lib/Basic/Targets/ARM.cpp @@ -154,6 +154,8 @@ bool ARMTargetInfo::hasMVEFloat() const { return hasMVE() && (MVE & MVE_FP); } +bool ARMTargetInfo::hasCDE() const { return getARMCDECoprocMask() != 0; } + bool ARMTargetInfo::isThumb() const { return ArchISA == llvm::ARM::ISAKind::THUMB; } @@ -422,6 +424,7 @@ bool ARMTargetInfo::handleTargetFeatures(std::vector<std::string> &Features, HWDiv = 0; DotProd = 0; HasFloat16 = true; + ARMCDECoprocMask = 0; // This does not diagnose illegal cases like having both // "+vfpv2" and "+vfpv3" or having "+neon" and "-fp64". @@ -486,6 +489,10 @@ bool ARMTargetInfo::handleTargetFeatures(std::vector<std::string> &Features, FPU |= FPARMV8; MVE |= MVE_INT | MVE_FP; HW_FP |= HW_FP_SP | HW_FP_HP; + } else if (Feature.size() == strlen("+cdecp0") && Feature >= "+cdecp0" && + Feature <= "+cdecp7") { + unsigned Coproc = Feature.back() - '0'; + ARMCDECoprocMask |= (1U << Coproc); } } @@ -758,6 +765,12 @@ void ARMTargetInfo::getTargetDefines(const LangOptions &Opts, Builder.defineMacro("__ARM_FEATURE_MVE", hasMVEFloat() ? "3" : "1"); } + if (hasCDE()) { + Builder.defineMacro("__ARM_FEATURE_CDE", "1"); + Builder.defineMacro("__ARM_FEATURE_CDE_COPROC", + "0x" + Twine::utohexstr(getARMCDECoprocMask())); + } + Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Twine(Opts.WCharSize ? Opts.WCharSize : 4)); diff --git a/clang/lib/Basic/Targets/ARM.h b/clang/lib/Basic/Targets/ARM.h index 9696a4404589..725954038602 100644 --- a/clang/lib/Basic/Targets/ARM.h +++ b/clang/lib/Basic/Targets/ARM.h @@ -108,6 +108,7 @@ class LLVM_LIBRARY_VISIBILITY ARMTargetInfo : public TargetInfo { bool supportsThumb2() const; bool hasMVE() const; bool hasMVEFloat() const; + bool hasCDE() const; StringRef getCPUAttr() const; StringRef getCPUProfile() const; diff --git a/clang/test/Preprocessor/arm-target-features.c b/clang/test/Preprocessor/arm-target-features.c index 3cee4d0fc2b6..ab18036c2cf9 100644 --- a/clang/test/Preprocessor/arm-target-features.c +++ b/clang/test/Preprocessor/arm-target-features.c @@ -800,6 +800,18 @@ // CHECK-V81M-MVE-NODSP-NOT: #define __ARM_FEATURE_MVE // CHECK-V81M-MVE-NODSP-NOT: #define __ARM_FEATURE_DSP +// Test CDE (Custom Datapath Extension) feature test macros + +// RUN: %clang -target arm-arm-none-eabi -march=armv8m.main -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-V8M-NOCDE %s +// CHECK-V8M-NOCDE-NOT: #define __ARM_FEATURE_CDE +// CHECK-V8M-NOCDE-NOT: #define __ARM_FEATURE_CDE_COPROC +// RUN: %clang -target arm-arm-none-eabi -march=armv8m.main+cdecp0+cdecp1+cdecp7 -x c -E -dM %s -o - | FileCheck -match-full-lines --check-prefix=CHECK-V8M-CDE-MASK1 %s +// CHECK-V8M-CDE-MASK1: #define __ARM_FEATURE_CDE 1 +// CHECK-V8M-CDE-MASK1: #define __ARM_FEATURE_CDE_COPROC 0x83 +// RUN: %clang -target arm-arm-none-eabi -march=armv8m.main+cdecp0+cdecp1+cdecp2+cdecp3+cdecp4+cdecp5+cdecp6+cdecp7 -x c -E -dM %s -o - | FileCheck -match-full-lines --check-prefix=CHECK-V8M-CDE-MASK2 %s +// CHECK-V8M-CDE-MASK2: #define __ARM_FEATURE_CDE 1 +// CHECK-V8M-CDE-MASK2: #define __ARM_FEATURE_CDE_COPROC 0xff + // RUN: %clang -target armv8.1a-none-none-eabi -x c -E -dM %s -o - | FileCheck -match-full-lines --check-prefix=CHECK-V81A %s // CHECK-V81A: #define __ARM_ARCH 8 // CHECK-V81A: #define __ARM_ARCH_8_1A__ 1 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits