From: Kostya Serebryany Date: Fri, 23 May 2014 14:45:13 +0000 (+0000) Subject: [ubsan] handle long double in 32-bit mode; part of the patch by Marek Polacek X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=a72efdff9e29a108eebcce81641e75afbc7e22b9;p=platform%2Fupstream%2Fllvm.git [ubsan] handle long double in 32-bit mode; part of the patch by Marek Polacek llvm-svn: 209516 --- diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors_format.inc b/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors_format.inc index a2ce889..8f94802 100644 --- a/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors_format.inc +++ b/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors_format.inc @@ -459,6 +459,9 @@ static int printf_get_value_size(PrintfDirective *dir) { case 8: \ va_arg(*aq, double); \ break; \ + case 12: \ + va_arg(*aq, long double); \ + break; \ case 16: \ va_arg(*aq, long double); \ break; \ diff --git a/compiler-rt/lib/ubsan/ubsan_value.cc b/compiler-rt/lib/ubsan/ubsan_value.cc index 5d77350..ab74720f 100644 --- a/compiler-rt/lib/ubsan/ubsan_value.cc +++ b/compiler-rt/lib/ubsan/ubsan_value.cc @@ -94,6 +94,7 @@ FloatMax Value::getFloatValue() const { switch (getType().getFloatBitWidth()) { case 64: return *reinterpret_cast(Val); case 80: return *reinterpret_cast(Val); + case 96: return *reinterpret_cast(Val); case 128: return *reinterpret_cast(Val); } } diff --git a/compiler-rt/test/ubsan/TestCases/Float/cast-overflow.cpp b/compiler-rt/test/ubsan/TestCases/Float/cast-overflow.cpp index 801a99f..6f64d13 100644 --- a/compiler-rt/test/ubsan/TestCases/Float/cast-overflow.cpp +++ b/compiler-rt/test/ubsan/TestCases/Float/cast-overflow.cpp @@ -9,6 +9,21 @@ // RUN: %run %t 6 2>&1 | FileCheck %s --check-prefix=CHECK-6 // FIXME: %run %t 7 2>&1 | FileCheck %s --check-prefix=CHECK-7 // RUN: %run %t 8 2>&1 | FileCheck %s --check-prefix=CHECK-8 +// RUN: %run %t 9 2>&1 | FileCheck %s --check-prefix=CHECK-9 + +// FIXME: run all ubsan tests in 32- and 64-bit modes (?). +// RUN: %clangxx -fsanitize=float-cast-overflow -m32 %s -o %t +// RUN: %run %t _ +// RUN: %run %t 0 2>&1 | FileCheck %s --check-prefix=CHECK-0 +// RUN: %run %t 1 2>&1 | FileCheck %s --check-prefix=CHECK-1 +// RUN: %run %t 2 2>&1 | FileCheck %s --check-prefix=CHECK-2 +// RUN: %run %t 3 2>&1 | FileCheck %s --check-prefix=CHECK-3 +// RUN: %run %t 4 2>&1 | FileCheck %s --check-prefix=CHECK-4 +// RUN: %run %t 5 2>&1 | FileCheck %s --check-prefix=CHECK-5 +// RUN: %run %t 6 2>&1 | FileCheck %s --check-prefix=CHECK-6 +// FIXME: %run %t 7 2>&1 | FileCheck %s --check-prefix=CHECK-7 +// RUN: %run %t 8 2>&1 | FileCheck %s --check-prefix=CHECK-8 +// RUN: %run %t 9 2>&1 | FileCheck %s --check-prefix=CHECK-9 // This test assumes float and double are IEEE-754 single- and double-precision. @@ -95,5 +110,10 @@ int main(int argc, char **argv) { case '8': // CHECK-8: runtime error: value 1e+39 is outside the range of representable values of type 'float' return (float)1e39; + case '9': + volatile long double ld = 300.0; + // CHECK-9: runtime error: value 300 is outside the range of representable values of type 'char' + char c = ld; + return c; } }