summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVladislav Vaintroub <wlad@mariadb.com>2019-06-07 11:41:18 +0200
committerVladislav Vaintroub <wlad@mariadb.com>2019-06-07 11:41:18 +0200
commit08fa65fa9c56d81d8fbdfa1eead466a9997e9600 (patch)
tree311f22486067bbf561479d15773f5f21c1eb4ce3
parent0c35b8318d9d4275afb249b0940438f575f18f4c (diff)
downloadmariadb-git-bb-10.4-wlad-128-indexes.tar.gz
MDEV-19709 Bitmap<128>::merge etc may crash on older GCC versionsbb-10.4-wlad-128-indexes
Older GCC generates SSE instruction on not-128-bit-aligned data in Bitmap<128>::buffer Workaround by forcing GCC not to use SSE on Bitmap<N> template.
-rw-r--r--sql/sql_bitmap.h17
1 files changed, 17 insertions, 0 deletions
diff --git a/sql/sql_bitmap.h b/sql/sql_bitmap.h
index 93c5056a8fb..4f1acb60161 100644
--- a/sql/sql_bitmap.h
+++ b/sql/sql_bitmap.h
@@ -27,6 +27,18 @@
#include <my_bitmap.h>
#include <my_bit.h>
+/*
+ Workaround GCC optimizer bug (generating SSE instuctions on unaligned data)
+*/
+#if defined (__GNUC__) && defined(__x86_64__) && (__GNUC__ < 6)
+#define NEED_GCC_NO_SSE_WORKAROUND
+#endif
+
+#ifdef NEED_GCC_NO_SSE_WORKAROUND
+#pragma GCC push_options
+#pragma GCC target ("no-sse")
+#endif
+
template <uint width> class Bitmap
{
uint32 buffer[(width + 31) / 32];
@@ -266,6 +278,11 @@ public:
};
};
+#ifdef NEED_GCC_NO_SSE_WORKAROUND
+#pragma GCC pop_options
+#undef NEED_GCC_NO_SSE_WORKAROUND
+#endif
+
/* An iterator to quickly walk over bits in ulonglong bitmap. */
class Table_map_iterator
{