1
0
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:
Sanjay Patel 2016-05-20 14:09:41 +00:00
parent 4f2926bc68
commit 7dea78f421
2 changed files with 8 additions and 5 deletions

View File

@ -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,

View File

@ -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