From: David Greene Date: Wed, 19 Oct 2011 13:02:42 +0000 (+0000) Subject: Make Template Arg Names Inits X-Git-Tag: android-x86-6.0-r1~928^2~29 X-Git-Url: http://git.osdn.net/view?p=android-x86%2Fexternal-llvm.git;a=commitdiff_plain;h=e22b321d2276b634519165b101b02d92c2fcf5c7 Make Template Arg Names Inits Allow template arg names to be Inits. This is further work to implement paste as it allows template names to participate in paste operations. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@142500 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/llvm/TableGen/Record.h b/include/llvm/TableGen/Record.h index 905126b2b39..0c9c909972c 100644 --- a/include/llvm/TableGen/Record.h +++ b/include/llvm/TableGen/Record.h @@ -1385,7 +1385,7 @@ class Record { unsigned ID; Init *Name; SMLoc Loc; - std::vector TemplateArgs; + std::vector TemplateArgs; std::vector Values; std::vector SuperClasses; @@ -1425,17 +1425,20 @@ public: /// get the corresponding DefInit. DefInit *getDefInit(); - const std::vector &getTemplateArgs() const { + const std::vector &getTemplateArgs() const { return TemplateArgs; } const std::vector &getValues() const { return Values; } const std::vector &getSuperClasses() const { return SuperClasses; } - bool isTemplateArg(StringRef Name) const { + bool isTemplateArg(Init *Name) const { for (unsigned i = 0, e = TemplateArgs.size(); i != e; ++i) if (TemplateArgs[i] == Name) return true; return false; } + bool isTemplateArg(StringRef Name) const { + return isTemplateArg(StringInit::get(Name.str())); + } const RecordVal *getValue(StringRef Name) const { for (unsigned i = 0, e = Values.size(); i != e; ++i) @@ -1451,10 +1454,13 @@ public: const RecordVal *getValue(Init *Name) const; RecordVal *getValue(Init *Name); - void addTemplateArg(StringRef Name) { + void addTemplateArg(Init *Name) { assert(!isTemplateArg(Name) && "Template arg already defined!"); TemplateArgs.push_back(Name); } + void addTemplateArg(StringRef Name) { + addTemplateArg(StringInit::get(Name.str())); + } void addValue(const RecordVal &RV) { assert(getValue(RV.getName()) == 0 && "Value already added!"); diff --git a/lib/TableGen/Record.cpp b/lib/TableGen/Record.cpp index a6407ab607b..b12589b7e8d 100644 --- a/lib/TableGen/Record.cpp +++ b/lib/TableGen/Record.cpp @@ -760,7 +760,9 @@ Init *UnOpInit::Fold(Record *CurRec, MultiClass *CurMultiClass) const { return VarInit::get(Name, RV->getType()); } - std::string TemplateArgName = CurRec->getName()+":"+Name; + Init *TemplateArgName = QualifyName(*CurRec, CurMultiClass, Name, + ":"); + if (CurRec->isTemplateArg(TemplateArgName)) { const RecordVal *RV = CurRec->getValue(TemplateArgName); assert(RV && "Template arg doesn't exist??"); @@ -773,7 +775,8 @@ Init *UnOpInit::Fold(Record *CurRec, MultiClass *CurMultiClass) const { } if (CurMultiClass) { - std::string MCName = CurMultiClass->Rec.getName()+"::"+Name; + Init *MCName = QualifyName(CurMultiClass->Rec, CurMultiClass, Name, "::"); + if (CurMultiClass->Rec.isTemplateArg(MCName)) { const RecordVal *RV = CurMultiClass->Rec.getValue(MCName); assert(RV && "Template arg doesn't exist??"); @@ -1765,7 +1768,7 @@ void Record::dump() const { errs() << *this; } raw_ostream &llvm::operator<<(raw_ostream &OS, const Record &R) { OS << R.getName(); - const std::vector &TArgs = R.getTemplateArgs(); + const std::vector &TArgs = R.getTemplateArgs(); if (!TArgs.empty()) { OS << "<"; for (unsigned i = 0, e = TArgs.size(); i != e; ++i) { diff --git a/lib/TableGen/TGParser.cpp b/lib/TableGen/TGParser.cpp index 4152c165c60..e913bce705a 100644 --- a/lib/TableGen/TGParser.cpp +++ b/lib/TableGen/TGParser.cpp @@ -154,7 +154,7 @@ bool TGParser::AddSubClass(Record *CurRec, SubClassReference &SubClass) { if (AddValue(CurRec, SubClass.RefLoc, Vals[i])) return true; - const std::vector &TArgs = SC->getTemplateArgs(); + const std::vector &TArgs = SC->getTemplateArgs(); // Ensure that an appropriate number of template arguments are specified. if (TArgs.size() < SubClass.TemplateArgs.size()) @@ -177,8 +177,8 @@ bool TGParser::AddSubClass(Record *CurRec, SubClassReference &SubClass) { } else if (!CurRec->getValue(TArgs[i])->getValue()->isComplete()) { return Error(SubClass.RefLoc,"Value not specified for template argument #" - + utostr(i) + " (" + TArgs[i] + ") of subclass '" + - SC->getName() + "'!"); + + utostr(i) + " (" + TArgs[i]->getAsUnquotedString() + + ") of subclass '" + SC->getNameInitAsString() + "'!"); } } @@ -233,7 +233,7 @@ bool TGParser::AddSubMultiClass(MultiClass *CurMC, CurMC->DefPrototypes.push_back(NewDef); } - const std::vector &SMCTArgs = SMC->Rec.getTemplateArgs(); + const std::vector &SMCTArgs = SMC->Rec.getTemplateArgs(); // Ensure that an appropriate number of template arguments are // specified. @@ -281,8 +281,8 @@ bool TGParser::AddSubMultiClass(MultiClass *CurMC, } else if (!CurRec->getValue(SMCTArgs[i])->getValue()->isComplete()) { return Error(SubMultiClass.RefLoc, "Value not specified for template argument #" - + utostr(i) + " (" + SMCTArgs[i] + ") of subclass '" + - SMC->Rec.getName() + "'!"); + + utostr(i) + " (" + SMCTArgs[i]->getAsUnquotedString() + + ") of subclass '" + SMC->Rec.getNameInitAsString() + "'!"); } } @@ -652,9 +652,11 @@ Init *TGParser::ParseIDValue(Record *CurRec, if (const RecordVal *RV = CurRec->getValue(Name)) return VarInit::get(Name, RV->getType()); - std::string TemplateArgName = CurRec->getName()+":"+Name; + Init *TemplateArgName = QualifyName(*CurRec, CurMultiClass, Name, ":"); + if (CurMultiClass) - TemplateArgName = CurMultiClass->Rec.getName()+"::"+TemplateArgName; + TemplateArgName = QualifyName(CurMultiClass->Rec, CurMultiClass, Name, + "::"); if (CurRec->isTemplateArg(TemplateArgName)) { const RecordVal *RV = CurRec->getValue(TemplateArgName); @@ -664,7 +666,9 @@ Init *TGParser::ParseIDValue(Record *CurRec, } if (CurMultiClass) { - std::string MCName = CurMultiClass->Rec.getName()+"::"+Name; + Init *MCName = QualifyName(CurMultiClass->Rec, CurMultiClass, Name, + "::"); + if (CurMultiClass->Rec.isTemplateArg(MCName)) { const RecordVal *RV = CurMultiClass->Rec.getValue(MCName); assert(RV && "Template arg doesn't exist??"); @@ -1420,7 +1424,7 @@ std::vector TGParser::ParseValueList(Record *CurRec, Record *ArgsRec, RecTy *ItemType = EltTy; unsigned int ArgN = 0; if (ArgsRec != 0 && EltTy == 0) { - const std::vector &TArgs = ArgsRec->getTemplateArgs(); + const std::vector &TArgs = ArgsRec->getTemplateArgs(); const RecordVal *RV = ArgsRec->getValue(TArgs[ArgN]); if (!RV) { errs() << "Cannot find template arg " << ArgN << " (" << TArgs[ArgN] @@ -1437,7 +1441,7 @@ std::vector TGParser::ParseValueList(Record *CurRec, Record *ArgsRec, Lex.Lex(); // Eat the comma if (ArgsRec != 0 && EltTy == 0) { - const std::vector &TArgs = ArgsRec->getTemplateArgs(); + const std::vector &TArgs = ArgsRec->getTemplateArgs(); if (ArgN >= TArgs.size()) { TokError("too many template arguments"); return std::vector(); @@ -1465,37 +1469,38 @@ std::vector TGParser::ParseValueList(Record *CurRec, Record *ArgsRec, /// /// Declaration ::= FIELD? Type ID ('=' Value)? /// -std::string TGParser::ParseDeclaration(Record *CurRec, +Init *TGParser::ParseDeclaration(Record *CurRec, bool ParsingTemplateArgs) { // Read the field prefix if present. bool HasField = Lex.getCode() == tgtok::Field; if (HasField) Lex.Lex(); RecTy *Type = ParseType(); - if (Type == 0) return ""; + if (Type == 0) return 0; if (Lex.getCode() != tgtok::Id) { TokError("Expected identifier in declaration"); - return ""; + return 0; } SMLoc IdLoc = Lex.getLoc(); - std::string DeclName = Lex.getCurStrVal(); + Init *DeclName = StringInit::get(Lex.getCurStrVal()); Lex.Lex(); if (ParsingTemplateArgs) { if (CurRec) { - DeclName = CurRec->getName() + ":" + DeclName; + DeclName = QualifyName(*CurRec, CurMultiClass, DeclName, ":"); } else { assert(CurMultiClass); } if (CurMultiClass) - DeclName = CurMultiClass->Rec.getName() + "::" + DeclName; + DeclName = QualifyName(CurMultiClass->Rec, CurMultiClass, DeclName, + "::"); } // Add the value. if (AddValue(CurRec, IdLoc, RecordVal(DeclName, Type, HasField))) - return ""; + return 0; // If a value is present, parse it. if (Lex.getCode() == tgtok::equal) { @@ -1504,7 +1509,7 @@ std::string TGParser::ParseDeclaration(Record *CurRec, Init *Val = ParseValue(CurRec, Type); if (Val == 0 || SetValue(CurRec, ValLoc, DeclName, std::vector(), Val)) - return ""; + return 0; } return DeclName; @@ -1524,8 +1529,8 @@ bool TGParser::ParseTemplateArgList(Record *CurRec) { Record *TheRecToAddTo = CurRec ? CurRec : &CurMultiClass->Rec; // Read the first declaration. - std::string TemplArg = ParseDeclaration(CurRec, true/*templateargs*/); - if (TemplArg.empty()) + Init *TemplArg = ParseDeclaration(CurRec, true/*templateargs*/); + if (TemplArg == 0) return true; TheRecToAddTo->addTemplateArg(TemplArg); @@ -1535,7 +1540,7 @@ bool TGParser::ParseTemplateArgList(Record *CurRec) { // Read the following declarations. TemplArg = ParseDeclaration(CurRec, true/*templateargs*/); - if (TemplArg.empty()) + if (TemplArg == 0) return true; TheRecToAddTo->addTemplateArg(TemplArg); } @@ -1553,7 +1558,7 @@ bool TGParser::ParseTemplateArgList(Record *CurRec) { /// BodyItem ::= LET ID OptionalBitList '=' Value ';' bool TGParser::ParseBodyItem(Record *CurRec) { if (Lex.getCode() != tgtok::Let) { - if (ParseDeclaration(CurRec, false).empty()) + if (ParseDeclaration(CurRec, false) == 0) return true; if (Lex.getCode() != tgtok::semi) @@ -1710,7 +1715,7 @@ bool TGParser::ParseDef(MultiClass *CurMultiClass) { if (CurMultiClass) { // Copy the template arguments for the multiclass into the def. - const std::vector &TArgs = + const std::vector &TArgs = CurMultiClass->Rec.getTemplateArgs(); for (unsigned i = 0, e = TArgs.size(); i != e; ++i) { @@ -1960,7 +1965,7 @@ bool TGParser::ResolveMulticlassDefArgs(MultiClass &MC, Record *CurRec, SMLoc DefmPrefixLoc, SMLoc SubClassLoc, - const std::vector &TArgs, + const std::vector &TArgs, std::vector &TemplateVals, bool DeleteArgs) { // Loop over all of the template arguments, setting them to the specified @@ -1982,8 +1987,9 @@ bool TGParser::ResolveMulticlassDefArgs(MultiClass &MC, } else if (!CurRec->getValue(TArgs[i])->getValue()->isComplete()) { return Error(SubClassLoc, "value not specified for template argument #"+ - utostr(i) + " (" + TArgs[i] + ") of multiclassclass '" + - MC.Rec.getName() + "'"); + utostr(i) + " (" + TArgs[i]->getAsUnquotedString() + + ") of multiclassclass '" + MC.Rec.getNameInitAsString() + + "'"); } } return false; @@ -2018,7 +2024,7 @@ bool TGParser::ResolveMulticlassDef(MultiClass &MC, CurMultiClass->DefPrototypes.push_back(CurRec); // Copy the template arguments for the multiclass into the new def. - const std::vector &TA = + const std::vector &TA = CurMultiClass->Rec.getTemplateArgs(); for (unsigned i = 0, e = TA.size(); i != e; ++i) { @@ -2073,7 +2079,7 @@ bool TGParser::ParseDefm(MultiClass *CurMultiClass) { std::vector &TemplateVals = Ref.TemplateArgs; // Verify that the correct number of template arguments were specified. - const std::vector &TArgs = MC->Rec.getTemplateArgs(); + const std::vector &TArgs = MC->Rec.getTemplateArgs(); if (TArgs.size() < TemplateVals.size()) return Error(SubClassLoc, "more template args specified than multiclass expects"); diff --git a/lib/TableGen/TGParser.h b/lib/TableGen/TGParser.h index 266fc2eb41a..da52da2f798 100644 --- a/lib/TableGen/TGParser.h +++ b/lib/TableGen/TGParser.h @@ -96,7 +96,7 @@ private: // Parser methods. Record *DefProto, SMLoc DefmPrefixLoc, SMLoc SubClassLoc, - const std::vector &TArgs, + const std::vector &TArgs, std::vector &TemplateVals, bool DeleteArgs); bool ResolveMulticlassDef(MultiClass &MC, @@ -113,7 +113,7 @@ private: // Parser methods. bool ParseBodyItem(Record *CurRec); bool ParseTemplateArgList(Record *CurRec); - std::string ParseDeclaration(Record *CurRec, bool ParsingTemplateArgs); + Init *ParseDeclaration(Record *CurRec, bool ParsingTemplateArgs); SubClassReference ParseSubClassReference(Record *CurRec, bool isDefm); SubMultiClassReference ParseSubMultiClassReference(MultiClass *CurMC);