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
This commit is contained in:
Chris Lattner 2003-08-04 04:50:57 +00:00
parent 5e2cb8b991
commit 40f71134b9
8 changed files with 56 additions and 2 deletions

View File

@ -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; }

View File

@ -168,7 +168,7 @@ static void addSubClass(Record *SC, const std::vector<Init*> &TemplateArgs) {
std::vector<SubClassRefTy> *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> INTVAL
%token <StrVal> 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);
};

View File

@ -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();
}

View File

@ -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 - '<classname>' - Represent an instance of a class, such as:
/// (R32 X = EAX).

View File

@ -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; }

View File

@ -168,7 +168,7 @@ static void addSubClass(Record *SC, const std::vector<Init*> &TemplateArgs) {
std::vector<SubClassRefTy> *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> INTVAL
%token <StrVal> 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);
};

View File

@ -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();
}

View File

@ -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 - '<classname>' - Represent an instance of a class, such as:
/// (R32 X = EAX).