clang 24.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 // clang-format off
23 // Integer registers
24 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10",
25 "r11", "r12", "r13", "r14", "r15", "r16", "r17", "r18", "r19", "r20", "r21",
26 "r22", "r23", "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
27
28 // Floating-point registers
29 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7", "f8", "f9", "f10",
30 "f11", "f12", "f13", "f14", "f15", "f16", "f17", "f18", "f19", "f20", "f21",
31 "f22", "f23", "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31", "f32",
32 "f34", "f36", "f38", "f40", "f42", "f44", "f46", "f48", "f50", "f52", "f54",
33 "f56", "f58", "f60", "f62",
34
35 // Condition code registers
36 "icc", "fcc0", "fcc1", "fcc2", "fcc3",
37 // clang-format on
38};
39
43
44const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
45 {{"g0"}, "r0"}, {{"g1"}, "r1"}, {{"g2"}, "r2"}, {{"g3"}, "r3"},
46 {{"g4"}, "r4"}, {{"g5"}, "r5"}, {{"g6"}, "r6"}, {{"g7"}, "r7"},
47 {{"o0"}, "r8"}, {{"o1"}, "r9"}, {{"o2"}, "r10"}, {{"o3"}, "r11"},
48 {{"o4"}, "r12"}, {{"o5"}, "r13"}, {{"o6", "sp"}, "r14"}, {{"o7"}, "r15"},
49 {{"l0"}, "r16"}, {{"l1"}, "r17"}, {{"l2"}, "r18"}, {{"l3"}, "r19"},
50 {{"l4"}, "r20"}, {{"l5"}, "r21"}, {{"l6"}, "r22"}, {{"l7"}, "r23"},
51 {{"i0"}, "r24"}, {{"i1"}, "r25"}, {{"i2"}, "r26"}, {{"i3"}, "r27"},
52 {{"i4"}, "r28"}, {{"i5"}, "r29"}, {{"i6", "fp"}, "r30"}, {{"i7"}, "r31"},
53};
54
58
59bool SparcTargetInfo::hasFeature(StringRef Feature) const {
60 return llvm::StringSwitch<bool>(Feature)
61 .Case("softfloat", SoftFloat)
62 .Case("sparc", true)
63 .Default(false);
64}
65
71
72static constexpr SparcCPUInfo CPUInfo[] = {
78 {{"sparclite86x"},
110};
111
114 if (Kind == CK_GENERIC)
115 return CG_V8;
116 const SparcCPUInfo *Item = llvm::find_if(
117 CPUInfo, [Kind](const SparcCPUInfo &Info) { return Info.Kind == Kind; });
118 if (Item == std::end(CPUInfo))
119 llvm_unreachable("Unexpected CPU kind");
120 return Item->Generation;
121}
122
124 const SparcCPUInfo *Item = llvm::find_if(
125 CPUInfo, [Name](const SparcCPUInfo &Info) { return Info.Name == Name; });
126
127 if (Item == std::end(CPUInfo))
128 return CK_GENERIC;
129 return Item->Kind;
130}
131
133 SmallVectorImpl<StringRef> &Values) const {
134 for (const SparcCPUInfo &Info : CPUInfo)
135 Values.push_back(Info.Name);
136}
137
139 MacroBuilder &Builder) const {
140 DefineStd(Builder, "sparc", Opts);
141 Builder.defineMacro("__REGISTER_PREFIX__", "");
142
143 if (SoftFloat)
144 Builder.defineMacro("SOFT_FLOAT", "1");
145}
146
148 MacroBuilder &Builder) const {
150 if (getTriple().isOSSolaris())
151 Builder.defineMacro("__sparcv8");
152 else {
153 switch (getCPUGeneration(CPU)) {
154 case CG_V8:
155 Builder.defineMacro("__sparcv8");
156 Builder.defineMacro("__sparcv8__");
157 break;
158 case CG_V9:
159 Builder.defineMacro("__sparc_v9__");
160 break;
161 }
162 }
163 if (getCPUGeneration(CPU) == CG_V9) {
164 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
165 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
166 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
167 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
168 }
169 Builder.defineMacro("__LONG_DOUBLE_128__");
170}
171
173 MacroBuilder &Builder) const {
175 Builder.defineMacro("__sparcv9");
176 Builder.defineMacro("__arch64__");
177 // Solaris doesn't need these variants, but the BSDs do.
178 if (!getTriple().isOSSolaris()) {
179 Builder.defineMacro("__sparc64__");
180 Builder.defineMacro("__sparc_v9__");
181 Builder.defineMacro("__sparcv9__");
182 }
183
184 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
185 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
186 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
187 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
188}
189
191 SmallVectorImpl<StringRef> &Values) const {
192 for (const SparcCPUInfo &Info : CPUInfo)
193 if (Info.Generation == CG_V9)
194 Values.push_back(Info.Name);
195}
static constexpr SparcCPUInfo CPUInfo[]
Definition Sparc.cpp:72
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...
const llvm::Triple & getTriple() const
Returns the target triple of the primary target.
bool hasFeature(StringRef Feature) const override
Determine whether the given target has the given feature.
Definition Sparc.cpp:59
ArrayRef< const char * > getGCCRegNames() const override
Definition Sparc.cpp:40
CPUGeneration getCPUGeneration(CPUKind Kind) const
Definition Sparc.cpp:113
CPUKind getCPUKind(StringRef Name) const
Definition Sparc.cpp:123
ArrayRef< TargetInfo::GCCRegAlias > getGCCRegAliases() const override
Definition Sparc.cpp:55
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:132
void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder) const override
===-— Other target property query methods -----------------------—===//
Definition Sparc.cpp:138
void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder) const override
===-— Other target property query methods -----------------------—===//
Definition Sparc.cpp:147
void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder) const override
===-— Other target property query methods -----------------------—===//
Definition Sparc.cpp:172
void fillValidCPUList(SmallVectorImpl< StringRef > &Values) const override
Fill a SmallVectorImpl with the valid values to setCPU.
Definition Sparc.cpp:190
LLVM_LIBRARY_VISIBILITY void DefineStd(clang::MacroBuilder &Builder, llvm::StringRef MacroName, const clang::LangOptions &Opts)
Define a macro name and standard variants.
Top level wrappers for InstallAPI frontend operations.
SparcTargetInfo::CPUKind Kind
Definition Sparc.cpp:68
llvm::StringLiteral Name
Definition Sparc.cpp:67
SparcTargetInfo::CPUGeneration Generation
Definition Sparc.cpp:69