[clang] f1dfaea - [Clang][SPARC] Define __sparc_v8__ and __leon__ like GCC (#234574)
via cfe-commits
cfe-commits at lists.llvm.org
Sun Oct 25 23:50:56 PDT 2026
Author: Daniel Cederman
Date: 2026-10-26T07:50:51+01:00
New Revision: f1dfaeaf872b7610e941c3331a38615f1333ebdf
URL: https://github.com/llvm/llvm-project/commit/f1dfaeaf872b7610e941c3331a38615f1333ebdf
DIFF: https://github.com/llvm/llvm-project/commit/f1dfaeaf872b7610e941c3331a38615f1333ebdf.diff
LOG: [Clang][SPARC] Define __sparc_v8__ and __leon__ like GCC (#234574)
The defines are used by glibc for example. A family field was added to
SparcCPUInfo to identify Leon processors.
Added:
Modified:
clang/lib/Basic/Targets/Sparc.cpp
clang/lib/Basic/Targets/Sparc.h
clang/test/Preprocessor/predefined-arch-macros.c
Removed:
################################################################################
diff --git a/clang/lib/Basic/Targets/Sparc.cpp b/clang/lib/Basic/Targets/Sparc.cpp
index cd5ef7bbda457a..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; });
@@ -154,12 +190,15 @@ 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;
}
}
+ if (getCPUFamily(CPU) == CF_LEON)
+ Builder.defineMacro("__leon__");
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 {
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
More information about the cfe-commits
mailing list