Copyright 2013 -> 2014
[folly.git] / folly / Portability.h
index 47d33be4a5a690babb58f82c1b3dbcee2535a89c..b227ba0da9ecf2f9018b7481bb67f870ab584c9a 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright 2013 Facebook, Inc.
+ * Copyright 2014 Facebook, Inc.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -25,6 +25,7 @@
 #include <features.h>
 #endif
 
+#include "CPortability.h"
 
 #if FOLLY_HAVE_SCHED_H
  #include <sched.h>
@@ -84,40 +85,6 @@ struct MaxAlign { char c; } __attribute__((aligned));
 # endif
 #endif
 
-
-/* Define a convenience macro to test when address sanitizer is being used
- * across the different compilers (e.g. clang, gcc) */
-#if defined(__clang__)
-# if __has_feature(address_sanitizer)
-#  define FOLLY_SANITIZE_ADDRESS 1
-# endif
-#elif defined (__GNUC__) && \
-      (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 8)) || (__GNUC__ >= 5)) && \
-      __SANITIZE_ADDRESS__
-# define FOLLY_SANITIZE_ADDRESS 1
-#endif
-
-/* Define attribute wrapper for function attribute used to disable
- * address sanitizer instrumentation. Unfortunately, this attribute
- * has issues when inlining is used, so disable that as well. */
-#ifdef FOLLY_SANITIZE_ADDRESS
-# if defined(__clang__)
-#  if __has_attribute(__no_address_safety_analysis__)
-#   define FOLLY_DISABLE_ADDRESS_SANITIZER \
-      __attribute__((__no_address_safety_analysis__, __noinline__))
-#  elif __has_attribute(__no_sanitize_address__)
-#   define FOLLY_DISABLE_ADDRESS_SANITIZER \
-      __attribute__((__no_sanitize_address__, __noinline__))
-#  endif
-# elif defined(__GNUC__)
-#  define FOLLY_DISABLE_ADDRESS_SANITIZER \
-     __attribute__((__no_address_safety_analysis__, __noinline__))
-# endif
-#endif
-#ifndef FOLLY_DISABLE_ADDRESS_SANITIZER
-# define FOLLY_DISABLE_ADDRESS_SANITIZER
-#endif
-
 // It turns out that GNU libstdc++ and LLVM libc++ differ on how they implement
 // the 'std' namespace; the latter uses inline namepsaces. Wrap this decision
 // up in a macro to make forward-declarations easier.
@@ -137,6 +104,14 @@ struct MaxAlign { char c; } __attribute__((aligned));
 #include "folly/detail/Clock.h"
 #endif
 
+// Provide our own std::__throw_* wrappers for platforms that don't have them
+#if FOLLY_HAVE_BITS_FUNCTEXCEPT_H
+#include <bits/functexcept.h>
+#else
+#include "folly/detail/FunctionalExcept.h"
+#endif
+
+#if defined(__cplusplus)
 // Unfortunately, boost::has_trivial_copy<T> is broken in libc++ due to its
 // usage of __has_trivial_copy(), so we can't use it as a
 // least-common-denominator for C++11 implementations that don't support
@@ -153,5 +128,6 @@ struct MaxAlign { char c; } __attribute__((aligned));
 #include <boost/type_traits.hpp>
 #define FOLLY_IS_TRIVIALLY_COPYABLE(T)      (boost::has_trivial_copy<T>::value)
 #endif
+#endif // __cplusplus
 
 #endif // FOLLY_PORTABILITY_H_