diff options
| author | David Greene <greened@obbligato.org> | 2009-05-14 22:38:31 +0000 |
|---|---|---|
| committer | David Greene <greened@obbligato.org> | 2009-05-14 22:38:31 +0000 |
| commit | d571b3c94b087e8560a14a427d623d70b1a9011c (patch) | |
| tree | 3d92bb86774ee7720f0541312ba042b8c6b3f9b8 /llvm/utils/TableGen/Record.cpp | |
| parent | e917fff30f9bb8c24a656492449d72d8262c7d7f (diff) | |
| download | bcm5719-llvm-d571b3c94b087e8560a14a427d623d70b1a9011c.tar.gz bcm5719-llvm-d571b3c94b087e8560a14a427d623d70b1a9011c.zip | |
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
llvm-svn: 71805
Diffstat (limited to 'llvm/utils/TableGen/Record.cpp')
| -rw-r--r-- | llvm/utils/TableGen/Record.cpp | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/llvm/utils/TableGen/Record.cpp b/llvm/utils/TableGen/Record.cpp index ade17026fbf..ae2c2f3ea40 100644 --- a/llvm/utils/TableGen/Record.cpp +++ b/llvm/utils/TableGen/Record.cpp @@ -520,6 +520,41 @@ Init *UnOpInit::Fold(Record *CurRec, MultiClass *CurMultiClass) { } break; } + case CAR: { + ListInit *LHSl = dynamic_cast<ListInit*>(LHS); + if (LHSl) { + if (LHSl->getSize() == 0) { + assert(0 && "Empty list in car"); + return 0; + } + return LHSl->getElement(0); + } + break; + } + case CDR: { + ListInit *LHSl = dynamic_cast<ListInit*>(LHS); + if (LHSl) { + if (LHSl->getSize() == 0) { + assert(0 && "Empty list in cdr"); + return 0; + } + ListInit *Result = new ListInit(LHSl->begin()+1, LHSl->end()); + return Result; + } + break; + } + case LNULL: { + ListInit *LHSl = dynamic_cast<ListInit*>(LHS); + if (LHSl) { + if (LHSl->getSize() == 0) { + return new IntInit(1); + } + else { + return new IntInit(0); + } + } + break; + } } return this; } @@ -536,6 +571,9 @@ std::string UnOpInit::getAsString() const { std::string Result; switch (Opc) { case CAST: Result = "!cast<" + getType()->getAsString() + ">"; break; + case CAR: Result = "!car"; break; + case CDR: Result = "!cdr"; break; + case LNULL: Result = "!null"; break; } return Result + "(" + LHS->getAsString() + ")"; } |

