diff options
author | Zain Jaffal <z_jaffal@apple.com> | 2023-03-07 12:38:40 +0000 |
---|---|---|
committer | Zain Jaffal <z_jaffal@apple.com> | 2023-03-07 12:41:56 +0000 |
commit | d612a75279250b2816e06fcf9b9770575946ad69 (patch) | |
tree | e05a59913e35cf592632c86235d7961518807943 /llvm/lib/TableGen | |
parent | d5c404d1b9ab934e9b230df4c09eef2425b106e9 (diff) | |
download | llvm-d612a75279250b2816e06fcf9b9770575946ad69.zip llvm-d612a75279250b2816e06fcf9b9770575946ad69.tar.gz llvm-d612a75279250b2816e06fcf9b9770575946ad69.tar.bz2 |
[TableGen] add !toupper and !tolower operators to change the casing of strings.
Reviewed By: fpetrogalli
Differential Revision: https://reviews.llvm.org/D145300
Diffstat (limited to 'llvm/lib/TableGen')
-rw-r--r-- | llvm/lib/TableGen/Record.cpp | 14 | ||||
-rw-r--r-- | llvm/lib/TableGen/TGLexer.cpp | 90 | ||||
-rw-r--r-- | llvm/lib/TableGen/TGLexer.h | 34 | ||||
-rw-r--r-- | llvm/lib/TableGen/TGParser.cpp | 14 |
4 files changed, 91 insertions, 61 deletions
diff --git a/llvm/lib/TableGen/Record.cpp b/llvm/lib/TableGen/Record.cpp index 363bf7b..a61fd3c 100644 --- a/llvm/lib/TableGen/Record.cpp +++ b/llvm/lib/TableGen/Record.cpp @@ -778,6 +778,14 @@ void UnOpInit::Profile(FoldingSetNodeID &ID) const { Init *UnOpInit::Fold(Record *CurRec, bool IsFinal) const { RecordKeeper &RK = getRecordKeeper(); switch (getOpcode()) { + case TOLOWER: + if (StringInit *LHSs = dyn_cast<StringInit>(LHS)) + return StringInit::get(RK, LHSs->getValue().lower()); + break; + case TOUPPER: + if (StringInit *LHSs = dyn_cast<StringInit>(LHS)) + return StringInit::get(RK, LHSs->getValue().upper()); + break; case CAST: if (isa<StringRecTy>(getType())) { if (StringInit *LHSs = dyn_cast<StringInit>(LHS)) @@ -927,6 +935,12 @@ std::string UnOpInit::getAsString() const { case EMPTY: Result = "!empty"; break; case GETDAGOP: Result = "!getdagop"; break; case LOG2 : Result = "!logtwo"; break; + case TOLOWER: + Result = "!tolower"; + break; + case TOUPPER: + Result = "!toupper"; + break; } return Result + "(" + LHS->getAsString() + ")"; } diff --git a/llvm/lib/TableGen/TGLexer.cpp b/llvm/lib/TableGen/TGLexer.cpp index f2148b4..ba63d0b 100644 --- a/llvm/lib/TableGen/TGLexer.cpp +++ b/llvm/lib/TableGen/TGLexer.cpp @@ -549,50 +549,52 @@ tgtok::TokKind TGLexer::LexExclaim() { // Check to see which operator this is. tgtok::TokKind Kind = - StringSwitch<tgtok::TokKind>(StringRef(Start, CurPtr - Start)) - .Case("eq", tgtok::XEq) - .Case("ne", tgtok::XNe) - .Case("le", tgtok::XLe) - .Case("lt", tgtok::XLt) - .Case("ge", tgtok::XGe) - .Case("gt", tgtok::XGt) - .Case("if", tgtok::XIf) - .Case("cond", tgtok::XCond) - .Case("isa", tgtok::XIsA) - .Case("head", tgtok::XHead) - .Case("tail", tgtok::XTail) - .Case("size", tgtok::XSize) - .Case("con", tgtok::XConcat) - .Case("dag", tgtok::XDag) - .Case("add", tgtok::XADD) - .Case("sub", tgtok::XSUB) - .Case("mul", tgtok::XMUL) - .Case("div", tgtok::XDIV) - .Case("not", tgtok::XNOT) - .Case("logtwo", tgtok::XLOG2) - .Case("and", tgtok::XAND) - .Case("or", tgtok::XOR) - .Case("xor", tgtok::XXOR) - .Case("shl", tgtok::XSHL) - .Case("sra", tgtok::XSRA) - .Case("srl", tgtok::XSRL) - .Case("cast", tgtok::XCast) - .Case("empty", tgtok::XEmpty) - .Case("subst", tgtok::XSubst) - .Case("foldl", tgtok::XFoldl) - .Case("foreach", tgtok::XForEach) - .Case("filter", tgtok::XFilter) - .Case("listconcat", tgtok::XListConcat) - .Case("listsplat", tgtok::XListSplat) - .Case("listremove", tgtok::XListRemove) - .Case("strconcat", tgtok::XStrConcat) - .Case("interleave", tgtok::XInterleave) - .Case("substr", tgtok::XSubstr) - .Case("find", tgtok::XFind) - .Cases("setdagop", "setop", tgtok::XSetDagOp) // !setop is deprecated. - .Cases("getdagop", "getop", tgtok::XGetDagOp) // !getop is deprecated. - .Case("exists", tgtok::XExists) - .Default(tgtok::Error); + StringSwitch<tgtok::TokKind>(StringRef(Start, CurPtr - Start)) + .Case("eq", tgtok::XEq) + .Case("ne", tgtok::XNe) + .Case("le", tgtok::XLe) + .Case("lt", tgtok::XLt) + .Case("ge", tgtok::XGe) + .Case("gt", tgtok::XGt) + .Case("if", tgtok::XIf) + .Case("cond", tgtok::XCond) + .Case("isa", tgtok::XIsA) + .Case("head", tgtok::XHead) + .Case("tail", tgtok::XTail) + .Case("size", tgtok::XSize) + .Case("con", tgtok::XConcat) + .Case("dag", tgtok::XDag) + .Case("add", tgtok::XADD) + .Case("sub", tgtok::XSUB) + .Case("mul", tgtok::XMUL) + .Case("div", tgtok::XDIV) + .Case("not", tgtok::XNOT) + .Case("logtwo", tgtok::XLOG2) + .Case("and", tgtok::XAND) + .Case("or", tgtok::XOR) + .Case("xor", tgtok::XXOR) + .Case("shl", tgtok::XSHL) + .Case("sra", tgtok::XSRA) + .Case("srl", tgtok::XSRL) + .Case("cast", tgtok::XCast) + .Case("empty", tgtok::XEmpty) + .Case("subst", tgtok::XSubst) + .Case("foldl", tgtok::XFoldl) + .Case("foreach", tgtok::XForEach) + .Case("filter", tgtok::XFilter) + .Case("listconcat", tgtok::XListConcat) + .Case("listsplat", tgtok::XListSplat) + .Case("listremove", tgtok::XListRemove) + .Case("strconcat", tgtok::XStrConcat) + .Case("interleave", tgtok::XInterleave) + .Case("substr", tgtok::XSubstr) + .Case("find", tgtok::XFind) + .Cases("setdagop", "setop", tgtok::XSetDagOp) // !setop is deprecated. + .Cases("getdagop", "getop", tgtok::XGetDagOp) // !getop is deprecated. + .Case("exists", tgtok::XExists) + .Case("tolower", tgtok::XToLower) + .Case("toupper", tgtok::XToUpper) + .Default(tgtok::Error); return Kind != tgtok::Error ? Kind : ReturnError(Start-1, "Unknown operator"); } diff --git a/llvm/lib/TableGen/TGLexer.h b/llvm/lib/TableGen/TGLexer.h index 284f1ba..93e28a4 100644 --- a/llvm/lib/TableGen/TGLexer.h +++ b/llvm/lib/TableGen/TGLexer.h @@ -29,11 +29,11 @@ class SourceMgr; class Twine; namespace tgtok { - enum TokKind { - // Markers +enum TokKind { + // Markers Eof, Error, - // Tokens with no info. + // Tokens with no info. minus, plus, // - + l_square, r_square, // [ ] l_brace, r_brace, // { } @@ -45,36 +45,36 @@ namespace tgtok { paste, // # dotdotdot, // ... - // Reserved keywords. ('ElseKW' is named to distinguish it from the - // existing 'Else' that means the preprocessor #else.) + // Reserved keywords. ('ElseKW' is named to distinguish it from the + // existing 'Else' that means the preprocessor #else.) Assert, Bit, Bits, Class, Code, Dag, Def, Defm, Defset, Defvar, ElseKW, FalseKW, Field, Foreach, If, In, Include, Int, Let, List, MultiClass, String, Then, TrueKW, - // Bang operators. + // Bang operators. XConcat, XADD, XSUB, XMUL, XDIV, XNOT, XLOG2, XAND, XOR, XXOR, XSRA, XSRL, XSHL, XListConcat, XListSplat, XStrConcat, XInterleave, XSubstr, XFind, XCast, XSubst, XForEach, XFilter, XFoldl, XHead, XTail, XSize, XEmpty, XIf, XCond, XEq, XIsA, XDag, XNe, XLe, XLt, XGe, XGt, XSetDagOp, XGetDagOp, - XExists, XListRemove, + XExists, XListRemove, XToLower, XToUpper, - // Boolean literals. + // Boolean literals. TrueVal, FalseVal, - // Integer value. - IntVal, + // Integer value. + IntVal, - // Binary constant. Note that these are sized according to the number of - // bits given. - BinaryIntVal, + // Binary constant. Note that these are sized according to the number of + // bits given. + BinaryIntVal, - // String valued tokens. + // String valued tokens. Id, StrVal, VarName, CodeFragment, - // Preprocessing tokens for internal usage by the lexer. - // They are never returned as a result of Lex(). + // Preprocessing tokens for internal usage by the lexer. + // They are never returned as a result of Lex(). Ifdef, Ifndef, Else, Endif, Define - }; +}; } /// TGLexer - TableGen Lexer class. diff --git a/llvm/lib/TableGen/TGParser.cpp b/llvm/lib/TableGen/TGParser.cpp index 735e565..6c52edc 100644 --- a/llvm/lib/TableGen/TGParser.cpp +++ b/llvm/lib/TableGen/TGParser.cpp @@ -969,6 +969,8 @@ Init *TGParser::ParseOperation(Record *CurRec, RecTy *ItemType) { TokError("unknown bang operator"); return nullptr; case tgtok::XNOT: + case tgtok::XToLower: + case tgtok::XToUpper: case tgtok::XLOG2: case tgtok::XHead: case tgtok::XTail: @@ -993,6 +995,16 @@ Init *TGParser::ParseOperation(Record *CurRec, RecTy *ItemType) { } break; + case tgtok::XToLower: + Lex.Lex(); // eat the operation + Code = UnOpInit::TOLOWER; + Type = StringRecTy::get(Records); + break; + case tgtok::XToUpper: + Lex.Lex(); // eat the operation + Code = UnOpInit::TOUPPER; + Type = StringRecTy::get(Records); + break; case tgtok::XNOT: Lex.Lex(); // eat the operation Code = UnOpInit::NOT; @@ -2470,6 +2482,8 @@ Init *TGParser::ParseSimpleValue(Record *CurRec, RecTy *ItemType, case tgtok::XSize: case tgtok::XEmpty: case tgtok::XCast: + case tgtok::XToLower: + case tgtok::XToUpper: case tgtok::XGetDagOp: // Value ::= !unop '(' Value ')' case tgtok::XExists: case tgtok::XIsA: |