Implement correct parsing, representation, and printing of DAG argument names

Implements testcase TableGen/TreeNames.td

llvm-svn: 7713
This commit is contained in:
Chris Lattner 2003-08-10 22:14:13 +00:00
parent 4eaf72fc3b
commit 3859c9a8db
4 changed files with 45 additions and 17 deletions

View File

@ -161,12 +161,12 @@ static void addSubClass(Record *SC, const std::vector<Init*> &TemplateArgs) {
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
@ -183,7 +183,7 @@ static void addSubClass(Record *SC, const std::vector<Init*> &TemplateArgs) {
%type <DagValueList> DagArgList DagArgListNE
%type <FieldList> ValueList ValueListNE
%type <BitList> BitList OptBitList RBitList
%type <StrVal> Declaration OptID
%type <StrVal> Declaration OptID OptVarName
%start File
%%
@ -282,16 +282,26 @@ Value : INTVAL {
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; };

View File

@ -172,15 +172,14 @@ MVT::ValueType Pattern::getIntrinsicType(Record *R) const {
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);
@ -201,8 +200,8 @@ TreePatternNode *Pattern::ParseTreePattern(DagInit *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)) {

View File

@ -438,8 +438,11 @@ void DagInit::print(std::ostream &OS) const {
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 << ")";
}

View File

@ -591,9 +591,16 @@ public:
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) {
@ -601,7 +608,16 @@ public:
}
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;
};