From d49739e03cc897308c28d5fe63202732dbc3b6c1 Mon Sep 17 00:00:00 2001 From: "Arnaud A. de Grandmaison" Date: Mon, 15 May 2017 08:43:27 +0000 Subject: [PATCH] MCObjectStreamer : fail with a diagnostic when emitting an out of range value. We were previously silently emitting bogus data in release mode, making it very hard to diagnose the error, or crashing with an assert in debug mode. A proper diagnostic is now always emitted when the value to be emitted is out of range. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@303041 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/MC/MCObjectStreamer.cpp | 5 +++++ test/MC/AArch64/label-arithmetic-diags-elf.s | 9 +++++++++ 2 files changed, 14 insertions(+) diff --git a/lib/MC/MCObjectStreamer.cpp b/lib/MC/MCObjectStreamer.cpp index f7f2253256e..174397e2739 100644 --- a/lib/MC/MCObjectStreamer.cpp +++ b/lib/MC/MCObjectStreamer.cpp @@ -133,6 +133,11 @@ void MCObjectStreamer::EmitValueImpl(const MCExpr *Value, unsigned Size, // Avoid fixups when possible. int64_t AbsValue; if (Value->evaluateAsAbsolute(AbsValue, getAssembler())) { + if (!isUIntN(8 * Size, AbsValue) && !isIntN(8 * Size, AbsValue)) { + getContext().reportError( + Loc, "value evaluated as " + Twine(AbsValue) + " is out of range."); + return; + } EmitIntValue(AbsValue, Size); return; } diff --git a/test/MC/AArch64/label-arithmetic-diags-elf.s b/test/MC/AArch64/label-arithmetic-diags-elf.s index e9d92d591fa..dbfdd24f8dc 100644 --- a/test/MC/AArch64/label-arithmetic-diags-elf.s +++ b/test/MC/AArch64/label-arithmetic-diags-elf.s @@ -1,5 +1,14 @@ // RUN: not llvm-mc -triple aarch64-elf -filetype=obj %s -o /dev/null 2>&1 | FileCheck %s + .data +b: + .fill 300 +e: + .byte e - b + // CHECK: error: value evaluated as 300 is out of range. + // CHECK-NEXT: .byte e - b + // CHECK-NEXT: ^ + .section sec_x start: .space 5000