[llvm-commits] [llvm] r142523 - in /llvm/trunk/lib/TableGen: TGParser.cpp TGParser.h
David Greene
greened at obbligato.org
Wed Oct 19 06:04:31 PDT 2011
Author: greened
Date: Wed Oct 19 08:04:31 2011
New Revision: 142523
URL: http://llvm.org/viewvc/llvm-project?rev=142523&view=rev
Log:
Process Defm Prefix as Init
Parse and process a defm prefix as an Init expression. This allows
paste operations to create defm prefixes.
Modified:
llvm/trunk/lib/TableGen/TGParser.cpp
llvm/trunk/lib/TableGen/TGParser.h
Modified: llvm/trunk/lib/TableGen/TGParser.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/TableGen/TGParser.cpp?rev=142523&r1=142522&r2=142523&view=diff
==============================================================================
--- llvm/trunk/lib/TableGen/TGParser.cpp (original)
+++ llvm/trunk/lib/TableGen/TGParser.cpp Wed Oct 19 08:04:31 2011
@@ -1970,24 +1970,50 @@
Record *TGParser::
InstantiateMulticlassDef(MultiClass &MC,
Record *DefProto,
- const std::string &DefmPrefix,
+ Init *DefmPrefix,
SMLoc DefmPrefixLoc) {
+ // We need to preserve DefProto so it can be reused for later
+ // instantiations, so create a new Record to inherit from it.
+
// Add in the defm name. If the defm prefix is empty, give each
// instantiated def a unique name. Otherwise, if "#NAME#" exists in the
// name, substitute the prefix for #NAME#. Otherwise, use the defm name
// as a prefix.
- std::string DefName = DefProto->getName();
- if (DefmPrefix.empty()) {
- DefName = GetNewAnonymousName();
- } else {
- std::string::size_type idx = DefName.find("#NAME#");
- if (idx != std::string::npos) {
- DefName.replace(idx, 6, DefmPrefix);
- } else {
- // Add the suffix to the defm name to get the new name.
- DefName = DefmPrefix + DefName;
- }
+ StringInit *DefNameString =
+ dynamic_cast<StringInit *>(DefProto->getNameInit());
+
+ if (DefNameString == 0) {
+ Error(DefmPrefixLoc, "Def name is not a string");
+ return 0;
+ }
+
+ if (DefmPrefix == 0)
+ DefmPrefix = StringInit::get(GetNewAnonymousName());
+
+ Init *DefName = DefProto->getNameInit();
+
+ // See if we can substitute #NAME#.
+ Init *NewDefName =
+ TernOpInit::get(TernOpInit::SUBST,
+ StringInit::get("#NAME#"),
+ DefmPrefix,
+ DefName,
+ StringRecTy::get())->Fold(DefProto, &MC);
+
+ if (NewDefName == DefName) {
+ // We did't do any substitution. We should concatenate the given
+ // prefix and name.
+ if (DefmPrefix == 0)
+ DefmPrefix = StringInit::get(GetNewAnonymousName());
+
+ DefName =
+ BinOpInit::get(BinOpInit::STRCONCAT,
+ UnOpInit::get(UnOpInit::CAST, DefmPrefix,
+ StringRecTy::get())->Fold(DefProto, &MC),
+ DefName, StringRecTy::get())->Fold(DefProto, &MC);
}
+ else
+ DefName = NewDefName;
Record *CurRec = new Record(DefName, DefmPrefixLoc, Records);
@@ -2086,14 +2112,9 @@
assert(Lex.getCode() == tgtok::Defm && "Unexpected token!");
Init *DefmPrefix = 0;
- std::string DefmPrefixString;
if (Lex.Lex() == tgtok::Id) { // eat the defm.
DefmPrefix = ParseObjectName(CurMultiClass);
- StringInit *DefmPrefixStringInit = dynamic_cast<StringInit *>(DefmPrefix);
- if (DefmPrefixStringInit == 0)
- return TokError("defm prefix is not a string");
- DefmPrefixString = DefmPrefixStringInit->getValue();
}
SMLoc DefmPrefixLoc = Lex.getLoc();
@@ -2132,8 +2153,7 @@
for (unsigned i = 0, e = MC->DefPrototypes.size(); i != e; ++i) {
Record *DefProto = MC->DefPrototypes[i];
- Record *CurRec = InstantiateMulticlassDef(*MC, DefProto, DefmPrefixString,
- DefmPrefixLoc);
+ Record *CurRec = InstantiateMulticlassDef(*MC, DefProto, DefmPrefix, DefmPrefixLoc);
if (ResolveMulticlassDefArgs(*MC, CurRec, DefmPrefixLoc, SubClassLoc,
TArgs, TemplateVals, true/*Delete args*/))
Modified: llvm/trunk/lib/TableGen/TGParser.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/TableGen/TGParser.h?rev=142523&r1=142522&r2=142523&view=diff
==============================================================================
--- llvm/trunk/lib/TableGen/TGParser.h (original)
+++ llvm/trunk/lib/TableGen/TGParser.h Wed Oct 19 08:04:31 2011
@@ -101,7 +101,7 @@
bool ParseMultiClass();
Record *InstantiateMulticlassDef(MultiClass &MC,
Record *DefProto,
- const std::string &DefmPrefix,
+ Init *DefmPrefix,
SMLoc DefmPrefixLoc);
bool ResolveMulticlassDefArgs(MultiClass &MC,
Record *DefProto,
More information about the llvm-commits
mailing list