Author: Alexis Engelke Date: 2026-07-01T06:05:55Z New Revision: ac493bb6ab3e60bbff8b2786d32a36b18c6c7391
URL: https://github.com/llvm/llvm-project/commit/ac493bb6ab3e60bbff8b2786d32a36b18c6c7391 DIFF: https://github.com/llvm/llvm-project/commit/ac493bb6ab3e60bbff8b2786d32a36b18c6c7391.diff LOG: [TargetParser][AArch64][NFC] Reference ArchInfo via index (#206699) 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. Added: Modified: clang/lib/Basic/Targets/AArch64.cpp clang/lib/Driver/ToolChain.cpp llvm/include/llvm/TargetParser/AArch64TargetParser.h llvm/lib/TargetParser/AArch64TargetParser.cpp llvm/unittests/TargetParser/TargetParserTest.cpp llvm/utils/TableGen/Basic/ARMTargetDefEmitter.cpp Removed: ################################################################################ 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 a7bb8117bc479..7dfd4f6678240 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 0daedb8bbcb17..5d1880b77fe16 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]; for (const auto &E : Extensions) if (CPU.DefaultExtensions.test(E.ID)) diff --git a/llvm/unittests/TargetParser/TargetParserTest.cpp b/llvm/unittests/TargetParser/TargetParserTest.cpp index 87f8580a00a58..c91b6b3ac08d8 100644 --- a/llvm/unittests/TargetParser/TargetParserTest.cpp +++ b/llvm/unittests/TargetParser/TargetParserTest.cpp @@ -1109,7 +1109,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( @@ -1257,14 +1258,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->DefaultExtensions; 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; @@ -1647,13 +1648,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 _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
