Graduate LLVM to the big leagues by embedding a LISP processor into TableGen.

Ok, not really, but do support some common LISP functions:

* car
* cdr
* null


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@71805 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
David Greene
2009-05-14 22:38:31 +00:00
parent beb31a51f6
commit 5f9f9ba00b
7 changed files with 149 additions and 6 deletions

View File

@@ -680,6 +680,9 @@ Init *TGParser::ParseOperation(Record *CurRec) {
TokError("unknown operation");
return 0;
break;
case tgtok::XCar:
case tgtok::XCdr:
case tgtok::XNull:
case tgtok::XCast: { // Value ::= !unop '(' Value ')'
UnOpInit::UnaryOp Code;
RecTy *Type = 0;
@@ -693,10 +696,23 @@ Init *TGParser::ParseOperation(Record *CurRec) {
Type = ParseOperatorType();
if (Type == 0) {
TokError("did not get type for binary operator");
TokError("did not get type for unary operator");
return 0;
}
break;
case tgtok::XCar:
Lex.Lex(); // eat the operation
Code = UnOpInit::CAR;
break;
case tgtok::XCdr:
Lex.Lex(); // eat the operation
Code = UnOpInit::CDR;
break;
case tgtok::XNull:
Lex.Lex(); // eat the operation
Code = UnOpInit::LNULL;
Type = new IntRecTy;
break;
}
if (Lex.getCode() != tgtok::l_paren) {
@@ -708,6 +724,60 @@ Init *TGParser::ParseOperation(Record *CurRec) {
Init *LHS = ParseValue(CurRec);
if (LHS == 0) return 0;
if (Code == UnOpInit::CAR
|| Code == UnOpInit::CDR
|| Code == UnOpInit::LNULL) {
ListInit *LHSl = dynamic_cast<ListInit*>(LHS);
TypedInit *LHSt = dynamic_cast<TypedInit*>(LHS);
if (LHSl == 0 && LHSt == 0) {
TokError("expected list type argument in unary operator");
return 0;
}
if (LHSt) {
ListRecTy *LType = dynamic_cast<ListRecTy*>(LHSt->getType());
if (LType == 0) {
TokError("expected list type argumnet in unary operator");
return 0;
}
}
if (Code == UnOpInit::CAR
|| Code == UnOpInit::CDR) {
if (LHSl && LHSl->getSize() == 0) {
TokError("empty list argument in unary operator");
return 0;
}
if (LHSl) {
Init *Item = LHSl->getElement(0);
TypedInit *Itemt = dynamic_cast<TypedInit*>(Item);
if (Itemt == 0) {
TokError("untyped list element in unary operator");
return 0;
}
if (Code == UnOpInit::CAR) {
Type = Itemt->getType();
}
else {
Type = new ListRecTy(Itemt->getType());
}
}
else {
assert(LHSt && "expected list type argument in unary operator");
ListRecTy *LType = dynamic_cast<ListRecTy*>(LHSt->getType());
if (LType == 0) {
TokError("expected list type argumnet in unary operator");
return 0;
}
if (Code == UnOpInit::CAR) {
Type = LType->getElementType();
}
else {
Type = LType;
}
}
}
}
if (Lex.getCode() != tgtok::r_paren) {
TokError("expected ')' in unary operator");
return 0;
@@ -1072,6 +1142,9 @@ Init *TGParser::ParseSimpleValue(Record *CurRec) {
break;
}
case tgtok::XCar:
case tgtok::XCdr:
case tgtok::XNull:
case tgtok::XCast: // Value ::= !unop '(' Value ')'
case tgtok::XConcat:
case tgtok::XSRA: