[clang] [Clang][SPARC] Define __sparc_v8__ and __leon__ like GCC (PR #234574)

Daniel Cederman via cfe-commits cfe-commits at lists.llvm.org
Sun Oct 25 22:59:05 PDT 2026


https://github.com/doac updated https://github.com/llvm/llvm-project/pull/234574

>From f9731001c70f27ac4207fc7a847d0b6f27cb1668 Mon Sep 17 00:00:00 2001
From: Daniel Cederman <cederman at gaisler.com>
Date: Thu, 22 Oct 2026 06:26:10 +0200
Subject: [PATCH 1/2] [Clang][SPARC] Define __sparc_v8__ and __leon__ like GCC

Used by glibc for example.
---
 clang/lib/Basic/Targets/Sparc.cpp                | 16 ++++++++++++++++
 clang/test/Preprocessor/predefined-arch-macros.c |  9 +++++++++
 2 files changed, 25 insertions(+)

diff --git a/clang/lib/Basic/Targets/Sparc.cpp b/clang/lib/Basic/Targets/Sparc.cpp
index cd5ef7bbda457a..f0b497d3eb432b 100644
--- a/clang/lib/Basic/Targets/Sparc.cpp
+++ b/clang/lib/Basic/Targets/Sparc.cpp
@@ -154,12 +154,28 @@ void SparcV8TargetInfo::getTargetDefines(const LangOptions &Opts,
     case CG_V8:
       Builder.defineMacro("__sparcv8");
       Builder.defineMacro("__sparcv8__");
+      Builder.defineMacro("__sparc_v8__");
       break;
     case CG_V9:
       Builder.defineMacro("__sparc_v9__");
       break;
     }
   }
+  switch (CPU) {
+  case CK_LEON2:
+  case CK_LEON2_AT697E:
+  case CK_LEON2_AT697F:
+  case CK_LEON3:
+  case CK_LEON3_UT699:
+  case CK_LEON3_GR712RC:
+  case CK_LEON4:
+  case CK_LEON4_GR740:
+  case CK_LEON5:
+    Builder.defineMacro("__leon__");
+    break;
+  default:
+    break;
+  }
   if (getCPUGeneration(CPU) == CG_V9) {
     Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
     Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
diff --git a/clang/test/Preprocessor/predefined-arch-macros.c b/clang/test/Preprocessor/predefined-arch-macros.c
index c9295a5f2ab3cc..c7323484500757 100644
--- a/clang/test/Preprocessor/predefined-arch-macros.c
+++ b/clang/test/Preprocessor/predefined-arch-macros.c
@@ -4809,6 +4809,7 @@
 // RUN:   | FileCheck -match-full-lines %s -check-prefix=CHECK_SPARC-V9
 // CHECK_SPARC-V9-NOT: #define __sparcv8 1
 // CHECK_SPARC-V9-NOT: #define __sparcv8__ 1
+// CHECK_SPARC-V9-NOT: #define __sparc_v8__ 1
 // CHECK_SPARC-V9: #define __sparc_v9__ 1
 // CHECK_SPARC-V9-NOT: #define __sparcv9 1
 // CHECK_SPARC-V9-NOT: #define __sparcv9__ 1
@@ -4833,10 +4834,18 @@
 // RUN:     -target sparcel-unknown-linux \
 // RUN:   | FileCheck -match-full-lines %s -check-prefix=CHECK_SPARCEL
 // CHECK_SPARCEL: #define __LITTLE_ENDIAN__ 1
+// CHECK_SPARCEL-NOT: #define __leon__ 1
 // CHECK_SPARCEL: #define __sparc 1
 // CHECK_SPARCEL: #define __sparc__ 1
+// CHECK_SPARCEL: #define __sparc_v8__ 1
 // CHECK_SPARCEL: #define __sparcv8 1
 
+// RUN: %clang -mcpu=leon3 -E -dM %s -o - 2>&1 \
+// RUN:     -target sparc-unknown-linux \
+// RUN:   | FileCheck -match-full-lines %s -check-prefix=CHECK_SPARC-LEON
+// CHECK_SPARC-LEON: #define __leon__ 1
+// CHECK_SPARC-LEON: #define __sparc_v8__ 1
+
 // RUN: %clang -E -dM %s -o - 2>&1 \
 // RUN:     -target sparcv9-unknown-linux \
 // RUN:   | FileCheck -match-full-lines %s -check-prefix=CHECK_SPARCV9

>From 80fd33bd4b44680b860572a5d0251752e109cfde Mon Sep 17 00:00:00 2001
From: Daniel Cederman <cederman at gaisler.com>
Date: Mon, 26 Oct 2026 06:54:44 +0100
Subject: [PATCH 2/2] [Clang][SPARC] Use a CPU family field to define __leon__

Mark the LEON CPUs with a family field in SparcCPUInfo instead of
listing them in a switch statement.
---
 clang/lib/Basic/Targets/Sparc.cpp | 69 ++++++++++++++++++++-----------
 clang/lib/Basic/Targets/Sparc.h   |  7 ++++
 2 files changed, 53 insertions(+), 23 deletions(-)

diff --git a/clang/lib/Basic/Targets/Sparc.cpp b/clang/lib/Basic/Targets/Sparc.cpp
index f0b497d3eb432b..c4f3a64cc2ef7d 100644
--- a/clang/lib/Basic/Targets/Sparc.cpp
+++ b/clang/lib/Basic/Targets/Sparc.cpp
@@ -67,6 +67,7 @@ struct SparcCPUInfo {
   llvm::StringLiteral Name;
   SparcTargetInfo::CPUKind Kind;
   SparcTargetInfo::CPUGeneration Generation;
+  SparcTargetInfo::CPUFamily Family = SparcTargetInfo::CF_NONE;
 };
 
 static constexpr SparcCPUInfo CPUInfo[] = {
@@ -98,15 +99,42 @@ static constexpr SparcCPUInfo CPUInfo[] = {
     {{"ma2480"}, SparcTargetInfo::CK_MYRIAD2480, SparcTargetInfo::CG_V8},
     {{"ma2485"}, SparcTargetInfo::CK_MYRIAD2485, SparcTargetInfo::CG_V8},
     {{"ma2x8x"}, SparcTargetInfo::CK_MYRIAD2x8x, SparcTargetInfo::CG_V8},
-    {{"leon2"}, SparcTargetInfo::CK_LEON2, SparcTargetInfo::CG_V8},
-    {{"at697e"}, SparcTargetInfo::CK_LEON2_AT697E, SparcTargetInfo::CG_V8},
-    {{"at697f"}, SparcTargetInfo::CK_LEON2_AT697F, SparcTargetInfo::CG_V8},
-    {{"leon3"}, SparcTargetInfo::CK_LEON3, SparcTargetInfo::CG_V8},
-    {{"ut699"}, SparcTargetInfo::CK_LEON3_UT699, SparcTargetInfo::CG_V8},
-    {{"gr712rc"}, SparcTargetInfo::CK_LEON3_GR712RC, SparcTargetInfo::CG_V8},
-    {{"leon4"}, SparcTargetInfo::CK_LEON4, SparcTargetInfo::CG_V8},
-    {{"gr740"}, SparcTargetInfo::CK_LEON4_GR740, SparcTargetInfo::CG_V8},
-    {{"leon5"}, SparcTargetInfo::CK_LEON5, SparcTargetInfo::CG_V8},
+    {{"leon2"},
+     SparcTargetInfo::CK_LEON2,
+     SparcTargetInfo::CG_V8,
+     SparcTargetInfo::CF_LEON},
+    {{"at697e"},
+     SparcTargetInfo::CK_LEON2_AT697E,
+     SparcTargetInfo::CG_V8,
+     SparcTargetInfo::CF_LEON},
+    {{"at697f"},
+     SparcTargetInfo::CK_LEON2_AT697F,
+     SparcTargetInfo::CG_V8,
+     SparcTargetInfo::CF_LEON},
+    {{"leon3"},
+     SparcTargetInfo::CK_LEON3,
+     SparcTargetInfo::CG_V8,
+     SparcTargetInfo::CF_LEON},
+    {{"ut699"},
+     SparcTargetInfo::CK_LEON3_UT699,
+     SparcTargetInfo::CG_V8,
+     SparcTargetInfo::CF_LEON},
+    {{"gr712rc"},
+     SparcTargetInfo::CK_LEON3_GR712RC,
+     SparcTargetInfo::CG_V8,
+     SparcTargetInfo::CF_LEON},
+    {{"leon4"},
+     SparcTargetInfo::CK_LEON4,
+     SparcTargetInfo::CG_V8,
+     SparcTargetInfo::CF_LEON},
+    {{"gr740"},
+     SparcTargetInfo::CK_LEON4_GR740,
+     SparcTargetInfo::CG_V8,
+     SparcTargetInfo::CF_LEON},
+    {{"leon5"},
+     SparcTargetInfo::CK_LEON5,
+     SparcTargetInfo::CG_V8,
+     SparcTargetInfo::CF_LEON},
 };
 
 SparcTargetInfo::CPUGeneration
@@ -120,6 +148,14 @@ SparcTargetInfo::getCPUGeneration(CPUKind Kind) const {
   return Item->Generation;
 }
 
+SparcTargetInfo::CPUFamily SparcTargetInfo::getCPUFamily(CPUKind Kind) const {
+  const SparcCPUInfo *Item = llvm::find_if(
+      CPUInfo, [Kind](const SparcCPUInfo &Info) { return Info.Kind == Kind; });
+  if (Item == std::end(CPUInfo))
+    return CF_NONE;
+  return Item->Family;
+}
+
 SparcTargetInfo::CPUKind SparcTargetInfo::getCPUKind(StringRef Name) const {
   const SparcCPUInfo *Item = llvm::find_if(
       CPUInfo, [Name](const SparcCPUInfo &Info) { return Info.Name == Name; });
@@ -161,21 +197,8 @@ void SparcV8TargetInfo::getTargetDefines(const LangOptions &Opts,
       break;
     }
   }
-  switch (CPU) {
-  case CK_LEON2:
-  case CK_LEON2_AT697E:
-  case CK_LEON2_AT697F:
-  case CK_LEON3:
-  case CK_LEON3_UT699:
-  case CK_LEON3_GR712RC:
-  case CK_LEON4:
-  case CK_LEON4_GR740:
-  case CK_LEON5:
+  if (getCPUFamily(CPU) == CF_LEON)
     Builder.defineMacro("__leon__");
-    break;
-  default:
-    break;
-  }
   if (getCPUGeneration(CPU) == CG_V9) {
     Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
     Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
diff --git a/clang/lib/Basic/Targets/Sparc.h b/clang/lib/Basic/Targets/Sparc.h
index 21c10495c82868..2219ccf7c70a37 100644
--- a/clang/lib/Basic/Targets/Sparc.h
+++ b/clang/lib/Basic/Targets/Sparc.h
@@ -127,8 +127,15 @@ class LLVM_LIBRARY_VISIBILITY SparcTargetInfo : public TargetInfo {
     CG_V9,
   };
 
+  enum CPUFamily {
+    CF_NONE,
+    CF_LEON,
+  };
+
   CPUGeneration getCPUGeneration(CPUKind Kind) const;
 
+  CPUFamily getCPUFamily(CPUKind Kind) const;
+
   CPUKind getCPUKind(StringRef Name) const;
 
   bool isValidCPUName(StringRef Name) const override {



More information about the cfe-commits mailing list