diff options
-rw-r--r-- | docs/TableGenFundamentals.html | 7 | ||||
-rw-r--r-- | test/TableGen/patsubst.td | 15 | ||||
-rw-r--r-- | test/TableGen/regmatch.td | 11 | ||||
-rw-r--r-- | utils/TableGen/CodeGenDAGPatterns.cpp | 2 | ||||
-rw-r--r-- | utils/TableGen/Record.cpp | 98 | ||||
-rw-r--r-- | utils/TableGen/Record.h | 4 | ||||
-rw-r--r-- | utils/TableGen/TGLexer.cpp | 2 | ||||
-rw-r--r-- | utils/TableGen/TGLexer.h | 2 | ||||
-rw-r--r-- | utils/TableGen/TGParser.cpp | 16 |
9 files changed, 4 insertions, 153 deletions
diff --git a/docs/TableGenFundamentals.html b/docs/TableGenFundamentals.html index 5d64a08952..05b2b233e6 100644 --- a/docs/TableGenFundamentals.html +++ b/docs/TableGenFundamentals.html @@ -417,13 +417,6 @@ aborts with an error. </dd> <dt><tt>!subst(a, b, c)</tt></dt> <dd>If 'a' and 'b' are of string type or are symbol references, substitute 'b' for 'a' in 'c.' This operation is analogous to $(subst) in GNU make.</dd> -<dt><tt>!patsubst(a, b, c)</tt></dt> - <dd>patch regular expression 'a' against string 'c' and substitute string 'b' on -a match. 'b' may contain placeholders of the form $<digit>, where -<digit> is a number 1-9.</dd> -<dt><tt>!regmatch(a, b)</tt></dt> - <dd>An integer {0,1} indicating whether string 'b' matched regular expression -'a.'</dd> <dt><tt>!foreach(a, b, c)</tt></dt> <dd>For each member 'b' of dag or list 'a' apply operator 'c.' 'b' is a dummy variable that should be declared as a member variable of an instantiated diff --git a/test/TableGen/patsubst.td b/test/TableGen/patsubst.td index 0a7b3d8219..e69de29bb2 100644 --- a/test/TableGen/patsubst.td +++ b/test/TableGen/patsubst.td @@ -1,15 +0,0 @@ -// RUN: tblgen %s | grep {Match1 = "v4f32"} | count 1 -// RUN: tblgen %s | grep {Match2 = "v2f64"} | count 1 -// RUN: tblgen %s | grep {Match3 = "v4f32 add"} | count 1 -// RUN: tblgen %s | grep {Match4 = "v2f64 add"} | count 1 - -class Foo<string v> { - string Value = v; - string Match1 = !patsubst(".*ps$", "v4f32", v); - string Match2 = !patsubst(".*pd$", "v2f64", v); - string Match3 = !patsubst("(.*)ps$", "v4f32 $1", v); - string Match4 = !patsubst("(.*)pd$", "v2f64 $1", v); -} - -def Bar : Foo<"addps">; -def Baz : Foo<"addpd">; diff --git a/test/TableGen/regmatch.td b/test/TableGen/regmatch.td index 3eb35df41c..e69de29bb2 100644 --- a/test/TableGen/regmatch.td +++ b/test/TableGen/regmatch.td @@ -1,11 +0,0 @@ -// RUN: tblgen %s | grep {Match1 = 1} | count 1 -// RUN: tblgen %s | grep {Match2 = 1} | count 1 - -class Foo<string v> { - string Value = v; - int Match1 = !regmatch(".*ps$", v); - int Match2 = !regmatch(".*pd$", v); -} - -def Bar : Foo<"addps">; -def Baz : Foo<"addpd">; diff --git a/utils/TableGen/CodeGenDAGPatterns.cpp b/utils/TableGen/CodeGenDAGPatterns.cpp index e668468772..05bbc0a7fd 100644 --- a/utils/TableGen/CodeGenDAGPatterns.cpp +++ b/utils/TableGen/CodeGenDAGPatterns.cpp @@ -2025,7 +2025,7 @@ void CodeGenDAGPatterns::ParsePatterns() { } } else { - ListTy = TArg->getType(); + ListTy - TArg->getType(); } } ListInit *LI = new ListInit(Values, new ListRecTy(ListTy)); diff --git a/utils/TableGen/Record.cpp b/utils/TableGen/Record.cpp index 2f500ae5c4..c62e21b3aa 100644 --- a/utils/TableGen/Record.cpp +++ b/utils/TableGen/Record.cpp @@ -16,9 +16,6 @@ #include "llvm/Support/Streams.h" #include "llvm/ADT/StringExtras.h" #include <ios> -#include <sys/types.h> -#include <regex.h> -#include <sstream> using namespace llvm; @@ -750,36 +747,6 @@ Init *BinOpInit::Fold(Record *CurRec, MultiClass *CurMultiClass) { } break; } - case REGMATCH: { - StringInit *LHSs = dynamic_cast<StringInit*>(LHS); - StringInit *RHSs = dynamic_cast<StringInit*>(RHS); - if (LHSs && RHSs) { - regex_t compiled; - int err = regcomp (&compiled, LHSs->getValue().c_str(), REG_EXTENDED); - if (err != 0) { - size_t length = regerror (err, &compiled, NULL, 0); - char *buffer = new char[length]; - (void) regerror (err, &compiled, buffer, length); - std::string errmsg = buffer; - delete[] buffer; - regfree(&compiled); - throw errmsg; - } - int result = regexec(&compiled, RHSs->getValue().c_str(), 0, NULL, 0); - if (result == REG_ESPACE) { - size_t length = regerror (err, &compiled, NULL, 0); - char *buffer = new char[length]; - (void) regerror (err, &compiled, buffer, length); - std::string errmsg = buffer; - delete[] buffer; - regfree(&compiled); - throw errmsg; - } - regfree(&compiled); - return new IntInit(result == 0); - } - break; - } case SHL: case SRA: case SRL: { @@ -819,7 +786,6 @@ std::string BinOpInit::getAsString() const { case SRA: Result = "!sra"; break; case SRL: Result = "!srl"; break; case STRCONCAT: Result = "!strconcat"; break; - case REGMATCH: Result = "!regmatch"; break; case NAMECONCAT: Result = "!nameconcat<" + getType()->getAsString() + ">"; break; } @@ -1035,69 +1001,6 @@ Init *TernOpInit::Fold(Record *CurRec, MultiClass *CurMultiClass) { } break; } - - case PATSUBST: { - StringInit *LHSs = dynamic_cast<StringInit*>(LHS); - StringInit *MHSs = dynamic_cast<StringInit*>(MHS); - StringInit *RHSs = dynamic_cast<StringInit*>(RHS); - - if (LHSs && MHSs && RHSs) { - regex_t compiled; - int err = regcomp (&compiled, LHSs->getValue().c_str(), REG_EXTENDED); - if (err != 0) { - size_t length = regerror (err, &compiled, NULL, 0); - char *buffer = new char[length]; - (void) regerror (err, &compiled, buffer, length); - std::string errmsg = buffer; - delete[] buffer; - regfree(&compiled); - throw errmsg; - } - regmatch_t matches[10]; - int result = regexec(&compiled, RHSs->getValue().c_str(), 10, matches, 0); - if (result == REG_ESPACE) { - size_t length = regerror (err, &compiled, NULL, 0); - char *buffer = new char[length]; - (void) regerror (err, &compiled, buffer, length); - std::string errmsg = buffer; - delete[] buffer; - regfree(&compiled); - throw errmsg; - } - regfree(&compiled); - if (result == 0) { - // Parse the substitution string looking for $1, $2, etc. and - // substitute strings. If there are no $1, etc. just replace - // the whole string. - std::string replacement = MHSs->getValue(); - size_t pos = replacement.find("$"); - while (pos != std::string::npos && pos+1 < replacement.size()) { - if (std::isdigit(replacement[pos+1])) { - std::string sidx(&replacement[pos+1], 1); - std::istringstream str(sidx); - int idx; - if (str >> idx) { - replacement.replace(pos, 2, RHSs->getValue(), matches[idx].rm_so, - matches[idx].rm_eo - matches[idx].rm_so); - } - else { - throw "unexpected failure in patsubst index calculation"; - } - } - else if (replacement[pos+1] == '$') { - replacement.replace(pos, 2, "$"); - } - pos = replacement.find("$", pos+1); - } - return new StringInit(replacement); - } - else { - // No match, just pass the string through - return RHSs; - } - } - break; - } } return this; @@ -1133,7 +1036,6 @@ std::string TernOpInit::getAsString() const { std::string Result; switch (Opc) { case SUBST: Result = "!subst"; break; - case PATSUBST: Result = "!patsubst"; break; case FOREACH: Result = "!foreach"; break; case IF: Result = "!if"; break; } diff --git a/utils/TableGen/Record.h b/utils/TableGen/Record.h index d8e4fb34b6..ac06cae809 100644 --- a/utils/TableGen/Record.h +++ b/utils/TableGen/Record.h @@ -841,7 +841,7 @@ public: /// class BinOpInit : public OpInit { public: - enum BinaryOp { SHL, SRA, SRL, STRCONCAT, CONCAT, NAMECONCAT, REGMATCH }; + enum BinaryOp { SHL, SRA, SRL, STRCONCAT, CONCAT, NAMECONCAT }; private: BinaryOp Opc; Init *LHS, *RHS; @@ -885,7 +885,7 @@ public: /// class TernOpInit : public OpInit { public: - enum TernaryOp { SUBST, FOREACH, IF, PATSUBST }; + enum TernaryOp { SUBST, FOREACH, IF }; private: TernaryOp Opc; Init *LHS, *MHS, *RHS; diff --git a/utils/TableGen/TGLexer.cpp b/utils/TableGen/TGLexer.cpp index 930d9dba5b..758d499a8b 100644 --- a/utils/TableGen/TGLexer.cpp +++ b/utils/TableGen/TGLexer.cpp @@ -447,9 +447,7 @@ tgtok::TokKind TGLexer::LexExclaim() { if (Len == 3 && !memcmp(Start, "shl", 3)) return tgtok::XSHL; if (Len == 9 && !memcmp(Start, "strconcat", 9)) return tgtok::XStrConcat; if (Len == 10 && !memcmp(Start, "nameconcat", 10)) return tgtok::XNameConcat; - if (Len == 8 && !memcmp(Start, "regmatch", 8)) return tgtok::XRegMatch; if (Len == 5 && !memcmp(Start, "subst", 5)) return tgtok::XSubst; - if (Len == 8 && !memcmp(Start, "patsubst", 8)) return tgtok::XPatSubst; if (Len == 7 && !memcmp(Start, "foreach", 7)) return tgtok::XForEach; if (Len == 4 && !memcmp(Start, "cast", 4)) return tgtok::XCast; if (Len == 3 && !memcmp(Start, "car", 3)) return tgtok::XCar; diff --git a/utils/TableGen/TGLexer.h b/utils/TableGen/TGLexer.h index fef10f0c45..ac3b984003 100644 --- a/utils/TableGen/TGLexer.h +++ b/utils/TableGen/TGLexer.h @@ -46,7 +46,7 @@ namespace tgtok { // !keywords. XConcat, XSRA, XSRL, XSHL, XStrConcat, XNameConcat, XCast, XSubst, - XForEach, XCar, XCdr, XNull, XIf, XRegMatch, XPatSubst, + XForEach, XCar, XCdr, XNull, XIf, // Integer value. IntVal, diff --git a/utils/TableGen/TGParser.cpp b/utils/TableGen/TGParser.cpp index d2bc6b853d..cdd285703b 100644 --- a/utils/TableGen/TGParser.cpp +++ b/utils/TableGen/TGParser.cpp @@ -799,7 +799,6 @@ Init *TGParser::ParseOperation(Record *CurRec) { case tgtok::XSRL: case tgtok::XSHL: case tgtok::XStrConcat: - case tgtok::XRegMatch: case tgtok::XNameConcat: { // Value ::= !binop '(' Value ',' Value ')' BinOpInit::BinaryOp Code; RecTy *Type = 0; @@ -832,11 +831,6 @@ Init *TGParser::ParseOperation(Record *CurRec) { Code = BinOpInit::STRCONCAT; Type = new StringRecTy(); break; - case tgtok::XRegMatch: - Lex.Lex(); // eat the operation - Code = BinOpInit::REGMATCH; - Type = new IntRecTy(); - break; case tgtok::XNameConcat: Lex.Lex(); // eat the operation Code = BinOpInit::NAMECONCAT; @@ -878,7 +872,6 @@ Init *TGParser::ParseOperation(Record *CurRec) { case tgtok::XIf: case tgtok::XForEach: - case tgtok::XPatSubst: case tgtok::XSubst: { // Value ::= !ternop '(' Value ',' Value ',' Value ')' TernOpInit::TernaryOp Code; RecTy *Type = 0; @@ -897,9 +890,6 @@ Init *TGParser::ParseOperation(Record *CurRec) { case tgtok::XSubst: Code = TernOpInit::SUBST; break; - case tgtok::XPatSubst: - Code = TernOpInit::PATSUBST; - break; } if (Lex.getCode() != tgtok::l_paren) { TokError("expected '(' after ternary operator"); @@ -973,10 +963,6 @@ Init *TGParser::ParseOperation(Record *CurRec) { Type = RHSt->getType(); break; } - case tgtok::XPatSubst: { - Type = new StringRecTy; - break; - } } return (new TernOpInit(Code, LHS, MHS, RHS, Type))->Fold(CurRec, CurMultiClass); } @@ -1281,11 +1267,9 @@ Init *TGParser::ParseSimpleValue(Record *CurRec, RecTy *ItemType) { case tgtok::XSRL: case tgtok::XSHL: case tgtok::XStrConcat: - case tgtok::XRegMatch: case tgtok::XNameConcat: // Value ::= !binop '(' Value ',' Value ')' case tgtok::XIf: case tgtok::XForEach: - case tgtok::XPatSubst: case tgtok::XSubst: { // Value ::= !ternop '(' Value ',' Value ',' Value ')' return ParseOperation(CurRec); break; |