From 40f71134b9fef0ca06c516f033cc9403394a913c Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Mon, 4 Aug 2003 04:50:57 +0000 Subject: [PATCH] Add initial support for a new 'dag' type git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@7559 91177308-0d34-0410-b5e6-96231b3b80d8 --- support/tools/TableGen/FileLexer.l | 1 + support/tools/TableGen/FileParser.y | 4 +++- support/tools/TableGen/Record.cpp | 7 +++++++ support/tools/TableGen/Record.h | 17 +++++++++++++++++ utils/TableGen/FileLexer.l | 1 + utils/TableGen/FileParser.y | 4 +++- utils/TableGen/Record.cpp | 7 +++++++ utils/TableGen/Record.h | 17 +++++++++++++++++ 8 files changed, 56 insertions(+), 2 deletions(-) diff --git a/support/tools/TableGen/FileLexer.l b/support/tools/TableGen/FileLexer.l index ad4bd77703a..8ab400610d0 100644 --- a/support/tools/TableGen/FileLexer.l +++ b/support/tools/TableGen/FileLexer.l @@ -154,6 +154,7 @@ bits { return BITS; } string { return STRING; } list { return LIST; } code { return CODE; } +dag { return DAG; } class { return CLASS; } def { return DEF; } diff --git a/support/tools/TableGen/FileParser.y b/support/tools/TableGen/FileParser.y index 4025d4e2315..0c5b240d307 100644 --- a/support/tools/TableGen/FileParser.y +++ b/support/tools/TableGen/FileParser.y @@ -168,7 +168,7 @@ static void addSubClass(Record *SC, const std::vector &TemplateArgs) { std::vector *SubClassList; }; -%token INT BIT STRING BITS LIST CODE CLASS DEF FIELD SET IN +%token INT BIT STRING BITS LIST CODE DAG CLASS DEF FIELD SET IN %token INTVAL %token ID STRVAL CODEFRAGMENT @@ -209,6 +209,8 @@ Type : STRING { // string type $$ = new ListRecTy($3); } | CODE { // code type $$ = new CodeRecTy(); + } | DAG { // dag type + $$ = new DagRecTy(); } | ClassID { // Record Type $$ = new RecordRecTy($1); }; diff --git a/support/tools/TableGen/Record.cpp b/support/tools/TableGen/Record.cpp index 781fecf8204..968f367bd7a 100644 --- a/support/tools/TableGen/Record.cpp +++ b/support/tools/TableGen/Record.cpp @@ -146,6 +146,13 @@ Init *ListRecTy::convertValue(TypedInit *TI) { return 0; } +Init *DagRecTy::convertValue(TypedInit *TI) { + if (TI->getType()->typeIsConvertibleTo(this)) + return TI; + return 0; +} + + void RecordRecTy::print(std::ostream &OS) const { OS << Rec->getName(); } diff --git a/support/tools/TableGen/Record.h b/support/tools/TableGen/Record.h index f933d4ff526..4573af0ee7f 100644 --- a/support/tools/TableGen/Record.h +++ b/support/tools/TableGen/Record.h @@ -21,6 +21,7 @@ class IntRecTy; class StringRecTy; class ListRecTy; class CodeRecTy; +class DagRecTy; class RecordRecTy; // Init subclasses... @@ -82,6 +83,7 @@ public: // These methods should only be called by subclasses of RecTy. virtual bool baseClassOf(const StringRecTy *RHS) const { return false; } virtual bool baseClassOf(const ListRecTy *RHS) const { return false; } virtual bool baseClassOf(const CodeRecTy *RHS) const { return false; } + virtual bool baseClassOf(const DagRecTy *RHS) const { return false; } virtual bool baseClassOf(const RecordRecTy *RHS) const { return false; } }; @@ -214,6 +216,21 @@ struct CodeRecTy : public RecTy { virtual bool baseClassOf(const CodeRecTy *RHS) const { return true; } }; +/// DagRecTy - 'dag' - Represent a dag fragment +/// +struct DagRecTy : public RecTy { + Init *convertValue(UnsetInit *UI) { return (Init*)UI; } + //Init *convertValue( DagInit *CI) { return (Init*)CI; } + Init *convertValue(TypedInit *TI); + + void print(std::ostream &OS) const { OS << "dag"; } + + bool typeIsConvertibleTo(const RecTy *RHS) const { + return RHS->baseClassOf(this); + } + virtual bool baseClassOf(const DagRecTy *RHS) const { return true; } +}; + /// RecordRecTy - '' - Represent an instance of a class, such as: /// (R32 X = EAX). diff --git a/utils/TableGen/FileLexer.l b/utils/TableGen/FileLexer.l index ad4bd77703a..8ab400610d0 100644 --- a/utils/TableGen/FileLexer.l +++ b/utils/TableGen/FileLexer.l @@ -154,6 +154,7 @@ bits { return BITS; } string { return STRING; } list { return LIST; } code { return CODE; } +dag { return DAG; } class { return CLASS; } def { return DEF; } diff --git a/utils/TableGen/FileParser.y b/utils/TableGen/FileParser.y index 4025d4e2315..0c5b240d307 100644 --- a/utils/TableGen/FileParser.y +++ b/utils/TableGen/FileParser.y @@ -168,7 +168,7 @@ static void addSubClass(Record *SC, const std::vector &TemplateArgs) { std::vector *SubClassList; }; -%token INT BIT STRING BITS LIST CODE CLASS DEF FIELD SET IN +%token INT BIT STRING BITS LIST CODE DAG CLASS DEF FIELD SET IN %token INTVAL %token ID STRVAL CODEFRAGMENT @@ -209,6 +209,8 @@ Type : STRING { // string type $$ = new ListRecTy($3); } | CODE { // code type $$ = new CodeRecTy(); + } | DAG { // dag type + $$ = new DagRecTy(); } | ClassID { // Record Type $$ = new RecordRecTy($1); }; diff --git a/utils/TableGen/Record.cpp b/utils/TableGen/Record.cpp index 781fecf8204..968f367bd7a 100644 --- a/utils/TableGen/Record.cpp +++ b/utils/TableGen/Record.cpp @@ -146,6 +146,13 @@ Init *ListRecTy::convertValue(TypedInit *TI) { return 0; } +Init *DagRecTy::convertValue(TypedInit *TI) { + if (TI->getType()->typeIsConvertibleTo(this)) + return TI; + return 0; +} + + void RecordRecTy::print(std::ostream &OS) const { OS << Rec->getName(); } diff --git a/utils/TableGen/Record.h b/utils/TableGen/Record.h index f933d4ff526..4573af0ee7f 100644 --- a/utils/TableGen/Record.h +++ b/utils/TableGen/Record.h @@ -21,6 +21,7 @@ class IntRecTy; class StringRecTy; class ListRecTy; class CodeRecTy; +class DagRecTy; class RecordRecTy; // Init subclasses... @@ -82,6 +83,7 @@ public: // These methods should only be called by subclasses of RecTy. virtual bool baseClassOf(const StringRecTy *RHS) const { return false; } virtual bool baseClassOf(const ListRecTy *RHS) const { return false; } virtual bool baseClassOf(const CodeRecTy *RHS) const { return false; } + virtual bool baseClassOf(const DagRecTy *RHS) const { return false; } virtual bool baseClassOf(const RecordRecTy *RHS) const { return false; } }; @@ -214,6 +216,21 @@ struct CodeRecTy : public RecTy { virtual bool baseClassOf(const CodeRecTy *RHS) const { return true; } }; +/// DagRecTy - 'dag' - Represent a dag fragment +/// +struct DagRecTy : public RecTy { + Init *convertValue(UnsetInit *UI) { return (Init*)UI; } + //Init *convertValue( DagInit *CI) { return (Init*)CI; } + Init *convertValue(TypedInit *TI); + + void print(std::ostream &OS) const { OS << "dag"; } + + bool typeIsConvertibleTo(const RecTy *RHS) const { + return RHS->baseClassOf(this); + } + virtual bool baseClassOf(const DagRecTy *RHS) const { return true; } +}; + /// RecordRecTy - '' - Represent an instance of a class, such as: /// (R32 X = EAX).