mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-26 23:32:58 +00:00
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:
parent
5e2cb8b991
commit
40f71134b9
@ -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; }
|
||||
|
@ -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);
|
||||
};
|
||||
|
@ -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();
|
||||
}
|
||||
|
@ -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).
|
||||
|
@ -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; }
|
||||
|
@ -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);
|
||||
};
|
||||
|
@ -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();
|
||||
}
|
||||
|
@ -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).
|
||||
|
Loading…
x
Reference in New Issue
Block a user