mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2026-04-21 08:17:40 +00:00
Implement !if, analogous to $(if) in GNU make.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@71815 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -862,6 +862,7 @@ Init *TGParser::ParseOperation(Record *CurRec) {
|
||||
return (new BinOpInit(Code, LHS, RHS, Type))->Fold(CurRec, CurMultiClass);
|
||||
}
|
||||
|
||||
case tgtok::XIf:
|
||||
case tgtok::XForEach:
|
||||
case tgtok::XSubst: { // Value ::= !ternop '(' Value ',' Value ',' Value ')'
|
||||
TernOpInit::TernaryOp Code;
|
||||
@@ -872,6 +873,9 @@ Init *TGParser::ParseOperation(Record *CurRec) {
|
||||
Lex.Lex(); // eat the operation
|
||||
switch (LexCode) {
|
||||
default: assert(0 && "Unhandled code!");
|
||||
case tgtok::XIf:
|
||||
Code = TernOpInit::IF;
|
||||
break;
|
||||
case tgtok::XForEach:
|
||||
Code = TernOpInit::FOREACH;
|
||||
break;
|
||||
@@ -914,6 +918,25 @@ Init *TGParser::ParseOperation(Record *CurRec) {
|
||||
|
||||
switch (LexCode) {
|
||||
default: assert(0 && "Unhandled code!");
|
||||
case tgtok::XIf: {
|
||||
TypedInit *MHSt = dynamic_cast<TypedInit *>(MHS);
|
||||
TypedInit *RHSt = dynamic_cast<TypedInit *>(RHS);
|
||||
if (MHSt == 0 || RHSt == 0) {
|
||||
TokError("could not get type for !if");
|
||||
return 0;
|
||||
}
|
||||
if (MHSt->getType()->typeIsConvertibleTo(RHSt->getType())) {
|
||||
Type = RHSt->getType();
|
||||
}
|
||||
else if (RHSt->getType()->typeIsConvertibleTo(MHSt->getType())) {
|
||||
Type = MHSt->getType();
|
||||
}
|
||||
else {
|
||||
TokError("inconsistent types for !if");
|
||||
return 0;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case tgtok::XForEach: {
|
||||
TypedInit *MHSt = dynamic_cast<TypedInit *>(MHS);
|
||||
if (MHSt == 0) {
|
||||
@@ -1152,6 +1175,7 @@ Init *TGParser::ParseSimpleValue(Record *CurRec) {
|
||||
case tgtok::XSHL:
|
||||
case tgtok::XStrConcat:
|
||||
case tgtok::XNameConcat: // Value ::= !binop '(' Value ',' Value ')'
|
||||
case tgtok::XIf:
|
||||
case tgtok::XForEach:
|
||||
case tgtok::XSubst: { // Value ::= !ternop '(' Value ',' Value ',' Value ')'
|
||||
return ParseOperation(CurRec);
|
||||
|
||||
Reference in New Issue
Block a user