[clang] [NFC][Clang][Headers] Update refs to ACLE in comments (PR #78305)
@@ -308,7 +313,7 @@ __qdbl(int32_t __t) { } #endif -/* 9.4.3 Accumultating multiplications */ +/* 8.4.3 Accumultating multiplications */ jwestwood921 wrote: There is a spelling error: 'Accumultating' instead of 'Accumulating'. https://github.com/llvm/llvm-project/pull/78305 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [NFC][Clang][Headers] Update refs to ACLE in comments (PR #78305)
@@ -540,7 +545,7 @@ __usub16(uint16x2_t __a, uint16x2_t __b) { } #endif -/* 9.5.10 Parallel 16-bit multiplications */ +/* 8.5.10 Parallel 16-bit multiplications */ jwestwood921 wrote: Nit pick: The ACLE document has 'multiplication', instead of 'multiplications'. https://github.com/llvm/llvm-project/pull/78305 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] __ARM_ARCH macro definition fix (PR #81301)
https://github.com/jwestwood921 created https://github.com/llvm/llvm-project/pull/81301 …ARCH Added functionality to the ARMTargetParser to obtain the minor version of each architecture, and amended ARM.cpp and AArch64.cpp to define __ARM_ARCH correctly. In ACLE 5.4.1, __ARM_ARCH is defined as equal to the major architecture version for ISAs up to and including v8. From v8.1 onwards, it's definition is changed to include minor versions, such that for an architecture vX.Y, __ARM_ARCH = X*100 + Y. >From 4f3a6f2ee1c6b8684f7a1eba1dc6db8c82925169 Mon Sep 17 00:00:00 2001 From: James Westwood Date: Fri, 9 Feb 2024 19:06:20 + Subject: [PATCH] __ARM_ARCH macro definition fix Added functionality to the ARMTargetParser to obtain the minor version of each architecture, and amended ARM.cpp and AArch64.cpp to define __ARM_ARCH correctly. In ACLE 5.4.1, __ARM_ARCH is defined as equal to the major architecture version for ISAs up to and including v8. From v8.1 onwards, it's definition is changed to include minor versions, such that for an architecture vX.Y, __ARM_ARCH = X*100 + Y. --- clang/test/Preprocessor/arm-target-features.c | 34 +-- .../llvm/TargetParser/ARMTargetParser.h | 1 + llvm/lib/TargetParser/ARMTargetParser.cpp | 58 +++ .../TargetParser/TargetParserTest.cpp | 8 +++ 4 files changed, 84 insertions(+), 17 deletions(-) diff --git a/clang/test/Preprocessor/arm-target-features.c b/clang/test/Preprocessor/arm-target-features.c index 236c9f2479b705..733d068b09b1fe 100644 --- a/clang/test/Preprocessor/arm-target-features.c +++ b/clang/test/Preprocessor/arm-target-features.c @@ -737,7 +737,7 @@ // Test whether predefines are as expected when targeting cortex-m55 (softfp FP ABI as default). // RUN: %clang -target arm-eabi -mcpu=cortex-m55 -x c -E -dM %s -o - | FileCheck -match-full-lines --check-prefix=M55 %s -// M55: #define __ARM_ARCH 8 +// M55: #define __ARM_ARCH 801 // M55: #define __ARM_ARCH_8_1M_MAIN__ 1 // M55: #define __ARM_ARCH_EXT_IDIV__ 1 // M55-NOT: __ARM_ARCH_ISA_ARM @@ -764,7 +764,7 @@ // KRAIT-ALLOW-FP-INSTR:#define __ARM_VFPV4__ 1 // RUN: %clang -target arm-arm-none-eabi -march=armv8.1-m.main -x c -E -dM %s -o - | FileCheck -match-full-lines --check-prefix=CHECK-V81M %s -// CHECK-V81M: #define __ARM_ARCH 8 +// CHECK-V81M: #define __ARM_ARCH 801 // CHECK-V81M: #define __ARM_ARCH_8_1M_MAIN__ 1 // CHECK-V81M: #define __ARM_ARCH_ISA_THUMB 2 // CHECK-V81M: #define __ARM_ARCH_PROFILE 'M' @@ -821,14 +821,14 @@ // 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 801 // CHECK-V81A: #define __ARM_ARCH_8_1A__ 1 // CHECK-V81A: #define __ARM_ARCH_PROFILE 'A' // CHECK-V81A: #define __ARM_FEATURE_QRDMX 1 // CHECK-V81A: #define __ARM_FP 0xe // RUN: %clang -target armv8.2a-none-none-eabi -x c -E -dM %s -o - | FileCheck -match-full-lines --check-prefix=CHECK-V82A %s -// CHECK-V82A: #define __ARM_ARCH 8 +// CHECK-V82A: #define __ARM_ARCH 802 // CHECK-V82A: #define __ARM_ARCH_8_2A__ 1 // CHECK-V82A: #define __ARM_ARCH_PROFILE 'A' // CHECK-V82A: #define __ARM_FEATURE_QRDMX 1 @@ -838,67 +838,67 @@ // CHECK-DRIVERKIT-NOT: #define __ARM_PCS_VFP 1 // RUN: %clang -target armv8.3a-none-none-eabi -x c -E -dM %s -o - | FileCheck -match-full-lines --check-prefix=CHECK-V83A %s -// CHECK-V83A: #define __ARM_ARCH 8 +// CHECK-V83A: #define __ARM_ARCH 803 // CHECK-V83A: #define __ARM_ARCH_8_3A__ 1 // CHECK-V83A: #define __ARM_ARCH_PROFILE 'A' // RUN: %clang -target armv8.4a-none-none-eabi -x c -E -dM %s -o - | FileCheck -match-full-lines --check-prefix=CHECK-V84A %s -// CHECK-V84A: #define __ARM_ARCH 8 +// CHECK-V84A: #define __ARM_ARCH 804 // CHECK-V84A: #define __ARM_ARCH_8_4A__ 1 // CHECK-V84A: #define __ARM_ARCH_PROFILE 'A' // RUN: %clang -target armv8.5a-none-none-eabi -x c -E -dM %s -o - | FileCheck -match-full-lines --check-prefix=CHECK-V85A %s -// CHECK-V85A: #define __ARM_ARCH 8 +// CHECK-V85A: #define __ARM_ARCH 805 // CHECK-V85A: #define __ARM_ARCH_8_5A__ 1 // CHECK-V85A: #define __ARM_ARCH_PROFILE 'A' // RUN: %clang -target armv8.6a-none-none-eabi -x c -E -dM %s -o - | FileCheck -match-full-lines --check-prefix=CHECK-V86A %s -// CHECK-V86A: #define __ARM_ARCH 8 +// CHECK-V86A: #define __ARM_ARCH 806 // CHECK-V86A: #define __ARM_ARCH_8_6A__ 1 // CHECK-V86A: #define __ARM_ARCH_PROFILE 'A' // RUN: %clang -target armv8.7a-none-none-eabi -x c -E -dM %s -o - | FileCheck -match-full-lines --check-prefix=CHECK-V87A %s -// CHECK-V87A: #define __ARM_ARCH 8 +// CHECK-V87A: #define __ARM_ARCH 807 // CHECK-V87A: #define __ARM_ARCH_8_7A__ 1 // CHECK-V87A: #define __ARM_ARCH_PROFILE 'A' // RUN: %clang -target armv8.8a-none-none-eabi -x c -E -dM %s -o - | FileCheck -match-full-lines --check-prefix
[clang] [llvm] __ARM_ARCH macro definition fix (PR #81301)
https://github.com/jwestwood921 updated https://github.com/llvm/llvm-project/pull/81301 >From 4f3a6f2ee1c6b8684f7a1eba1dc6db8c82925169 Mon Sep 17 00:00:00 2001 From: James Westwood Date: Fri, 9 Feb 2024 19:06:20 + Subject: [PATCH 1/2] __ARM_ARCH macro definition fix Added functionality to the ARMTargetParser to obtain the minor version of each architecture, and amended ARM.cpp and AArch64.cpp to define __ARM_ARCH correctly. In ACLE 5.4.1, __ARM_ARCH is defined as equal to the major architecture version for ISAs up to and including v8. From v8.1 onwards, it's definition is changed to include minor versions, such that for an architecture vX.Y, __ARM_ARCH = X*100 + Y. --- clang/test/Preprocessor/arm-target-features.c | 34 +-- .../llvm/TargetParser/ARMTargetParser.h | 1 + llvm/lib/TargetParser/ARMTargetParser.cpp | 58 +++ .../TargetParser/TargetParserTest.cpp | 8 +++ 4 files changed, 84 insertions(+), 17 deletions(-) diff --git a/clang/test/Preprocessor/arm-target-features.c b/clang/test/Preprocessor/arm-target-features.c index 236c9f2479b705..733d068b09b1fe 100644 --- a/clang/test/Preprocessor/arm-target-features.c +++ b/clang/test/Preprocessor/arm-target-features.c @@ -737,7 +737,7 @@ // Test whether predefines are as expected when targeting cortex-m55 (softfp FP ABI as default). // RUN: %clang -target arm-eabi -mcpu=cortex-m55 -x c -E -dM %s -o - | FileCheck -match-full-lines --check-prefix=M55 %s -// M55: #define __ARM_ARCH 8 +// M55: #define __ARM_ARCH 801 // M55: #define __ARM_ARCH_8_1M_MAIN__ 1 // M55: #define __ARM_ARCH_EXT_IDIV__ 1 // M55-NOT: __ARM_ARCH_ISA_ARM @@ -764,7 +764,7 @@ // KRAIT-ALLOW-FP-INSTR:#define __ARM_VFPV4__ 1 // RUN: %clang -target arm-arm-none-eabi -march=armv8.1-m.main -x c -E -dM %s -o - | FileCheck -match-full-lines --check-prefix=CHECK-V81M %s -// CHECK-V81M: #define __ARM_ARCH 8 +// CHECK-V81M: #define __ARM_ARCH 801 // CHECK-V81M: #define __ARM_ARCH_8_1M_MAIN__ 1 // CHECK-V81M: #define __ARM_ARCH_ISA_THUMB 2 // CHECK-V81M: #define __ARM_ARCH_PROFILE 'M' @@ -821,14 +821,14 @@ // 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 801 // CHECK-V81A: #define __ARM_ARCH_8_1A__ 1 // CHECK-V81A: #define __ARM_ARCH_PROFILE 'A' // CHECK-V81A: #define __ARM_FEATURE_QRDMX 1 // CHECK-V81A: #define __ARM_FP 0xe // RUN: %clang -target armv8.2a-none-none-eabi -x c -E -dM %s -o - | FileCheck -match-full-lines --check-prefix=CHECK-V82A %s -// CHECK-V82A: #define __ARM_ARCH 8 +// CHECK-V82A: #define __ARM_ARCH 802 // CHECK-V82A: #define __ARM_ARCH_8_2A__ 1 // CHECK-V82A: #define __ARM_ARCH_PROFILE 'A' // CHECK-V82A: #define __ARM_FEATURE_QRDMX 1 @@ -838,67 +838,67 @@ // CHECK-DRIVERKIT-NOT: #define __ARM_PCS_VFP 1 // RUN: %clang -target armv8.3a-none-none-eabi -x c -E -dM %s -o - | FileCheck -match-full-lines --check-prefix=CHECK-V83A %s -// CHECK-V83A: #define __ARM_ARCH 8 +// CHECK-V83A: #define __ARM_ARCH 803 // CHECK-V83A: #define __ARM_ARCH_8_3A__ 1 // CHECK-V83A: #define __ARM_ARCH_PROFILE 'A' // RUN: %clang -target armv8.4a-none-none-eabi -x c -E -dM %s -o - | FileCheck -match-full-lines --check-prefix=CHECK-V84A %s -// CHECK-V84A: #define __ARM_ARCH 8 +// CHECK-V84A: #define __ARM_ARCH 804 // CHECK-V84A: #define __ARM_ARCH_8_4A__ 1 // CHECK-V84A: #define __ARM_ARCH_PROFILE 'A' // RUN: %clang -target armv8.5a-none-none-eabi -x c -E -dM %s -o - | FileCheck -match-full-lines --check-prefix=CHECK-V85A %s -// CHECK-V85A: #define __ARM_ARCH 8 +// CHECK-V85A: #define __ARM_ARCH 805 // CHECK-V85A: #define __ARM_ARCH_8_5A__ 1 // CHECK-V85A: #define __ARM_ARCH_PROFILE 'A' // RUN: %clang -target armv8.6a-none-none-eabi -x c -E -dM %s -o - | FileCheck -match-full-lines --check-prefix=CHECK-V86A %s -// CHECK-V86A: #define __ARM_ARCH 8 +// CHECK-V86A: #define __ARM_ARCH 806 // CHECK-V86A: #define __ARM_ARCH_8_6A__ 1 // CHECK-V86A: #define __ARM_ARCH_PROFILE 'A' // RUN: %clang -target armv8.7a-none-none-eabi -x c -E -dM %s -o - | FileCheck -match-full-lines --check-prefix=CHECK-V87A %s -// CHECK-V87A: #define __ARM_ARCH 8 +// CHECK-V87A: #define __ARM_ARCH 807 // CHECK-V87A: #define __ARM_ARCH_8_7A__ 1 // CHECK-V87A: #define __ARM_ARCH_PROFILE 'A' // RUN: %clang -target armv8.8a-none-none-eabi -x c -E -dM %s -o - | FileCheck -match-full-lines --check-prefix=CHECK-V88A %s -// CHECK-V88A: #define __ARM_ARCH 8 +// CHECK-V88A: #define __ARM_ARCH 808 // CHECK-V88A: #define __ARM_ARCH_8_8A__ 1 // CHECK-V88A: #define __ARM_ARCH_PROFILE 'A' // RUN: %clang -target armv8.9a-none-none-eabi -x c -E -dM %s -o - | FileCheck -match-full-lines --check-prefix=CHECK-V89A %s -// CHECK-V89A: #define __ARM_ARCH 8 +// CHECK-V89A: #define __ARM_ARCH 809 // CHECK-V89A: #define __ARM_
[clang] [llvm] __ARM_ARCH macro definition fix (PR #81301)
https://github.com/jwestwood921 closed https://github.com/llvm/llvm-project/pull/81301 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] __ARM_ARCH macro fix (PR #81466)
https://github.com/jwestwood921 created https://github.com/llvm/llvm-project/pull/81466 Added functionality to the ARMTargetParser to obtain the minor version of each architecture, and amended ARM.cpp and AArch64.cpp to define __ARM_ARCH correctly. In ACLE 5.4.1, __ARM_ARCH is defined as equal to the major architecture version for ISAs up to and including v8. From v8.1 onwards, it's definition is changed to include minor versions, such that for an architecture vX.Y, __ARM_ARCH = X*100 + Y. >From 08628a75872266bdb1365ed39754512b1a400a70 Mon Sep 17 00:00:00 2001 From: James Westwood Date: Fri, 9 Feb 2024 19:06:20 + Subject: [PATCH] __ARM_ARCH macro definition fix Added functionality to the ARMTargetParser to obtain the minor version of each architecture, and amended ARM.cpp and AArch64.cpp to define __ARM_ARCH correctly. In ACLE 5.4.1, __ARM_ARCH is defined as equal to the major architecture version for ISAs up to and including v8. From v8.1 onwards, it's definition is changed to include minor versions, such that for an architecture vX.Y, __ARM_ARCH = X*100 + Y. --- clang/lib/Basic/Targets/AArch64.cpp | 17 +- clang/lib/Basic/Targets/ARM.cpp | 14 - clang/lib/Basic/Targets/ARM.h | 1 + clang/test/Preprocessor/arm-target-features.c | 34 +-- .../llvm/TargetParser/ARMTargetParser.h | 1 + llvm/lib/TargetParser/ARMTargetParser.cpp | 58 +++ .../TargetParser/TargetParserTest.cpp | 8 +++ 7 files changed, 111 insertions(+), 22 deletions(-) diff --git a/clang/lib/Basic/Targets/AArch64.cpp b/clang/lib/Basic/Targets/AArch64.cpp index 68032961451d90..32bca34f8976eb 100644 --- a/clang/lib/Basic/Targets/AArch64.cpp +++ b/clang/lib/Basic/Targets/AArch64.cpp @@ -367,8 +367,21 @@ void AArch64TargetInfo::getTargetDefines(const LangOptions &Opts, // ACLE predefines. Many can only have one possible value on v8 AArch64. Builder.defineMacro("__ARM_ACLE", "200"); - Builder.defineMacro("__ARM_ARCH", - std::to_string(ArchInfo->Version.getMajor())); + + // ACLE 5.4.1 ARM/Thumb instruction set architecture + // __ARM_ARCH is defined as an integer value indicating the current ARM ISA. + // For ISAs up to and including v8, __ARM_ARCH is equal to the major version + // number. For ISAs from v8.1 onwards, __ARM_ARCH is scaled up to include the + // minor version number, e.g. for ARM architecture ARMvX.Y: + // __ARM_ARCH = X * 100 + Y. + if (ArchInfo->Version.getMajor() == 8 && ArchInfo->Version.getMinor() == 0) +Builder.defineMacro("__ARM_ARCH", +std::to_string(ArchInfo->Version.getMajor())); + else +Builder.defineMacro("__ARM_ARCH", +std::to_string(ArchInfo->Version.getMajor()*100 + + ArchInfo->Version.getMinor().value())); + Builder.defineMacro("__ARM_ARCH_PROFILE", std::string("'") + (char)ArchInfo->Profile + "'"); diff --git a/clang/lib/Basic/Targets/ARM.cpp b/clang/lib/Basic/Targets/ARM.cpp index 55b71557452fa0..f1d649425840bc 100644 --- a/clang/lib/Basic/Targets/ARM.cpp +++ b/clang/lib/Basic/Targets/ARM.cpp @@ -130,6 +130,7 @@ void ARMTargetInfo::setArchInfo(llvm::ARM::ArchKind Kind) { SubArch = llvm::ARM::getSubArch(ArchKind); ArchProfile = llvm::ARM::parseArchProfile(SubArch); ArchVersion = llvm::ARM::parseArchVersion(SubArch); + ArchMinorVersion = llvm::ARM::parseArchMinorVersion(SubArch); // cache CPU related strings CPUAttr = getCPUAttr(); @@ -736,9 +737,16 @@ void ARMTargetInfo::getTargetDefines(const LangOptions &Opts, if (!CPUAttr.empty()) Builder.defineMacro("__ARM_ARCH_" + CPUAttr + "__"); - // ACLE 6.4.1 ARM/Thumb instruction set architecture - // __ARM_ARCH is defined as an integer value indicating the current ARM ISA - Builder.defineMacro("__ARM_ARCH", Twine(ArchVersion)); + // ACLE 5.4.1 ARM/Thumb instruction set architecture + // __ARM_ARCH is defined as an integer value indicating the current ARM ISA. + // For ISAs up to and including v8, __ARM_ARCH is equal to the major version + // number. For ISAs from v8.1 onwards, __ARM_ARCH is scaled up to include the + // minor version number, e.g. for ARM architecture ARMvX.Y: + // __ARM_ARCH = X * 100 + Y. + if (ArchVersion >= 9 || ArchMinorVersion != 0) +Builder.defineMacro("__ARM_ARCH", Twine(ArchVersion*100 + ArchMinorVersion)); + else +Builder.defineMacro("__ARM_ARCH", Twine(ArchVersion)); if (ArchVersion >= 8) { // ACLE 6.5.7 Crypto Extension diff --git a/clang/lib/Basic/Targets/ARM.h b/clang/lib/Basic/Targets/ARM.h index 9802eb01abf3c4..9c4bd299f67339 100644 --- a/clang/lib/Basic/Targets/ARM.h +++ b/clang/lib/Basic/Targets/ARM.h @@ -60,6 +60,7 @@ class LLVM_LIBRARY_VISIBILITY ARMTargetInfo : public TargetInfo { llvm::ARM::ArchKind ArchKind = llvm::ARM::ArchKind::ARMV4T; llvm::ARM::ProfileKind ArchProfile; unsigned ArchVersion;
[clang] [llvm] __ARM_ARCH macro fix (PR #81466)
https://github.com/jwestwood921 updated https://github.com/llvm/llvm-project/pull/81466 >From 08628a75872266bdb1365ed39754512b1a400a70 Mon Sep 17 00:00:00 2001 From: James Westwood Date: Fri, 9 Feb 2024 19:06:20 + Subject: [PATCH 1/2] __ARM_ARCH macro definition fix Added functionality to the ARMTargetParser to obtain the minor version of each architecture, and amended ARM.cpp and AArch64.cpp to define __ARM_ARCH correctly. In ACLE 5.4.1, __ARM_ARCH is defined as equal to the major architecture version for ISAs up to and including v8. From v8.1 onwards, it's definition is changed to include minor versions, such that for an architecture vX.Y, __ARM_ARCH = X*100 + Y. --- clang/lib/Basic/Targets/AArch64.cpp | 17 +- clang/lib/Basic/Targets/ARM.cpp | 14 - clang/lib/Basic/Targets/ARM.h | 1 + clang/test/Preprocessor/arm-target-features.c | 34 +-- .../llvm/TargetParser/ARMTargetParser.h | 1 + llvm/lib/TargetParser/ARMTargetParser.cpp | 58 +++ .../TargetParser/TargetParserTest.cpp | 8 +++ 7 files changed, 111 insertions(+), 22 deletions(-) diff --git a/clang/lib/Basic/Targets/AArch64.cpp b/clang/lib/Basic/Targets/AArch64.cpp index 68032961451d90..32bca34f8976eb 100644 --- a/clang/lib/Basic/Targets/AArch64.cpp +++ b/clang/lib/Basic/Targets/AArch64.cpp @@ -367,8 +367,21 @@ void AArch64TargetInfo::getTargetDefines(const LangOptions &Opts, // ACLE predefines. Many can only have one possible value on v8 AArch64. Builder.defineMacro("__ARM_ACLE", "200"); - Builder.defineMacro("__ARM_ARCH", - std::to_string(ArchInfo->Version.getMajor())); + + // ACLE 5.4.1 ARM/Thumb instruction set architecture + // __ARM_ARCH is defined as an integer value indicating the current ARM ISA. + // For ISAs up to and including v8, __ARM_ARCH is equal to the major version + // number. For ISAs from v8.1 onwards, __ARM_ARCH is scaled up to include the + // minor version number, e.g. for ARM architecture ARMvX.Y: + // __ARM_ARCH = X * 100 + Y. + if (ArchInfo->Version.getMajor() == 8 && ArchInfo->Version.getMinor() == 0) +Builder.defineMacro("__ARM_ARCH", +std::to_string(ArchInfo->Version.getMajor())); + else +Builder.defineMacro("__ARM_ARCH", +std::to_string(ArchInfo->Version.getMajor()*100 + + ArchInfo->Version.getMinor().value())); + Builder.defineMacro("__ARM_ARCH_PROFILE", std::string("'") + (char)ArchInfo->Profile + "'"); diff --git a/clang/lib/Basic/Targets/ARM.cpp b/clang/lib/Basic/Targets/ARM.cpp index 55b71557452fa0..f1d649425840bc 100644 --- a/clang/lib/Basic/Targets/ARM.cpp +++ b/clang/lib/Basic/Targets/ARM.cpp @@ -130,6 +130,7 @@ void ARMTargetInfo::setArchInfo(llvm::ARM::ArchKind Kind) { SubArch = llvm::ARM::getSubArch(ArchKind); ArchProfile = llvm::ARM::parseArchProfile(SubArch); ArchVersion = llvm::ARM::parseArchVersion(SubArch); + ArchMinorVersion = llvm::ARM::parseArchMinorVersion(SubArch); // cache CPU related strings CPUAttr = getCPUAttr(); @@ -736,9 +737,16 @@ void ARMTargetInfo::getTargetDefines(const LangOptions &Opts, if (!CPUAttr.empty()) Builder.defineMacro("__ARM_ARCH_" + CPUAttr + "__"); - // ACLE 6.4.1 ARM/Thumb instruction set architecture - // __ARM_ARCH is defined as an integer value indicating the current ARM ISA - Builder.defineMacro("__ARM_ARCH", Twine(ArchVersion)); + // ACLE 5.4.1 ARM/Thumb instruction set architecture + // __ARM_ARCH is defined as an integer value indicating the current ARM ISA. + // For ISAs up to and including v8, __ARM_ARCH is equal to the major version + // number. For ISAs from v8.1 onwards, __ARM_ARCH is scaled up to include the + // minor version number, e.g. for ARM architecture ARMvX.Y: + // __ARM_ARCH = X * 100 + Y. + if (ArchVersion >= 9 || ArchMinorVersion != 0) +Builder.defineMacro("__ARM_ARCH", Twine(ArchVersion*100 + ArchMinorVersion)); + else +Builder.defineMacro("__ARM_ARCH", Twine(ArchVersion)); if (ArchVersion >= 8) { // ACLE 6.5.7 Crypto Extension diff --git a/clang/lib/Basic/Targets/ARM.h b/clang/lib/Basic/Targets/ARM.h index 9802eb01abf3c4..9c4bd299f67339 100644 --- a/clang/lib/Basic/Targets/ARM.h +++ b/clang/lib/Basic/Targets/ARM.h @@ -60,6 +60,7 @@ class LLVM_LIBRARY_VISIBILITY ARMTargetInfo : public TargetInfo { llvm::ARM::ArchKind ArchKind = llvm::ARM::ArchKind::ARMV4T; llvm::ARM::ProfileKind ArchProfile; unsigned ArchVersion; + unsigned ArchMinorVersion; unsigned FPU : 5; unsigned MVE : 2; diff --git a/clang/test/Preprocessor/arm-target-features.c b/clang/test/Preprocessor/arm-target-features.c index 236c9f2479b705..733d068b09b1fe 100644 --- a/clang/test/Preprocessor/arm-target-features.c +++ b/clang/test/Preprocessor/arm-target-features.c @@ -737,7 +737,7 @@ // Test whether predefines are as expected when targetin
[clang] [llvm] __ARM_ARCH macro definition fix (PR #81493)
https://github.com/jwestwood921 created https://github.com/llvm/llvm-project/pull/81493 This patch changes how the macro __ARM_ARCH is defined to match its defintion in the ACLE. In ACLE 5.4.1, __ARM_ARCH is defined as equal to the major architecture version for ISAs up to and including v8. From v8.1 onwards, its definition is changed to include minor versions, such that for an architecture vX.Y, __ARM_ARCH = X*100 + Y. Before this patch, LLVM defined __ARM_ARCH using only the major architecture version for all architecture versions. This patch adds functionality to define __ARM_ARCH correctly for architectures greater than or equal to v8.1. >From 2c265033c4f345f475a7dca4793178ce2502a4fa Mon Sep 17 00:00:00 2001 From: James Westwood Date: Fri, 9 Feb 2024 19:06:20 + Subject: [PATCH] __ARM_ARCH macro definition fix This patch changes how the macro __ARM_ARCH is defined to match its defintion in the ACLE. In ACLE 5.4.1, __ARM_ARCH is defined as equal to the major architecture version for ISAs up to and including v8. From v8.1 onwards, its definition is changed to include minor versions, such that for an architecture vX.Y, __ARM_ARCH = X*100 + Y. Before this patch, LLVM defined __ARM_ARCH using only the major architecture version for all architecture versions. This patch adds functionality to define __ARM_ARCH correctly for architectures greater than or equal to v8.1. --- clang/lib/Basic/Targets/AArch64.cpp | 17 +- clang/lib/Basic/Targets/ARM.cpp | 15 - clang/lib/Basic/Targets/ARM.h | 1 + clang/test/Preprocessor/arm-target-features.c | 34 +-- .../llvm/TargetParser/ARMTargetParser.h | 1 + llvm/lib/TargetParser/ARMTargetParser.cpp | 58 +++ .../TargetParser/TargetParserTest.cpp | 8 +++ 7 files changed, 112 insertions(+), 22 deletions(-) diff --git a/clang/lib/Basic/Targets/AArch64.cpp b/clang/lib/Basic/Targets/AArch64.cpp index 68032961451d90..3ef283f824006c 100644 --- a/clang/lib/Basic/Targets/AArch64.cpp +++ b/clang/lib/Basic/Targets/AArch64.cpp @@ -367,8 +367,21 @@ void AArch64TargetInfo::getTargetDefines(const LangOptions &Opts, // ACLE predefines. Many can only have one possible value on v8 AArch64. Builder.defineMacro("__ARM_ACLE", "200"); - Builder.defineMacro("__ARM_ARCH", - std::to_string(ArchInfo->Version.getMajor())); + + // ACLE 5.4.1 ARM/Thumb instruction set architecture + // __ARM_ARCH is defined as an integer value indicating the current ARM ISA. + // For ISAs up to and including v8, __ARM_ARCH is equal to the major version + // number. For ISAs from v8.1 onwards, __ARM_ARCH is scaled up to include the + // minor version number, e.g. for ARM architecture ARMvX.Y: + // __ARM_ARCH = X * 100 + Y. + if (ArchInfo->Version.getMajor() == 8 && ArchInfo->Version.getMinor() == 0) +Builder.defineMacro("__ARM_ARCH", +std::to_string(ArchInfo->Version.getMajor())); + else +Builder.defineMacro("__ARM_ARCH", +std::to_string(ArchInfo->Version.getMajor() * 100 + + ArchInfo->Version.getMinor().value())); + Builder.defineMacro("__ARM_ARCH_PROFILE", std::string("'") + (char)ArchInfo->Profile + "'"); diff --git a/clang/lib/Basic/Targets/ARM.cpp b/clang/lib/Basic/Targets/ARM.cpp index 55b71557452fa0..9ac558caa2886a 100644 --- a/clang/lib/Basic/Targets/ARM.cpp +++ b/clang/lib/Basic/Targets/ARM.cpp @@ -130,6 +130,7 @@ void ARMTargetInfo::setArchInfo(llvm::ARM::ArchKind Kind) { SubArch = llvm::ARM::getSubArch(ArchKind); ArchProfile = llvm::ARM::parseArchProfile(SubArch); ArchVersion = llvm::ARM::parseArchVersion(SubArch); + ArchMinorVersion = llvm::ARM::parseArchMinorVersion(SubArch); // cache CPU related strings CPUAttr = getCPUAttr(); @@ -736,9 +737,17 @@ void ARMTargetInfo::getTargetDefines(const LangOptions &Opts, if (!CPUAttr.empty()) Builder.defineMacro("__ARM_ARCH_" + CPUAttr + "__"); - // ACLE 6.4.1 ARM/Thumb instruction set architecture - // __ARM_ARCH is defined as an integer value indicating the current ARM ISA - Builder.defineMacro("__ARM_ARCH", Twine(ArchVersion)); + // ACLE 5.4.1 ARM/Thumb instruction set architecture + // __ARM_ARCH is defined as an integer value indicating the current ARM ISA. + // For ISAs up to and including v8, __ARM_ARCH is equal to the major version + // number. For ISAs from v8.1 onwards, __ARM_ARCH is scaled up to include the + // minor version number, e.g. for ARM architecture ARMvX.Y: + // __ARM_ARCH = X * 100 + Y. + if (ArchVersion >= 9 || ArchMinorVersion != 0) +Builder.defineMacro("__ARM_ARCH", +Twine(ArchVersion * 100 + ArchMinorVersion)); + else +Builder.defineMacro("__ARM_ARCH", Twine(ArchVersion)); if (ArchVersion >= 8) { // ACLE 6.5.7 Crypto Extension diff --git a/clang/lib/Basic/Targets/ARM.h b/clang/lib/Basic/Ta
[clang] [llvm] __ARM_ARCH macro fix (PR #81466)
https://github.com/jwestwood921 closed https://github.com/llvm/llvm-project/pull/81466 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [ARM] __ARM_ARCH macro definition fix (PR #81493)
https://github.com/jwestwood921 edited https://github.com/llvm/llvm-project/pull/81493 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [ARM] __ARM_ARCH macro definition fix (PR #81493)
https://github.com/jwestwood921 updated https://github.com/llvm/llvm-project/pull/81493 >From 2c265033c4f345f475a7dca4793178ce2502a4fa Mon Sep 17 00:00:00 2001 From: James Westwood Date: Fri, 9 Feb 2024 19:06:20 + Subject: [PATCH 1/2] __ARM_ARCH macro definition fix This patch changes how the macro __ARM_ARCH is defined to match its defintion in the ACLE. In ACLE 5.4.1, __ARM_ARCH is defined as equal to the major architecture version for ISAs up to and including v8. From v8.1 onwards, its definition is changed to include minor versions, such that for an architecture vX.Y, __ARM_ARCH = X*100 + Y. Before this patch, LLVM defined __ARM_ARCH using only the major architecture version for all architecture versions. This patch adds functionality to define __ARM_ARCH correctly for architectures greater than or equal to v8.1. --- clang/lib/Basic/Targets/AArch64.cpp | 17 +- clang/lib/Basic/Targets/ARM.cpp | 15 - clang/lib/Basic/Targets/ARM.h | 1 + clang/test/Preprocessor/arm-target-features.c | 34 +-- .../llvm/TargetParser/ARMTargetParser.h | 1 + llvm/lib/TargetParser/ARMTargetParser.cpp | 58 +++ .../TargetParser/TargetParserTest.cpp | 8 +++ 7 files changed, 112 insertions(+), 22 deletions(-) diff --git a/clang/lib/Basic/Targets/AArch64.cpp b/clang/lib/Basic/Targets/AArch64.cpp index 68032961451d90..3ef283f824006c 100644 --- a/clang/lib/Basic/Targets/AArch64.cpp +++ b/clang/lib/Basic/Targets/AArch64.cpp @@ -367,8 +367,21 @@ void AArch64TargetInfo::getTargetDefines(const LangOptions &Opts, // ACLE predefines. Many can only have one possible value on v8 AArch64. Builder.defineMacro("__ARM_ACLE", "200"); - Builder.defineMacro("__ARM_ARCH", - std::to_string(ArchInfo->Version.getMajor())); + + // ACLE 5.4.1 ARM/Thumb instruction set architecture + // __ARM_ARCH is defined as an integer value indicating the current ARM ISA. + // For ISAs up to and including v8, __ARM_ARCH is equal to the major version + // number. For ISAs from v8.1 onwards, __ARM_ARCH is scaled up to include the + // minor version number, e.g. for ARM architecture ARMvX.Y: + // __ARM_ARCH = X * 100 + Y. + if (ArchInfo->Version.getMajor() == 8 && ArchInfo->Version.getMinor() == 0) +Builder.defineMacro("__ARM_ARCH", +std::to_string(ArchInfo->Version.getMajor())); + else +Builder.defineMacro("__ARM_ARCH", +std::to_string(ArchInfo->Version.getMajor() * 100 + + ArchInfo->Version.getMinor().value())); + Builder.defineMacro("__ARM_ARCH_PROFILE", std::string("'") + (char)ArchInfo->Profile + "'"); diff --git a/clang/lib/Basic/Targets/ARM.cpp b/clang/lib/Basic/Targets/ARM.cpp index 55b71557452fa0..9ac558caa2886a 100644 --- a/clang/lib/Basic/Targets/ARM.cpp +++ b/clang/lib/Basic/Targets/ARM.cpp @@ -130,6 +130,7 @@ void ARMTargetInfo::setArchInfo(llvm::ARM::ArchKind Kind) { SubArch = llvm::ARM::getSubArch(ArchKind); ArchProfile = llvm::ARM::parseArchProfile(SubArch); ArchVersion = llvm::ARM::parseArchVersion(SubArch); + ArchMinorVersion = llvm::ARM::parseArchMinorVersion(SubArch); // cache CPU related strings CPUAttr = getCPUAttr(); @@ -736,9 +737,17 @@ void ARMTargetInfo::getTargetDefines(const LangOptions &Opts, if (!CPUAttr.empty()) Builder.defineMacro("__ARM_ARCH_" + CPUAttr + "__"); - // ACLE 6.4.1 ARM/Thumb instruction set architecture - // __ARM_ARCH is defined as an integer value indicating the current ARM ISA - Builder.defineMacro("__ARM_ARCH", Twine(ArchVersion)); + // ACLE 5.4.1 ARM/Thumb instruction set architecture + // __ARM_ARCH is defined as an integer value indicating the current ARM ISA. + // For ISAs up to and including v8, __ARM_ARCH is equal to the major version + // number. For ISAs from v8.1 onwards, __ARM_ARCH is scaled up to include the + // minor version number, e.g. for ARM architecture ARMvX.Y: + // __ARM_ARCH = X * 100 + Y. + if (ArchVersion >= 9 || ArchMinorVersion != 0) +Builder.defineMacro("__ARM_ARCH", +Twine(ArchVersion * 100 + ArchMinorVersion)); + else +Builder.defineMacro("__ARM_ARCH", Twine(ArchVersion)); if (ArchVersion >= 8) { // ACLE 6.5.7 Crypto Extension diff --git a/clang/lib/Basic/Targets/ARM.h b/clang/lib/Basic/Targets/ARM.h index 71322a094f5edb..df06e4d120637a 100644 --- a/clang/lib/Basic/Targets/ARM.h +++ b/clang/lib/Basic/Targets/ARM.h @@ -60,6 +60,7 @@ class LLVM_LIBRARY_VISIBILITY ARMTargetInfo : public TargetInfo { llvm::ARM::ArchKind ArchKind = llvm::ARM::ArchKind::ARMV4T; llvm::ARM::ProfileKind ArchProfile; unsigned ArchVersion; + unsigned ArchMinorVersion; LLVM_PREFERRED_TYPE(FPUMode) unsigned FPU : 5; diff --git a/clang/test/Preprocessor/arm-target-features.c b/clang/test/Preprocessor/arm-target-features.c index 236c9f2479b705..733d068b09b
[clang] [llvm] [ARM] __ARM_ARCH macro definition fix (PR #81493)
https://github.com/jwestwood921 updated https://github.com/llvm/llvm-project/pull/81493 >From 15c83444dbf0ea8e161479253351727b049b6bd1 Mon Sep 17 00:00:00 2001 From: James Westwood Date: Fri, 9 Feb 2024 19:06:20 + Subject: [PATCH] __ARM_ARCH macro definition fix This patch changes how the macro __ARM_ARCH is defined to match its defintion in the ACLE. In ACLE 5.4.1, __ARM_ARCH is defined as equal to the major architecture version for ISAs up to and including v8. From v8.1 onwards, its definition is changed to include minor versions, such that for an architecture vX.Y, __ARM_ARCH = X*100 + Y. Before this patch, LLVM defined __ARM_ARCH using only the major architecture version for all architecture versions. This patch adds functionality to define __ARM_ARCH correctly for architectures greater than or equal to v8.1. --- clang/lib/Basic/Targets/AArch64.cpp | 16 - clang/lib/Basic/Targets/ARM.cpp | 14 - clang/lib/Basic/Targets/ARM.h | 1 + clang/test/Preprocessor/arm-target-features.c | 34 +-- .../llvm/TargetParser/ARMTargetParser.h | 1 + llvm/lib/TargetParser/ARMTargetParser.cpp | 58 +++ .../TargetParser/TargetParserTest.cpp | 8 +++ 7 files changed, 110 insertions(+), 22 deletions(-) diff --git a/clang/lib/Basic/Targets/AArch64.cpp b/clang/lib/Basic/Targets/AArch64.cpp index 68032961451d90..dd0218e6ebed81 100644 --- a/clang/lib/Basic/Targets/AArch64.cpp +++ b/clang/lib/Basic/Targets/AArch64.cpp @@ -367,8 +367,20 @@ void AArch64TargetInfo::getTargetDefines(const LangOptions &Opts, // ACLE predefines. Many can only have one possible value on v8 AArch64. Builder.defineMacro("__ARM_ACLE", "200"); - Builder.defineMacro("__ARM_ARCH", - std::to_string(ArchInfo->Version.getMajor())); + + // __ARM_ARCH is defined as an integer value indicating the current ARM ISA. + // For ISAs up to and including v8, __ARM_ARCH is equal to the major version + // number. For ISAs from v8.1 onwards, __ARM_ARCH is scaled up to include the + // minor version number, e.g. for ARM architecture ARMvX.Y: + // __ARM_ARCH = X * 100 + Y. + if (ArchInfo->Version.getMajor() == 8 && ArchInfo->Version.getMinor() == 0) +Builder.defineMacro("__ARM_ARCH", +std::to_string(ArchInfo->Version.getMajor())); + else +Builder.defineMacro("__ARM_ARCH", +std::to_string(ArchInfo->Version.getMajor() * 100 + + ArchInfo->Version.getMinor().value())); + Builder.defineMacro("__ARM_ARCH_PROFILE", std::string("'") + (char)ArchInfo->Profile + "'"); diff --git a/clang/lib/Basic/Targets/ARM.cpp b/clang/lib/Basic/Targets/ARM.cpp index 55b71557452fa0..cd7fb95259d9db 100644 --- a/clang/lib/Basic/Targets/ARM.cpp +++ b/clang/lib/Basic/Targets/ARM.cpp @@ -130,6 +130,7 @@ void ARMTargetInfo::setArchInfo(llvm::ARM::ArchKind Kind) { SubArch = llvm::ARM::getSubArch(ArchKind); ArchProfile = llvm::ARM::parseArchProfile(SubArch); ArchVersion = llvm::ARM::parseArchVersion(SubArch); + ArchMinorVersion = llvm::ARM::parseArchMinorVersion(SubArch); // cache CPU related strings CPUAttr = getCPUAttr(); @@ -736,9 +737,16 @@ void ARMTargetInfo::getTargetDefines(const LangOptions &Opts, if (!CPUAttr.empty()) Builder.defineMacro("__ARM_ARCH_" + CPUAttr + "__"); - // ACLE 6.4.1 ARM/Thumb instruction set architecture - // __ARM_ARCH is defined as an integer value indicating the current ARM ISA - Builder.defineMacro("__ARM_ARCH", Twine(ArchVersion)); + // __ARM_ARCH is defined as an integer value indicating the current ARM ISA. + // For ISAs up to and including v8, __ARM_ARCH is equal to the major version + // number. For ISAs from v8.1 onwards, __ARM_ARCH is scaled up to include the + // minor version number, e.g. for ARM architecture ARMvX.Y: + // __ARM_ARCH = X * 100 + Y. + if (ArchVersion >= 9 || ArchMinorVersion != 0) +Builder.defineMacro("__ARM_ARCH", +Twine(ArchVersion * 100 + ArchMinorVersion)); + else +Builder.defineMacro("__ARM_ARCH", Twine(ArchVersion)); if (ArchVersion >= 8) { // ACLE 6.5.7 Crypto Extension diff --git a/clang/lib/Basic/Targets/ARM.h b/clang/lib/Basic/Targets/ARM.h index 71322a094f5edb..df06e4d120637a 100644 --- a/clang/lib/Basic/Targets/ARM.h +++ b/clang/lib/Basic/Targets/ARM.h @@ -60,6 +60,7 @@ class LLVM_LIBRARY_VISIBILITY ARMTargetInfo : public TargetInfo { llvm::ARM::ArchKind ArchKind = llvm::ARM::ArchKind::ARMV4T; llvm::ARM::ProfileKind ArchProfile; unsigned ArchVersion; + unsigned ArchMinorVersion; LLVM_PREFERRED_TYPE(FPUMode) unsigned FPU : 5; diff --git a/clang/test/Preprocessor/arm-target-features.c b/clang/test/Preprocessor/arm-target-features.c index 236c9f2479b705..733d068b09b1fe 100644 --- a/clang/test/Preprocessor/arm-target-features.c +++ b/clang/test/Preprocessor/arm-target-features.c @@
[clang] [llvm] [ARM] __ARM_ARCH macro definition fix (PR #81493)
https://github.com/jwestwood921 updated https://github.com/llvm/llvm-project/pull/81493 >From 0a970c1e8d5137e1c202f688f06d738b890dd98c Mon Sep 17 00:00:00 2001 From: James Westwood Date: Fri, 9 Feb 2024 19:06:20 + Subject: [PATCH] __ARM_ARCH macro definition fix This patch changes how the macro __ARM_ARCH is defined to match its defintion in the ACLE. In ACLE 5.4.1, __ARM_ARCH is defined as equal to the major architecture version for ISAs up to and including v8. From v8.1 onwards, its definition is changed to include minor versions, such that for an architecture vX.Y, __ARM_ARCH = X*100 + Y. Before this patch, LLVM defined __ARM_ARCH using only the major architecture version for all architecture versions. This patch adds functionality to define __ARM_ARCH correctly for architectures greater than or equal to v8.1. --- clang/docs/ReleaseNotes.rst | 2 + clang/lib/Basic/Targets/AArch64.cpp | 16 - clang/lib/Basic/Targets/ARM.cpp | 14 - clang/lib/Basic/Targets/ARM.h | 1 + clang/test/Preprocessor/arm-target-features.c | 34 +-- .../llvm/TargetParser/ARMTargetParser.h | 1 + llvm/lib/TargetParser/ARMTargetParser.cpp | 58 +++ .../TargetParser/TargetParserTest.cpp | 8 +++ 8 files changed, 112 insertions(+), 22 deletions(-) diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index 402a2f8687386c..462630a0cd14c3 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -253,6 +253,8 @@ X86 Support Arm and AArch64 Support ^^^ +- Fixed the incorrect definition of the __ARM_ARCH macro for architectures greater than or equal to v8.1. + Android Support ^^^ diff --git a/clang/lib/Basic/Targets/AArch64.cpp b/clang/lib/Basic/Targets/AArch64.cpp index 68032961451d90..dd0218e6ebed81 100644 --- a/clang/lib/Basic/Targets/AArch64.cpp +++ b/clang/lib/Basic/Targets/AArch64.cpp @@ -367,8 +367,20 @@ void AArch64TargetInfo::getTargetDefines(const LangOptions &Opts, // ACLE predefines. Many can only have one possible value on v8 AArch64. Builder.defineMacro("__ARM_ACLE", "200"); - Builder.defineMacro("__ARM_ARCH", - std::to_string(ArchInfo->Version.getMajor())); + + // __ARM_ARCH is defined as an integer value indicating the current ARM ISA. + // For ISAs up to and including v8, __ARM_ARCH is equal to the major version + // number. For ISAs from v8.1 onwards, __ARM_ARCH is scaled up to include the + // minor version number, e.g. for ARM architecture ARMvX.Y: + // __ARM_ARCH = X * 100 + Y. + if (ArchInfo->Version.getMajor() == 8 && ArchInfo->Version.getMinor() == 0) +Builder.defineMacro("__ARM_ARCH", +std::to_string(ArchInfo->Version.getMajor())); + else +Builder.defineMacro("__ARM_ARCH", +std::to_string(ArchInfo->Version.getMajor() * 100 + + ArchInfo->Version.getMinor().value())); + Builder.defineMacro("__ARM_ARCH_PROFILE", std::string("'") + (char)ArchInfo->Profile + "'"); diff --git a/clang/lib/Basic/Targets/ARM.cpp b/clang/lib/Basic/Targets/ARM.cpp index 55b71557452fa0..cd7fb95259d9db 100644 --- a/clang/lib/Basic/Targets/ARM.cpp +++ b/clang/lib/Basic/Targets/ARM.cpp @@ -130,6 +130,7 @@ void ARMTargetInfo::setArchInfo(llvm::ARM::ArchKind Kind) { SubArch = llvm::ARM::getSubArch(ArchKind); ArchProfile = llvm::ARM::parseArchProfile(SubArch); ArchVersion = llvm::ARM::parseArchVersion(SubArch); + ArchMinorVersion = llvm::ARM::parseArchMinorVersion(SubArch); // cache CPU related strings CPUAttr = getCPUAttr(); @@ -736,9 +737,16 @@ void ARMTargetInfo::getTargetDefines(const LangOptions &Opts, if (!CPUAttr.empty()) Builder.defineMacro("__ARM_ARCH_" + CPUAttr + "__"); - // ACLE 6.4.1 ARM/Thumb instruction set architecture - // __ARM_ARCH is defined as an integer value indicating the current ARM ISA - Builder.defineMacro("__ARM_ARCH", Twine(ArchVersion)); + // __ARM_ARCH is defined as an integer value indicating the current ARM ISA. + // For ISAs up to and including v8, __ARM_ARCH is equal to the major version + // number. For ISAs from v8.1 onwards, __ARM_ARCH is scaled up to include the + // minor version number, e.g. for ARM architecture ARMvX.Y: + // __ARM_ARCH = X * 100 + Y. + if (ArchVersion >= 9 || ArchMinorVersion != 0) +Builder.defineMacro("__ARM_ARCH", +Twine(ArchVersion * 100 + ArchMinorVersion)); + else +Builder.defineMacro("__ARM_ARCH", Twine(ArchVersion)); if (ArchVersion >= 8) { // ACLE 6.5.7 Crypto Extension diff --git a/clang/lib/Basic/Targets/ARM.h b/clang/lib/Basic/Targets/ARM.h index 71322a094f5edb..df06e4d120637a 100644 --- a/clang/lib/Basic/Targets/ARM.h +++ b/clang/lib/Basic/Targets/ARM.h @@ -60,6 +60,7 @@ class LLVM_LIBRARY_VISIBILITY ARMTargetInfo : public TargetInfo {
[clang] [llvm] [ARM] __ARM_ARCH macro definition fix (PR #81493)
https://github.com/jwestwood921 updated https://github.com/llvm/llvm-project/pull/81493 >From 0a970c1e8d5137e1c202f688f06d738b890dd98c Mon Sep 17 00:00:00 2001 From: James Westwood Date: Fri, 9 Feb 2024 19:06:20 + Subject: [PATCH] __ARM_ARCH macro definition fix This patch changes how the macro __ARM_ARCH is defined to match its defintion in the ACLE. In ACLE 5.4.1, __ARM_ARCH is defined as equal to the major architecture version for ISAs up to and including v8. From v8.1 onwards, its definition is changed to include minor versions, such that for an architecture vX.Y, __ARM_ARCH = X*100 + Y. Before this patch, LLVM defined __ARM_ARCH using only the major architecture version for all architecture versions. This patch adds functionality to define __ARM_ARCH correctly for architectures greater than or equal to v8.1. --- clang/docs/ReleaseNotes.rst | 2 + clang/lib/Basic/Targets/AArch64.cpp | 16 - clang/lib/Basic/Targets/ARM.cpp | 14 - clang/lib/Basic/Targets/ARM.h | 1 + clang/test/Preprocessor/arm-target-features.c | 34 +-- .../llvm/TargetParser/ARMTargetParser.h | 1 + llvm/lib/TargetParser/ARMTargetParser.cpp | 58 +++ .../TargetParser/TargetParserTest.cpp | 8 +++ 8 files changed, 112 insertions(+), 22 deletions(-) diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index 402a2f8687386c..462630a0cd14c3 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -253,6 +253,8 @@ X86 Support Arm and AArch64 Support ^^^ +- Fixed the incorrect definition of the __ARM_ARCH macro for architectures greater than or equal to v8.1. + Android Support ^^^ diff --git a/clang/lib/Basic/Targets/AArch64.cpp b/clang/lib/Basic/Targets/AArch64.cpp index 68032961451d90..dd0218e6ebed81 100644 --- a/clang/lib/Basic/Targets/AArch64.cpp +++ b/clang/lib/Basic/Targets/AArch64.cpp @@ -367,8 +367,20 @@ void AArch64TargetInfo::getTargetDefines(const LangOptions &Opts, // ACLE predefines. Many can only have one possible value on v8 AArch64. Builder.defineMacro("__ARM_ACLE", "200"); - Builder.defineMacro("__ARM_ARCH", - std::to_string(ArchInfo->Version.getMajor())); + + // __ARM_ARCH is defined as an integer value indicating the current ARM ISA. + // For ISAs up to and including v8, __ARM_ARCH is equal to the major version + // number. For ISAs from v8.1 onwards, __ARM_ARCH is scaled up to include the + // minor version number, e.g. for ARM architecture ARMvX.Y: + // __ARM_ARCH = X * 100 + Y. + if (ArchInfo->Version.getMajor() == 8 && ArchInfo->Version.getMinor() == 0) +Builder.defineMacro("__ARM_ARCH", +std::to_string(ArchInfo->Version.getMajor())); + else +Builder.defineMacro("__ARM_ARCH", +std::to_string(ArchInfo->Version.getMajor() * 100 + + ArchInfo->Version.getMinor().value())); + Builder.defineMacro("__ARM_ARCH_PROFILE", std::string("'") + (char)ArchInfo->Profile + "'"); diff --git a/clang/lib/Basic/Targets/ARM.cpp b/clang/lib/Basic/Targets/ARM.cpp index 55b71557452fa0..cd7fb95259d9db 100644 --- a/clang/lib/Basic/Targets/ARM.cpp +++ b/clang/lib/Basic/Targets/ARM.cpp @@ -130,6 +130,7 @@ void ARMTargetInfo::setArchInfo(llvm::ARM::ArchKind Kind) { SubArch = llvm::ARM::getSubArch(ArchKind); ArchProfile = llvm::ARM::parseArchProfile(SubArch); ArchVersion = llvm::ARM::parseArchVersion(SubArch); + ArchMinorVersion = llvm::ARM::parseArchMinorVersion(SubArch); // cache CPU related strings CPUAttr = getCPUAttr(); @@ -736,9 +737,16 @@ void ARMTargetInfo::getTargetDefines(const LangOptions &Opts, if (!CPUAttr.empty()) Builder.defineMacro("__ARM_ARCH_" + CPUAttr + "__"); - // ACLE 6.4.1 ARM/Thumb instruction set architecture - // __ARM_ARCH is defined as an integer value indicating the current ARM ISA - Builder.defineMacro("__ARM_ARCH", Twine(ArchVersion)); + // __ARM_ARCH is defined as an integer value indicating the current ARM ISA. + // For ISAs up to and including v8, __ARM_ARCH is equal to the major version + // number. For ISAs from v8.1 onwards, __ARM_ARCH is scaled up to include the + // minor version number, e.g. for ARM architecture ARMvX.Y: + // __ARM_ARCH = X * 100 + Y. + if (ArchVersion >= 9 || ArchMinorVersion != 0) +Builder.defineMacro("__ARM_ARCH", +Twine(ArchVersion * 100 + ArchMinorVersion)); + else +Builder.defineMacro("__ARM_ARCH", Twine(ArchVersion)); if (ArchVersion >= 8) { // ACLE 6.5.7 Crypto Extension diff --git a/clang/lib/Basic/Targets/ARM.h b/clang/lib/Basic/Targets/ARM.h index 71322a094f5edb..df06e4d120637a 100644 --- a/clang/lib/Basic/Targets/ARM.h +++ b/clang/lib/Basic/Targets/ARM.h @@ -60,6 +60,7 @@ class LLVM_LIBRARY_VISIBILITY ARMTargetInfo : public TargetInfo {
[clang] [llvm] Changed the __ARM_ARCH macro to match the definition in the ACLE. (PR #79583)
https://github.com/jwestwood921 created https://github.com/llvm/llvm-project/pull/79583 Added functionality to the ARMTargetParser to obtain the minor version of each architecture, and amended ARM.cpp and AArch64.cpp to define __ARM_ARCH correctly. In ACLE 5.4.1, __ARM_ARCH is defined as equal to the major architecture version for ISAs up to and including v8. From v8.1 onwards, it's definition is changed to include minor versions, such that for an architecture vX.Y, __ARM_ARCH = X*100 + Y. >From ca0e00f887f1d7c397f1ff690f2614c46b423285 Mon Sep 17 00:00:00 2001 From: James Westwood Date: Tue, 16 Jan 2024 13:40:50 + Subject: [PATCH] Changed the __ARM_ARCH macro to match the definition in the ACLE. Added functionality to the ARMTargetParser to obtain the minor version of each architecture, and amended ARM.cpp and AArch64.cpp to define __ARM_ARCH correctly. In ACLE 5.4.1, __ARM_ARCH is defined as equal to the major architecture version for ISAs up to and including v8. From v8.1 onwards, it's definition is changed to include minor versions, such that for an architecture vX.Y, __ARM_ARCH = X*100 + Y. Change-Id: Ia9d0943009790f206f1f6422e43996cf501e99f8 --- clang/lib/Basic/Targets/AArch64.cpp | 17 +- clang/lib/Basic/Targets/ARM.cpp | 15 - clang/lib/Basic/Targets/ARM.h | 1 + clang/test/Preprocessor/arm-target-features.c | 32 +- .../llvm/TargetParser/ARMTargetParser.h | 1 + llvm/lib/TargetParser/ARMTargetParser.cpp | 60 +++ .../TargetParser/TargetParserTest.cpp | 8 +++ 7 files changed, 113 insertions(+), 21 deletions(-) diff --git a/clang/lib/Basic/Targets/AArch64.cpp b/clang/lib/Basic/Targets/AArch64.cpp index d47181bfca4fc86..7d0f879b3daee6f 100644 --- a/clang/lib/Basic/Targets/AArch64.cpp +++ b/clang/lib/Basic/Targets/AArch64.cpp @@ -368,8 +368,21 @@ void AArch64TargetInfo::getTargetDefines(const LangOptions &Opts, // ACLE predefines. Many can only have one possible value on v8 AArch64. Builder.defineMacro("__ARM_ACLE", "200"); - Builder.defineMacro("__ARM_ARCH", - std::to_string(ArchInfo->Version.getMajor())); + + // ACLE 5.4.1 ARM/Thumb instruction set architecture + // __ARM_ARCH is defined as an integer value indicating the current ARM ISA. + // For ISAs up to and including v8, __ARM_ARCH is equal to the major version + // number. For ISAs from v8.1 onwards, __ARM_ARCH is scaled up to include the + // minor version number, e.g. for ARM architecture ARMvX.Y: + // __ARM_ARCH = X * 100 + Y. + if (ArchInfo->Version.getMajor() == 8 && ArchInfo->Version.getMinor() == 0) +Builder.defineMacro("__ARM_ARCH", +std::to_string(ArchInfo->Version.getMajor())); + else +Builder.defineMacro("__ARM_ARCH", +std::to_string(ArchInfo->Version.getMajor() * 100 + + ArchInfo->Version.getMinor().value())); + Builder.defineMacro("__ARM_ARCH_PROFILE", std::string("'") + (char)ArchInfo->Profile + "'"); diff --git a/clang/lib/Basic/Targets/ARM.cpp b/clang/lib/Basic/Targets/ARM.cpp index 55b71557452fa04..9ac558caa2886aa 100644 --- a/clang/lib/Basic/Targets/ARM.cpp +++ b/clang/lib/Basic/Targets/ARM.cpp @@ -130,6 +130,7 @@ void ARMTargetInfo::setArchInfo(llvm::ARM::ArchKind Kind) { SubArch = llvm::ARM::getSubArch(ArchKind); ArchProfile = llvm::ARM::parseArchProfile(SubArch); ArchVersion = llvm::ARM::parseArchVersion(SubArch); + ArchMinorVersion = llvm::ARM::parseArchMinorVersion(SubArch); // cache CPU related strings CPUAttr = getCPUAttr(); @@ -736,9 +737,17 @@ void ARMTargetInfo::getTargetDefines(const LangOptions &Opts, if (!CPUAttr.empty()) Builder.defineMacro("__ARM_ARCH_" + CPUAttr + "__"); - // ACLE 6.4.1 ARM/Thumb instruction set architecture - // __ARM_ARCH is defined as an integer value indicating the current ARM ISA - Builder.defineMacro("__ARM_ARCH", Twine(ArchVersion)); + // ACLE 5.4.1 ARM/Thumb instruction set architecture + // __ARM_ARCH is defined as an integer value indicating the current ARM ISA. + // For ISAs up to and including v8, __ARM_ARCH is equal to the major version + // number. For ISAs from v8.1 onwards, __ARM_ARCH is scaled up to include the + // minor version number, e.g. for ARM architecture ARMvX.Y: + // __ARM_ARCH = X * 100 + Y. + if (ArchVersion >= 9 || ArchMinorVersion != 0) +Builder.defineMacro("__ARM_ARCH", +Twine(ArchVersion * 100 + ArchMinorVersion)); + else +Builder.defineMacro("__ARM_ARCH", Twine(ArchVersion)); if (ArchVersion >= 8) { // ACLE 6.5.7 Crypto Extension diff --git a/clang/lib/Basic/Targets/ARM.h b/clang/lib/Basic/Targets/ARM.h index 9802eb01abf3c43..9c4bd299f67339a 100644 --- a/clang/lib/Basic/Targets/ARM.h +++ b/clang/lib/Basic/Targets/ARM.h @@ -60,6 +60,7 @@ class LLVM_LIBRARY_VISIBILITY ARMTargetInfo : public TargetInfo {
[clang] [llvm] Changed the __ARM_ARCH macro to match the definition in the ACLE. (PR #79583)
https://github.com/jwestwood921 closed https://github.com/llvm/llvm-project/pull/79583 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [NFC] Fix arm_acle.h title headers (PR #82624)
https://github.com/jwestwood921 approved this pull request. LGTM, but wait for @DavidSpickett to review before merging. https://github.com/llvm/llvm-project/pull/82624 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits