clang 20.0.0git
Sparc.cpp
Go to the documentation of this file.
1//===--- Sparc.cpp - Implement Sparc target feature support ---------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file implements Sparc TargetInfo objects.
10//
11//===----------------------------------------------------------------------===//
12
13#include "Sparc.h"
14#include "Targets.h"
16#include "llvm/ADT/StringSwitch.h"
17
18using namespace clang;
19using namespace clang::targets;
20
21const char *const SparcTargetInfo::GCCRegNames[] = {
22 // Integer registers
23 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10",
24 "r11", "r12", "r13", "r14", "r15", "r16", "r17", "r18", "r19", "r20", "r21",
25 "r22", "r23", "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
26
27 // Floating-point registers
28 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7", "f8", "f9", "f10",
29 "f11", "f12", "f13", "f14", "f15", "f16", "f17", "f18", "f19", "f20", "f21",
30 "f22", "f23", "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31", "f32",
31 "f34", "f36", "f38", "f40", "f42", "f44", "f46", "f48", "f50", "f52", "f54",
32 "f56", "f58", "f60", "f62",
33};
34
36 return llvm::ArrayRef(GCCRegNames);
37}
38
39const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
40 {{"g0"}, "r0"}, {{"g1"}, "r1"}, {{"g2"}, "r2"}, {{"g3"}, "r3"},
41 {{"g4"}, "r4"}, {{"g5"}, "r5"}, {{"g6"}, "r6"}, {{"g7"}, "r7"},
42 {{"o0"}, "r8"}, {{"o1"}, "r9"}, {{"o2"}, "r10"}, {{"o3"}, "r11"},
43 {{"o4"}, "r12"}, {{"o5"}, "r13"}, {{"o6", "sp"}, "r14"}, {{"o7"}, "r15"},
44 {{"l0"}, "r16"}, {{"l1"}, "r17"}, {{"l2"}, "r18"}, {{"l3"}, "r19"},
45 {{"l4"}, "r20"}, {{"l5"}, "r21"}, {{"l6"}, "r22"}, {{"l7"}, "r23"},
46 {{"i0"}, "r24"}, {{"i1"}, "r25"}, {{"i2"}, "r26"}, {{"i3"}, "r27"},
47 {{"i4"}, "r28"}, {{"i5"}, "r29"}, {{"i6", "fp"}, "r30"}, {{"i7"}, "r31"},
48};
49
51 return llvm::ArrayRef(GCCRegAliases);
52}
53
54bool SparcTargetInfo::hasFeature(StringRef Feature) const {
55 return llvm::StringSwitch<bool>(Feature)
56 .Case("softfloat", SoftFloat)
57 .Case("sparc", true)
58 .Default(false);
59}
60
62 llvm::StringLiteral Name;
65};
66
67static constexpr SparcCPUInfo CPUInfo[] = {
73 {{"sparclite86x"},
104};
105
108 if (Kind == CK_GENERIC)
109 return CG_V8;
110 const SparcCPUInfo *Item = llvm::find_if(
111 CPUInfo, [Kind](const SparcCPUInfo &Info) { return Info.Kind == Kind; });
112 if (Item == std::end(CPUInfo))
113 llvm_unreachable("Unexpected CPU kind");
114 return Item->Generation;
115}
116
118 const SparcCPUInfo *Item = llvm::find_if(
119 CPUInfo, [Name](const SparcCPUInfo &Info) { return Info.Name == Name; });
120
121 if (Item == std::end(CPUInfo))
122 return CK_GENERIC;
123 return Item->Kind;
124}
125
127 SmallVectorImpl<StringRef> &Values) const {
128 for (const SparcCPUInfo &Info : CPUInfo)
129 Values.push_back(Info.Name);
130}
131
133 MacroBuilder &Builder) const {
134 DefineStd(Builder, "sparc", Opts);
135 Builder.defineMacro("__REGISTER_PREFIX__", "");
136
137 if (SoftFloat)
138 Builder.defineMacro("SOFT_FLOAT", "1");
139}
140
142 MacroBuilder &Builder) const {
144 if (getTriple().isOSSolaris())
145 Builder.defineMacro("__sparcv8");
146 else {
147 switch (getCPUGeneration(CPU)) {
148 case CG_V8:
149 Builder.defineMacro("__sparcv8");
150 Builder.defineMacro("__sparcv8__");
151 break;
152 case CG_V9:
153 Builder.defineMacro("__sparc_v9__");
154 break;
155 }
156 }
157 if (getCPUGeneration(CPU) == CG_V9) {
158 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
159 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
160 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
161 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
162 }
163}
164
166 MacroBuilder &Builder) const {
168 Builder.defineMacro("__sparcv9");
169 Builder.defineMacro("__arch64__");
170 // Solaris doesn't need these variants, but the BSDs do.
171 if (!getTriple().isOSSolaris()) {
172 Builder.defineMacro("__sparc64__");
173 Builder.defineMacro("__sparc_v9__");
174 Builder.defineMacro("__sparcv9__");
175 }
176
177 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
178 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
179 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
180 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
181}
182
184 SmallVectorImpl<StringRef> &Values) const {
185 for (const SparcCPUInfo &Info : CPUInfo)
186 if (Info.Generation == CG_V9)
187 Values.push_back(Info.Name);
188}
static constexpr SparcCPUInfo CPUInfo[]
Definition: Sparc.cpp:67
Defines the clang::MacroBuilder utility class.
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
Definition: LangOptions.h:476
const llvm::Triple & getTriple() const
Returns the target triple of the primary target.
Definition: TargetInfo.h:1256
bool hasFeature(StringRef Feature) const override
Determine whether the given target has the given feature.
Definition: Sparc.cpp:54
ArrayRef< const char * > getGCCRegNames() const override
Definition: Sparc.cpp:35
CPUGeneration getCPUGeneration(CPUKind Kind) const
Definition: Sparc.cpp:107
CPUKind getCPUKind(StringRef Name) const
Definition: Sparc.cpp:117
ArrayRef< TargetInfo::GCCRegAlias > getGCCRegAliases() const override
Definition: Sparc.cpp:50
enum clang::targets::SparcTargetInfo::CPUKind CPU
void fillValidCPUList(SmallVectorImpl< StringRef > &Values) const override
Fill a SmallVectorImpl with the valid values to setCPU.
Definition: Sparc.cpp:126
void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder) const override
===-— Other target property query methods -----------------------—===//
Definition: Sparc.cpp:132
void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder) const override
===-— Other target property query methods -----------------------—===//
Definition: Sparc.cpp:141
void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder) const override
===-— Other target property query methods -----------------------—===//
Definition: Sparc.cpp:165
void fillValidCPUList(SmallVectorImpl< StringRef > &Values) const override
Fill a SmallVectorImpl with the valid values to setCPU.
Definition: Sparc.cpp:183
void DefineStd(MacroBuilder &Builder, StringRef MacroName, const LangOptions &Opts)
DefineStd - Define a macro name and standard variants.
Definition: Targets.cpp:59
The JSON file list parser is used to communicate input to InstallAPI.
SparcTargetInfo::CPUKind Kind
Definition: Sparc.cpp:63
llvm::StringLiteral Name
Definition: Sparc.cpp:62
SparcTargetInfo::CPUGeneration Generation
Definition: Sparc.cpp:64