[llvm-commits] CVS: llvm/utils/TableGen/FileParser.y

Chris Lattner lattner at cs.uiuc.edu
Thu Sep 29 21:53:16 PDT 2005



Changes in directory llvm/utils/TableGen:

FileParser.y updated: 1.38 -> 1.39
---
Log message:

Refactor this a bit to move ParsingTemplateArgs to only apply to classes,
not defs.

Implement support for forward definitions of classes.  This implements 
TableGen/ForwardRef.td.


---
Diffs of the changes:  (+25 -11)

 FileParser.y |   36 +++++++++++++++++++++++++-----------
 1 files changed, 25 insertions(+), 11 deletions(-)


Index: llvm/utils/TableGen/FileParser.y
diff -u llvm/utils/TableGen/FileParser.y:1.38 llvm/utils/TableGen/FileParser.y:1.39
--- llvm/utils/TableGen/FileParser.y:1.38	Thu Sep 29 23:42:31 2005
+++ llvm/utils/TableGen/FileParser.y	Thu Sep 29 23:53:04 2005
@@ -214,7 +214,7 @@
 %type <DagValueList> DagArgList DagArgListNE
 %type <FieldList>    ValueList ValueListNE
 %type <BitList>      BitList OptBitList RBitList
-%type <StrVal>       Declaration OptID OptVarName
+%type <StrVal>       Declaration OptID OptVarName ObjectName
 
 %start File
 
@@ -537,20 +537,31 @@
   static unsigned AnonCounter = 0;
   if ($1->empty())
     *$1 = "anonymous."+utostr(AnonCounter++);
-  CurRec = new Record(*$1);
-  delete $1;
-  ParsingTemplateArgs = true;
+  $$ = $1;
 };
 
 ClassName : ObjectName {
-  if (Records.getClass(CurRec->getName())) {
-    err() << "Class '" << CurRec->getName() << "' already defined!\n";
-    exit(1);
+  // If a class of this name already exists, it must be a forward ref.
+  if ((CurRec = Records.getClass(*$1))) {
+    // If the body was previously defined, this is an error.
+    if (!CurRec->getValues().empty() ||
+        !CurRec->getSuperClasses().empty() ||
+        !CurRec->getTemplateArgs().empty()) {
+      err() << "Class '" << CurRec->getName() << "' already defined!\n";
+      exit(1);
+    }
+  } else {
+    // If this is the first reference to this class, create and add it.
+    CurRec = new Record(*$1);
+    Records.addClass(CurRec);
   }
-  Records.addClass(CurRec);
+  delete $1;
 };
 
 DefName : ObjectName {
+  CurRec = new Record(*$1);
+  delete $1;
+  
   // Ensure redefinition doesn't happen.
   if (Records.getDef(CurRec->getName())) {
     err() << "Def '" << CurRec->getName() << "' already defined!\n";
@@ -560,7 +571,6 @@
 };
 
 ObjectBody : ClassList {
-           ParsingTemplateArgs = false;
            for (unsigned i = 0, e = $1->size(); i != e; ++i) {
              addSubClass((*$1)[i].first, *(*$1)[i].second);
              // Delete the template arg values for the class
@@ -579,8 +589,12 @@
            CurRec = 0;
          };
 
-ClassInst : CLASS ClassName OptTemplateArgList ObjectBody {
-        $$ = $4;
+ClassInst : CLASS ClassName {
+                ParsingTemplateArgs = true;
+            } OptTemplateArgList {
+                ParsingTemplateArgs = false;
+            } ObjectBody {
+        $$ = $6;
      };
 
 DefInst : DEF DefName ObjectBody {






More information about the llvm-commits mailing list