diff --git a/include/llvm/TableGen/Record.h b/include/llvm/TableGen/Record.h index 79352427499..62089a3f12b 100644 --- a/include/llvm/TableGen/Record.h +++ b/include/llvm/TableGen/Record.h @@ -1506,6 +1506,7 @@ class RecordKeeper { using RecordMap = std::map>; RecordMap Classes, Defs; FoldingSet RecordTypePool; + unsigned AnonCounter = 0; public: const RecordMap &getClasses() const { return Classes; } @@ -1535,6 +1536,8 @@ public: assert(Ins && "Record already exists"); } + Init *getNewAnonymousName(); + //===--------------------------------------------------------------------===// // High-level helper methods, useful for tablegen backends... diff --git a/lib/TableGen/Record.cpp b/lib/TableGen/Record.cpp index 471261f2607..dac12d7d506 100644 --- a/lib/TableGen/Record.cpp +++ b/lib/TableGen/Record.cpp @@ -1834,6 +1834,12 @@ raw_ostream &llvm::operator<<(raw_ostream &OS, const RecordKeeper &RK) { return OS; } +/// GetNewAnonymousName - Generate a unique anonymous name that can be used as +/// an identifier. +Init *RecordKeeper::getNewAnonymousName() { + return StringInit::get("anonymous_" + utostr(AnonCounter++)); +} + std::vector RecordKeeper::getAllDerivedDefinitions(StringRef ClassName) const { Record *Class = getClass(ClassName); diff --git a/lib/TableGen/TGParser.cpp b/lib/TableGen/TGParser.cpp index efd993d8b2b..642812d5ceb 100644 --- a/lib/TableGen/TGParser.cpp +++ b/lib/TableGen/TGParser.cpp @@ -406,7 +406,7 @@ bool TGParser::ProcessForeachDefs(Record *CurRec, SMLoc Loc, IterSet &IterVals){ if (!IterRec->isAnonymous()) return Error(Loc, "def already exists: " +IterRec->getNameInitAsString()); - IterRec->setName(GetNewAnonymousName()); + IterRec->setName(Records.getNewAnonymousName()); } Record *IterRecSave = IterRec.get(); // Keep a copy before release. @@ -427,12 +427,6 @@ static bool isObjectStart(tgtok::TokKind K) { K == tgtok::MultiClass || K == tgtok::Foreach; } -/// GetNewAnonymousName - Generate a unique anonymous name that can be used as -/// an identifier. -Init *TGParser::GetNewAnonymousName() { - return StringInit::get("anonymous_" + utostr(AnonCounter++)); -} - /// ParseObjectName - If an object name is specified, return it. Otherwise, /// return 0. /// ObjectName ::= Value [ '#' Value ]* @@ -1364,8 +1358,9 @@ Init *TGParser::ParseSimpleValue(Record *CurRec, RecTy *ItemType, SMLoc EndLoc = Lex.getLoc(); // Create the new record, set it as CurRec temporarily. - auto NewRecOwner = llvm::make_unique(GetNewAnonymousName(), NameLoc, - Records, /*IsAnonymous=*/true); + auto NewRecOwner = + make_unique(Records.getNewAnonymousName(), NameLoc, Records, + /*IsAnonymous=*/true); Record *NewRec = NewRecOwner.get(); // Keep a copy since we may release. SCRef.RefRange = SMRange(NameLoc, EndLoc); SCRef.Rec = Class; @@ -2158,8 +2153,8 @@ bool TGParser::ParseDef(MultiClass *CurMultiClass) { if (Name) CurRecOwner = make_unique(Name, DefLoc, Records); else - CurRecOwner = llvm::make_unique(GetNewAnonymousName(), DefLoc, - Records, /*IsAnonymous=*/true); + CurRecOwner = make_unique(Records.getNewAnonymousName(), DefLoc, + Records, /*IsAnonymous=*/true); Record *CurRec = CurRecOwner.get(); // Keep a copy since we may release. if (!CurMultiClass && Loops.empty()) { @@ -2504,7 +2499,7 @@ Record *TGParser::InstantiateMulticlassDef(MultiClass &MC, Record *DefProto, bool IsAnonymous = false; if (!DefmPrefix) { - DefmPrefix = GetNewAnonymousName(); + DefmPrefix = Records.getNewAnonymousName(); IsAnonymous = true; } diff --git a/lib/TableGen/TGParser.h b/lib/TableGen/TGParser.h index 1b2966c9f6c..e97290761ef 100644 --- a/lib/TableGen/TGParser.h +++ b/lib/TableGen/TGParser.h @@ -68,8 +68,6 @@ class TGParser { // Record tracker RecordKeeper &Records; - unsigned AnonCounter; - // A "named boolean" indicating how to parse identifiers. Usually // identifiers map to some existing object but in special cases // (e.g. parsing def names) no such object exists yet because we are @@ -84,7 +82,7 @@ class TGParser { public: TGParser(SourceMgr &SrcMgr, RecordKeeper &records) - : Lex(SrcMgr), CurMultiClass(nullptr), Records(records), AnonCounter(0) {} + : Lex(SrcMgr), CurMultiClass(nullptr), Records(records) {} /// ParseFile - Main entrypoint for parsing a tblgen file. These parser /// routines return true on error, or false on success. @@ -110,8 +108,6 @@ private: // Semantic analysis methods. bool AddSubMultiClass(MultiClass *CurMC, SubMultiClassReference &SubMultiClass); - Init *GetNewAnonymousName(); - // IterRecord: Map an iterator name to a value. struct IterRecord { VarInit *IterVar;