Author: Paul C. Anagnostopoulos Date: 2020-12-21T10:46:25-05:00 New Revision: 554eb1f6dc49e616b70254a7976699b3eff84366
URL: https://github.com/llvm/llvm-project/commit/554eb1f6dc49e616b70254a7976699b3eff84366 DIFF: https://github.com/llvm/llvm-project/commit/554eb1f6dc49e616b70254a7976699b3eff84366.diff LOG: Revert "[TableGen] Add the !substr() bang operator" This reverts commit 3a675c777dd5788e2313cb06fb27b01f8a2e7573. Added: Modified: llvm/docs/TableGen/ProgRef.rst llvm/include/llvm/TableGen/Record.h llvm/lib/TableGen/Record.cpp llvm/lib/TableGen/TGLexer.cpp llvm/lib/TableGen/TGLexer.h llvm/lib/TableGen/TGParser.cpp llvm/lib/TableGen/TGParser.h Removed: llvm/test/TableGen/substr.td ################################################################################ diff --git a/llvm/docs/TableGen/ProgRef.rst b/llvm/docs/TableGen/ProgRef.rst index f2ee7a7e549a..342b91a0c437 100644 --- a/llvm/docs/TableGen/ProgRef.rst +++ b/llvm/docs/TableGen/ProgRef.rst @@ -216,8 +216,7 @@ TableGen provides "bang operators" that have a wide variety of uses: : !interleave !isa !le !listconcat !listsplat : !lt !mul !ne !not !or : !setdagop !shl !size !sra !srl - : !strconcat !sub !subst !substr !tail - : !xor + : !strconcat !sub !subst !tail !xor The ``!cond`` operator has a slightly diff erent syntax compared to other bang operators, so it is defined separately: @@ -1724,13 +1723,6 @@ and non-0 as true. record if the *target* record name equals the *value* record name; otherwise it produces the *value*. -``!substr(``\ *string*\ ``,`` *start*\ [``,`` *length*]\ ``)`` - This operator extracts a substring of the given *string*. The starting - position of the substring is specified by *start*, which can range - between 0 and the length of the string. The length of the substring - is specified by *length*; if not specified, the rest of the string is - extracted. The *start* and *length* arguments must be integers. - ``!tail(``\ *a*\ ``)`` This operator produces a new list with all the elements of the list *a* except for the zeroth one. (See also ``!head``.) diff --git a/llvm/include/llvm/TableGen/Record.h b/llvm/include/llvm/TableGen/Record.h index a0c5b2778547..3010b4dad09a 100644 --- a/llvm/include/llvm/TableGen/Record.h +++ b/llvm/include/llvm/TableGen/Record.h @@ -829,7 +829,7 @@ class BinOpInit : public OpInit, public FoldingSetNode { /// !op (X, Y, Z) - Combine two inits. class TernOpInit : public OpInit, public FoldingSetNode { public: - enum TernaryOp : uint8_t { SUBST, FOREACH, FILTER, IF, DAG, SUBSTR }; + enum TernaryOp : uint8_t { SUBST, FOREACH, FILTER, IF, DAG }; private: Init *LHS, *MHS, *RHS; diff --git a/llvm/lib/TableGen/Record.cpp b/llvm/lib/TableGen/Record.cpp index 9c0464d4e1bf..cbdce04494f3 100644 --- a/llvm/lib/TableGen/Record.cpp +++ b/llvm/lib/TableGen/Record.cpp @@ -1325,27 +1325,6 @@ Init *TernOpInit::Fold(Record *CurRec) const { } break; } - - case SUBSTR: { - StringInit *LHSs = dyn_cast<StringInit>(LHS); - IntInit *MHSi = dyn_cast<IntInit>(MHS); - IntInit *RHSi = dyn_cast<IntInit>(RHS); - if (LHSs && MHSi && RHSi) { - int64_t StringSize = LHSs->getValue().size(); - int64_t Start = MHSi->getValue(); - int64_t Length = RHSi->getValue(); - if (Start < 0 || Start > StringSize) - PrintError(CurRec->getLoc(), - Twine("!substr start position is out of range 0...") + - std::to_string(StringSize) + ": " + - std::to_string(Start)); - if (Length < 0) - PrintError(CurRec->getLoc(), "!substr length must be nonnegative"); - return StringInit::get(LHSs->getValue().substr(Start, Length), - LHSs->getFormat()); - } - break; - } } return const_cast<TernOpInit *>(this); @@ -1385,12 +1364,11 @@ std::string TernOpInit::getAsString() const { std::string Result; bool UnquotedLHS = false; switch (getOpcode()) { - case DAG: Result = "!dag"; break; - case FILTER: Result = "!filter"; UnquotedLHS = true; break; + case SUBST: Result = "!subst"; break; case FOREACH: Result = "!foreach"; UnquotedLHS = true; break; + case FILTER: Result = "!filter"; UnquotedLHS = true; break; case IF: Result = "!if"; break; - case SUBST: Result = "!subst"; break; - case SUBSTR: Result = "!substr"; break; + case DAG: Result = "!dag"; break; } return (Result + "(" + (UnquotedLHS ? LHS->getAsUnquotedString() : LHS->getAsString()) + diff --git a/llvm/lib/TableGen/TGLexer.cpp b/llvm/lib/TableGen/TGLexer.cpp index a45ef6dc10c1..df0df96f40eb 100644 --- a/llvm/lib/TableGen/TGLexer.cpp +++ b/llvm/lib/TableGen/TGLexer.cpp @@ -589,7 +589,6 @@ tgtok::TokKind TGLexer::LexExclaim() { .Case("listsplat", tgtok::XListSplat) .Case("strconcat", tgtok::XStrConcat) .Case("interleave", tgtok::XInterleave) - .Case("substr", tgtok::XSubstr) .Cases("setdagop", "setop", tgtok::XSetDagOp) // !setop is deprecated. .Cases("getdagop", "getop", tgtok::XGetDagOp) // !getop is deprecated. .Default(tgtok::Error); diff --git a/llvm/lib/TableGen/TGLexer.h b/llvm/lib/TableGen/TGLexer.h index ee568849ca88..1856bef3ea9b 100644 --- a/llvm/lib/TableGen/TGLexer.h +++ b/llvm/lib/TableGen/TGLexer.h @@ -53,9 +53,9 @@ namespace tgtok { // Bang operators. XConcat, XADD, XSUB, XMUL, XNOT, XAND, XOR, XXOR, XSRA, XSRL, XSHL, - XListConcat, XListSplat, XStrConcat, XInterleave, XSubstr, XCast, - XSubst, XForEach, XFilter, XFoldl, XHead, XTail, XSize, XEmpty, XIf, - XCond, XEq, XIsA, XDag, XNe, XLe, XLt, XGe, XGt, XSetDagOp, XGetDagOp, + XListConcat, XListSplat, XStrConcat, XInterleave, XCast, XSubst, XForEach, + XFilter, XFoldl, XHead, XTail, XSize, XEmpty, XIf, XCond, XEq, XIsA, + XDag, XNe, XLe, XLt, XGe, XGt, XSetDagOp, XGetDagOp, // Boolean literals. TrueVal, FalseVal, diff --git a/llvm/lib/TableGen/TGParser.cpp b/llvm/lib/TableGen/TGParser.cpp index 7308cf1b4924..2671d29a7272 100644 --- a/llvm/lib/TableGen/TGParser.cpp +++ b/llvm/lib/TableGen/TGParser.cpp @@ -1496,10 +1496,6 @@ Init *TGParser::ParseOperation(Record *CurRec, RecTy *ItemType) { return (TernOpInit::get(Code, LHS, MHS, RHS, Type))->Fold(CurRec); } - case tgtok::XSubstr: { - return ParseOperationSubstr(CurRec, ItemType); - } - case tgtok::XCond: return ParseOperationCond(CurRec, ItemType); @@ -1659,94 +1655,6 @@ RecTy *TGParser::ParseOperatorType() { return Type; } -/// Parse the !substr operation. Return null on error. -/// -/// Substr ::= !substr(string, start-int [, length-int]) => string -Init *TGParser::ParseOperationSubstr(Record *CurRec, RecTy *ItemType) { - TernOpInit::TernaryOp Code = TernOpInit::SUBSTR; - RecTy *Type = StringRecTy::get(); - - Lex.Lex(); // eat the operation - - if (!consume(tgtok::l_paren)) { - TokError("expected '(' after !substr operator"); - return nullptr; - } - - Init *LHS = ParseValue(CurRec); - if (!LHS) - return nullptr; - - if (!consume(tgtok::comma)) { - TokError("expected ',' in !substr operator"); - return nullptr; - } - - SMLoc MHSLoc = Lex.getLoc(); - Init *MHS = ParseValue(CurRec); - if (!MHS) - return nullptr; - - SMLoc RHSLoc = Lex.getLoc(); - Init *RHS; - if (consume(tgtok::comma)) { - RHSLoc = Lex.getLoc(); - RHS = ParseValue(CurRec); - if (!RHS) - return nullptr; - } else { - RHS = IntInit::get(SIZE_MAX); - } - - if (!consume(tgtok::r_paren)) { - TokError("expected ')' in !substr operator"); - return nullptr; - } - - if (ItemType && !Type->typeIsConvertibleTo(ItemType)) { - Error(RHSLoc, Twine("expected value of type '") + - ItemType->getAsString() + "', got '" + - Type->getAsString() + "'"); - } - - TypedInit *LHSt = dyn_cast<TypedInit>(LHS); - if (!LHSt && !isa<UnsetInit>(LHS)) { - TokError("could not determine type of the string in !substr"); - return nullptr; - } - if (LHSt && !isa<StringRecTy>(LHSt->getType())) { - TokError(Twine("expected string, got type '") + - LHSt->getType()->getAsString() + "'"); - return nullptr; - } - - TypedInit *MHSt = dyn_cast<TypedInit>(MHS); - if (!MHSt && !isa<UnsetInit>(MHS)) { - TokError("could not determine type of the start position in !substr"); - return nullptr; - } - if (MHSt && !isa<IntRecTy>(MHSt->getType())) { - Error(MHSLoc, Twine("expected int, got type '") + - MHSt->getType()->getAsString() + "'"); - return nullptr; - } - - if (RHS) { - TypedInit *RHSt = dyn_cast<TypedInit>(RHS); - if (!RHSt && !isa<UnsetInit>(RHS)) { - TokError("could not determine type of the length in !substr"); - return nullptr; - } - if (RHSt && !isa<IntRecTy>(RHSt->getType())) { - TokError(Twine("expected int, got type '") + - RHSt->getType()->getAsString() + "'"); - return nullptr; - } - } - - return (TernOpInit::get(Code, LHS, MHS, RHS, Type))->Fold(CurRec); -} - /// Parse the !foreach and !filter operations. Return null on error. /// /// ForEach ::= !foreach(ID, list-or-dag, expr) => list<expr type> @@ -2298,8 +2206,7 @@ Init *TGParser::ParseSimpleValue(Record *CurRec, RecTy *ItemType, case tgtok::XFoldl: case tgtok::XForEach: case tgtok::XFilter: - case tgtok::XSubst: - case tgtok::XSubstr: { // Value ::= !ternop '(' Value ',' Value ',' Value ')' + case tgtok::XSubst: { // Value ::= !ternop '(' Value ',' Value ',' Value ')' return ParseOperation(CurRec, ItemType); } } diff --git a/llvm/lib/TableGen/TGParser.h b/llvm/lib/TableGen/TGParser.h index 3ed78a23067f..bdeb4d35382b 100644 --- a/llvm/lib/TableGen/TGParser.h +++ b/llvm/lib/TableGen/TGParser.h @@ -254,7 +254,6 @@ class TGParser { TypedInit *FirstItem = nullptr); RecTy *ParseType(); Init *ParseOperation(Record *CurRec, RecTy *ItemType); - Init *ParseOperationSubstr(Record *CurRec, RecTy *ItemType); Init *ParseOperationForEachFilter(Record *CurRec, RecTy *ItemType); Init *ParseOperationCond(Record *CurRec, RecTy *ItemType); RecTy *ParseOperatorType(); diff --git a/llvm/test/TableGen/substr.td b/llvm/test/TableGen/substr.td deleted file mode 100644 index 5efe4ce69215..000000000000 --- a/llvm/test/TableGen/substr.td +++ /dev/null @@ -1,81 +0,0 @@ -// RUN: llvm-tblgen %s | FileCheck %s -// RUN: not llvm-tblgen -DERROR1 %s 2>&1 | FileCheck --check-prefix=ERROR1 %s - -defvar claim = "This is the end of the world!"; - -// CHECK: def Rec1 -// CHECK: fullNoLength = "This is the end of the world!"; -// CHECK: fullLength = "This is the end of the world!"; -// CHECK: thisIsTheEnd = "This is the end"; -// CHECK: DoorsSong = "the end"; -// CHECK: finalNoLength = "end of the world!"; -// CHECK: finalLength = "end of the world!"; - -def Rec1 { - string fullNoLength = !substr(claim, 0); - string fullLength = !substr(claim, 0, 999); - string thisIsTheEnd = !substr(claim, 0, 15); - string DoorsSong = !substr(claim, 8, 7); - string finalNoLength = !substr(claim, 12); - string finalLength = !substr(claim, 12, !sub(!size(claim), 12)); -} - -// CHECK: def Rec2 { -// CHECK: lastName = "Flintstone"; - -def Rec2 { - string firstName = "Fred"; - string name = firstName # " " # "Flintstone"; - string lastName = !substr(name, !add(!size(firstName), 1)); -} - -// CHECK: def Rec3 { -// CHECK: test1 = ""; -// CHECK: test2 = ""; -// CHECK: test3 = ""; -// CHECK: test4 = "h"; -// CHECK: test5 = "hello"; -// CHECK: test6 = ""; - -def Rec3 { - string test1 = !substr("", 0, 0); - string test2 = !substr("", 0, 9); - string test3 = !substr("hello", 0, 0); - string test4 = !substr("hello", 0, 1); - string test5 = !substr("hello", 0, 99); - string test6 = !substr("hello", 5, 99); -} - -// CHECK: def Rec4 -// CHECK: message = "This is the end of the world!"; -// CHECK: messagePrefix = "This is th..."; -// CHECK: warning = "Bad message: 'This is th...'"; - -class C<string msg> { - string message = msg; - string messagePrefix = !substr(message, 0, 10) # "..."; -} - -def Rec4 : C<claim> { - string warning = "Bad message: '" # messagePrefix # "'"; -} - -#ifdef ERROR1 - -// ERROR1: expected string, got type 'int' -// ERROR1: expected int, got type 'bits<3>' -// ERROR1: expected int, got type 'string' -// ERROR1: !substr start position is out of range 0...29: 30 -// ERROR1: !substr length must be nonnegative - -def Rec8 { - string claim1 = !substr(42, 0, 3); - string claim2 = !substr(claim, 0b101); - string claim3 = !substr(claim, 0, "oops"); -} - -def Rec9 { - string claim1 = !substr(claim, !add(!size(claim), 1)); - string claim2 = !substr(claim, 0, -13); -} -#endif _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits