Fix the bootstrap of CompilerRT with host compilers that don't support
authorChandler Carruth <chandlerc@gmail.com>
Sat, 13 Oct 2012 02:30:10 +0000 (02:30 +0000)
committerChandler Carruth <chandlerc@gmail.com>
Sat, 13 Oct 2012 02:30:10 +0000 (02:30 +0000)
emulating 128-bit arithmetic on 32-bit x86 targets. This should get the
bootstrap back for GCC 4.6 at least.

Suggestions on better ways to do the detection here are welcome...

llvm-svn: 165863

compiler-rt/lib/ubsan/ubsan_diag.cc
compiler-rt/lib/ubsan/ubsan_value.cc
compiler-rt/lib/ubsan/ubsan_value.h

index 8095542..05d8132 100644 (file)
@@ -36,7 +36,7 @@ Diag &Diag::operator<<(const Value &V) {
 
 /// Hexadecimal printing for numbers too large for fprintf to handle directly.
 static void PrintHex(UIntMax Val) {
-#ifdef HAVE_INT128_T
+#if HAVE_INT128_T
   fprintf(stderr, "0x%08x%08x%08x%08x",
           (unsigned int)(Val >> 96),
           (unsigned int)(Val >> 64),
index 0b36895..3d6a735 100644 (file)
@@ -27,7 +27,7 @@ SIntMax Value::getSIntValue() const {
   }
   if (getType().getIntegerBitWidth() == 64)
     return *reinterpret_cast<s64*>(Val);
-#ifdef HAVE_INT128_T
+#if HAVE_INT128_T
   if (getType().getIntegerBitWidth() == 128)
     return *reinterpret_cast<s128*>(Val);
 #endif
@@ -40,7 +40,7 @@ UIntMax Value::getUIntValue() const {
     return Val;
   if (getType().getIntegerBitWidth() == 64)
     return *reinterpret_cast<u64*>(Val);
-#ifdef HAVE_INT128_T
+#if HAVE_INT128_T
   if (getType().getIntegerBitWidth() == 128)
     return *reinterpret_cast<u128*>(Val);
 #endif
index 9426c69..e92b2d6 100644 (file)
 #include "sanitizer_common/sanitizer_common.h"
 
 // FIXME: Move this out to a config header.
+#if defined(__clang__) || _LP64
 typedef __int128 s128;
 typedef unsigned __int128 u128;
 #define HAVE_INT128_T 1
+#else
+#define HAVE_INT128_T 0
+#endif
 
 
 namespace __ubsan {
 
 /// \brief Largest integer types we support.
-#ifdef HAVE_INT128_T
+#if HAVE_INT128_T
 typedef s128 SIntMax;
 typedef u128 UIntMax;
 #else