From: Chris Lattner Date: Thu, 8 Sep 2005 18:48:23 +0000 (+0000) Subject: Add support for automatically created anonymous definitions. X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=a1207a5add8cb4db88ebceb6ea1e81546945db97;p=oota-llvm.git Add support for automatically created anonymous definitions. This implements Regression/TableGen/AnonDefinitionOnDemand.td git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@23274 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/utils/TableGen/FileParser.y b/utils/TableGen/FileParser.y index 47a525abdd3..319b0e3695b 100644 --- a/utils/TableGen/FileParser.y +++ b/utils/TableGen/FileParser.y @@ -291,6 +291,34 @@ Value : INTVAL { } delete $1; + } | ID '<' ValueListNE '>' { + // This is a CLASS expression. This is supposed to synthesize + // a new anonymous definition, deriving from CLASS with no + // body. + Record *Class = Records.getClass(*$1); + if (!Class) { + err() << "Expected a class, got '" << *$1 << "'!\n"; + exit(1); + } + delete $1; + + static unsigned AnonCounter = 0; + Record *OldRec = CurRec; // Save CurRec. + + // Create the new record, set it as CurRec temporarily. + CurRec = new Record("anonymous.val."+utostr(AnonCounter++)); + addSubClass(Class, *$3); // Add info about the subclass to CurRec. + delete $3; // Free up the template args. + + CurRec->resolveReferences(); + + Records.addDef(CurRec); + + // The result of the expression is a reference to the new record. + $$ = new DefInit(CurRec); + + // Restore the old CurRec + CurRec = OldRec; } | Value '{' BitList '}' { $$ = $1->convertInitializerBitRange(*$3); if ($$ == 0) { @@ -543,12 +571,13 @@ ClassInst : CLASS ObjectBody { DefInst : DEF ObjectBody { $2->resolveReferences(); + // If ObjectBody has template arguments, it's an error. if (!$2->getTemplateArgs().empty()) { err() << "Def '" << $2->getName() << "' is not permitted to have template arguments!\n"; exit(1); } - // If ObjectBody has template arguments, it's an error. + // Ensure redefinition doesn't happen. if (Records.getDef($2->getName())) { err() << "Def '" << $2->getName() << "' already defined!\n"; exit(1);