aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/TableGen
diff options
context:
space:
mode:
authorZain Jaffal <z_jaffal@apple.com>2023-03-07 12:38:40 +0000
committerZain Jaffal <z_jaffal@apple.com>2023-03-07 12:41:56 +0000
commitd612a75279250b2816e06fcf9b9770575946ad69 (patch)
treee05a59913e35cf592632c86235d7961518807943 /llvm/lib/TableGen
parentd5c404d1b9ab934e9b230df4c09eef2425b106e9 (diff)
downloadllvm-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.cpp14
-rw-r--r--llvm/lib/TableGen/TGLexer.cpp90
-rw-r--r--llvm/lib/TableGen/TGLexer.h34
-rw-r--r--llvm/lib/TableGen/TGParser.cpp14
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: