TableGen: Support folding casts from bits to int

This is to fix an incorrect error when trying to initialize
DwarfNumbers with a !cast<int> of a bits initializer.
getValuesAsListOfInts("DwarfNumbers") would not see an IntInit
and instead the cast, so would give up.

It seems likely that this could be generalized to attempt
the convertInitializerTo for any type. I'm not really sure
why the existing code seems to special case the string cast cases
when convertInitializerTo seems like it should generally handle this
sort of thing.

llvm-svn: 243722
This commit is contained in:
Matt Arsenault 2015-07-31 01:12:06 +00:00
parent 4fca6e8063
commit a7bc7db53c
2 changed files with 18 additions and 0 deletions

View File

@ -673,6 +673,14 @@ Init *UnOpInit::Fold(Record *CurRec, MultiClass *CurMultiClass) const {
PrintFatalError(CurRec->getLoc(), PrintFatalError(CurRec->getLoc(),
"Undefined reference:'" + Name + "'\n"); "Undefined reference:'" + Name + "'\n");
} }
if (isa<IntRecTy>(getType())) {
if (BitsInit *BI = dyn_cast<BitsInit>(LHS)) {
if (Init *NewInit = BI->convertInitializerTo(IntRecTy::get()))
return NewInit;
break;
}
}
} }
break; break;
} }

View File

@ -0,0 +1,10 @@
// RUN: llvm-tblgen %s | FileCheck %s
class Foo<bits<8> b> {
// CHECK: list<int> ListOfInts = [170];
// CHECK: list<int> AnotherList = [170, 7];
list<int> ListOfInts = [!cast<int>(b)];
list<int> AnotherList = [!cast<int>(b), !cast<int>({1, 1, 1})];
}
def : Foo<{1, 0, 1, 0, 1, 0, 1, 0}>;