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

Reply via email to