mirror of
https://github.com/RPCSX/llvm.git
synced 2025-02-24 07:01:35 +00:00
Fix pr5470. Tablegen handles template arguments by temporarily setting their
values, resolving references to them, and then removing the definitions. If a template argument is set to an undefined value, we need to resolve references to that argument to an explicit undefined value. The current code leaves the reference to the template argument as it is, which causes an assertion failure later when the definition of the template argument is removed. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@89581 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
f27f115ef5
commit
2214dc0764
10
test/TableGen/UnsetBitInit.td
Normal file
10
test/TableGen/UnsetBitInit.td
Normal file
@ -0,0 +1,10 @@
|
||||
// RUN: tblgen %s
|
||||
class x {
|
||||
field bits<32> A;
|
||||
}
|
||||
|
||||
class y<bits<2> B> : x {
|
||||
let A{21-20} = B;
|
||||
}
|
||||
|
||||
def z : y<{0,?}>;
|
@ -490,8 +490,11 @@ Init *ListInit::resolveListElementReference(Record &R, const RecordVal *IRV,
|
||||
if (Elt >= getSize())
|
||||
return 0; // Out of range reference.
|
||||
Init *E = getElement(Elt);
|
||||
if (!dynamic_cast<UnsetInit*>(E)) // If the element is set
|
||||
return E; // Replace the VarListElementInit with it.
|
||||
// If the element is set to some value, or if we are resolving a reference
|
||||
// to a specific variable and that variable is explicitly unset, then
|
||||
// replace the VarListElementInit with it.
|
||||
if (IRV || !dynamic_cast<UnsetInit*>(E))
|
||||
return E;
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -1116,8 +1119,11 @@ Init *VarInit::resolveBitReference(Record &R, const RecordVal *IRV,
|
||||
assert(Bit < BI->getNumBits() && "Bit reference out of range!");
|
||||
Init *B = BI->getBit(Bit);
|
||||
|
||||
if (!dynamic_cast<UnsetInit*>(B)) // If the bit is not set...
|
||||
return B; // Replace the VarBitInit with it.
|
||||
// If the bit is set to some value, or if we are resolving a reference to a
|
||||
// specific variable and that variable is explicitly unset, then replace the
|
||||
// VarBitInit with it.
|
||||
if (IRV || !dynamic_cast<UnsetInit*>(B))
|
||||
return B;
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -1138,8 +1144,11 @@ Init *VarInit::resolveListElementReference(Record &R, const RecordVal *IRV,
|
||||
if (Elt >= LI->getSize())
|
||||
return 0; // Out of range reference.
|
||||
Init *E = LI->getElement(Elt);
|
||||
if (!dynamic_cast<UnsetInit*>(E)) // If the element is set
|
||||
return E; // Replace the VarListElementInit with it.
|
||||
// If the element is set to some value, or if we are resolving a reference
|
||||
// to a specific variable and that variable is explicitly unset, then
|
||||
// replace the VarListElementInit with it.
|
||||
if (IRV || !dynamic_cast<UnsetInit*>(E))
|
||||
return E;
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -1246,8 +1255,11 @@ Init *FieldInit::resolveListElementReference(Record &R, const RecordVal *RV,
|
||||
if (Elt >= LI->getSize()) return 0;
|
||||
Init *E = LI->getElement(Elt);
|
||||
|
||||
if (!dynamic_cast<UnsetInit*>(E)) // If the bit is set...
|
||||
return E; // Replace the VarListElementInit with it.
|
||||
// If the element is set to some value, or if we are resolving a
|
||||
// reference to a specific variable and that variable is explicitly
|
||||
// unset, then replace the VarListElementInit with it.
|
||||
if (RV || !dynamic_cast<UnsetInit*>(E))
|
||||
return E;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user