mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-14 11:32:34 +00:00
Reject integer literals that are out of range for their type.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@24162 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
61bc60fc4f
commit
465c737467
@ -482,10 +482,28 @@ static unsigned char getIntrinsicType(Record *R, bool NotRegisters,
|
||||
/// exception.
|
||||
bool TreePatternNode::ApplyTypeConstraints(TreePattern &TP, bool NotRegisters) {
|
||||
if (isLeaf()) {
|
||||
if (DefInit *DI = dynamic_cast<DefInit*>(getLeafValue()))
|
||||
if (DefInit *DI = dynamic_cast<DefInit*>(getLeafValue())) {
|
||||
// If it's a regclass or something else known, include the type.
|
||||
return UpdateNodeType(getIntrinsicType(DI->getDef(), NotRegisters, TP),
|
||||
TP);
|
||||
} else if (IntInit *II = dynamic_cast<IntInit*>(getLeafValue())) {
|
||||
// Int inits are always integers. :)
|
||||
bool MadeChange = UpdateNodeType(MVT::isInt, TP);
|
||||
|
||||
if (hasTypeSet()) {
|
||||
unsigned Size = MVT::getSizeInBits(getType());
|
||||
// Make sure that the value is representable for this type.
|
||||
if (Size < 32) {
|
||||
int Val = (II->getValue() << (32-Size)) >> (32-Size);
|
||||
if (Val != II->getValue())
|
||||
TP.error("Sign-extended integer value '" + itostr(II->getValue()) +
|
||||
"' is out of range for type 'MVT::" +
|
||||
getEnumName(getType()) + "'!");
|
||||
}
|
||||
}
|
||||
|
||||
return MadeChange;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user