[ubsan] handle long double in 32-bit mode; part of the patch by Marek Polacek
authorKostya Serebryany <kcc@google.com>
Fri, 23 May 2014 14:45:13 +0000 (14:45 +0000)
committerKostya Serebryany <kcc@google.com>
Fri, 23 May 2014 14:45:13 +0000 (14:45 +0000)
llvm-svn: 209516

compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors_format.inc
compiler-rt/lib/ubsan/ubsan_value.cc
compiler-rt/test/ubsan/TestCases/Float/cast-overflow.cpp

index a2ce889..8f94802 100644 (file)
@@ -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;                                                     \
index 5d77350..ab74720 100644 (file)
@@ -94,6 +94,7 @@ FloatMax Value::getFloatValue() const {
     switch (getType().getFloatBitWidth()) {
     case 64: return *reinterpret_cast<double*>(Val);
     case 80: return *reinterpret_cast<long double*>(Val);
+    case 96: return *reinterpret_cast<long double*>(Val);
     case 128: return *reinterpret_cast<long double*>(Val);
     }
   }
index 801a99f..6f64d13 100644 (file)
@@ -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;
   }
 }