Skip to content

Commit

Permalink
sanitizer: Fix endianness checks for gcc
Browse files Browse the repository at this point in the history
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
  • Loading branch information
vonosmas committed Mar 9, 2016
1 parent 3c4b129 commit c1424fc
Show file tree
Hide file tree
Showing 4 changed files with 6 additions and 6 deletions.
2 changes: 1 addition & 1 deletion compiler-rt/lib/asan/asan_report.cc
Expand Up @@ -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.
Expand Down
Expand Up @@ -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";
Expand Down
4 changes: 2 additions & 2 deletions compiler-rt/lib/tsan/rtl/tsan_interceptors.cc
Expand Up @@ -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

Expand Down
2 changes: 1 addition & 1 deletion compiler-rt/lib/ubsan/ubsan_value.cc
Expand Up @@ -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.
Expand Down

0 comments on commit c1424fc

Please sign in to comment.