diff options
| author | Alexey Samsonov <vonosmas@gmail.com> | 2016-03-09 23:39:40 +0000 |
|---|---|---|
| committer | Alexey Samsonov <vonosmas@gmail.com> | 2016-03-09 23:39:40 +0000 |
| commit | c1424fc7c883c4bd184c4a715749a587c6b96fb2 (patch) | |
| tree | e9e36884ea4d9a2ed915e13c883176828114afb0 | |
| parent | 3c4b1290a417ea70318b7424c9376f02abf09343 (diff) | |
| download | bcm5719-llvm-c1424fc7c883c4bd184c4a715749a587c6b96fb2.tar.gz bcm5719-llvm-c1424fc7c883c4bd184c4a715749a587c6b96fb2.zip | |
sanitizer: Fix endianness checks for gcc
Summary:
__BIG_ENDIAN__ and __LITTLE_ENDIAN__ are not supported by gcc, which
eg. for ubsan Value::getFloatValue will silently fall through to
the little endian branch, breaking display of float values by ubsan.
Use __BYTE_ORDER__ == __ORDER_BIG/LITTLE_ENDIAN__ as the condition
instead, which is supported by both clang and gcc.
Noticed while porting ubsan to s390x.
Patch by Marcin KoĆcielnicki!
Differential Revision: http://reviews.llvm.org/D17660
llvm-svn: 263077
| -rw-r--r-- | compiler-rt/lib/asan/asan_report.cc | 2 | ||||
| -rw-r--r-- | compiler-rt/lib/sanitizer_common/sanitizer_symbolizer_libcdep.cc | 4 | ||||
| -rw-r--r-- | compiler-rt/lib/tsan/rtl/tsan_interceptors.cc | 4 | ||||
| -rw-r--r-- | compiler-rt/lib/ubsan/ubsan_value.cc | 2 |
4 files changed, 6 insertions, 6 deletions
diff --git a/compiler-rt/lib/asan/asan_report.cc b/compiler-rt/lib/asan/asan_report.cc index 94fe04e26e5..9a67f2d1938 100644 --- a/compiler-rt/lib/asan/asan_report.cc +++ b/compiler-rt/lib/asan/asan_report.cc @@ -471,7 +471,7 @@ bool DescribeAddressIfStack(uptr addr, uptr access_size) { // previously. That's unfortunate, but I have no better solution, // especially given that the alloca may be from entirely different place // (e.g. use-after-scope, or different thread's stack). -#if defined(__powerpc64__) && defined(__BIG_ENDIAN__) +#if defined(__powerpc64__) && __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ // On PowerPC64 ELFv1, the address of a function actually points to a // three-doubleword data structure with the first field containing // the address of the function's code. diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_symbolizer_libcdep.cc b/compiler-rt/lib/sanitizer_common/sanitizer_symbolizer_libcdep.cc index 7b0d9c40620..e82581fe6f6 100644 --- a/compiler-rt/lib/sanitizer_common/sanitizer_symbolizer_libcdep.cc +++ b/compiler-rt/lib/sanitizer_common/sanitizer_symbolizer_libcdep.cc @@ -209,9 +209,9 @@ class LLVMSymbolizerProcess : public SymbolizerProcess { const char* const kSymbolizerArch = "--default-arch=arm64"; #elif defined(__arm__) const char* const kSymbolizerArch = "--default-arch=arm"; -#elif defined(__powerpc64__) && defined(__BIG_ENDIAN__) +#elif defined(__powerpc64__) && __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ const char* const kSymbolizerArch = "--default-arch=powerpc64"; -#elif defined(__powerpc64__) && defined(__LITTLE_ENDIAN__) +#elif defined(__powerpc64__) && __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ const char* const kSymbolizerArch = "--default-arch=powerpc64le"; #else const char* const kSymbolizerArch = "--default-arch=unknown"; diff --git a/compiler-rt/lib/tsan/rtl/tsan_interceptors.cc b/compiler-rt/lib/tsan/rtl/tsan_interceptors.cc index 76cd740ed98..5e541f26447 100644 --- a/compiler-rt/lib/tsan/rtl/tsan_interceptors.cc +++ b/compiler-rt/lib/tsan/rtl/tsan_interceptors.cc @@ -87,10 +87,10 @@ struct ucontext_t { #endif #if defined(__x86_64__) || defined(__mips__) \ - || (defined(__powerpc64__) && defined(__BIG_ENDIAN__)) + || (defined(__powerpc64__) && __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__) #define PTHREAD_ABI_BASE "GLIBC_2.3.2" #elif defined(__aarch64__) || (defined(__powerpc64__) \ - && defined(__LITTLE_ENDIAN__)) + && __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__) #define PTHREAD_ABI_BASE "GLIBC_2.17" #endif diff --git a/compiler-rt/lib/ubsan/ubsan_value.cc b/compiler-rt/lib/ubsan/ubsan_value.cc index 79dc4c8e827..72faf2ee14b 100644 --- a/compiler-rt/lib/ubsan/ubsan_value.cc +++ b/compiler-rt/lib/ubsan/ubsan_value.cc @@ -83,7 +83,7 @@ FloatMax Value::getFloatValue() const { #endif case 32: { float Value; -#if defined(__BIG_ENDIAN__) +#if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ // For big endian the float value is in the last 4 bytes. // On some targets we may only have 4 bytes so we count backwards from // the end of Val to account for both the 32-bit and 64-bit cases. |

