Index: llvm/trunk/include/llvm/TableGen/Record.h =================================================================== --- llvm/trunk/include/llvm/TableGen/Record.h +++ llvm/trunk/include/llvm/TableGen/Record.h @@ -1506,6 +1506,7 @@ using RecordMap = std::map>; RecordMap Classes, Defs; FoldingSet RecordTypePool; + unsigned AnonCounter = 0; public: const RecordMap &getClasses() const { return Classes; } @@ -1535,6 +1536,8 @@ assert(Ins && "Record already exists"); } + Init *getNewAnonymousName(); + //===--------------------------------------------------------------------===// // High-level helper methods, useful for tablegen backends... Index: llvm/trunk/lib/TableGen/Record.cpp =================================================================== --- llvm/trunk/lib/TableGen/Record.cpp +++ llvm/trunk/lib/TableGen/Record.cpp @@ -1834,6 +1834,12 @@ 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); Index: llvm/trunk/lib/TableGen/TGParser.h =================================================================== --- llvm/trunk/lib/TableGen/TGParser.h +++ llvm/trunk/lib/TableGen/TGParser.h @@ -68,8 +68,6 @@ // 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 @@ 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 @@ bool AddSubMultiClass(MultiClass *CurMC, SubMultiClassReference &SubMultiClass); - Init *GetNewAnonymousName(); - // IterRecord: Map an iterator name to a value. struct IterRecord { VarInit *IterVar; Index: llvm/trunk/lib/TableGen/TGParser.cpp =================================================================== --- llvm/trunk/lib/TableGen/TGParser.cpp +++ llvm/trunk/lib/TableGen/TGParser.cpp @@ -406,7 +406,7 @@ 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 @@ 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 @@ 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 @@ 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 @@ bool IsAnonymous = false; if (!DefmPrefix) { - DefmPrefix = GetNewAnonymousName(); + DefmPrefix = Records.getNewAnonymousName(); IsAnonymous = true; }