mirror of
https://github.com/RPCSX/llvm.git
synced 2024-11-24 04:09:45 +00:00
Allow TableGen DAG arguments to be just a name.
DAG arguments can optionally be named: (dag node, node:$name) With this change, the node is also optional: (dag node, node:$name, $name) The missing node is treated as an UnsetInit, so the above is equivalent to: (dag node, node:$name, ?:$name) This syntax is useful in output patterns where we currently require the types of variables to be repeated: def : Pat<(subc i32:$b, i32:$c), (SUBCCrr i32:$b, i32:$c)>; This is preferable: def : Pat<(subc i32:$b, i32:$c), (SUBCCrr $b, $c)>; git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@177843 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
9c22886a01
commit
4717fd4c0f
@ -286,7 +286,7 @@ given values.
|
||||
.. productionlist::
|
||||
SimpleValue: "(" `DagArg` `DagArgList` ")"
|
||||
DagArgList: `DagArg` ("," `DagArg`)*
|
||||
DagArg: `Value` [":" `TokVarName`]
|
||||
DagArg: `Value` [":" `TokVarName`] | `TokVarName`
|
||||
|
||||
The initial :token:`DagArg` is called the "operator" of the dag.
|
||||
|
||||
|
@ -1547,29 +1547,39 @@ Init *TGParser::ParseValue(Record *CurRec, RecTy *ItemType, IDParseMode Mode) {
|
||||
|
||||
/// ParseDagArgList - Parse the argument list for a dag literal expression.
|
||||
///
|
||||
/// ParseDagArgList ::= Value (':' VARNAME)?
|
||||
/// ParseDagArgList ::= ParseDagArgList ',' Value (':' VARNAME)?
|
||||
/// DagArg ::= Value (':' VARNAME)?
|
||||
/// DagArg ::= VARNAME
|
||||
/// DagArgList ::= DagArg
|
||||
/// DagArgList ::= DagArgList ',' DagArg
|
||||
std::vector<std::pair<llvm::Init*, std::string> >
|
||||
TGParser::ParseDagArgList(Record *CurRec) {
|
||||
std::vector<std::pair<llvm::Init*, std::string> > Result;
|
||||
|
||||
while (1) {
|
||||
Init *Val = ParseValue(CurRec);
|
||||
if (Val == 0) return std::vector<std::pair<llvm::Init*, std::string> >();
|
||||
|
||||
// If the variable name is present, add it.
|
||||
std::string VarName;
|
||||
if (Lex.getCode() == tgtok::colon) {
|
||||
if (Lex.Lex() != tgtok::VarName) { // eat the ':'
|
||||
TokError("expected variable name in dag literal");
|
||||
// DagArg ::= VARNAME
|
||||
if (Lex.getCode() == tgtok::VarName) {
|
||||
// A missing value is treated like '?'.
|
||||
Result.push_back(std::make_pair(UnsetInit::get(), Lex.getCurStrVal()));
|
||||
Lex.Lex();
|
||||
} else {
|
||||
// DagArg ::= Value (':' VARNAME)?
|
||||
Init *Val = ParseValue(CurRec);
|
||||
if (Val == 0)
|
||||
return std::vector<std::pair<llvm::Init*, std::string> >();
|
||||
|
||||
// If the variable name is present, add it.
|
||||
std::string VarName;
|
||||
if (Lex.getCode() == tgtok::colon) {
|
||||
if (Lex.Lex() != tgtok::VarName) { // eat the ':'
|
||||
TokError("expected variable name in dag literal");
|
||||
return std::vector<std::pair<llvm::Init*, std::string> >();
|
||||
}
|
||||
VarName = Lex.getCurStrVal();
|
||||
Lex.Lex(); // eat the VarName.
|
||||
}
|
||||
VarName = Lex.getCurStrVal();
|
||||
Lex.Lex(); // eat the VarName.
|
||||
|
||||
Result.push_back(std::make_pair(Val, VarName));
|
||||
}
|
||||
|
||||
Result.push_back(std::make_pair(Val, VarName));
|
||||
|
||||
if (Lex.getCode() != tgtok::comma) break;
|
||||
Lex.Lex(); // eat the ','
|
||||
}
|
||||
|
@ -70,3 +70,15 @@ def VAL4 : bar<foo2, somedef2>;
|
||||
// CHECK-NEXT: dag Dag3 = (somedef2 2);
|
||||
// CHECK-NEXT: NAME = ?
|
||||
// CHECK-NEXT: }
|
||||
|
||||
def VAL5 : bar<foo2, somedef2> {
|
||||
// Named operands.
|
||||
let Dag1 = (somedef1 1:$name1);
|
||||
|
||||
// Name, no node.
|
||||
let Dag2 = (somedef2 $name2, $name3);
|
||||
}
|
||||
|
||||
// CHECK: def VAL5 {
|
||||
// CHECK-NEXT: dag Dag1 = (somedef1 1:$name1);
|
||||
// CHECK-NEXT: dag Dag2 = (somedef2 ?:$name2, ?:$name3);
|
||||
|
Loading…
Reference in New Issue
Block a user