diff options
author | Bruno Cardoso Lopes <bruno.cardoso@gmail.com> | 2010-06-22 20:30:50 +0000 |
---|---|---|
committer | Bruno Cardoso Lopes <bruno.cardoso@gmail.com> | 2010-06-22 20:30:50 +0000 |
commit | e5104ac99aae21fb8ee514f3b65eac9856399dc0 (patch) | |
tree | d6e43d54278d742debce4bf11c71b32ed988d2d4 | |
parent | 649fa7bad061cfab53eedd054ae98c4dafb2158a (diff) | |
download | external_llvm-e5104ac99aae21fb8ee514f3b65eac9856399dc0.zip external_llvm-e5104ac99aae21fb8ee514f3b65eac9856399dc0.tar.gz external_llvm-e5104ac99aae21fb8ee514f3b65eac9856399dc0.tar.bz2 |
Fix a subtle multiclass bug: when using class inheritance on
a toplevel 'defm', make sure to properly resolve references.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@106570 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | test/TableGen/defmclass.td | 2 | ||||
-rw-r--r-- | utils/TableGen/TGParser.cpp | 8 |
2 files changed, 6 insertions, 4 deletions
diff --git a/test/TableGen/defmclass.td b/test/TableGen/defmclass.td index ef8e8f7..55482da 100644 --- a/test/TableGen/defmclass.td +++ b/test/TableGen/defmclass.td @@ -16,6 +16,7 @@ class BaseI { class I<bits<4> op> : BaseI { bits<4> opcode = op; int val = !if(!eq(Prefix, xd.Prefix), 7, 21); + int check = !if(hasVEX_4VPrefix, 0, 10); } multiclass R { @@ -33,4 +34,5 @@ multiclass Y { defm SD : R, M, XS; } +// CHECK: int check = 0; defm Instr : Y, VEX; diff --git a/utils/TableGen/TGParser.cpp b/utils/TableGen/TGParser.cpp index 3770848..f81aabe 100644 --- a/utils/TableGen/TGParser.cpp +++ b/utils/TableGen/TGParser.cpp @@ -2020,7 +2020,6 @@ bool TGParser::ParseDefm(MultiClass *CurMultiClass) { } } else { Records.addDef(CurRec); - CurRec->resolveReferences(); } NewRecDefs.push_back(CurRec); @@ -2064,9 +2063,6 @@ bool TGParser::ParseDefm(MultiClass *CurMultiClass) { if (SetValue(CurRec, LetStack[i][j].Loc, LetStack[i][j].Name, LetStack[i][j].Bits, LetStack[i][j].Value)) return true; - - if (!CurMultiClass) - CurRec->resolveReferences(); } if (Lex.getCode() != tgtok::comma) break; @@ -2075,6 +2071,10 @@ bool TGParser::ParseDefm(MultiClass *CurMultiClass) { } } + if (!CurMultiClass) + for (unsigned i = 0, e = NewRecDefs.size(); i != e; ++i) + NewRecDefs[i]->resolveReferences(); + if (Lex.getCode() != tgtok::semi) return TokError("expected ';' at end of defm"); Lex.Lex(); |