MCExpr: Avoid UB by evaluating this shift as unsigned
authorJustin Bogner <mail@justinbogner.com>
Tue, 23 Jun 2015 07:32:55 +0000 (07:32 +0000)
committerJustin Bogner <mail@justinbogner.com>
Tue, 23 Jun 2015 07:32:55 +0000 (07:32 +0000)
We hit undefined behaviour in some MCExpr tests when the LHS of a left
shift is -1. Twos-complement semantics are completely reasonable here,
so we should just do the shift in unsigned.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@240385 91177308-0d34-0410-b5e6-96231b3b80d8

lib/MC/MCExpr.cpp

index b16245ac3f45c59580538cd2dce07bdfd2bda507..a30ceecc952b459379f8cf7423a996406204914f 100644 (file)
@@ -752,7 +752,7 @@ bool MCExpr::evaluateAsRelocatableImpl(MCValue &Res, const MCAssembler *Asm,
     case MCBinaryExpr::Mul:  Result = LHS * RHS; break;
     case MCBinaryExpr::NE:   Result = LHS != RHS; break;
     case MCBinaryExpr::Or:   Result = LHS | RHS; break;
-    case MCBinaryExpr::Shl:  Result = LHS << RHS; break;
+    case MCBinaryExpr::Shl:  Result = uint64_t(LHS) << uint64_t(RHS); break;
     case MCBinaryExpr::Sub:  Result = LHS - RHS; break;
     case MCBinaryExpr::Xor:  Result = LHS ^ RHS; break;
     }