Coverage Report

Created: 2024-01-17 10:31

/src/llvm-project/clang/lib/Basic/Targets/CSKY.cpp
Line
Count
Source (jump to first uncovered line)
1
//===--- CSKY.cpp - Implement CSKY 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 CSKY TargetInfo objects.
10
//
11
//===----------------------------------------------------------------------===//
12
13
#include "CSKY.h"
14
15
using namespace clang;
16
using namespace clang::targets;
17
18
0
bool CSKYTargetInfo::isValidCPUName(StringRef Name) const {
19
0
  return llvm::CSKY::parseCPUArch(Name) != llvm::CSKY::ArchKind::INVALID;
20
0
}
21
22
0
bool CSKYTargetInfo::setCPU(const std::string &Name) {
23
0
  llvm::CSKY::ArchKind archKind = llvm::CSKY::parseCPUArch(Name);
24
0
  bool isValid = (archKind != llvm::CSKY::ArchKind::INVALID);
25
26
0
  if (isValid) {
27
0
    CPU = Name;
28
0
    Arch = archKind;
29
0
  }
30
31
0
  return isValid;
32
0
}
33
34
void CSKYTargetInfo::getTargetDefines(const LangOptions &Opts,
35
0
                                      MacroBuilder &Builder) const {
36
0
  Builder.defineMacro("__csky__", "2");
37
0
  Builder.defineMacro("__CSKY__", "2");
38
0
  Builder.defineMacro("__ckcore__", "2");
39
0
  Builder.defineMacro("__CKCORE__", "2");
40
41
0
  Builder.defineMacro("__CSKYABI__", ABI == "abiv2" ? "2" : "1");
42
0
  Builder.defineMacro("__cskyabi__", ABI == "abiv2" ? "2" : "1");
43
44
0
  StringRef ArchName = "ck810";
45
0
  StringRef CPUName = "ck810";
46
47
0
  if (Arch != llvm::CSKY::ArchKind::INVALID) {
48
0
    ArchName = llvm::CSKY::getArchName(Arch);
49
0
    CPUName = CPU;
50
0
  }
51
52
0
  Builder.defineMacro("__" + ArchName.upper() + "__");
53
0
  Builder.defineMacro("__" + ArchName.lower() + "__");
54
0
  if (ArchName != CPUName) {
55
0
    Builder.defineMacro("__" + CPUName.upper() + "__");
56
0
    Builder.defineMacro("__" + CPUName.lower() + "__");
57
0
  }
58
59
  // TODO: Add support for BE if BE was supported later
60
0
  StringRef endian = "__cskyLE__";
61
62
0
  Builder.defineMacro(endian);
63
0
  Builder.defineMacro(endian.upper());
64
0
  Builder.defineMacro(endian.lower());
65
66
0
  if (DSPV2) {
67
0
    StringRef dspv2 = "__CSKY_DSPV2__";
68
0
    Builder.defineMacro(dspv2);
69
0
    Builder.defineMacro(dspv2.lower());
70
0
  }
71
72
0
  if (VDSPV2) {
73
0
    StringRef vdspv2 = "__CSKY_VDSPV2__";
74
0
    Builder.defineMacro(vdspv2);
75
0
    Builder.defineMacro(vdspv2.lower());
76
77
0
    if (HardFloat) {
78
0
      StringRef vdspv2_f = "__CSKY_VDSPV2_F__";
79
0
      Builder.defineMacro(vdspv2_f);
80
0
      Builder.defineMacro(vdspv2_f.lower());
81
0
    }
82
0
  }
83
0
  if (VDSPV1) {
84
0
    StringRef vdspv1_64 = "__CSKY_VDSP64__";
85
0
    StringRef vdspv1_128 = "__CSKY_VDSP128__";
86
87
0
    Builder.defineMacro(vdspv1_64);
88
0
    Builder.defineMacro(vdspv1_64.lower());
89
0
    Builder.defineMacro(vdspv1_128);
90
0
    Builder.defineMacro(vdspv1_128.lower());
91
0
  }
92
0
  if (is3E3R1) {
93
0
    StringRef is3e3r1 = "__CSKY_3E3R1__";
94
0
    Builder.defineMacro(is3e3r1);
95
0
    Builder.defineMacro(is3e3r1.lower());
96
0
  }
97
0
}
98
99
0
bool CSKYTargetInfo::hasFeature(StringRef Feature) const {
100
0
  return llvm::StringSwitch<bool>(Feature)
101
0
      .Case("hard-float", HardFloat)
102
0
      .Case("hard-float-abi", HardFloatABI)
103
0
      .Case("fpuv2_sf", FPUV2_SF)
104
0
      .Case("fpuv2_df", FPUV2_DF)
105
0
      .Case("fpuv3_sf", FPUV3_SF)
106
0
      .Case("fpuv3_df", FPUV3_DF)
107
0
      .Case("vdspv2", VDSPV2)
108
0
      .Case("dspv2", DSPV2)
109
0
      .Case("vdspv1", VDSPV1)
110
0
      .Case("3e3r1", is3E3R1)
111
0
      .Default(false);
112
0
}
113
114
bool CSKYTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
115
0
                                          DiagnosticsEngine &Diags) {
116
0
  for (const auto &Feature : Features) {
117
0
    if (Feature == "+hard-float")
118
0
      HardFloat = true;
119
0
    if (Feature == "+hard-float-abi")
120
0
      HardFloatABI = true;
121
0
    if (Feature == "+fpuv2_sf")
122
0
      FPUV2_SF = true;
123
0
    if (Feature == "+fpuv2_df")
124
0
      FPUV2_DF = true;
125
0
    if (Feature == "+fpuv3_sf")
126
0
      FPUV3_SF = true;
127
0
    if (Feature == "+fpuv3_df")
128
0
      FPUV3_DF = true;
129
0
    if (Feature == "+vdspv2")
130
0
      VDSPV2 = true;
131
0
    if (Feature == "+dspv2")
132
0
      DSPV2 = true;
133
0
    if (Feature == "+vdspv1")
134
0
      VDSPV1 = true;
135
0
    if (Feature == "+3e3r1")
136
0
      is3E3R1 = true;
137
0
  }
138
139
0
  return true;
140
0
}
141
142
0
ArrayRef<Builtin::Info> CSKYTargetInfo::getTargetBuiltins() const {
143
0
  return ArrayRef<Builtin::Info>();
144
0
}
145
146
0
ArrayRef<const char *> CSKYTargetInfo::getGCCRegNames() const {
147
0
  static const char *const GCCRegNames[] = {
148
      // Integer registers
149
0
      "r0",
150
0
      "r1",
151
0
      "r2",
152
0
      "r3",
153
0
      "r4",
154
0
      "r5",
155
0
      "r6",
156
0
      "r7",
157
0
      "r8",
158
0
      "r9",
159
0
      "r10",
160
0
      "r11",
161
0
      "r12",
162
0
      "r13",
163
0
      "r14",
164
0
      "r15",
165
0
      "r16",
166
0
      "r17",
167
0
      "r18",
168
0
      "r19",
169
0
      "r20",
170
0
      "r21",
171
0
      "r22",
172
0
      "r23",
173
0
      "r24",
174
0
      "r25",
175
0
      "r26",
176
0
      "r27",
177
0
      "r28",
178
0
      "r29",
179
0
      "r30",
180
0
      "r31",
181
182
      // Floating point registers
183
0
      "fr0",
184
0
      "fr1",
185
0
      "fr2",
186
0
      "fr3",
187
0
      "fr4",
188
0
      "fr5",
189
0
      "fr6",
190
0
      "fr7",
191
0
      "fr8",
192
0
      "fr9",
193
0
      "fr10",
194
0
      "fr11",
195
0
      "fr12",
196
0
      "fr13",
197
0
      "fr14",
198
0
      "fr15",
199
0
      "fr16",
200
0
      "fr17",
201
0
      "fr18",
202
0
      "fr19",
203
0
      "fr20",
204
0
      "fr21",
205
0
      "fr22",
206
0
      "fr23",
207
0
      "fr24",
208
0
      "fr25",
209
0
      "fr26",
210
0
      "fr27",
211
0
      "fr28",
212
0
      "fr29",
213
0
      "fr30",
214
0
      "fr31",
215
216
0
  };
217
0
  return llvm::ArrayRef(GCCRegNames);
218
0
}
219
220
0
ArrayRef<TargetInfo::GCCRegAlias> CSKYTargetInfo::getGCCRegAliases() const {
221
0
  static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
222
0
      {{"a0"}, "r0"},
223
0
      {{"a1"}, "r1"},
224
0
      {{"a2"}, "r2"},
225
0
      {{"a3"}, "r3"},
226
0
      {{"l0"}, "r4"},
227
0
      {{"l1"}, "r5"},
228
0
      {{"l2"}, "r6"},
229
0
      {{"l3"}, "r7"},
230
0
      {{"l4"}, "r8"},
231
0
      {{"l5"}, "r9"},
232
0
      {{"l6"}, "r10"},
233
0
      {{"l7"}, "r11"},
234
0
      {{"t0"}, "r12"},
235
0
      {{"t1"}, "r13"},
236
0
      {{"sp"}, "r14"},
237
0
      {{"lr"}, "r15"},
238
0
      {{"l8"}, "r16"},
239
0
      {{"l9"}, "r17"},
240
0
      {{"t2"}, "r18"},
241
0
      {{"t3"}, "r19"},
242
0
      {{"t4"}, "r20"},
243
0
      {{"t5"}, "r21"},
244
0
      {{"t6"}, "r22"},
245
0
      {{"t7", "fp"}, "r23"},
246
0
      {{"t8", "top"}, "r24"},
247
0
      {{"t9", "bsp"}, "r25"},
248
0
      {{"r26"}, "r26"},
249
0
      {{"r27"}, "r27"},
250
0
      {{"gb", "rgb", "rdb"}, "r28"},
251
0
      {{"tb", "rtb"}, "r29"},
252
0
      {{"svbr"}, "r30"},
253
0
      {{"tls"}, "r31"},
254
255
0
      {{"vr0"}, "fr0"},
256
0
      {{"vr1"}, "fr1"},
257
0
      {{"vr2"}, "fr2"},
258
0
      {{"vr3"}, "fr3"},
259
0
      {{"vr4"}, "fr4"},
260
0
      {{"vr5"}, "fr5"},
261
0
      {{"vr6"}, "fr6"},
262
0
      {{"vr7"}, "fr7"},
263
0
      {{"vr8"}, "fr8"},
264
0
      {{"vr9"}, "fr9"},
265
0
      {{"vr10"}, "fr10"},
266
0
      {{"vr11"}, "fr11"},
267
0
      {{"vr12"}, "fr12"},
268
0
      {{"vr13"}, "fr13"},
269
0
      {{"vr14"}, "fr14"},
270
0
      {{"vr15"}, "fr15"},
271
0
      {{"vr16"}, "fr16"},
272
0
      {{"vr17"}, "fr17"},
273
0
      {{"vr18"}, "fr18"},
274
0
      {{"vr19"}, "fr19"},
275
0
      {{"vr20"}, "fr20"},
276
0
      {{"vr21"}, "fr21"},
277
0
      {{"vr22"}, "fr22"},
278
0
      {{"vr23"}, "fr23"},
279
0
      {{"vr24"}, "fr24"},
280
0
      {{"vr25"}, "fr25"},
281
0
      {{"vr26"}, "fr26"},
282
0
      {{"vr27"}, "fr27"},
283
0
      {{"vr28"}, "fr28"},
284
0
      {{"vr29"}, "fr29"},
285
0
      {{"vr30"}, "fr30"},
286
0
      {{"vr31"}, "fr31"},
287
288
0
  };
289
0
  return llvm::ArrayRef(GCCRegAliases);
290
0
}
291
292
bool CSKYTargetInfo::validateAsmConstraint(
293
0
    const char *&Name, TargetInfo::ConstraintInfo &Info) const {
294
0
  switch (*Name) {
295
0
  default:
296
0
    return false;
297
0
  case 'a':
298
0
  case 'b':
299
0
  case 'c':
300
0
  case 'y':
301
0
  case 'l':
302
0
  case 'h':
303
0
  case 'w':
304
0
  case 'v': // A floating-point and vector register.
305
0
  case 'z':
306
0
    Info.setAllowsRegister();
307
0
    return true;
308
0
  }
309
0
}
310
311
0
unsigned CSKYTargetInfo::getMinGlobalAlign(uint64_t Size) const {
312
0
  if (Size >= 32)
313
0
    return 32;
314
0
  return 0;
315
0
}