mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-31 20:51:52 +01:00
[MCExpr] avoid UB via negation of INT_MIN
I accidentally exposed a bug in MCExpr::evaluateAsRelocatableImpl() with the test file added in: http://reviews.llvm.org/rL269977 Differential Revision: http://reviews.llvm.org/D20434 llvm-svn: 270218
This commit is contained in:
parent
4f2926bc68
commit
7dea78f421
@ -663,8 +663,10 @@ bool MCExpr::evaluateAsRelocatableImpl(MCValue &Res, const MCAssembler *Asm,
|
||||
/// -(a - b + const) ==> (b - a - const)
|
||||
if (Value.getSymA() && !Value.getSymB())
|
||||
return false;
|
||||
|
||||
// The cast avoids undefined behavior if the constant is INT64_MIN.
|
||||
Res = MCValue::get(Value.getSymB(), Value.getSymA(),
|
||||
-Value.getConstant());
|
||||
-(uint64_t)Value.getConstant());
|
||||
break;
|
||||
case MCUnaryExpr::Not:
|
||||
if (!Value.isAbsolute())
|
||||
@ -697,9 +699,10 @@ bool MCExpr::evaluateAsRelocatableImpl(MCValue &Res, const MCAssembler *Asm,
|
||||
return false;
|
||||
case MCBinaryExpr::Sub:
|
||||
// Negate RHS and add.
|
||||
// The cast avoids undefined behavior if the constant is INT64_MIN.
|
||||
return EvaluateSymbolicAdd(Asm, Layout, Addrs, InSet, LHSValue,
|
||||
RHSValue.getSymB(), RHSValue.getSymA(),
|
||||
-RHSValue.getConstant(), Res);
|
||||
-(uint64_t)RHSValue.getConstant(), Res);
|
||||
|
||||
case MCBinaryExpr::Add:
|
||||
return EvaluateSymbolicAdd(Asm, Layout, Addrs, InSet, LHSValue,
|
||||
|
@ -11,8 +11,8 @@ movl $-2147483648, %eax
|
||||
|
||||
movabsq $9223372036854775807, %rax
|
||||
|
||||
# FIXME: This line causes UB failure.
|
||||
# movabsq $-9223372036854775808, %rax
|
||||
# This line should not induce undefined behavior via negation of INT64_MIN.
|
||||
movabsq $-9223372036854775808, %rax
|
||||
|
||||
# CHECK: movb $127, %al
|
||||
# CHECK: movb $-128, %al
|
||||
@ -24,5 +24,5 @@ movabsq $9223372036854775807, %rax
|
||||
# CHECK: movl $-2147483648, %eax # imm = 0xFFFFFFFF80000000
|
||||
|
||||
# CHECK: movabsq $9223372036854775807, %rax # imm = 0x7FFFFFFFFFFFFFFF
|
||||
# FIXME-CHECK: movabsq $-9223372036854775808, %rax # imm = 0x8000000000000000
|
||||
# CHECK: movabsq $-9223372036854775808, %rax # imm = 0x8000000000000000
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user