[llvm-branch-commits] [TargetParser][AArch64][NFC] Reference ArchInfo via index (PR #206699)
via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Tue Jun 30 03:35:19 PDT 2026
llvmorg-github-actions[bot] wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-backend-aarch64
Author: Alexis Engelke (aengelke)
<details>
<summary>Changes</summary>
This removes all relocations from CpuInfos so that the 3-4 kiB structure
can be stored in .rodata. Additionally, the ArchInfos pointer array is
replaced by an ArchInfos value array and the architecture names are
replaced by constexpr references.
---
Full diff: https://github.com/llvm/llvm-project/pull/206699.diff
6 Files Affected:
- (modified) clang/lib/Basic/Targets/AArch64.cpp (+3-3)
- (modified) clang/lib/Driver/ToolChain.cpp (+2-2)
- (modified) llvm/include/llvm/TargetParser/AArch64TargetParser.h (+1-1)
- (modified) llvm/lib/TargetParser/AArch64TargetParser.cpp (+8-8)
- (modified) llvm/unittests/TargetParser/TargetParserTest.cpp (+9-8)
- (modified) llvm/utils/TableGen/Basic/ARMTargetDefEmitter.cpp (+18-15)
``````````diff
diff --git a/clang/lib/Basic/Targets/AArch64.cpp b/clang/lib/Basic/Targets/AArch64.cpp
index fbcff173297e6..d56b09553a19b 100644
--- a/clang/lib/Basic/Targets/AArch64.cpp
+++ b/clang/lib/Basic/Targets/AArch64.cpp
@@ -960,9 +960,9 @@ void AArch64TargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
if (!Enabled)
return;
- for (const auto *OtherArch : llvm::AArch64::ArchInfos)
- if (ArchInfo->implies(*OtherArch))
- Features[OtherArch->getSubArch()] = true;
+ for (const auto &OtherArch : llvm::AArch64::ArchInfos)
+ if (ArchInfo->implies(OtherArch))
+ Features[OtherArch.getSubArch()] = true;
// Set any features implied by the architecture
std::vector<StringRef> CPUFeats;
diff --git a/clang/lib/Driver/ToolChain.cpp b/clang/lib/Driver/ToolChain.cpp
index 54cd534f8c5fc..21d2fbef59fc6 100644
--- a/clang/lib/Driver/ToolChain.cpp
+++ b/clang/lib/Driver/ToolChain.cpp
@@ -298,8 +298,8 @@ static void getAArch64MultilibFlags(const Driver &D,
MArch.push_back(("no" + AArch64::StrTab[Ext.UserVisibleName]).str());
StringRef ArchName;
for (const auto &ArchInfo : AArch64::ArchInfos)
- if (FeatureSet.contains(AArch64::StrTab[ArchInfo->ArchFeature]))
- ArchName = AArch64::StrTab[ArchInfo->Name];
+ if (FeatureSet.contains(AArch64::StrTab[ArchInfo.ArchFeature]))
+ ArchName = AArch64::StrTab[ArchInfo.Name];
if (!ArchName.empty()) {
MArch.insert(MArch.begin(), ("-march=" + ArchName).str());
Result.push_back(llvm::join(MArch, "+"));
diff --git a/llvm/include/llvm/TargetParser/AArch64TargetParser.h b/llvm/include/llvm/TargetParser/AArch64TargetParser.h
index ec217ca33726f..68dfdff11fa89 100644
--- a/llvm/include/llvm/TargetParser/AArch64TargetParser.h
+++ b/llvm/include/llvm/TargetParser/AArch64TargetParser.h
@@ -165,7 +165,7 @@ struct ArchInfo {
// Details of a specific CPU.
struct CpuInfo {
StringTable::Offset Name; // Name, as written for -mcpu.
- const ArchInfo &Arch;
+ unsigned ArchIdx;
AArch64::ExtensionBitset
DefaultExtensions; // Default extensions for this CPU.
diff --git a/llvm/lib/TargetParser/AArch64TargetParser.cpp b/llvm/lib/TargetParser/AArch64TargetParser.cpp
index 679d59383f536..14f986c3c3580 100644
--- a/llvm/lib/TargetParser/AArch64TargetParser.cpp
+++ b/llvm/lib/TargetParser/AArch64TargetParser.cpp
@@ -38,13 +38,13 @@ const AArch64::ArchInfo *AArch64::getArchForCpu(StringRef CPU) {
std::optional<CpuInfo> Cpu = parseCpu(CPU);
if (!Cpu)
return nullptr;
- return &Cpu->Arch;
+ return &ArchInfos[Cpu->ArchIdx];
}
std::optional<AArch64::ArchInfo> AArch64::ArchInfo::findBySubArch(StringRef SubArch) {
- for (const auto *A : AArch64::ArchInfos)
- if (A->getSubArch() == SubArch)
- return *A;
+ for (const auto &A : AArch64::ArchInfos)
+ if (A.getSubArch() == SubArch)
+ return A;
return {};
}
@@ -154,9 +154,9 @@ const AArch64::ArchInfo *AArch64::parseArch(StringRef Arch) {
return {};
StringRef Syn = llvm::ARM::getArchSynonym(Arch);
- for (const auto *A : ArchInfos) {
- if (StrTab[A->Name].ends_with(Syn))
- return A;
+ for (const auto &A : ArchInfos) {
+ if (StrTab[A.Name].ends_with(Syn))
+ return &A;
}
return {};
}
@@ -347,7 +347,7 @@ void AArch64::ExtensionSet::disable(ArchExtKind E) {
void AArch64::ExtensionSet::addCPUDefaults(const CpuInfo &CPU) {
LLVM_DEBUG(llvm::dbgs() << "addCPUDefaults(" << StrTab[CPU.Name] << ")\n");
- BaseArch = &CPU.Arch;
+ BaseArch = &ArchInfos[CPU.ArchIdx];
AArch64::ExtensionBitset CPUExtensions = CPU.getImpliedExtensions();
for (const auto &E : Extensions)
diff --git a/llvm/unittests/TargetParser/TargetParserTest.cpp b/llvm/unittests/TargetParser/TargetParserTest.cpp
index 45d584ac3d071..5466c2f639316 100644
--- a/llvm/unittests/TargetParser/TargetParserTest.cpp
+++ b/llvm/unittests/TargetParser/TargetParserTest.cpp
@@ -1078,7 +1078,8 @@ TEST_P(AArch64CPUTestFixture, testAArch64CPU) {
const std::optional<AArch64::CpuInfo> Cpu = AArch64::parseCpu(params.CPUName);
EXPECT_TRUE(Cpu);
- EXPECT_EQ(params.ExpectedArch, AArch64::StrTab[Cpu->Arch.Name]);
+ EXPECT_EQ(params.ExpectedArch,
+ AArch64::StrTab[AArch64::ArchInfos[Cpu->ArchIdx].Name]);
}
INSTANTIATE_TEST_SUITE_P(
@@ -1226,14 +1227,14 @@ TEST_P(AArch64CPUAliasTestFixture, testCPUAlias) {
StringRef MainName = params.Aliases[0];
const std::optional<AArch64::CpuInfo> Cpu = AArch64::parseCpu(MainName);
- const AArch64::ArchInfo &MainAI = Cpu->Arch;
+ const AArch64::ArchInfo &MainAI = AArch64::ArchInfos[Cpu->ArchIdx];
AArch64::ExtensionBitset MainFlags = Cpu->getImpliedExtensions();
for (size_t I = 1, E = params.Aliases.size(); I != E; ++I) {
StringRef OtherName = params.Aliases[I];
const std::optional<AArch64::CpuInfo> OtherCpu =
AArch64::parseCpu(OtherName);
- const AArch64::ArchInfo &OtherAI = OtherCpu->Arch;
+ const AArch64::ArchInfo &OtherAI = AArch64::ArchInfos[OtherCpu->ArchIdx];
EXPECT_EQ(MainAI.Version, OtherAI.Version)
<< MainName << " vs " << OtherName;
@@ -1616,13 +1617,13 @@ TEST(TargetParserTest, AArch64ArchFeatures) {
}
TEST(TargetParserTest, AArch64ArchPartialOrder) {
- for (const auto *A : AArch64::ArchInfos) {
- EXPECT_EQ(*A, *A);
+ for (const auto &A : AArch64::ArchInfos) {
+ EXPECT_EQ(A, A);
// v8r has no relation to other valid architectures
- if (*A != AArch64::ARMV8R) {
- EXPECT_FALSE(A->implies(AArch64::ARMV8R));
- EXPECT_FALSE(AArch64::ARMV8R.implies(*A));
+ if (A != AArch64::ARMV8R) {
+ EXPECT_FALSE(A.implies(AArch64::ARMV8R));
+ EXPECT_FALSE(AArch64::ARMV8R.implies(A));
}
}
diff --git a/llvm/utils/TableGen/Basic/ARMTargetDefEmitter.cpp b/llvm/utils/TableGen/Basic/ARMTargetDefEmitter.cpp
index 934ea67c4d982..73c2addce3330 100644
--- a/llvm/utils/TableGen/Basic/ARMTargetDefEmitter.cpp
+++ b/llvm/utils/TableGen/Basic/ARMTargetDefEmitter.cpp
@@ -221,6 +221,10 @@ static void emitARMTargetDef(const RecordKeeper &RK, raw_ostream &OS) {
};
auto Architectures = RK.getAllDerivedDefinitionsIfDefined("Architecture64");
+ OS << "\n"
+ << "/// The set of all architectures\n"
+ << "inline constexpr std::array<ArchInfo, " << Architectures.size()
+ << "> ArchInfos = {{\n";
std::vector<std::string> CppSpellings;
for (const Record *Rec : Architectures) {
const int Major = Rec->getValueAsInt("Major");
@@ -235,11 +239,11 @@ static void emitARMTargetDef(const RecordKeeper &RK, raw_ostream &OS) {
// Name of the object in C++
std::string CppSpelling = ArchInfoName(Major, Minor, ProfileUpper);
- OS << "inline constexpr ArchInfo " << CppSpelling << " = {\n";
+ OS << " {\n";
CppSpellings.push_back(std::move(CppSpelling));
- OS << llvm::format(" VersionTuple{%d, %d},\n", Major, Minor);
- OS << llvm::format(" %sProfile,\n", ProfileUpper.c_str());
+ OS << llvm::format(" VersionTuple{%d, %d},\n", Major, Minor);
+ OS << llvm::format(" %sProfile,\n", ProfileUpper.c_str());
// Name as spelled for -march.
std::string ArchStr;
@@ -248,31 +252,28 @@ static void emitARMTargetDef(const RecordKeeper &RK, raw_ostream &OS) {
AS << llvm::format("armv%d-%s", Major, ProfileLower.c_str());
else
AS << llvm::format("armv%d.%d-%s", Major, Minor, ProfileLower.c_str());
- OS << " " << StrTab.GetOrAddStringOffset(ArchStr) << ",\n";
+ OS << " " << StrTab.GetOrAddStringOffset(ArchStr) << ",\n";
// SubtargetFeature::Name, used for -target-feature. Here the "+" is added.
std::string TargetFeatureName =
(Twine("+") + Rec->getValueAsString("Name")).str();
- OS << " " << StrTab.GetOrAddStringOffset(TargetFeatureName) << ",\n";
+ OS << " " << StrTab.GetOrAddStringOffset(TargetFeatureName) << ",\n";
// Construct the list of default extensions
- OS << " (AArch64::ExtensionBitset({";
+ OS << " (AArch64::ExtensionBitset({";
for (auto *E : Rec->getValueAsListOfDefs("DefaultExts")) {
OS << "AArch64::" << E->getValueAsString("ArchExtKindSpelling").upper()
<< ", ";
}
OS << "}))\n";
- OS << "};\n";
+ OS << " },\n";
}
+ OS << "}};\n";
- OS << "\n"
- << "/// The set of all architectures\n"
- << "static constexpr std::array<const ArchInfo *, " << CppSpellings.size()
- << "> ArchInfos = {\n";
- for (StringRef CppSpelling : CppSpellings)
- OS << " &" << CppSpelling << ",\n";
- OS << "};\n";
+ for (auto [Idx, CppSpelling] : enumerate(CppSpellings))
+ OS << "static constexpr const ArchInfo &" << CppSpelling << " = ArchInfos["
+ << Idx << "];\n";
OS << "#undef EMIT_ARCHITECTURES\n"
<< "#endif // EMIT_ARCHITECTURES\n"
@@ -346,12 +347,14 @@ static void emitARMTargetDef(const RecordKeeper &RK, raw_ostream &OS) {
auto Minor = Arch->getValueAsInt("Minor");
auto Profile = Arch->getValueAsString("Profile");
auto ArchInfo = ArchInfoName(Major, Minor, Profile);
+ unsigned ArchIdx =
+ llvm::find(CppSpellings, ArchInfo) - CppSpellings.begin();
checkFeatureTree(Arch);
OS << " {\n"
<< " " << StrTab.GetOrAddStringOffset(Name) << ",\n"
- << " " << ArchInfo << ",\n"
+ << " " << ArchIdx << " /* " << ArchInfo << " */,\n"
<< " AArch64::ExtensionBitset({\n";
// Keep track of extensions we have seen
``````````
</details>
https://github.com/llvm/llvm-project/pull/206699
More information about the llvm-branch-commits
mailing list