From c335ffa055646319af9a9c0e92be02d215143e9d Mon Sep 17 00:00:00 2001 From: Ilya Kurdyukov Date: Sat, 3 Sep 2022 21:09:44 +0700 Subject: [PATCH] mysql-8.0.30 e2k support These sed patches are also needed to workaround bugs in the EDG frontend: sed -i "/using __base/{N;N;s/^.*using __base.*EncodeBase.*friend __base.*$/EncodeBase_EDG/}" router/src/mysql_protocol/include/mysqlrouter/classic_protocol_codec_*.h sed -i "/#include /c #define preferred_separator preferred_separator_1\n#include \nnamespace std { namespace filesystem = experimental::filesystem; }" mysql-shell/{configure.cmake,mysqlshdk/libs/storage/backend/directory.cc} sed -i "s/-Werror/-Wno-error/" mysql-shell/cmake/compiler.cmake --- CMakeLists.txt | 1 + cmake/abi_check.cmake | 2 +- extra/robin-hood-hashing/robin_hood.h | 2 +- extra/zstd/zstd-1.5.0/lib/common/compiler.h | 2 +- .../devapi/mod_mysqlx_collection_find.cc | 6 ++++++ .../devapi/mod_mysqlx_collection_modify.cc | 4 ++++ .../modules/devapi/mod_mysqlx_table_insert.cc | 6 ++++++ .../mysqlshdk/include/scripting/types_cpp.h | 4 ++-- .../mysqlshdk/libs/storage/backend/directory.cc | 4 ++-- .../mysqlrouter/classic_protocol_codec_base.h | 17 +++++++++++++++++ sql/containers/atomics_array.h | 2 +- sql/containers/integrals_lockfree_queue.h | 2 +- sql/mem_root_array.h | 2 +- sql/mysqld.cc | 2 +- sql/mysqld.h | 2 +- sql/thr_malloc.h | 2 +- storage/innobase/buf/checksum.cc | 2 ++ storage/innobase/include/os0thread.h | 7 +++++++ storage/innobase/include/ut0rnd.h | 2 +- storage/innobase/ut/ut0rnd.cc | 2 +- unittest/gunit/fake_table.cc | 7 +++++++ unittest/gunit/gunit_test_main.cc | 2 +- unittest/gunit/gunit_test_main.h | 2 +- 23 files changed, 67 insertions(+), 17 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 22fa2127..9cca8fef 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -665,6 +665,7 @@ SET(MYSQL_MACHINE_TYPE ${CMAKE_SYSTEM_PROCESSOR}) SET(KNOWN_64BIT_ARCHITECTURES arm64 aarch64 + e2k ppc64 ppc64le s390x diff --git a/cmake/abi_check.cmake b/cmake/abi_check.cmake index 864fcbe6..4248be2a 100644 --- a/cmake/abi_check.cmake +++ b/cmake/abi_check.cmake @@ -32,7 +32,7 @@ # On Windows we use the Windows subsystem for Linux and gcc and sed # installed in it, if available. SET(RUN_ABI_CHECK 0) -IF(LINUX AND MY_COMPILER_IS_GNU) +IF(LINUX AND MY_COMPILER_IS_GNU AND NOT CMAKE_SYSTEM_PROCESSOR STREQUAL "e2k") SET(RUN_ABI_CHECK 1) ELSEIF(WIN32) FIND_PROGRAM(WSL_EXECUTABLE wsl HINTS C:/Windows/Sysnative) diff --git a/extra/robin-hood-hashing/robin_hood.h b/extra/robin-hood-hashing/robin_hood.h index c92b96ad..67f25aeb 100644 --- a/extra/robin-hood-hashing/robin_hood.h +++ b/extra/robin-hood-hashing/robin_hood.h @@ -175,7 +175,7 @@ static Counts& counts() { #ifndef __has_cpp_attribute // For backwards compatibility # define __has_cpp_attribute(x) 0 #endif -#if __has_cpp_attribute(clang::fallthrough) +#if __has_cpp_attribute(clang::fallthrough) && !defined(__e2k__) # define ROBIN_HOOD_PRIVATE_DEFINITION_FALLTHROUGH() [[clang::fallthrough]] #elif __has_cpp_attribute(gnu::fallthrough) # define ROBIN_HOOD_PRIVATE_DEFINITION_FALLTHROUGH() [[gnu::fallthrough]] diff --git a/extra/zstd/zstd-1.5.0/lib/common/compiler.h b/extra/zstd/zstd-1.5.0/lib/common/compiler.h index a951d0ad..bc67d06a 100644 --- a/extra/zstd/zstd-1.5.0/lib/common/compiler.h +++ b/extra/zstd/zstd-1.5.0/lib/common/compiler.h @@ -151,7 +151,7 @@ /* vectorization * older GCC (pre gcc-4.3 picked as the cutoff) uses a different syntax */ -#if !defined(__INTEL_COMPILER) && !defined(__clang__) && defined(__GNUC__) +#if !defined(__INTEL_COMPILER) && !defined(__clang__) && defined(__GNUC__) && !defined(__e2k__) # if (__GNUC__ == 4 && __GNUC_MINOR__ > 3) || (__GNUC__ >= 5) # define DONT_VECTORIZE __attribute__((optimize("no-tree-vectorize"))) # else diff --git a/mysql-shell/modules/devapi/mod_mysqlx_collection_find.cc b/mysql-shell/modules/devapi/mod_mysqlx_collection_find.cc index d0347020..53466482 100644 --- a/mysql-shell/modules/devapi/mod_mysqlx_collection_find.cc +++ b/mysql-shell/modules/devapi/mod_mysqlx_collection_find.cc @@ -36,9 +36,15 @@ namespace mysqlsh { namespace mysqlx { using shcore::Value; +#ifdef __EDG__ +constexpr shcore::Value_type Array = shcore::Value_type::Array; +constexpr shcore::Value_type Object = shcore::Value_type::Object; +constexpr shcore::Value_type String = shcore::Value_type::String; +#else using shcore::Value_type::Array; using shcore::Value_type::Object; using shcore::Value_type::String; +#endif using std::placeholders::_1; REGISTER_HELP_CLASS(CollectionFind, mysqlx); diff --git a/mysql-shell/modules/devapi/mod_mysqlx_collection_modify.cc b/mysql-shell/modules/devapi/mod_mysqlx_collection_modify.cc index 9fb9875a..144a09d4 100644 --- a/mysql-shell/modules/devapi/mod_mysqlx_collection_modify.cc +++ b/mysql-shell/modules/devapi/mod_mysqlx_collection_modify.cc @@ -42,7 +42,11 @@ namespace mysqlsh { namespace mysqlx { using shcore::Value; +#ifdef __EDG__ +constexpr shcore::Value_type Array = shcore::Value_type::Array; +#else using shcore::Value_type::Array; +#endif using std::placeholders::_1; // Documentation of CollectionModify class diff --git a/mysql-shell/modules/devapi/mod_mysqlx_table_insert.cc b/mysql-shell/modules/devapi/mod_mysqlx_table_insert.cc index 01f621c4..9a39f97e 100644 --- a/mysql-shell/modules/devapi/mod_mysqlx_table_insert.cc +++ b/mysql-shell/modules/devapi/mod_mysqlx_table_insert.cc @@ -33,9 +33,15 @@ namespace mysqlsh { namespace mysqlx { using shcore::Value; +#ifdef __EDG__ +constexpr shcore::Value_type Array = shcore::Value_type::Array; +constexpr shcore::Value_type Map = shcore::Value_type::Map; +constexpr shcore::Value_type String = shcore::Value_type::String; +#else using shcore::Value_type::Array; using shcore::Value_type::Map; using shcore::Value_type::String; +#endif using std::placeholders::_1; REGISTER_HELP_CLASS(TableInsert, mysqlx); diff --git a/mysql-shell/mysqlshdk/include/scripting/types_cpp.h b/mysql-shell/mysqlshdk/include/scripting/types_cpp.h index 0da02a85..a5cd5bc3 100644 --- a/mysql-shell/mysqlshdk/include/scripting/types_cpp.h +++ b/mysql-shell/mysqlshdk/include/scripting/types_cpp.h @@ -1634,7 +1634,7 @@ class SHCORE_PUBLIC Cpp_object_bridge : public Object_bridge { _funcs.emplace( registered_name, std::shared_ptr( - new Cpp_function(&md, [&md, func = std::forward(func), + new Cpp_function(&md, [this, &md, func = std::forward(func), defs = std::make_tuple(std::move(defs)...)]( const shcore::Argument_list &args) { // Executes parameter validators @@ -1645,7 +1645,7 @@ class SHCORE_PUBLIC Cpp_object_bridge : public Object_bridge { md.signature[index]->validate(args[index], &context); } - return detail::Result_wrapper::call([&func, &args, &defs]() { + return detail::Result_wrapper::call([this, &func, &args, &defs]() { return call(func, args, defs, std::index_sequence_for{}); }); diff --git a/mysql-shell/mysqlshdk/libs/storage/backend/directory.cc b/mysql-shell/mysqlshdk/libs/storage/backend/directory.cc index ac06d7f1..ab4e4cd0 100644 --- a/mysql-shell/mysqlshdk/libs/storage/backend/directory.cc +++ b/mysql-shell/mysqlshdk/libs/storage/backend/directory.cc @@ -66,7 +66,7 @@ std::unordered_set Directory::filter_files( std::error_code ec; for (auto &entry : std::filesystem::directory_iterator(path, ec)) { - if (entry.is_regular_file() + if (std::filesystem::is_regular_file(entry.symlink_status())) { #if (__GNUC__ < 8 || (__GNUC__ == 8 && __GNUC_MINOR__ < 4)) && \ !defined(__clang__) // older versions of GCC do not handle filesystems which do not support @@ -84,7 +84,7 @@ std::unordered_set Directory::filter_files( if (pattern.empty() || shcore::match_glob(pattern, name)) { files.emplace(std::move(name), [entry = std::move(entry)]() { - return entry.file_size(); + return std::filesystem::file_size(entry.path()); }); } } diff --git a/router/src/mysql_protocol/include/mysqlrouter/classic_protocol_codec_base.h b/router/src/mysql_protocol/include/mysqlrouter/classic_protocol_codec_base.h index b376d921..a4c7ca93 100644 --- a/router/src/mysql_protocol/include/mysqlrouter/classic_protocol_codec_base.h +++ b/router/src/mysql_protocol/include/mysqlrouter/classic_protocol_codec_base.h @@ -347,6 +347,22 @@ class EncodeSizeAccumulator { * used by .size() and .encode() as both have to process the same * fields in the same order, just with different mappers */ +#ifdef __EDG__ +#define EncodeBase_EDG \ + private: \ + const capabilities::value_type __base; \ + public: \ + constexpr size_t size() const noexcept { \ + return accumulate_fields(impl::EncodeSizeAccumulator(__base)); \ + } \ + stdx::expected encode( \ + const net::mutable_buffer &buffer) const { \ + return accumulate_fields(impl::EncodeBufferAccumulator(buffer, __base)); \ + } \ + constexpr capabilities::value_type caps() const noexcept { return __base; } + +template class EncodeBase {}; +#else template class EncodeBase { public: @@ -368,6 +384,7 @@ class EncodeBase { private: const capabilities::value_type caps_; }; +#endif } // namespace impl } // namespace classic_protocol diff --git a/sql/containers/atomics_array.h b/sql/containers/atomics_array.h index 588fe986..1dd16139 100644 --- a/sql/containers/atomics_array.h +++ b/sql/containers/atomics_array.h @@ -256,7 +256,7 @@ class Atomics_array { friend std::ostream &operator<<(std::ostream &out, Atomics_array &in) { - out << in.to_string(true) << std::flush; + out << in.to_string() << std::flush; return out; } diff --git a/sql/containers/integrals_lockfree_queue.h b/sql/containers/integrals_lockfree_queue.h index 923d4362..663057d3 100644 --- a/sql/containers/integrals_lockfree_queue.h +++ b/sql/containers/integrals_lockfree_queue.h @@ -542,7 +542,7 @@ class Integrals_lockfree_queue { friend std::ostream &operator<<( std::ostream &out, Integrals_lockfree_queue const &in) { - out << in.to_string(true) << std::flush; + out << in.to_string() << std::flush; return out; } diff --git a/sql/mem_root_array.h b/sql/mem_root_array.h index bceaff70..59d9fccf 100644 --- a/sql/mem_root_array.h +++ b/sql/mem_root_array.h @@ -480,7 +480,7 @@ class Mem_root_array : public Mem_root_array_YY { : Mem_root_array(root, x.cbegin(), x.cend()) {} Mem_root_array(std::initializer_list elements) - : Mem_root_array(*THR_MALLOC, begin(elements), end(elements)) {} + : Mem_root_array(*THR_MALLOC, elements.begin(), elements.end()) {} ~Mem_root_array() { super::clear(); } diff --git a/sql/mysqld.cc b/sql/mysqld.cc index 32c0328a..81ed19ca 100644 --- a/sql/mysqld.cc +++ b/sql/mysqld.cc @@ -1537,7 +1537,7 @@ SHOW_COMP_OPTION have_statement_timeout = SHOW_OPTION_DISABLED; /* Thread specific variables */ -thread_local MEM_ROOT **THR_MALLOC = nullptr; +__thread MEM_ROOT **THR_MALLOC = nullptr; mysql_mutex_t LOCK_status, LOCK_uuid_generator, LOCK_crypt, LOCK_global_system_variables, LOCK_user_conn, LOCK_error_messages; diff --git a/sql/mysqld.h b/sql/mysqld.h index c6f9fcc5..7def3bac 100644 --- a/sql/mysqld.h +++ b/sql/mysqld.h @@ -416,7 +416,7 @@ extern bool migrate_connect_options; extern LEX_CSTRING sql_statement_names[(uint)SQLCOM_END + 1]; -extern thread_local MEM_ROOT **THR_MALLOC; +extern __thread MEM_ROOT **THR_MALLOC; extern PSI_file_key key_file_binlog_cache; extern PSI_file_key key_file_binlog_index_cache; diff --git a/sql/thr_malloc.h b/sql/thr_malloc.h index c3a3ed75..a4f49323 100644 --- a/sql/thr_malloc.h +++ b/sql/thr_malloc.h @@ -28,7 +28,7 @@ struct CHARSET_INFO; struct MEM_ROOT; typedef unsigned int PSI_memory_key; -extern thread_local MEM_ROOT **THR_MALLOC; +extern __thread MEM_ROOT **THR_MALLOC; void init_sql_alloc(PSI_memory_key key, MEM_ROOT *root, size_t block_size); diff --git a/storage/innobase/buf/checksum.cc b/storage/innobase/buf/checksum.cc index 8f8a7631..ef28838c 100644 --- a/storage/innobase/buf/checksum.cc +++ b/storage/innobase/buf/checksum.cc @@ -30,6 +30,8 @@ this program; if not, write to the Free Software Foundation, Inc., Created Aug 11, 2011 Vasil Dimov *******************************************************/ +#define EDG_THREAD_FIX + #include #include diff --git a/storage/innobase/include/os0thread.h b/storage/innobase/include/os0thread.h index f2371478..cc6e8ddc 100644 --- a/storage/innobase/include/os0thread.h +++ b/storage/innobase/include/os0thread.h @@ -69,8 +69,15 @@ using os_thread_id_t = std::thread::native_handle_type; namespace ut { /** The hash value of the current thread's id */ +#ifdef __EDG__ +extern const thread_local size_t this_thread_hash; +#ifdef EDG_THREAD_FIX +const thread_local size_t this_thread_hash = std::hash{}(std::this_thread::get_id()); +#endif +#else const inline thread_local size_t this_thread_hash = std::hash{}(std::this_thread::get_id()); +#endif } // namespace ut /** Returns the string representation of the thread ID supplied. It uses the diff --git a/storage/innobase/include/ut0rnd.h b/storage/innobase/include/ut0rnd.h index 5a8dd225..5f7fa7b6 100644 --- a/storage/innobase/include/ut0rnd.h +++ b/storage/innobase/include/ut0rnd.h @@ -107,7 +107,7 @@ on data written to disk. namespace detail { /** Seed value of ut::random_64() */ -extern thread_local uint64_t random_seed; +extern __thread uint64_t random_seed; /** A helper method, it is used by hash_binary_ib for backward compatibility. NOTE: Do not use this method, it produces results that are not hashed well. diff --git a/storage/innobase/ut/ut0rnd.cc b/storage/innobase/ut/ut0rnd.cc index 7f8ff347..1f003a66 100644 --- a/storage/innobase/ut/ut0rnd.cc +++ b/storage/innobase/ut/ut0rnd.cc @@ -35,7 +35,7 @@ this program; if not, write to the Free Software Foundation, Inc., namespace ut::detail { -thread_local uint64_t random_seed = 0; +__thread uint64_t random_seed = 0; /* This is a "precomputed" table of random hash values. */ alignas(ut::INNODB_CACHE_LINE_SIZE) diff --git a/unittest/gunit/fake_table.cc b/unittest/gunit/fake_table.cc index a7480360..26850d35 100644 --- a/unittest/gunit/fake_table.cc +++ b/unittest/gunit/fake_table.cc @@ -19,7 +19,14 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ +#ifdef __EDG__ +#include "sql/table.h" +class Fake_TABLE : public TABLE { + static int highest_table_id; +}; +#else #include "unittest/gunit/fake_table.h" +#endif // We choose non-zero to avoid it working by coincidence. int Fake_TABLE::highest_table_id = 5; diff --git a/unittest/gunit/gunit_test_main.cc b/unittest/gunit/gunit_test_main.cc index 7bcc21ce..7ce83fc7 100644 --- a/unittest/gunit/gunit_test_main.cc +++ b/unittest/gunit/gunit_test_main.cc @@ -121,7 +121,7 @@ static void init_signal_handling() { // Some globals needed for "small" tests. mysql_mutex_t LOCK_open; uint opt_debug_sync_timeout = 0; -thread_local MEM_ROOT **THR_MALLOC = nullptr; +__thread MEM_ROOT **THR_MALLOC = nullptr; thread_local THD *current_thd = nullptr; size_t malloc_chunk_size = 1024; diff --git a/unittest/gunit/gunit_test_main.h b/unittest/gunit/gunit_test_main.h index 2fe17ac4..2f0db81e 100644 --- a/unittest/gunit/gunit_test_main.h +++ b/unittest/gunit/gunit_test_main.h @@ -30,7 +30,7 @@ struct MEM_ROOT; extern mysql_mutex_t LOCK_open; extern uint opt_debug_sync_timeout; -extern thread_local MEM_ROOT **THR_MALLOC; +extern __thread MEM_ROOT **THR_MALLOC; extern thread_local THD *current_thd; extern size_t malloc_chunk_size; -- 2.34.1