mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-05-13 01:15:32 +00:00
Fix the interpreter to not crash due to zeroext/signext
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@86428 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
36206182e1
commit
dbf6f518e9
@ -882,16 +882,6 @@ void Interpreter::visitCallSite(CallSite CS) {
|
|||||||
e = SF.Caller.arg_end(); i != e; ++i, ++pNum) {
|
e = SF.Caller.arg_end(); i != e; ++i, ++pNum) {
|
||||||
Value *V = *i;
|
Value *V = *i;
|
||||||
ArgVals.push_back(getOperandValue(V, SF));
|
ArgVals.push_back(getOperandValue(V, SF));
|
||||||
// Promote all integral types whose size is < sizeof(i32) into i32.
|
|
||||||
// We do this by zero or sign extending the value as appropriate
|
|
||||||
// according to the parameter attributes
|
|
||||||
const Type *Ty = V->getType();
|
|
||||||
if (Ty->isInteger() && (ArgVals.back().IntVal.getBitWidth() < 32)) {
|
|
||||||
if (CS.paramHasAttr(pNum, Attribute::ZExt))
|
|
||||||
ArgVals.back().IntVal = ArgVals.back().IntVal.zext(32);
|
|
||||||
else if (CS.paramHasAttr(pNum, Attribute::SExt))
|
|
||||||
ArgVals.back().IntVal = ArgVals.back().IntVal.sext(32);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// To handle indirect calls, we must get the pointer value from the argument
|
// To handle indirect calls, we must get the pointer value from the argument
|
||||||
|
19
test/ExecutionEngine/interpreter-ext.ll
Normal file
19
test/ExecutionEngine/interpreter-ext.ll
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
; RUN: lli -force-interpreter
|
||||||
|
; Extending a value due to zeroext/signext will leave it the wrong size
|
||||||
|
; causing problems later, such as a crash if you try to extend it again.
|
||||||
|
|
||||||
|
define void @zero(i8 zeroext %foo) {
|
||||||
|
zext i8 %foo to i32
|
||||||
|
ret void
|
||||||
|
}
|
||||||
|
|
||||||
|
define void @sign(i8 signext %foo) {
|
||||||
|
sext i8 %foo to i32
|
||||||
|
ret void
|
||||||
|
}
|
||||||
|
|
||||||
|
define i32 @main() {
|
||||||
|
call void @zero(i8 0)
|
||||||
|
call void @sign(i8 0)
|
||||||
|
ret i32 0
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user