clang 22.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"},
109};
110
113 if (Kind == CK_GENERIC)
114 return CG_V8;
115 const SparcCPUInfo *Item = llvm::find_if(
116 CPUInfo, [Kind](const SparcCPUInfo &Info) { return Info.Kind == Kind; });
117 if (Item == std::end(CPUInfo))
118 llvm_unreachable("Unexpected CPU kind");
119 return Item->Generation;
120}
121
123 const SparcCPUInfo *Item = llvm::find_if(
124 CPUInfo, [Name](const SparcCPUInfo &Info) { return Info.Name == Name; });
125
126 if (Item == std::end(CPUInfo))
127 return CK_GENERIC;
128 return Item->Kind;
129}
130
132 SmallVectorImpl<StringRef> &Values) const {
133 for (const SparcCPUInfo &Info : CPUInfo)
134 Values.push_back(Info.Name);
135}
136
138 MacroBuilder &Builder) const {
139 DefineStd(Builder, "sparc", Opts);
140 Builder.defineMacro("__REGISTER_PREFIX__", "");
141
142 if (SoftFloat)
143 Builder.defineMacro("SOFT_FLOAT", "1");
144}
145
147 MacroBuilder &Builder) const {
149 if (getTriple().isOSSolaris())
150 Builder.defineMacro("__sparcv8");
151 else {
152 switch (getCPUGeneration(CPU)) {
153 case CG_V8:
154 Builder.defineMacro("__sparcv8");
155 Builder.defineMacro("__sparcv8__");
156 break;
157 case CG_V9:
158 Builder.defineMacro("__sparc_v9__");
159 break;
160 }
161 }
162 if (getCPUGeneration(CPU) == CG_V9) {
163 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
164 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
165 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
166 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
167 }
168}
169
171 MacroBuilder &Builder) const {
173 Builder.defineMacro("__sparcv9");
174 Builder.defineMacro("__arch64__");
175 // Solaris doesn't need these variants, but the BSDs do.
176 if (!getTriple().isOSSolaris()) {
177 Builder.defineMacro("__sparc64__");
178 Builder.defineMacro("__sparc_v9__");
179 Builder.defineMacro("__sparcv9__");
180 }
181
182 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
183 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
184 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
185 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
186}
187
189 SmallVectorImpl<StringRef> &Values) const {
190 for (const SparcCPUInfo &Info : CPUInfo)
191 if (Info.Generation == CG_V9)
192 Values.push_back(Info.Name);
193}
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:112
CPUKind getCPUKind(StringRef Name) const
Definition Sparc.cpp:122
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:131
void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder) const override
===-— Other target property query methods -----------------------—===//
Definition Sparc.cpp:137
void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder) const override
===-— Other target property query methods -----------------------—===//
Definition Sparc.cpp:146
void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder) const override
===-— Other target property query methods -----------------------—===//
Definition Sparc.cpp:170
void fillValidCPUList(SmallVectorImpl< StringRef > &Values) const override
Fill a SmallVectorImpl with the valid values to setCPU.
Definition Sparc.cpp:188
LLVM_LIBRARY_VISIBILITY void DefineStd(clang::MacroBuilder &Builder, llvm::StringRef MacroName, const clang::LangOptions &Opts)
Define a macro name and standard variants.
The JSON file list parser is used to communicate input to InstallAPI.
SparcTargetInfo::CPUKind Kind
Definition Sparc.cpp:68
llvm::StringLiteral Name
Definition Sparc.cpp:67
SparcTargetInfo::CPUGeneration Generation
Definition Sparc.cpp:69