Skip to content

Commit a84ed78

Browse files
committed
[Hexagon] NFC: Reduce the amount of version-specific code
There is a lot of redundant code that needs to be modified when new Hexagon versions are added. Reduce the amount of this redundancy. - compute ELF flags and attributes based on version feature names; - simplify EnableHVX option handling by using arch features instead of arch version enums; - simplify completeHVXFeatures() by using features; - delete several unused or redundant functions and constants: isCPUValid, getCpu, getHexagonCPUSuffix; - do not set HexagonArchVersion in initializeSubtargetDependencies, it is set in ParseSubtargetFeatures; Signed-off-by: Alexey Karyakin <[email protected]>
1 parent 2db0289 commit a84ed78

File tree

7 files changed

+169
-231
lines changed

7 files changed

+169
-231
lines changed

clang/lib/Basic/Targets/Hexagon.cpp

Lines changed: 15 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,19 @@
1818
using namespace clang;
1919
using namespace clang::targets;
2020

21+
namespace {
22+
23+
constexpr llvm::StringLiteral CpuValsTextArray[] = {
24+
"hexagonv5", "hexagonv55", "hexagonv60", "hexagonv62", "hexagonv65",
25+
"hexagonv66", "hexagonv67", "hexagonv67t", "hexagonv68", "hexagonv69",
26+
"hexagonv71", "hexagonv71t", "hexagonv73", "hexagonv75", "hexagonv79",
27+
};
28+
29+
} // namespace
30+
31+
const llvm::ArrayRef<llvm::StringLiteral>
32+
HexagonTargetInfo::CpuValsText(CpuValsTextArray);
33+
2134
void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
2235
MacroBuilder &Builder) const {
2336
Builder.defineMacro("__qdsp6__", "1");
@@ -239,22 +252,6 @@ bool HexagonTargetInfo::hasFeature(StringRef Feature) const {
239252
.Default(false);
240253
}
241254

242-
struct CPUSuffix {
243-
llvm::StringLiteral Name;
244-
llvm::StringLiteral Suffix;
245-
};
246-
247-
static constexpr CPUSuffix Suffixes[] = {
248-
{{"hexagonv5"}, {"5"}}, {{"hexagonv55"}, {"55"}},
249-
{{"hexagonv60"}, {"60"}}, {{"hexagonv62"}, {"62"}},
250-
{{"hexagonv65"}, {"65"}}, {{"hexagonv66"}, {"66"}},
251-
{{"hexagonv67"}, {"67"}}, {{"hexagonv67t"}, {"67t"}},
252-
{{"hexagonv68"}, {"68"}}, {{"hexagonv69"}, {"69"}},
253-
{{"hexagonv71"}, {"71"}}, {{"hexagonv71t"}, {"71t"}},
254-
{{"hexagonv73"}, {"73"}}, {{"hexagonv75"}, {"75"}},
255-
{{"hexagonv79"}, {"79"}},
256-
};
257-
258255
std::optional<unsigned> HexagonTargetInfo::getHexagonCPURev(StringRef Name) {
259256
StringRef Arch = Name;
260257
Arch.consume_front("hexagonv");
@@ -267,18 +264,10 @@ std::optional<unsigned> HexagonTargetInfo::getHexagonCPURev(StringRef Name) {
267264
return std::nullopt;
268265
}
269266

270-
const char *HexagonTargetInfo::getHexagonCPUSuffix(StringRef Name) {
271-
const CPUSuffix *Item = llvm::find_if(
272-
Suffixes, [Name](const CPUSuffix &S) { return S.Name == Name; });
273-
if (Item == std::end(Suffixes))
274-
return nullptr;
275-
return Item->Suffix.data();
276-
}
277-
278267
void HexagonTargetInfo::fillValidCPUList(
279268
SmallVectorImpl<StringRef> &Values) const {
280-
for (const CPUSuffix &Suffix : Suffixes)
281-
Values.push_back(Suffix.Name);
269+
for (const llvm::StringLiteral &I : CpuValsText)
270+
Values.push_back(I);
282271
}
283272

284273
llvm::SmallVector<Builtin::InfosShard>

clang/lib/Basic/Targets/Hexagon.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ namespace targets {
2525
// Hexagon abstract base class
2626
class LLVM_LIBRARY_VISIBILITY HexagonTargetInfo : public TargetInfo {
2727

28+
static const llvm::ArrayRef<llvm::StringLiteral> CpuValsText;
2829
static const char *const GCCRegNames[];
2930
static const TargetInfo::GCCRegAlias GCCRegAliases[];
3031
std::string CPU;
@@ -115,11 +116,11 @@ class LLVM_LIBRARY_VISIBILITY HexagonTargetInfo : public TargetInfo {
115116

116117
std::string_view getClobbers() const override { return ""; }
117118

118-
static const char *getHexagonCPUSuffix(StringRef Name);
119119
static std::optional<unsigned> getHexagonCPURev(StringRef Name);
120120

121121
bool isValidCPUName(StringRef Name) const override {
122-
return getHexagonCPUSuffix(Name);
122+
return std::any_of(std::begin(CpuValsText), std::end(CpuValsText),
123+
[Name](StringRef V) { return V == Name; });
123124
}
124125

125126
void fillValidCPUList(SmallVectorImpl<StringRef> &Values) const override;

llvm/lib/Target/Hexagon/HexagonDepArch.h

Lines changed: 0 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -32,26 +32,6 @@ enum class ArchEnum {
3232
V79
3333
};
3434

35-
inline std::optional<Hexagon::ArchEnum> getCpu(StringRef CPU) {
36-
return StringSwitch<std::optional<Hexagon::ArchEnum>>(CPU)
37-
.Case("generic", Hexagon::ArchEnum::V5)
38-
.Case("hexagonv5", Hexagon::ArchEnum::V5)
39-
.Case("hexagonv55", Hexagon::ArchEnum::V55)
40-
.Case("hexagonv60", Hexagon::ArchEnum::V60)
41-
.Case("hexagonv62", Hexagon::ArchEnum::V62)
42-
.Case("hexagonv65", Hexagon::ArchEnum::V65)
43-
.Case("hexagonv66", Hexagon::ArchEnum::V66)
44-
.Case("hexagonv67", Hexagon::ArchEnum::V67)
45-
.Case("hexagonv67t", Hexagon::ArchEnum::V67)
46-
.Case("hexagonv68", Hexagon::ArchEnum::V68)
47-
.Case("hexagonv69", Hexagon::ArchEnum::V69)
48-
.Case("hexagonv71", Hexagon::ArchEnum::V71)
49-
.Case("hexagonv71t", Hexagon::ArchEnum::V71)
50-
.Case("hexagonv73", Hexagon::ArchEnum::V73)
51-
.Case("hexagonv75", Hexagon::ArchEnum::V75)
52-
.Case("hexagonv79", Hexagon::ArchEnum::V79)
53-
.Default(std::nullopt);
54-
}
5535
} // namespace Hexagon
5636
} // namespace llvm
5737

llvm/lib/Target/Hexagon/HexagonSubtarget.cpp

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -88,12 +88,6 @@ HexagonSubtarget::HexagonSubtarget(const Triple &TT, StringRef CPU,
8888

8989
HexagonSubtarget &
9090
HexagonSubtarget::initializeSubtargetDependencies(StringRef CPU, StringRef FS) {
91-
std::optional<Hexagon::ArchEnum> ArchVer = Hexagon::getCpu(CPUString);
92-
if (ArchVer)
93-
HexagonArchVersion = *ArchVer;
94-
else
95-
llvm_unreachable("Unrecognized Hexagon processor version");
96-
9791
UseHVX128BOps = false;
9892
UseHVX64BOps = false;
9993
UseAudioOps = false;
@@ -163,7 +157,7 @@ HexagonSubtarget::initializeSubtargetDependencies(StringRef CPU, StringRef FS) {
163157
FeatureBitset FeatureBits = getFeatureBits();
164158
if (HexagonDisableDuplex)
165159
setFeatureBits(FeatureBits.reset(Hexagon::FeatureDuplex));
166-
setFeatureBits(Hexagon_MC::completeHVXFeatures(FeatureBits));
160+
SetFeatureBitsTransitively(Hexagon_MC::completeHVXFeatures(FeatureBits));
167161

168162
return *this;
169163
}

llvm/lib/Target/Hexagon/MCTargetDesc/HexagonMCELFStreamer.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -195,11 +195,12 @@ static unsigned featureToArchVersion(unsigned Feature) {
195195

196196
void HexagonTargetStreamer::emitTargetAttributes(const MCSubtargetInfo &STI) {
197197
auto Features = STI.getFeatureBits();
198-
unsigned Arch = featureToArchVersion(Hexagon_MC::getArchVersion(Features));
199-
std::optional<unsigned> HVXArch = Hexagon_MC::getHVXVersion(Features);
198+
unsigned Arch = Hexagon_MC::getArchVersionAttribute(Features).value_or(0);
199+
std::optional<unsigned> HVXArch =
200+
Hexagon_MC::getHVXVersionAttribute(Features);
200201
emitAttribute(HexagonAttrs::ARCH, Arch);
201202
if (HVXArch)
202-
emitAttribute(HexagonAttrs::HVXARCH, featureToArchVersion(*HVXArch));
203+
emitAttribute(HexagonAttrs::HVXARCH, *HVXArch);
203204
if (Features.test(Hexagon::ExtensionHVXIEEEFP))
204205
emitAttribute(HexagonAttrs::HVXIEEEFP, 1);
205206
if (Features.test(Hexagon::ExtensionHVXQFloat))

0 commit comments

Comments
 (0)