https://github.com/aengelke updated https://github.com/llvm/llvm-project/pull/206699
>From f328be6fb7aef10f2bc758df1ec41db565db2425 Mon Sep 17 00:00:00 2001 From: Alexis Engelke <[email protected]> Date: Tue, 30 Jun 2026 10:14:56 +0000 Subject: [PATCH] [spr] changes to main this commit is based on Created using spr 1.3.8-wip [skip ci] --- clang/lib/Driver/ToolChain.cpp | 16 ++--- clang/lib/Driver/ToolChains/Clang.cpp | 3 +- .../llvm/TargetParser/AArch64TargetParser.h | 47 +++++++------ .../AArch64/AsmParser/AArch64AsmParser.cpp | 2 +- llvm/lib/TargetParser/AArch64TargetParser.cpp | 67 ++++++++++--------- .../TargetParser/TargetParserTest.cpp | 40 +++++------ .../TableGen/Basic/ARMTargetDefEmitter.cpp | 58 +++++++++++----- 7 files changed, 133 insertions(+), 100 deletions(-) diff --git a/clang/lib/Driver/ToolChain.cpp b/clang/lib/Driver/ToolChain.cpp index 726c8a6ad229a..54cd534f8c5fc 100644 --- a/clang/lib/Driver/ToolChain.cpp +++ b/clang/lib/Driver/ToolChain.cpp @@ -289,17 +289,17 @@ static void getAArch64MultilibFlags(const Driver &D, UnifiedFeatures.end()); std::vector<std::string> MArch; for (const auto &Ext : AArch64::Extensions) - if (!Ext.UserVisibleName.empty()) - if (FeatureSet.contains(Ext.PosTargetFeature)) - MArch.push_back(Ext.UserVisibleName.str()); + if (Ext.UserVisibleName.value()) + if (FeatureSet.contains(AArch64::StrTab[Ext.PosTargetFeature])) + MArch.push_back(AArch64::StrTab[Ext.UserVisibleName].str()); for (const auto &Ext : AArch64::Extensions) - if (!Ext.UserVisibleName.empty()) - if (FeatureSet.contains(Ext.NegTargetFeature)) - MArch.push_back(("no" + Ext.UserVisibleName).str()); + if (Ext.UserVisibleName.value()) + if (FeatureSet.contains(AArch64::StrTab[Ext.NegTargetFeature])) + MArch.push_back(("no" + AArch64::StrTab[Ext.UserVisibleName]).str()); StringRef ArchName; for (const auto &ArchInfo : AArch64::ArchInfos) - if (FeatureSet.contains(ArchInfo->ArchFeature)) - ArchName = 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/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index a3a3954bc464e..158d9aeaeb785 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -1438,7 +1438,8 @@ static void CollectARMPACBTIOptions(const ToolChain &TC, const ArgList &Args, auto isPAuthLR = [](const char *member) { llvm::AArch64::ExtensionInfo pauthlr_extension = llvm::AArch64::getExtensionByID(llvm::AArch64::AEK_PAUTHLR); - return pauthlr_extension.PosTargetFeature == member; + return llvm::AArch64::StrTab[pauthlr_extension.PosTargetFeature] == + member; }; if (llvm::any_of(CmdArgs, isPAuthLR)) diff --git a/llvm/include/llvm/TargetParser/AArch64TargetParser.h b/llvm/include/llvm/TargetParser/AArch64TargetParser.h index 224bcaf79412d..ec217ca33726f 100644 --- a/llvm/include/llvm/TargetParser/AArch64TargetParser.h +++ b/llvm/include/llvm/TargetParser/AArch64TargetParser.h @@ -19,6 +19,7 @@ #include "llvm/ADT/StringExtras.h" #include "llvm/ADT/StringMap.h" #include "llvm/ADT/StringRef.h" +#include "llvm/ADT/StringTable.h" #include "llvm/Support/Compiler.h" #include "llvm/Support/VersionTuple.h" #include "llvm/Support/raw_ostream.h" @@ -43,6 +44,10 @@ static_assert(FEAT_MAX < 62, static_assert(PRIOR_MAX < 120, "FeatPriorities is limited to 120 entries"); +// Emit the StringTable StrTab to which all offsets refer. +#define EMIT_STRTAB +#include "llvm/TargetParser/AArch64TargetParserDef.inc" + // Each ArchExtKind correponds directly to a possible -target-feature. #define EMIT_ARCHEXTKIND_ENUM #include "llvm/TargetParser/AArch64TargetParserDef.inc" @@ -54,18 +59,19 @@ using ExtensionBitset = Bitset<AEK_NUM_EXTENSIONS>; // SubtargetFeature which may represent either an actual extension or some // internal LLVM property. struct ExtensionInfo { - StringRef UserVisibleName; // Human readable name used in -march, -cpu + StringTable::Offset + UserVisibleName; // Human readable name used in -march, -cpu // and target func attribute, e.g. "profile". - std::optional<StringRef> Alias; // An alias for this extension, if one exists. + StringTable::Offset Alias; // An alias for this extension, if one exists. ArchExtKind ID; // Corresponding to the ArchExtKind, this // extensions representation in the bitfield. - StringRef ArchFeatureName; // The feature name defined by the - // Architecture, e.g. FEAT_AdvSIMD. - StringRef Description; // The textual description of the extension. - StringRef PosTargetFeature; // -target-feature/-mattr enable string, - // e.g. "+spe". - StringRef NegTargetFeature; // -target-feature/-mattr disable string, - // e.g. "-spe". + StringTable::Offset ArchFeatureName; // The feature name defined by the + // Architecture, e.g. FEAT_AdvSIMD. + StringTable::Offset Description; // The textual description of the extension. + StringTable::Offset PosTargetFeature; // -target-feature/-mattr enable string, + // e.g. "+spe". + StringTable::Offset NegTargetFeature; // -target-feature/-mattr disable + // string, e.g. "-spe". }; #define EMIT_EXTENSIONS @@ -102,8 +108,9 @@ enum ArchProfile { AProfile = 'A', RProfile = 'R', InvalidProfile = '?' }; struct ArchInfo { VersionTuple Version; // Architecture version, major + minor. ArchProfile Profile; // Architecuture profile - StringRef Name; // Name as supplied to -march e.g. "armv8.1-a" - StringRef ArchFeature; // Name as supplied to -target-feature, e.g. "+v8a" + StringTable::Offset Name; // Name as supplied to -march e.g. "armv8.1-a" + StringTable::Offset + ArchFeature; // Name as supplied to -target-feature, e.g. "+v8a" AArch64::ExtensionBitset DefaultExts; // bitfield of default extensions ArchExtKind @@ -146,7 +153,7 @@ struct ArchInfo { } // Return ArchFeature without the leading "+". - StringRef getSubArch() const { return ArchFeature.substr(1); } + StringRef getSubArch() const { return StrTab[ArchFeature].substr(1); } // Search for ArchInfo by SubArch name LLVM_ABI static std::optional<ArchInfo> findBySubArch(StringRef SubArch); @@ -157,7 +164,7 @@ struct ArchInfo { // Details of a specific CPU. struct CpuInfo { - StringRef Name; // Name, as written for -mcpu. + StringTable::Offset Name; // Name, as written for -mcpu. const ArchInfo &Arch; AArch64::ExtensionBitset DefaultExtensions; // Default extensions for this CPU. @@ -219,16 +226,16 @@ struct ExtensionSet { // Convert the set of enabled extension to an LLVM feature list, appending // them to Features. template <typename T> void toLLVMFeatureList(std::vector<T> &Features) const { - if (BaseArch && !BaseArch->ArchFeature.empty()) - Features.emplace_back(T(BaseArch->ArchFeature)); + if (BaseArch && !StrTab[BaseArch->ArchFeature].empty()) + Features.emplace_back(T(StrTab[BaseArch->ArchFeature])); for (const auto &E : Extensions) { - if (E.PosTargetFeature.empty() || !Touched.test(E.ID)) + if (!Touched.test(E.ID)) continue; if (Enabled.test(E.ID)) - Features.emplace_back(T(E.PosTargetFeature)); + Features.emplace_back(T(StrTab[E.PosTargetFeature])); else - Features.emplace_back(T(E.NegTargetFeature)); + Features.emplace_back(T(StrTab[E.NegTargetFeature])); } } @@ -237,8 +244,8 @@ struct ExtensionSet { // Name alias. struct Alias { - StringRef AltName; - StringRef Name; + StringTable::Offset AltName; + StringTable::Offset Name; }; #define EMIT_CPU_ALIAS diff --git a/llvm/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp b/llvm/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp index b3fda2fe849fa..61ab1ba2bd47e 100644 --- a/llvm/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp +++ b/llvm/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp @@ -7457,7 +7457,7 @@ bool AArch64AsmParser::parseDirectiveArch(SMLoc L) { // Get the architecture and extension features. std::vector<StringRef> AArch64Features; - AArch64Features.push_back(ArchInfo->ArchFeature); + AArch64Features.push_back(AArch64::StrTab[ArchInfo->ArchFeature]); AArch64::getExtensionFeatures(ArchInfo->DefaultExts, AArch64Features); MCSubtargetInfo &STI = copySTI(); diff --git a/llvm/lib/TargetParser/AArch64TargetParser.cpp b/llvm/lib/TargetParser/AArch64TargetParser.cpp index 2c0211b3a2919..679d59383f536 100644 --- a/llvm/lib/TargetParser/AArch64TargetParser.cpp +++ b/llvm/lib/TargetParser/AArch64TargetParser.cpp @@ -108,16 +108,16 @@ bool AArch64::getExtensionFeatures( std::vector<StringRef> &Features) { for (const auto &E : Extensions) /* INVALID and NONE have no feature name. */ - if (InputExts.test(E.ID) && !E.PosTargetFeature.empty()) - Features.push_back(E.PosTargetFeature); + if (InputExts.test(E.ID)) + Features.push_back(StrTab[E.PosTargetFeature]); return true; } StringRef AArch64::resolveCPUAlias(StringRef Name) { for (const auto &A : CpuAliases) - if (A.AltName == Name) - return A.Name; + if (StrTab[A.AltName] == Name) + return StrTab[A.Name]; return Name; } @@ -125,22 +125,19 @@ StringRef AArch64::getArchExtFeature(StringRef ArchExt) { bool IsNegated = ArchExt.starts_with("no"); StringRef ArchExtBase = IsNegated ? ArchExt.drop_front(2) : ArchExt; - if (auto AE = parseArchExtension(ArchExtBase)) { - assert(!(AE.has_value() && AE->NegTargetFeature.empty())); - return IsNegated ? AE->NegTargetFeature : AE->PosTargetFeature; - } - + if (auto AE = parseArchExtension(ArchExtBase)) + return StrTab[IsNegated ? AE->NegTargetFeature : AE->PosTargetFeature]; return StringRef(); } void AArch64::fillValidCPUArchList(SmallVectorImpl<StringRef> &Values) { for (const auto &C : CpuInfos) - Values.push_back(C.Name); + Values.push_back(StrTab[C.Name]); for (const auto &Alias : CpuAliases) // The apple-latest alias is backend only, do not expose it to clang's -mcpu. - if (Alias.AltName != "apple-latest") - Values.push_back(Alias.AltName); + if (StrTab[Alias.AltName] != "apple-latest") + Values.push_back(StrTab[Alias.AltName]); llvm::sort(Values); } @@ -158,7 +155,7 @@ const AArch64::ArchInfo *AArch64::parseArch(StringRef Arch) { StringRef Syn = llvm::ARM::getArchSynonym(Arch); for (const auto *A : ArchInfos) { - if (A->Name.ends_with(Syn)) + if (StrTab[A->Name].ends_with(Syn)) return A; } return {}; @@ -169,7 +166,7 @@ AArch64::parseArchExtension(StringRef ArchExt) { if (ArchExt.empty()) return {}; for (const auto &A : Extensions) { - if (ArchExt == A.UserVisibleName || ArchExt == A.Alias) + if (ArchExt == StrTab[A.UserVisibleName] || ArchExt == StrTab[A.Alias]) return A; } return {}; @@ -190,8 +187,8 @@ std::optional<AArch64::FMVInfo> AArch64::parseFMVExtension(StringRef FMVExt) { std::optional<AArch64::ExtensionInfo> AArch64::targetFeatureToExtension(StringRef TargetFeature) { for (const auto &E : Extensions) - if (TargetFeature == E.PosTargetFeature || - TargetFeature == E.NegTargetFeature) + if (TargetFeature == StrTab[E.PosTargetFeature] || + TargetFeature == StrTab[E.NegTargetFeature]) return E; return {}; } @@ -202,7 +199,7 @@ std::optional<AArch64::CpuInfo> AArch64::parseCpu(StringRef Name) { // Then find the CPU name. for (const auto &C : CpuInfos) - if (Name == C.Name) + if (Name == StrTab[C.Name]) return C; return {}; @@ -215,12 +212,15 @@ void AArch64::PrintSupportedExtensions() { << "Description\n"; for (const auto &Ext : Extensions) { // Extensions without a feature cannot be used with -march. - if (!Ext.UserVisibleName.empty() && !Ext.PosTargetFeature.empty()) { + if (Ext.UserVisibleName.value() && Ext.PosTargetFeature.value()) { + // NB: StringTable strings are null-terminated, so the StringRef can be + // used as C string without further conversion. outs() << " " - << format(Ext.Description.empty() ? "%-20s%s\n" : "%-20s%-55s%s\n", - Ext.UserVisibleName.str().c_str(), - Ext.ArchFeatureName.str().c_str(), - Ext.Description.str().c_str()); + << format(!Ext.Description.value() ? "%-20s%s\n" + : "%-20s%-55s%s\n", + StrTab[Ext.UserVisibleName].data(), + StrTab[Ext.ArchFeatureName].data(), + StrTab[Ext.Description].data()); } } } @@ -239,14 +239,15 @@ AArch64::printEnabledExtensions(const std::set<StringRef> &EnabledFeatureNames) std::sort(EnabledExtensionsInfo.begin(), EnabledExtensionsInfo.end(), [](const ExtensionInfo &Lhs, const ExtensionInfo &Rhs) { - return Lhs.ArchFeatureName < Rhs.ArchFeatureName; + return StrTab[Lhs.ArchFeatureName] < StrTab[Rhs.ArchFeatureName]; }); for (const auto &Ext : EnabledExtensionsInfo) { + // NB: StringTable strings are null-terminated, so the StringRef can be used + // as C string without further conversion. outs() << " " - << format("%-55s%s\n", - Ext.ArchFeatureName.str().c_str(), - Ext.Description.str().c_str()); + << format("%-55s%s\n", StrTab[Ext.ArchFeatureName].data(), + StrTab[Ext.Description].data()); } } @@ -262,7 +263,9 @@ void AArch64::ExtensionSet::enable(ArchExtKind E) { if (Enabled.test(E)) return; - LLVM_DEBUG(llvm::dbgs() << "Enable " << lookupExtensionByID(E).UserVisibleName << "\n"); + LLVM_DEBUG(llvm::dbgs() << "Enable " + << StrTab[lookupExtensionByID(E).UserVisibleName] + << "\n"); Touched.set(E); Enabled.set(E); @@ -329,7 +332,9 @@ void AArch64::ExtensionSet::disable(ArchExtKind E) { if (!Enabled.test(E)) return; - LLVM_DEBUG(llvm::dbgs() << "Disable " << lookupExtensionByID(E).UserVisibleName << "\n"); + LLVM_DEBUG(llvm::dbgs() << "Disable " + << StrTab[lookupExtensionByID(E).UserVisibleName] + << "\n"); Touched.set(E); Enabled.reset(E); @@ -341,7 +346,7 @@ void AArch64::ExtensionSet::disable(ArchExtKind E) { } void AArch64::ExtensionSet::addCPUDefaults(const CpuInfo &CPU) { - LLVM_DEBUG(llvm::dbgs() << "addCPUDefaults(" << CPU.Name << ")\n"); + LLVM_DEBUG(llvm::dbgs() << "addCPUDefaults(" << StrTab[CPU.Name] << ")\n"); BaseArch = &CPU.Arch; AArch64::ExtensionBitset CPUExtensions = CPU.getImpliedExtensions(); @@ -351,7 +356,7 @@ void AArch64::ExtensionSet::addCPUDefaults(const CpuInfo &CPU) { } void AArch64::ExtensionSet::addArchDefaults(const ArchInfo &Arch) { - LLVM_DEBUG(llvm::dbgs() << "addArchDefaults(" << Arch.Name << ")\n"); + LLVM_DEBUG(llvm::dbgs() << "addArchDefaults(" << StrTab[Arch.Name] << ")\n"); BaseArch = &Arch; for (const auto &E : Extensions) @@ -373,8 +378,6 @@ bool AArch64::ExtensionSet::parseModifier(StringRef Modifier, StringRef ArchExt = Modifier.drop_front(NChars); if (auto AE = parseArchExtension(ArchExt)) { - if (AE->PosTargetFeature.empty() || AE->NegTargetFeature.empty()) - return false; if (IsNegated) disable(AE->ID); else diff --git a/llvm/unittests/TargetParser/TargetParserTest.cpp b/llvm/unittests/TargetParser/TargetParserTest.cpp index 61da68940d9a1..45d584ac3d071 100644 --- a/llvm/unittests/TargetParser/TargetParserTest.cpp +++ b/llvm/unittests/TargetParser/TargetParserTest.cpp @@ -1078,7 +1078,7 @@ TEST_P(AArch64CPUTestFixture, testAArch64CPU) { const std::optional<AArch64::CpuInfo> Cpu = AArch64::parseCpu(params.CPUName); EXPECT_TRUE(Cpu); - EXPECT_EQ(params.ExpectedArch, Cpu->Arch.Name); + EXPECT_EQ(params.ExpectedArch, AArch64::StrTab[Cpu->Arch.Name]); } INSTANTIATE_TEST_SUITE_P( @@ -1594,25 +1594,25 @@ TEST(TargetParserTest, AArch64ExtensionFeatures) { } TEST(TargetParserTest, AArch64ArchFeatures) { - EXPECT_EQ(AArch64::ARMV8A.ArchFeature, "+v8a"); - EXPECT_EQ(AArch64::ARMV8_1A.ArchFeature, "+v8.1a"); - EXPECT_EQ(AArch64::ARMV8_2A.ArchFeature, "+v8.2a"); - EXPECT_EQ(AArch64::ARMV8_3A.ArchFeature, "+v8.3a"); - EXPECT_EQ(AArch64::ARMV8_4A.ArchFeature, "+v8.4a"); - EXPECT_EQ(AArch64::ARMV8_5A.ArchFeature, "+v8.5a"); - EXPECT_EQ(AArch64::ARMV8_6A.ArchFeature, "+v8.6a"); - EXPECT_EQ(AArch64::ARMV8_7A.ArchFeature, "+v8.7a"); - EXPECT_EQ(AArch64::ARMV8_8A.ArchFeature, "+v8.8a"); - EXPECT_EQ(AArch64::ARMV8_9A.ArchFeature, "+v8.9a"); - EXPECT_EQ(AArch64::ARMV9A.ArchFeature, "+v9a"); - EXPECT_EQ(AArch64::ARMV9_1A.ArchFeature, "+v9.1a"); - EXPECT_EQ(AArch64::ARMV9_2A.ArchFeature, "+v9.2a"); - EXPECT_EQ(AArch64::ARMV9_3A.ArchFeature, "+v9.3a"); - EXPECT_EQ(AArch64::ARMV9_4A.ArchFeature, "+v9.4a"); - EXPECT_EQ(AArch64::ARMV9_5A.ArchFeature, "+v9.5a"); - EXPECT_EQ(AArch64::ARMV9_6A.ArchFeature, "+v9.6a"); - EXPECT_EQ(AArch64::ARMV9_7A.ArchFeature, "+v9.7a"); - EXPECT_EQ(AArch64::ARMV8R.ArchFeature, "+v8r"); + EXPECT_EQ(AArch64::StrTab[AArch64::ARMV8A.ArchFeature], "+v8a"); + EXPECT_EQ(AArch64::StrTab[AArch64::ARMV8_1A.ArchFeature], "+v8.1a"); + EXPECT_EQ(AArch64::StrTab[AArch64::ARMV8_2A.ArchFeature], "+v8.2a"); + EXPECT_EQ(AArch64::StrTab[AArch64::ARMV8_3A.ArchFeature], "+v8.3a"); + EXPECT_EQ(AArch64::StrTab[AArch64::ARMV8_4A.ArchFeature], "+v8.4a"); + EXPECT_EQ(AArch64::StrTab[AArch64::ARMV8_5A.ArchFeature], "+v8.5a"); + EXPECT_EQ(AArch64::StrTab[AArch64::ARMV8_6A.ArchFeature], "+v8.6a"); + EXPECT_EQ(AArch64::StrTab[AArch64::ARMV8_7A.ArchFeature], "+v8.7a"); + EXPECT_EQ(AArch64::StrTab[AArch64::ARMV8_8A.ArchFeature], "+v8.8a"); + EXPECT_EQ(AArch64::StrTab[AArch64::ARMV8_9A.ArchFeature], "+v8.9a"); + EXPECT_EQ(AArch64::StrTab[AArch64::ARMV9A.ArchFeature], "+v9a"); + EXPECT_EQ(AArch64::StrTab[AArch64::ARMV9_1A.ArchFeature], "+v9.1a"); + EXPECT_EQ(AArch64::StrTab[AArch64::ARMV9_2A.ArchFeature], "+v9.2a"); + EXPECT_EQ(AArch64::StrTab[AArch64::ARMV9_3A.ArchFeature], "+v9.3a"); + EXPECT_EQ(AArch64::StrTab[AArch64::ARMV9_4A.ArchFeature], "+v9.4a"); + EXPECT_EQ(AArch64::StrTab[AArch64::ARMV9_5A.ArchFeature], "+v9.5a"); + EXPECT_EQ(AArch64::StrTab[AArch64::ARMV9_6A.ArchFeature], "+v9.6a"); + EXPECT_EQ(AArch64::StrTab[AArch64::ARMV9_7A.ArchFeature], "+v9.7a"); + EXPECT_EQ(AArch64::StrTab[AArch64::ARMV8R.ArchFeature], "+v8r"); } TEST(TargetParserTest, AArch64ArchPartialOrder) { diff --git a/llvm/utils/TableGen/Basic/ARMTargetDefEmitter.cpp b/llvm/utils/TableGen/Basic/ARMTargetDefEmitter.cpp index a18fed082207f..934ea67c4d982 100644 --- a/llvm/utils/TableGen/Basic/ARMTargetDefEmitter.cpp +++ b/llvm/utils/TableGen/Basic/ARMTargetDefEmitter.cpp @@ -18,6 +18,7 @@ #include "llvm/Support/FormatVariadic.h" #include "llvm/TableGen/Error.h" #include "llvm/TableGen/Record.h" +#include "llvm/TableGen/StringToOffsetTable.h" #include "llvm/TableGen/TableGenBackend.h" #include <set> #include <string> @@ -115,6 +116,8 @@ static void emitARMTargetDef(const RecordKeeper &RK, raw_ostream &OS) { if (!RK.getClass("Architecture64")) return; + StringToOffsetTable StrTab; + // Emit the ArchExtKind enum OS << "#ifdef EMIT_ARCHEXTKIND_ENUM\n" << "enum ArchExtKind : unsigned {\n"; @@ -133,20 +136,28 @@ static void emitARMTargetDef(const RecordKeeper &RK, raw_ostream &OS) { for (const Record *Rec : SortedExtensions) { auto AEK = Rec->getValueAsString("ArchExtKindSpelling").upper(); OS << " "; - OS << "{\"" << Rec->getValueAsString("UserVisibleName") << "\""; - if (auto Alias = Rec->getValueAsString("UserVisibleAlias"); Alias.empty()) - OS << ", {}"; - else - OS << ", \"" << Alias << "\""; + OS << "{" + << StrTab.GetOrAddStringOffset(Rec->getValueAsString("UserVisibleName")); + // Empty string implies no alias. + OS << ", " + << StrTab.GetOrAddStringOffset( + Rec->getValueAsString("UserVisibleAlias")); OS << ", AArch64::" << AEK; - OS << ", \"" << Rec->getValueAsString("ArchFeatureName") << "\""; - OS << ", \"" << Rec->getValueAsString("Desc") << "\""; - OS << ", \"+" << Rec->getValueAsString("Name") << "\""; // posfeature - OS << ", \"-" << Rec->getValueAsString("Name") << "\""; // negfeature + OS << ", " + << StrTab.GetOrAddStringOffset(Rec->getValueAsString("ArchFeatureName")); + OS << ", " << StrTab.GetOrAddStringOffset(Rec->getValueAsString("Desc")); + OS << ", " + << StrTab.GetOrAddStringOffset( + std::string("+") + + Rec->getValueAsString("Name").str()); // posfeature + OS << ", " + << StrTab.GetOrAddStringOffset( + std::string("-") + + Rec->getValueAsString("Name").str()); // negfeature OS << "},\n"; }; - OS << "};\n" - << "#undef EMIT_EXTENSIONS\n" + OS << "};\n"; + OS << "#undef EMIT_EXTENSIONS\n" << "#endif // EMIT_EXTENSIONS\n" << "\n"; @@ -231,15 +242,18 @@ static void emitARMTargetDef(const RecordKeeper &RK, raw_ostream &OS) { OS << llvm::format(" %sProfile,\n", ProfileUpper.c_str()); // Name as spelled for -march. + std::string ArchStr; + llvm::raw_string_ostream AS(ArchStr); if (Minor == 0) - OS << llvm::format(" \"armv%d-%s\",\n", Major, ProfileLower.c_str()); + AS << llvm::format("armv%d-%s", Major, ProfileLower.c_str()); else - OS << llvm::format(" \"armv%d.%d-%s\",\n", Major, Minor, - ProfileLower.c_str()); + AS << llvm::format("armv%d.%d-%s", Major, Minor, ProfileLower.c_str()); + OS << " " << StrTab.GetOrAddStringOffset(ArchStr) << ",\n"; // SubtargetFeature::Name, used for -target-feature. Here the "+" is added. - const auto TargetFeatureName = Rec->getValueAsString("Name"); - OS << " \"+" << TargetFeatureName << "\",\n"; + std::string TargetFeatureName = + (Twine("+") + Rec->getValueAsString("Name")).str(); + OS << " " << StrTab.GetOrAddStringOffset(TargetFeatureName) << ",\n"; // Construct the list of default extensions OS << " (AArch64::ExtensionBitset({"; @@ -286,7 +300,8 @@ static void emitARMTargetDef(const RecordKeeper &RK, raw_ostream &OS) { PrintFatalError( Rec, "Alias '" + Name + "' duplicates an existing ProcessorAlias"); - OS << llvm::formatv(R"( { "{0}", "{1}" },)", Name, Alias) << '\n'; + OS << " {" << StrTab.GetOrAddStringOffset(Name) << ", " + << StrTab.GetOrAddStringOffset(Alias) << "},\n"; } OS << "};\n" @@ -335,7 +350,7 @@ static void emitARMTargetDef(const RecordKeeper &RK, raw_ostream &OS) { checkFeatureTree(Arch); OS << " {\n" - << " \"" << Name << "\",\n" + << " " << StrTab.GetOrAddStringOffset(Name) << ",\n" << " " << ArchInfo << ",\n" << " AArch64::ExtensionBitset({\n"; @@ -357,6 +372,13 @@ static void emitARMTargetDef(const RecordKeeper &RK, raw_ostream &OS) { OS << "#undef EMIT_CPU_INFO\n" << "#endif // EMIT_CPU_INFO\n" << "\n"; + + // Emit string table. + OS << "#ifdef EMIT_STRTAB\n"; + StrTab.EmitStringTableDef(OS, "StrTab"); + OS << "#undef EMIT_STRTAB\n" + << "#endif // EMIT_STRTAB\n" + << "\n"; } static TableGen::Emitter::Opt _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
