mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-08-05 13:26:55 +00:00
Fix PR2060 by rejecting invalid types for integer constants.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@47311 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -378,7 +378,8 @@ static Value *getExistingVal(const Type *Ty, const ValID &D) {
|
|||||||
// Check to make sure that "Ty" is an integral type, and that our
|
// Check to make sure that "Ty" is an integral type, and that our
|
||||||
// value will fit into the specified type...
|
// value will fit into the specified type...
|
||||||
case ValID::ConstSIntVal: // Is it a constant pool reference??
|
case ValID::ConstSIntVal: // Is it a constant pool reference??
|
||||||
if (!ConstantInt::isValueValidForType(Ty, D.ConstPool64)) {
|
if (!isa<IntegerType>(Ty) ||
|
||||||
|
!ConstantInt::isValueValidForType(Ty, D.ConstPool64)) {
|
||||||
GenerateError("Signed integral constant '" +
|
GenerateError("Signed integral constant '" +
|
||||||
itostr(D.ConstPool64) + "' is invalid for type '" +
|
itostr(D.ConstPool64) + "' is invalid for type '" +
|
||||||
Ty->getDescription() + "'");
|
Ty->getDescription() + "'");
|
||||||
@@ -387,20 +388,23 @@ static Value *getExistingVal(const Type *Ty, const ValID &D) {
|
|||||||
return ConstantInt::get(Ty, D.ConstPool64, true);
|
return ConstantInt::get(Ty, D.ConstPool64, true);
|
||||||
|
|
||||||
case ValID::ConstUIntVal: // Is it an unsigned const pool reference?
|
case ValID::ConstUIntVal: // Is it an unsigned const pool reference?
|
||||||
if (!ConstantInt::isValueValidForType(Ty, D.UConstPool64)) {
|
if (isa<IntegerType>(Ty) &&
|
||||||
if (!ConstantInt::isValueValidForType(Ty, D.ConstPool64)) {
|
ConstantInt::isValueValidForType(Ty, D.UConstPool64))
|
||||||
GenerateError("Integral constant '" + utostr(D.UConstPool64) +
|
|
||||||
"' is invalid or out of range");
|
|
||||||
return 0;
|
|
||||||
} else { // This is really a signed reference. Transmogrify.
|
|
||||||
return ConstantInt::get(Ty, D.ConstPool64, true);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
return ConstantInt::get(Ty, D.UConstPool64);
|
return ConstantInt::get(Ty, D.UConstPool64);
|
||||||
|
|
||||||
|
if (!isa<IntegerType>(Ty) ||
|
||||||
|
!ConstantInt::isValueValidForType(Ty, D.ConstPool64)) {
|
||||||
|
GenerateError("Integral constant '" + utostr(D.UConstPool64) +
|
||||||
|
"' is invalid or out of range for type '" +
|
||||||
|
Ty->getDescription() + "'");
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
// This is really a signed reference. Transmogrify.
|
||||||
|
return ConstantInt::get(Ty, D.ConstPool64, true);
|
||||||
|
|
||||||
case ValID::ConstFPVal: // Is it a floating point const pool reference?
|
case ValID::ConstFPVal: // Is it a floating point const pool reference?
|
||||||
if (!ConstantFP::isValueValidForType(Ty, *D.ConstPoolFP)) {
|
if (!Ty->isFloatingPoint() ||
|
||||||
|
!ConstantFP::isValueValidForType(Ty, *D.ConstPoolFP)) {
|
||||||
GenerateError("FP constant invalid for type");
|
GenerateError("FP constant invalid for type");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
6
test/Assembler/2008-02-18-IntPointerCrash.ll
Normal file
6
test/Assembler/2008-02-18-IntPointerCrash.ll
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
; RUN: not llvm-as %s |& grep {is invalid or}
|
||||||
|
; PR2060
|
||||||
|
|
||||||
|
define i8* @foo() {
|
||||||
|
ret i8* 0
|
||||||
|
}
|
Reference in New Issue
Block a user