int IntVal;
RecTy *Ty;
Init *Initializer;
- std::vector<Init*> *DagValueList;
std::vector<Init*> *FieldList;
std::vector<unsigned>*BitList;
Record *Rec;
SubClassRefTy *SubClassRef;
std::vector<SubClassRefTy> *SubClassList;
+ std::vector<std::pair<Init*, std::string> > *DagValueList;
};
%token INT BIT STRING BITS LIST CODE DAG CLASS DEF FIELD LET IN
%type <DagValueList> DagArgList DagArgListNE
%type <FieldList> ValueList ValueListNE
%type <BitList> BitList OptBitList RBitList
-%type <StrVal> Declaration OptID
+%type <StrVal> Declaration OptID OptVarName
%start File
%%
delete $2; delete $3;
};
-DagArgListNE : Value {
- $$ = new std::vector<Init*>();
- $$->push_back($1);
+OptVarName : /* empty */ {
+ $$ = new std::string();
}
- | DagArgListNE ',' Value {
- $1->push_back($3);
+ | ':' VARNAME {
+ $$ = $2;
+ };
+
+DagArgListNE : Value OptVarName {
+ $$ = new std::vector<std::pair<Init*, std::string> >();
+ $$->push_back(std::make_pair($1, *$2));
+ delete $2;
+ }
+ | DagArgListNE ',' Value OptVarName {
+ $1->push_back(std::make_pair($3, *$4));
+ delete $4;
+ $$ = $1;
};
DagArgList : /*empty*/ {
- $$ = new std::vector<Init*>();
+ $$ = new std::vector<std::pair<Init*, std::string> >();
}
| DagArgListNE { $$ = $1; };
TreePatternNode *Pattern::ParseTreePattern(DagInit *DI) {
Record *Operator = DI->getNodeType();
- const std::vector<Init*> &Args = DI->getArgs();
if (Operator->isSubClassOf("ValueType")) {
// If the operator is a ValueType, then this must be "type cast" of a leaf
// node.
- if (Args.size() != 1)
+ if (DI->getNumArgs() != 1)
error("Type cast only valid for a leaf node!");
- Init *Arg = Args[0];
+ Init *Arg = DI->getArg(0);
TreePatternNode *New;
if (DefInit *DI = dynamic_cast<DefInit*>(Arg)) {
New = new TreePatternNode(DI);
std::vector<TreePatternNode*> Children;
- for (unsigned i = 0, e = Args.size(); i != e; ++i) {
- Init *Arg = Args[i];
+ for (unsigned i = 0, e = DI->getNumArgs(); i != e; ++i) {
+ Init *Arg = DI->getArg(i);
if (DagInit *DI = dynamic_cast<DagInit*>(Arg)) {
Children.push_back(ParseTreePattern(DI));
} else if (DefInit *DI = dynamic_cast<DefInit*>(Arg)) {
OS << "(" << NodeTypeDef->getName();
if (Args.size()) {
OS << " " << *Args[0];
- for (unsigned i = 1, e = Args.size(); i != e; ++i)
+ if (!ArgNames[0].empty()) OS << ":$" << ArgNames[0];
+ for (unsigned i = 1, e = Args.size(); i != e; ++i) {
OS << ", " << *Args[i];
+ if (!ArgNames[i].empty()) OS << ":$" << ArgNames[i];
+ }
}
OS << ")";
}
class DagInit : public Init {
Record *NodeTypeDef;
std::vector<Init*> Args;
+ std::vector<std::string> ArgNames;
public:
- DagInit(Record *D, std::vector<Init*> &a) : NodeTypeDef(D) {
- Args.swap(a); // DESTRUCTIVELY take the arguments
+ DagInit(Record *D, const std::vector<std::pair<Init*, std::string> > &args)
+ : NodeTypeDef(D) {
+ Args.reserve(args.size());
+ ArgNames.reserve(args.size());
+ for (unsigned i = 0, e = args.size(); i != e; ++i) {
+ Args.push_back(args[i].first);
+ ArgNames.push_back(args[i].second);
+ }
}
virtual Init *convertInitializerTo(RecTy *Ty) {
}
Record *getNodeType() const { return NodeTypeDef; }
- const std::vector<Init*> &getArgs() const { return Args; }
+
+ unsigned getNumArgs() const { return Args.size(); }
+ Init *getArg(unsigned Num) const {
+ assert(Num < Args.size() && "Arg number out of range!");
+ return Args[Num];
+ }
+ const std::string &getArgName(unsigned Num) const {
+ assert(Num < ArgNames.size() && "Arg number out of range!");
+ return ArgNames[Num];
+ }
virtual void print(std::ostream &OS) const;
};
int IntVal;
RecTy *Ty;
Init *Initializer;
- std::vector<Init*> *DagValueList;
std::vector<Init*> *FieldList;
std::vector<unsigned>*BitList;
Record *Rec;
SubClassRefTy *SubClassRef;
std::vector<SubClassRefTy> *SubClassList;
+ std::vector<std::pair<Init*, std::string> > *DagValueList;
};
%token INT BIT STRING BITS LIST CODE DAG CLASS DEF FIELD LET IN
%type <DagValueList> DagArgList DagArgListNE
%type <FieldList> ValueList ValueListNE
%type <BitList> BitList OptBitList RBitList
-%type <StrVal> Declaration OptID
+%type <StrVal> Declaration OptID OptVarName
%start File
%%
delete $2; delete $3;
};
-DagArgListNE : Value {
- $$ = new std::vector<Init*>();
- $$->push_back($1);
+OptVarName : /* empty */ {
+ $$ = new std::string();
}
- | DagArgListNE ',' Value {
- $1->push_back($3);
+ | ':' VARNAME {
+ $$ = $2;
+ };
+
+DagArgListNE : Value OptVarName {
+ $$ = new std::vector<std::pair<Init*, std::string> >();
+ $$->push_back(std::make_pair($1, *$2));
+ delete $2;
+ }
+ | DagArgListNE ',' Value OptVarName {
+ $1->push_back(std::make_pair($3, *$4));
+ delete $4;
+ $$ = $1;
};
DagArgList : /*empty*/ {
- $$ = new std::vector<Init*>();
+ $$ = new std::vector<std::pair<Init*, std::string> >();
}
| DagArgListNE { $$ = $1; };
TreePatternNode *Pattern::ParseTreePattern(DagInit *DI) {
Record *Operator = DI->getNodeType();
- const std::vector<Init*> &Args = DI->getArgs();
if (Operator->isSubClassOf("ValueType")) {
// If the operator is a ValueType, then this must be "type cast" of a leaf
// node.
- if (Args.size() != 1)
+ if (DI->getNumArgs() != 1)
error("Type cast only valid for a leaf node!");
- Init *Arg = Args[0];
+ Init *Arg = DI->getArg(0);
TreePatternNode *New;
if (DefInit *DI = dynamic_cast<DefInit*>(Arg)) {
New = new TreePatternNode(DI);
std::vector<TreePatternNode*> Children;
- for (unsigned i = 0, e = Args.size(); i != e; ++i) {
- Init *Arg = Args[i];
+ for (unsigned i = 0, e = DI->getNumArgs(); i != e; ++i) {
+ Init *Arg = DI->getArg(i);
if (DagInit *DI = dynamic_cast<DagInit*>(Arg)) {
Children.push_back(ParseTreePattern(DI));
} else if (DefInit *DI = dynamic_cast<DefInit*>(Arg)) {
OS << "(" << NodeTypeDef->getName();
if (Args.size()) {
OS << " " << *Args[0];
- for (unsigned i = 1, e = Args.size(); i != e; ++i)
+ if (!ArgNames[0].empty()) OS << ":$" << ArgNames[0];
+ for (unsigned i = 1, e = Args.size(); i != e; ++i) {
OS << ", " << *Args[i];
+ if (!ArgNames[i].empty()) OS << ":$" << ArgNames[i];
+ }
}
OS << ")";
}
class DagInit : public Init {
Record *NodeTypeDef;
std::vector<Init*> Args;
+ std::vector<std::string> ArgNames;
public:
- DagInit(Record *D, std::vector<Init*> &a) : NodeTypeDef(D) {
- Args.swap(a); // DESTRUCTIVELY take the arguments
+ DagInit(Record *D, const std::vector<std::pair<Init*, std::string> > &args)
+ : NodeTypeDef(D) {
+ Args.reserve(args.size());
+ ArgNames.reserve(args.size());
+ for (unsigned i = 0, e = args.size(); i != e; ++i) {
+ Args.push_back(args[i].first);
+ ArgNames.push_back(args[i].second);
+ }
}
virtual Init *convertInitializerTo(RecTy *Ty) {
}
Record *getNodeType() const { return NodeTypeDef; }
- const std::vector<Init*> &getArgs() const { return Args; }
+
+ unsigned getNumArgs() const { return Args.size(); }
+ Init *getArg(unsigned Num) const {
+ assert(Num < Args.size() && "Arg number out of range!");
+ return Args[Num];
+ }
+ const std::string &getArgName(unsigned Num) const {
+ assert(Num < ArgNames.size() && "Arg number out of range!");
+ return ArgNames[Num];
+ }
virtual void print(std::ostream &OS) const;
};