mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-06-12 13:38:21 +00:00
Fix evil TableGen bug in template parameters with defaults.
If a TableGen class has an initializer expression containing an X.Y subexpression, AND X depends on template parameters, AND those template parameters have defaults, AND some parameters with defaults are beyond position 1, THEN parts of the initializer expression are evaluated prematurely with the default values when the first explicit template parameter is substituted, before the remaining explicit template parameters have been substituted. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@99492 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@ -1108,12 +1108,15 @@ RecTy *VarInit::getFieldType(const std::string &FieldName) const {
|
||||
return 0;
|
||||
}
|
||||
|
||||
Init *VarInit::getFieldInit(Record &R, const std::string &FieldName) const {
|
||||
Init *VarInit::getFieldInit(Record &R, const RecordVal *RV,
|
||||
const std::string &FieldName) const {
|
||||
if (dynamic_cast<RecordRecTy*>(getType()))
|
||||
if (const RecordVal *RV = R.getValue(VarName)) {
|
||||
Init *TheInit = RV->getValue();
|
||||
if (const RecordVal *Val = R.getValue(VarName)) {
|
||||
if (RV != Val && (RV || dynamic_cast<UnsetInit*>(Val->getValue())))
|
||||
return 0;
|
||||
Init *TheInit = Val->getValue();
|
||||
assert(TheInit != this && "Infinite loop detected!");
|
||||
if (Init *I = TheInit->getFieldInit(R, FieldName))
|
||||
if (Init *I = TheInit->getFieldInit(R, RV, FieldName))
|
||||
return I;
|
||||
else
|
||||
return 0;
|
||||
@ -1174,7 +1177,8 @@ RecTy *DefInit::getFieldType(const std::string &FieldName) const {
|
||||
return 0;
|
||||
}
|
||||
|
||||
Init *DefInit::getFieldInit(Record &R, const std::string &FieldName) const {
|
||||
Init *DefInit::getFieldInit(Record &R, const RecordVal *RV,
|
||||
const std::string &FieldName) const {
|
||||
return Def->getValue(FieldName)->getValue();
|
||||
}
|
||||
|
||||
@ -1185,7 +1189,7 @@ std::string DefInit::getAsString() const {
|
||||
|
||||
Init *FieldInit::resolveBitReference(Record &R, const RecordVal *RV,
|
||||
unsigned Bit) {
|
||||
if (Init *BitsVal = Rec->getFieldInit(R, FieldName))
|
||||
if (Init *BitsVal = Rec->getFieldInit(R, RV, FieldName))
|
||||
if (BitsInit *BI = dynamic_cast<BitsInit*>(BitsVal)) {
|
||||
assert(Bit < BI->getNumBits() && "Bit reference out of range!");
|
||||
Init *B = BI->getBit(Bit);
|
||||
@ -1198,7 +1202,7 @@ Init *FieldInit::resolveBitReference(Record &R, const RecordVal *RV,
|
||||
|
||||
Init *FieldInit::resolveListElementReference(Record &R, const RecordVal *RV,
|
||||
unsigned Elt) {
|
||||
if (Init *ListVal = Rec->getFieldInit(R, FieldName))
|
||||
if (Init *ListVal = Rec->getFieldInit(R, RV, FieldName))
|
||||
if (ListInit *LI = dynamic_cast<ListInit*>(ListVal)) {
|
||||
if (Elt >= LI->getSize()) return 0;
|
||||
Init *E = LI->getElement(Elt);
|
||||
@ -1215,7 +1219,7 @@ Init *FieldInit::resolveListElementReference(Record &R, const RecordVal *RV,
|
||||
Init *FieldInit::resolveReferences(Record &R, const RecordVal *RV) {
|
||||
Init *NewRec = RV ? Rec->resolveReferences(R, RV) : Rec;
|
||||
|
||||
Init *BitsVal = NewRec->getFieldInit(R, FieldName);
|
||||
Init *BitsVal = NewRec->getFieldInit(R, RV, FieldName);
|
||||
if (BitsVal) {
|
||||
Init *BVR = BitsVal->resolveReferences(R, RV);
|
||||
return BVR->isComplete() ? BVR : this;
|
||||
|
Reference in New Issue
Block a user