From 63cee81c3c6b083c028ced1114ec50e6a7cae0b3 Mon Sep 17 00:00:00 2001 From: Davide Italiano Date: Fri, 11 Sep 2015 20:47:35 +0000 Subject: [PATCH] [MC] Don't crash on division by zero. Differential Revision: http://reviews.llvm.org/D12776 llvm-svn: 247471 --- llvm/lib/MC/MCExpr.cpp | 12 +++++++++++- llvm/test/MC/ELF/div-by-zero.s | 6 ++++++ 2 files changed, 17 insertions(+), 1 deletion(-) create mode 100644 llvm/test/MC/ELF/div-by-zero.s diff --git a/llvm/lib/MC/MCExpr.cpp b/llvm/lib/MC/MCExpr.cpp index a30ceecc952b..90cd7fa07b1a 100644 --- a/llvm/lib/MC/MCExpr.cpp +++ b/llvm/lib/MC/MCExpr.cpp @@ -739,7 +739,17 @@ bool MCExpr::evaluateAsRelocatableImpl(MCValue &Res, const MCAssembler *Asm, case MCBinaryExpr::AShr: Result = LHS >> RHS; break; case MCBinaryExpr::Add: Result = LHS + RHS; break; case MCBinaryExpr::And: Result = LHS & RHS; break; - case MCBinaryExpr::Div: Result = LHS / RHS; break; + case MCBinaryExpr::Div: { + // Handle division by zero. gas just emits a warning and keeps going, + // we try to be stricter. + // FIXME: Currently the caller of this function has no way to understand + // we're bailing out because of 'division by zero'. Therefore, it will + // emit a 'expected relocatable expression' error. It would be nice to + // change this code to emit a better diagnostic. + if (RHS == 0) + return false; + Result = LHS / RHS; break; + } case MCBinaryExpr::EQ: Result = LHS == RHS; break; case MCBinaryExpr::GT: Result = LHS > RHS; break; case MCBinaryExpr::GTE: Result = LHS >= RHS; break; diff --git a/llvm/test/MC/ELF/div-by-zero.s b/llvm/test/MC/ELF/div-by-zero.s new file mode 100644 index 000000000000..8c7f77346551 --- /dev/null +++ b/llvm/test/MC/ELF/div-by-zero.s @@ -0,0 +1,6 @@ +// Check that llvm-mc doesn't crash on division by zero. +// RUN: not llvm-mc -filetype=obj -triple x86_64-pc-linux-gnu %s 2> %t +// RUN: FileCheck -input-file %t %s + +// CHECK: expected relocatable expression +.int 1/0