Implement correct parsing, representation, and printing of DAG argument names
authorChris Lattner <sabre@nondot.org>
Sun, 10 Aug 2003 22:14:13 +0000 (22:14 +0000)
committerChris Lattner <sabre@nondot.org>
Sun, 10 Aug 2003 22:14:13 +0000 (22:14 +0000)
Implements testcase TableGen/TreeNames.td

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@7713 91177308-0d34-0410-b5e6-96231b3b80d8

support/tools/TableGen/FileParser.y
support/tools/TableGen/InstrSelectorEmitter.cpp
support/tools/TableGen/Record.cpp
support/tools/TableGen/Record.h
utils/TableGen/FileParser.y
utils/TableGen/InstrSelectorEmitter.cpp
utils/TableGen/Record.cpp
utils/TableGen/Record.h

index 5b983eb06c7a4271dfe105906e0f5723b3c38238..9650c53e2f260b68a5a1a8f7a8796f6b3b1cf563 100644 (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; };
 
index f0b3ca1c4f797dc22f051307a513945735b4d730..9eb3be7f3fb0c7e3fb6983d78e086d8b7901f02a 100644 (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)) {
index a76c55cfb67879c336a6a3f35c98d93e13e66aab..384005081e707668ea52264dce35857fc4258843 100644 (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 << ")";
 }
index 5c50a07651dd29faaeae643da184b468c6592959..88312509ef3fc2da78134e0c42ad0b104173395d 100644 (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;
 };
index 5b983eb06c7a4271dfe105906e0f5723b3c38238..9650c53e2f260b68a5a1a8f7a8796f6b3b1cf563 100644 (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; };
 
index f0b3ca1c4f797dc22f051307a513945735b4d730..9eb3be7f3fb0c7e3fb6983d78e086d8b7901f02a 100644 (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)) {
index a76c55cfb67879c336a6a3f35c98d93e13e66aab..384005081e707668ea52264dce35857fc4258843 100644 (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 << ")";
 }
index 5c50a07651dd29faaeae643da184b468c6592959..88312509ef3fc2da78134e0c42ad0b104173395d 100644 (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;
 };