diff options
author | CoprDistGit <infra@openeuler.org> | 2023-04-24 08:46:38 +0000 |
---|---|---|
committer | CoprDistGit <infra@openeuler.org> | 2023-04-24 08:46:38 +0000 |
commit | b4f1d771777090b4e09abd34c701c0cbb47cb0c9 (patch) | |
tree | 7d2e99b4b8a7f5ee49fcc0318a572d93d30d74ac | |
parent | 13a5c32b80e77cfc952fa466af74509e593873d7 (diff) |
automatic import of boost
-rw-r--r-- | boost-1.77-locale-remove-linking-with-boost-system.patch | 355 | ||||
-rw-r--r-- | boost-1.77-type_erasure-remove-boost-system-linkage.patch | 24 | ||||
-rw-r--r-- | boost-1.78-build-Don-t-skip-install-targets-if-there-s-build-no-in-ureqs.patch | 71 | ||||
-rw-r--r-- | boost-1.78-filesystem-Added-protection-for-CVE-2022-21658.patch | 330 | ||||
-rw-r--r-- | boost-1.78-filesystem-Use-O_NONBLOCK-instead-of-O_NDELAY.patch | 23 | ||||
-rw-r--r-- | boost-1.78-graph-Skip-performance-test.patch | 40 | ||||
-rw-r--r-- | boost-1.78-icl-Avoid-gcc-bugs.patch | 36 | ||||
-rw-r--r-- | boost-1.78-locale-Fix-access-to-first-element-of-empty-vector.patch | 33 | ||||
-rw-r--r-- | boost-1.78-pool-fix-integer-overflows-in-pool-ordered_malloc.patch | 179 | ||||
-rw-r--r-- | boost-1.78-python-Update-call_method-hpp.patch | 24 | ||||
-rw-r--r-- | boost.spec | 573 | ||||
-rw-r--r-- | boost_1_78_0-sw.patch | 1940 | ||||
-rw-r--r-- | boost_1_78_0.tar.gz | 1 | ||||
-rw-r--r-- | sources | 0 |
14 files changed, 3629 insertions, 0 deletions
diff --git a/boost-1.77-locale-remove-linking-with-boost-system.patch b/boost-1.77-locale-remove-linking-with-boost-system.patch new file mode 100644 index 0000000..a3ecde1 --- /dev/null +++ b/boost-1.77-locale-remove-linking-with-boost-system.patch @@ -0,0 +1,355 @@ +From aebac1401f9ddabb84c222481301d25beea1988d Mon Sep 17 00:00:00 2001 +From: Andrey Semashev <andrey.semashev@gmail.com> +Date: Mon, 14 Jan 2019 21:08:25 +0300 +Subject: [PATCH 1/2] Remove linking with Boost.System. + +Since Boost.System is header-only now, no need to link with the library. +--- + build/Jamfile.v2 | 3 --- + 1 file changed, 3 deletions(-) + +diff --git a/libs/locale/build/Jamfile.v2 b/libs/locale/build/Jamfile.v2 +index 578e722e..43ab0014 100644 +--- a/libs/locale/build/Jamfile.v2 ++++ b/libs/locale/build/Jamfile.v2 +@@ -382,9 +382,6 @@ rule configure-full ( properties * : flags-only ) + result += <source>util/gregorian.cpp ; + } + +- result += <library>../../system/build//boost_system ; +- +- + if "$(flags-only)" = "flags" + { + return $(flags-result) ; + +From b01aab1d28c9b32d107ae39c76c9af988420d476 Mon Sep 17 00:00:00 2001 +From: Andrey Semashev <andrey.semashev@gmail.com> +Date: Mon, 14 Jan 2019 21:10:38 +0300 +Subject: [PATCH 2/2] Trim trailing spaces. + +--- + build/Jamfile.v2 | 119 +++++++++++++++++++++++------------------------ + 1 file changed, 59 insertions(+), 60 deletions(-) + +diff --git a/libs/locale/build/Jamfile.v2 b/libs/locale/build/Jamfile.v2 +index 43ab0014..97dd68c7 100644 +--- a/libs/locale/build/Jamfile.v2 ++++ b/libs/locale/build/Jamfile.v2 +@@ -1,6 +1,6 @@ + # copyright John Maddock 2003, Artyom Beilis 2010 +-# Distributed under the Boost Software License, Version 1.0. +-# (See accompanying file LICENSE_1_0.txt or copy at ++# Distributed under the Boost Software License, Version 1.0. ++# (See accompanying file LICENSE_1_0.txt or copy at + # http://www.boost.org/LICENSE_1_0.txt. + + +@@ -32,11 +32,11 @@ explicit has_iconv ; + + ICONV_PATH = [ modules.peek : ICONV_PATH ] ; + +-lib iconv +- : ++lib iconv ++ : + : <search>$(ICONV_PATH)/lib <link>shared <runtime-link>shared + : +- : <include>$(ICONV_PATH)/include ++ : <include>$(ICONV_PATH)/include + ; + + explicit iconv ; +@@ -45,8 +45,8 @@ obj has_iconv_libc_ext : ../build/has_iconv.cpp iconv ; + exe has_external_iconv : has_iconv_libc_ext iconv ; + explicit has_external_iconv ; + +-exe accepts_shared_option : ../build/option.cpp +- : <cxxflags>-shared-libstdc++ ++exe accepts_shared_option : ../build/option.cpp ++ : <cxxflags>-shared-libstdc++ + <cxxflags>-shared-libgcc + <linkflags>-shared-libstdc++ + <linkflags>-shared-libgcc +@@ -71,8 +71,8 @@ if $(ICU_LINK) + else + { + searched-lib icuuc : : <name>icuuc +- <search>$(ICU_PATH)/lib +- <link>shared ++ <search>$(ICU_PATH)/lib ++ <link>shared + <runtime-link>shared ; + + searched-lib icuuc : : <toolset>msvc +@@ -120,9 +120,9 @@ else + + explicit icuuc icudt icuin ; + +- ICU_OPTS = <include>$(ICU_PATH)/include +- <library>icuuc/<link>shared/<runtime-link>shared +- <library>icudt/<link>shared/<runtime-link>shared ++ ICU_OPTS = <include>$(ICU_PATH)/include ++ <library>icuuc/<link>shared/<runtime-link>shared ++ <library>icudt/<link>shared/<runtime-link>shared + <library>icuin/<link>shared/<runtime-link>shared + <dll-path>$(ICU_PATH)/bin + <runtime-link>shared ; +@@ -130,8 +130,8 @@ else + + + searched-lib icuuc_64 : : <name>icuuc +- <search>$(ICU_PATH)/lib64 +- <link>shared ++ <search>$(ICU_PATH)/lib64 ++ <link>shared + <runtime-link>shared ; + + searched-lib icuuc_64 : : <toolset>msvc +@@ -179,14 +179,14 @@ else + + explicit icuuc_64 icudt_64 icuin_64 ; + +- ICU64_OPTS = <include>$(ICU_PATH)/include +- <library>icuuc_64/<link>shared/<runtime-link>shared +- <library>icudt_64/<link>shared/<runtime-link>shared ++ ICU64_OPTS = <include>$(ICU_PATH)/include ++ <library>icuuc_64/<link>shared/<runtime-link>shared ++ <library>icudt_64/<link>shared/<runtime-link>shared + <library>icuin_64/<link>shared/<runtime-link>shared + <dll-path>$(ICU_PATH)/bin64 + <runtime-link>shared ; +- +- ++ ++ + } + + obj has_icu_obj : ../build/has_icu_test.cpp : $(ICU_OPTS) ; +@@ -206,11 +206,11 @@ rule configure-full ( properties * : flags-only ) + + local result ; + local flags-result ; +- ++ + local found-iconv ; +- ++ + if <boost.locale.iconv>on in $(properties) +- || ! <boost.locale.iconv> in $(properties:G) ++ || ! <boost.locale.iconv> in $(properties:G) + && ! <target-os>solaris in $(properties) + { + # See if iconv is bundled with standard library. +@@ -218,7 +218,7 @@ rule configure-full ( properties * : flags-only ) + { + found-iconv = true ; + } +- else ++ else + { + if [ configure.builds has_external_iconv : $(properties) : "iconv (separate)" ] + { +@@ -226,8 +226,8 @@ rule configure-full ( properties * : flags-only ) + result += <library>iconv ; + } + } +- } +- if $(found-iconv) ++ } ++ if $(found-iconv) + { + flags-result += <define>BOOST_LOCALE_WITH_ICONV=1 ; + } +@@ -249,7 +249,7 @@ rule configure-full ( properties * : flags-only ) + + if $(found-icu) + { +- ICU_SOURCES = ++ ICU_SOURCES = + boundary + codecvt + collator +@@ -260,20 +260,20 @@ rule configure-full ( properties * : flags-only ) + numeric + time_zone + ; +- +- result += <source>icu/$(ICU_SOURCES).cpp +- <library>../../thread/build//boost_thread ++ ++ result += <source>icu/$(ICU_SOURCES).cpp ++ <library>../../thread/build//boost_thread + ; + } + + } +- +- if ! $(found-iconv) && ! $(found-icu) && ! <target-os>windows in $(properties) && ! <target-os>cygwin in $(properties) ++ ++ if ! $(found-iconv) && ! $(found-icu) && ! <target-os>windows in $(properties) && ! <target-os>cygwin in $(properties) + { + ECHO "- Boost.Locale needs either iconv or ICU library to be built." ; + result += <build>no ; + } +- ++ + if ! <boost.locale.std> in $(properties:G) + { + if <toolset>sun in $(properties) +@@ -283,9 +283,9 @@ rule configure-full ( properties * : flags-only ) + else + { + properties += <boost.locale.std>on ; +- } ++ } + } +- ++ + if <boost.locale.std>off in $(properties) + { + flags-result += <define>BOOST_LOCALE_NO_STD_BACKEND=1 ; +@@ -301,38 +301,38 @@ rule configure-full ( properties * : flags-only ) + ; + result += <source>std/$(STD_SOURCES).cpp ; + } +- ++ + if ! <boost.locale.winapi> in $(properties:G) + { +- if <target-os>windows in $(properties) ++ if <target-os>windows in $(properties) + || <target-os>cygwin in $(properties) + { + properties += <boost.locale.winapi>on ; +- } ++ } + else + { + properties += <boost.locale.winapi>off ; +- } ++ } + } +- if <target-os>windows in $(properties) +- && <toolset>gcc in $(properties) ++ if <target-os>windows in $(properties) ++ && <toolset>gcc in $(properties) + && <link>shared in $(properties) + && [ configure.builds accepts_shared_option : $(properties) : "g++ -shared-* supported" ] + { +- flags-result += <cxxflags>-shared-libstdc++ ++ flags-result += <cxxflags>-shared-libstdc++ + <cxxflags>-shared-libgcc + <linkflags>-shared-libstdc++ + <linkflags>-shared-libgcc + ; + } +- ++ + if <boost.locale.winapi>off in $(properties) + { + flags-result += <define>BOOST_LOCALE_NO_WINAPI_BACKEND=1 ; + } + else + { +- WINAPI_SOURCES = ++ WINAPI_SOURCES = + collate + converter + numeric +@@ -340,34 +340,34 @@ rule configure-full ( properties * : flags-only ) + ; + result += <source>win32/$(WINAPI_SOURCES).cpp ; + } +- ++ + if ( ! <boost.locale.winapi>off in $(properties) || ! <boost.locale.std>off in $(properties) ) + && ( <target-os>windows in $(properties) || <target-os>cygwin in $(properties) ) + { + result += <source>win32/lcid.cpp ; + } +- ++ + if ! <boost.locale.posix> in $(properties:G) + { +- if <target-os>linux in $(properties) +- || <target-os>darwin in $(properties) ++ if <target-os>linux in $(properties) ++ || <target-os>darwin in $(properties) + || ( <target-os>freebsd in $(properties) && [ configure.builds has_xlocale : $(properties) : "xlocale supported" ] ) + { + properties += <boost.locale.posix>on ; + } + else + { +- properties += <boost.locale.posix>off ; +- } ++ properties += <boost.locale.posix>off ; ++ } + } +- ++ + if <boost.locale.posix>off in $(properties) + { +- flags-result += <define>BOOST_LOCALE_NO_POSIX_BACKEND=1 ; ++ flags-result += <define>BOOST_LOCALE_NO_POSIX_BACKEND=1 ; + } + else + { +- POSIX_SOURCES = ++ POSIX_SOURCES = + collate + converter + numeric +@@ -381,12 +381,13 @@ rule configure-full ( properties * : flags-only ) + { + result += <source>util/gregorian.cpp ; + } +- +- if "$(flags-only)" = "flags" ++ ++ if "$(flags-only)" = "flags" + { + return $(flags-result) ; + } +- else { ++ else ++ { + result += $(flags-result) ; + return $(result) ; + } +@@ -396,7 +397,6 @@ rule configure ( properties * ) + { + local result = [ configure-full $(properties) : "all" ] ; + return $(result) ; +- + } + + rule configure-flags ( properties * ) +@@ -404,15 +404,14 @@ rule configure-flags ( properties * ) + local result ; + result = [ configure-full $(properties) : "flags" ] ; + return $(result) ; +- + } + + + alias build_options : : : : <conditional>@configure ; + alias build_flags : : : : <conditional>@configure-flags ; + +-lib boost_locale +- : ++lib boost_locale ++ : + encoding/codepage.cpp + shared/date_time.cpp + shared/format.cpp +@@ -425,7 +424,7 @@ lib boost_locale + util/codecvt_converter.cpp + util/default_locale.cpp + util/info.cpp +- util/locale_data.cpp ++ util/locale_data.cpp + : + # Don't link explicitly, not required + <define>BOOST_THREAD_NO_LIB=1 diff --git a/boost-1.77-type_erasure-remove-boost-system-linkage.patch b/boost-1.77-type_erasure-remove-boost-system-linkage.patch new file mode 100644 index 0000000..2236d56 --- /dev/null +++ b/boost-1.77-type_erasure-remove-boost-system-linkage.patch @@ -0,0 +1,24 @@ +From d96af5c5060f02d35a70f57d971b539258279634 Mon Sep 17 00:00:00 2001 +From: sdlzx <hdu_sdlzx@163.com> +Date: Tue, 5 Oct 2021 17:14:02 +0800 +Subject: [PATCH] Remove boost.system linkage + +--- + libs/type_erasure/build/Jamfile.v2 | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/libs/type_erasure/build/Jamfile.v2 b/libs/type_erasure/build/Jamfile.v2 +index 2408e6bd8..3a77b5e57 100644 +--- a/libs/type_erasure/build/Jamfile.v2 ++++ b/libs/type_erasure/build/Jamfile.v2 +@@ -12,6 +12,6 @@ project /boost/type_erasure + : usage-requirements <link>shared:<define>BOOST_TYPE_ERASURE_DYN_LINK + ; + +-lib boost_type_erasure : dynamic_binding.cpp /boost//thread /boost//system ; ++lib boost_type_erasure : dynamic_binding.cpp /boost//thread ; + + boost-install boost_type_erasure ; +-- +2.31.1 + diff --git a/boost-1.78-build-Don-t-skip-install-targets-if-there-s-build-no-in-ureqs.patch b/boost-1.78-build-Don-t-skip-install-targets-if-there-s-build-no-in-ureqs.patch new file mode 100644 index 0000000..ca4e6ba --- /dev/null +++ b/boost-1.78-build-Don-t-skip-install-targets-if-there-s-build-no-in-ureqs.patch @@ -0,0 +1,71 @@ +From 62e7321669f66a90e2a90c8f31af34f59ebc5d7a Mon Sep 17 00:00:00 2001 +From: Dmitry Arkhipov <grisumbras@gmail.com> +Date: Thu, 9 Dec 2021 08:11:57 +0300 +Subject: [PATCH] Don't skip install targets if there's <build>no in ureqs + +--- + tools/build/src/tools/stage.jam | 4 ++++ + tools/build/test/install_build_no.py | 26 ++++++++++++++++++++++++++ + tools/build/test/test_all.py | 1 + + 3 files changed, 31 insertions(+) + create mode 100755 test/install_build_no.py + +diff --git a/tools/build/src/tools/stage.jam b/tools/build/src/tools/stage.jam +index c5f02e3ba4..325129dc81 100644 +--- a/tools/build/src/tools/stage.jam ++++ b/tools/build/src/tools/stage.jam +@@ -478,6 +478,10 @@ class install-target-class : basic-target + return [ sequence.unique $(result2) ] ; + } + ++ rule skip-from-usage-requirements ( ) ++ { ++ } ++ + # Returns true iff 'type' is subtype of some element of 'types-to-include'. + # + local rule include-type ( type : types-to-include * ) +diff --git a/tools/build/test/install_build_no.py b/tools/build/test/install_build_no.py +new file mode 100755 +index 0000000000..0ccf3c5cc6 +--- /dev/null ++++ b/tools/build/test/install_build_no.py +@@ -0,0 +1,26 @@ ++#!/usr/bin/python ++ ++# Copyright 2021 Dmitry Arkhipov (grisumbras@gmail.com) ++# Distributed under the Boost Software License, Version 1.0. ++# (See accompanying file LICENSE.txt or https://www.bfgroup.xyz/b2/LICENSE.txt) ++ ++# Check that <build>no in usage-requirements of dependencies does not affect ++# install rule, i.e. a skipped installed target does not affect insallation of ++# other targets. ++ ++import BoostBuild ++ ++t = BoostBuild.Tester() ++ ++t.write("a.cpp", "int main() {}\n") ++ ++t.write("jamroot.jam", """ ++make x : : maker : <build>no ; ++exe a : a.cpp ; ++install install : x a ; ++""") ++ ++t.run_build_system() ++t.expect_addition("install/a.exe") ++ ++t.cleanup() +diff --git a/tools/build/test/test_all.py b/tools/build/test/test_all.py +index b7ef5ad701..9ed729d017 100644 +--- a/tools/build/test/test_all.py ++++ b/tools/build/test/test_all.py +@@ -250,6 +250,7 @@ def reorder_tests(tests, first_test): + "inherit_toolset", + "inherited_dependency", + "inline", ++ "install_build_no", + "libjpeg", + "liblzma", + "libpng", diff --git a/boost-1.78-filesystem-Added-protection-for-CVE-2022-21658.patch b/boost-1.78-filesystem-Added-protection-for-CVE-2022-21658.patch new file mode 100644 index 0000000..b306a5c --- /dev/null +++ b/boost-1.78-filesystem-Added-protection-for-CVE-2022-21658.patch @@ -0,0 +1,330 @@ +From 41d076ace558cfae01e233f9746dc955dcf78dba Mon Sep 17 00:00:00 2001 +From: Andrey Semashev <andrey.semashev@gmail.com> +Date: Sun, 30 Jan 2022 23:41:06 +0300 +Subject: [PATCH] Added protection for CVE-2022-21658 in remove_all on POSIX + systems. + +Another process could replace the directory being processed by remove_all +with a symlink after remove_all called symlink_status but before +it creates a directory iterator. As a result, remove_all would remove +the linked directory contents instead of removing the symlink. + +On POSIX systems that support fdopendir and O_NOFOLLOW flag for open(2), +this can be prevented by opening the directory with O_NOFOLLOW before +iterating. This will fail if the directory was replaced with a symlink. + +No protection on other systems. + +Reported in https://github.com/boostorg/filesystem/issues/224. +--- + libs/filesystem/CMakeLists.txt | 4 ++ + libs/filesystem/build/Jamfile.v2 | 1 + + libs/filesystem/config/Jamfile.v2 | 2 + + libs/filesystem/config/has_fdopendir_nofollow.cpp | 20 ++++++ + boost/filesystem/directory.hpp | 3 +- + libs/filesystem/src/directory.cpp | 53 ++++++++++++++-- + libs/filesystem/src/operations.cpp | 86 ++++++++++++++++---------- + 7 files changed, 131 insertions(+), 38 deletions(-) + create mode 100644 config/has_fdopendir_nofollow.cpp + +diff --git a/libs/filesystem/CMakeLists.txt b/libs/filesystem/CMakeLists.txt +index 5a8678309..37ef7e161 100644 +--- a/libs/filesystem/CMakeLists.txt ++++ b/libs/filesystem/CMakeLists.txt +@@ -59,6 +59,7 @@ if(NOT BOOST_FILESYSTEM_DISABLE_STATX) + check_cxx_source_compiles("#include <${CMAKE_CURRENT_SOURCE_DIR}/config/has_statx_syscall.cpp>" BOOST_FILESYSTEM_HAS_STATX_SYSCALL) + endif() + endif() ++check_cxx_source_compiles("#include <${CMAKE_CURRENT_SOURCE_DIR}/config/has_fdopendir_nofollow.cpp>" BOOST_FILESYSTEM_HAS_FDOPENDIR_NOFOLLOW) + if(WIN32 AND NOT BOOST_FILESYSTEM_DISABLE_BCRYPT) + set(CMAKE_REQUIRED_LIBRARIES bcrypt) + check_cxx_source_compiles("#include <${CMAKE_CURRENT_SOURCE_DIR}/config/has_bcrypt.cpp>" BOOST_FILESYSTEM_HAS_BCRYPT) +@@ -170,6 +171,9 @@ endif() + if(BOOST_FILESYSTEM_HAS_STATX_SYSCALL) + target_compile_definitions(boost_filesystem PRIVATE BOOST_FILESYSTEM_HAS_STATX_SYSCALL) + endif() ++if(BOOST_FILESYSTEM_HAS_FDOPENDIR_NOFOLLOW) ++ target_compile_definitions(boost_filesystem PRIVATE BOOST_FILESYSTEM_HAS_FDOPENDIR_NOFOLLOW) ++endif() + + target_link_libraries(boost_filesystem + PUBLIC +diff --git a/libs/filesystem/build/Jamfile.v2 b/libs/filesystem/build/Jamfile.v2 +index 6ab58ddb8..02e3b8971 100644 +--- a/libs/filesystem/build/Jamfile.v2 ++++ b/libs/filesystem/build/Jamfile.v2 +@@ -112,6 +112,7 @@ project boost/filesystem + [ check-target-builds ../config//has_stat_st_birthtim "has stat::st_birthtim" : <define>BOOST_FILESYSTEM_HAS_STAT_ST_BIRTHTIM ] + [ check-target-builds ../config//has_stat_st_birthtimensec "has stat::st_birthtimensec" : <define>BOOST_FILESYSTEM_HAS_STAT_ST_BIRTHTIMENSEC ] + [ check-target-builds ../config//has_stat_st_birthtimespec "has stat::st_birthtimespec" : <define>BOOST_FILESYSTEM_HAS_STAT_ST_BIRTHTIMESPEC ] ++ [ check-target-builds ../config//has_fdopendir_nofollow "has fdopendir(O_NOFOLLOW)" : <define>BOOST_FILESYSTEM_HAS_FDOPENDIR_NOFOLLOW ] + <conditional>@check-statx + <conditional>@select-windows-crypto-api + <conditional>@check-cxx20-atomic-ref +diff --git a/libs/filesystem/config/Jamfile.v2 b/libs/filesystem/config/Jamfile.v2 +index 2e9ee4bd6..5ea7dc6c7 100644 +--- a/libs/filesystem/config/Jamfile.v2 ++++ b/libs/filesystem/config/Jamfile.v2 +@@ -27,6 +27,8 @@ obj has_stat_st_birthtimensec : has_stat_st_birthtimensec.cpp : <include>../src + explicit has_stat_st_birthtimensec ; + obj has_stat_st_birthtimespec : has_stat_st_birthtimespec.cpp : <include>../src ; + explicit has_stat_st_birthtimespec ; ++obj has_fdopendir_nofollow : has_fdopendir_nofollow.cpp : <include>../src ; ++explicit has_fdopendir_nofollow ; + + lib bcrypt ; + explicit bcrypt ; +diff --git a/libs/filesystem/config/has_fdopendir_nofollow.cpp b/libs/filesystem/config/has_fdopendir_nofollow.cpp +new file mode 100644 +index 000000000..009a73084 +--- /dev/null ++++ b/libs/filesystem/config/has_fdopendir_nofollow.cpp +@@ -0,0 +1,20 @@ ++// Copyright 2022 Andrey Semashev ++ ++// Distributed under the Boost Software License, Version 1.0. ++// See http://www.boost.org/LICENSE_1_0.txt ++ ++// See library home page at http://www.boost.org/libs/filesystem ++ ++#include "platform_config.hpp" ++ ++#include <sys/types.h> ++#include <sys/stat.h> ++#include <dirent.h> ++#include <fcntl.h> ++ ++int main() ++{ ++ int fd = open(".", O_DIRECTORY | O_RDONLY | O_NOFOLLOW); ++ DIR* dir = fdopendir(fd); ++ return dir != 0; ++} +diff --git a/boost/filesystem/directory.hpp b/boost/filesystem/directory.hpp +index f487633fc..fa1e69be5 100644 +--- a/boost/filesystem/directory.hpp ++++ b/boost/filesystem/directory.hpp +@@ -247,7 +247,8 @@ BOOST_SCOPED_ENUM_UT_DECLARE_BEGIN(directory_options, unsigned int) + skip_dangling_symlinks = 1u << 2, // non-standard extension for recursive_directory_iterator: don't follow dangling directory symlinks, + pop_on_error = 1u << 3, // non-standard extension for recursive_directory_iterator: instead of producing an end iterator on errors, + // repeatedly invoke pop() until it succeeds or the iterator becomes equal to end iterator +- _detail_no_push = 1u << 4 // internal use only ++ _detail_no_follow = 1u << 4, // internal use only ++ _detail_no_push = 1u << 5 // internal use only + } + BOOST_SCOPED_ENUM_DECLARE_END(directory_options) + +diff --git a/libs/filesystem/src/directory.cpp b/libs/filesystem/src/directory.cpp +index 554277580..8b41ae5e1 100644 +--- a/libs/filesystem/src/directory.cpp ++++ b/libs/filesystem/src/directory.cpp +@@ -2,7 +2,7 @@ + + // Copyright 2002-2009, 2014 Beman Dawes + // Copyright 2001 Dietmar Kuehl +-// Copyright 2019 Andrey Semashev ++// Copyright 2019, 2022 Andrey Semashev + + // Distributed under the Boost Software License, Version 1.0. + // See http://www.boost.org/LICENSE_1_0.txt +@@ -33,6 +33,8 @@ + + #ifdef BOOST_POSIX_API + ++#include <sys/types.h> ++#include <sys/stat.h> + #include <dirent.h> + #include <unistd.h> + #include <fcntl.h> +@@ -47,6 +49,14 @@ + #define BOOST_FILESYSTEM_USE_READDIR_R + #endif + ++// At least Mac OS X 10.6 and older doesn't support O_CLOEXEC ++#ifndef O_CLOEXEC ++#define O_CLOEXEC 0 ++#define BOOST_FILESYSTEM_NO_O_CLOEXEC ++#endif ++ ++#include "posix_tools.hpp" ++ + #else // BOOST_WINDOWS_API + + #include <cwchar> +@@ -206,13 +216,46 @@ inline std::size_t path_max() + + #endif // BOOST_FILESYSTEM_USE_READDIR_R + +-error_code dir_itr_first(void*& handle, void*& buffer, const char* dir, std::string& target, fs::file_status&, fs::file_status&) ++error_code dir_itr_first(void*& handle, void*& buffer, const char* dir, std::string& target, unsigned int opts, fs::file_status&, fs::file_status&) + { +- if ((handle = ::opendir(dir)) == 0) ++#if defined(BOOST_FILESYSTEM_HAS_FDOPENDIR_NOFOLLOW) ++ int flags = O_DIRECTORY | O_RDONLY | O_NDELAY | O_CLOEXEC; ++ if ((opts & static_cast< unsigned int >(directory_options::_detail_no_follow)) != 0u) ++ flags |= O_NOFOLLOW; ++ ++ int fd = ::open(dir, flags); ++ if (BOOST_UNLIKELY(fd < 0)) ++ { ++ const int err = errno; ++ return error_code(err, system_category()); ++ } ++ ++#if defined(BOOST_FILESYSTEM_NO_O_CLOEXEC) && defined(FD_CLOEXEC) ++ int res = ::fcntl(fd, F_SETFD, FD_CLOEXEC); ++ if (BOOST_UNLIKELY(res < 0)) ++ { ++ const int err = errno; ++ close_fd(fd); ++ return error_code(err, system_category()); ++ } ++#endif ++ ++ handle = ::fdopendir(fd); ++ if (BOOST_UNLIKELY(!handle)) + { + const int err = errno; ++ close_fd(fd); + return error_code(err, system_category()); + } ++#else // defined(BOOST_FILESYSTEM_HAS_FDOPENDIR_NOFOLLOW) ++ handle = ::opendir(dir); ++ if (BOOST_UNLIKELY(!handle)) ++ { ++ const int err = errno; ++ return error_code(err, system_category()); ++ } ++#endif // defined(BOOST_FILESYSTEM_HAS_FDOPENDIR_NOFOLLOW) ++ + target.assign("."); // string was static but caused trouble + // when iteration called from dtor, after + // static had already been destroyed +@@ -342,7 +385,7 @@ error_code dir_itr_increment(void*& handle, void*& buffer, std::string& target, + + #else // BOOST_WINDOWS_API + +-error_code dir_itr_first(void*& handle, fs::path const& dir, std::wstring& target, fs::file_status& sf, fs::file_status& symlink_sf) ++error_code dir_itr_first(void*& handle, fs::path const& dir, std::wstring& target, unsigned int opts, fs::file_status& sf, fs::file_status& symlink_sf) + // Note: an empty root directory has no "." or ".." entries, so this + // causes a ERROR_FILE_NOT_FOUND error which we do not considered an + // error. It is treated as eof instead. +@@ -512,7 +555,7 @@ void directory_iterator_construct(directory_iterator& it, path const& p, unsigne + #if defined(BOOST_POSIX_API) + imp->buffer, + #endif +- p.c_str(), filename, file_stat, symlink_file_stat); ++ p.c_str(), filename, opts, file_stat, symlink_file_stat); + + if (result) + { +diff --git a/libs/filesystem/src/operations.cpp b/libs/filesystem/src/operations.cpp +index e14b598b7..bf42105b9 100644 +--- a/libs/filesystem/src/operations.cpp ++++ b/libs/filesystem/src/operations.cpp +@@ -945,51 +945,73 @@ inline bool remove_impl(path const& p, error_code* ec) + //! remove_all() implementation + uintmax_t remove_all_impl(path const& p, error_code* ec) + { +- fs::file_type type; ++ for (unsigned int attempt = 0u; attempt < 5u; ++attempt) + { +- error_code local_ec; +- type = fs::detail::symlink_status(p, &local_ec).type(); ++ fs::file_type type; ++ { ++ error_code local_ec; ++ type = fs::detail::symlink_status(p, &local_ec).type(); + +- if (type == fs::file_not_found) +- return 0u; ++ if (type == fs::file_not_found) ++ return 0u; + +- if (BOOST_UNLIKELY(type == fs::status_error)) +- { +- if (!ec) +- BOOST_FILESYSTEM_THROW(filesystem_error("boost::filesystem::remove_all", p, local_ec)); ++ if (BOOST_UNLIKELY(type == fs::status_error)) ++ { ++ if (!ec) ++ BOOST_FILESYSTEM_THROW(filesystem_error("boost::filesystem::remove_all", p, local_ec)); + +- *ec = local_ec; +- return static_cast< uintmax_t >(-1); ++ *ec = local_ec; ++ return static_cast< uintmax_t >(-1); ++ } + } +- } + +- uintmax_t count = 0u; ++ uintmax_t count = 0u; + +- if (type == fs::directory_file) // but not a directory symlink +- { +- fs::directory_iterator itr; +- fs::detail::directory_iterator_construct(itr, p, static_cast< unsigned int >(directory_options::none), ec); +- if (ec && *ec) +- return static_cast< uintmax_t >(-1); +- +- const fs::directory_iterator end_dit; +- while (itr != end_dit) ++ if (type == fs::directory_file) // but not a directory symlink + { +- count += fs::detail::remove_all_impl(itr->path(), ec); +- if (ec && *ec) +- return static_cast< uintmax_t >(-1); ++ fs::directory_iterator itr; ++ error_code local_ec; ++ fs::detail::directory_iterator_construct(itr, p, static_cast< unsigned int >(directory_options::_detail_no_follow), &local_ec); ++ if (BOOST_UNLIKELY(!!local_ec)) ++ { ++#if defined(BOOST_FILESYSTEM_HAS_FDOPENDIR_NOFOLLOW) ++ // If open(2) with O_NOFOLLOW fails with ELOOP, this means that either the path contains a loop ++ // of symbolic links, or the last element of the path is a symbolic link. Given that lstat(2) above ++ // did not fail, most likely it is the latter case. I.e. between the lstat above and this open call ++ // the filesystem was modified so that the path no longer refers to a directory file (as opposed to a symlink). ++ if (local_ec == error_code(ELOOP, system_category())) ++ continue; ++#endif // defined(BOOST_FILESYSTEM_HAS_FDOPENDIR_NOFOLLOW) + +- fs::detail::directory_iterator_increment(itr, ec); +- if (ec && *ec) ++ if (!ec) ++ BOOST_FILESYSTEM_THROW(filesystem_error("boost::filesystem::remove_all", p, local_ec)); ++ ++ *ec = local_ec; + return static_cast< uintmax_t >(-1); ++ } ++ ++ const fs::directory_iterator end_dit; ++ while (itr != end_dit) ++ { ++ count += fs::detail::remove_all_impl(itr->path(), ec); ++ if (ec && *ec) ++ return static_cast< uintmax_t >(-1); ++ ++ fs::detail::directory_iterator_increment(itr, ec); ++ if (ec && *ec) ++ return static_cast< uintmax_t >(-1); ++ } + } +- } + +- count += fs::detail::remove_impl(p, type, ec); +- if (ec && *ec) +- return static_cast< uintmax_t >(-1); ++ count += fs::detail::remove_impl(p, type, ec); ++ if (ec && *ec) ++ return static_cast< uintmax_t >(-1); + +- return count; ++ return count; ++ } ++ ++ emit_error(ELOOP, p, ec, "boost::filesystem::remove_all: path cannot be opened as a directory"); ++ return static_cast< uintmax_t >(-1); + } + + #else // defined(BOOST_POSIX_API) diff --git a/boost-1.78-filesystem-Use-O_NONBLOCK-instead-of-O_NDELAY.patch b/boost-1.78-filesystem-Use-O_NONBLOCK-instead-of-O_NDELAY.patch new file mode 100644 index 0000000..f722b15 --- /dev/null +++ b/boost-1.78-filesystem-Use-O_NONBLOCK-instead-of-O_NDELAY.patch @@ -0,0 +1,23 @@ +From dbec3baaadf7d899e66aa90843d285e749e88b2d Mon Sep 17 00:00:00 2001 +From: Andrey Semashev <andrey.semashev@gmail.com> +Date: Thu, 3 Feb 2022 20:58:42 +0300 +Subject: [PATCH] Use O_NONBLOCK instead of O_NDELAY as it is the flag defined + by POSIX. + +--- + libs/filesystem/src/directory.cpp | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/libs/filesystem/src/directory.cpp b/libs/filesystem/src/directory.cpp +index 8b41ae5e1..dd2f9413b 100644 +--- a/libs/filesystem/src/directory.cpp ++++ b/libs/filesystem/src/directory.cpp +@@ -219,7 +219,7 @@ inline std::size_t path_max() + error_code dir_itr_first(void*& handle, void*& buffer, const char* dir, std::string& target, unsigned int opts, fs::file_status&, fs::file_status&) + { + #if defined(BOOST_FILESYSTEM_HAS_FDOPENDIR_NOFOLLOW) +- int flags = O_DIRECTORY | O_RDONLY | O_NDELAY | O_CLOEXEC; ++ int flags = O_DIRECTORY | O_RDONLY | O_NONBLOCK | O_CLOEXEC; + if ((opts & static_cast< unsigned int >(directory_options::_detail_no_follow)) != 0u) + flags |= O_NOFOLLOW; + diff --git a/boost-1.78-graph-Skip-performance-test.patch b/boost-1.78-graph-Skip-performance-test.patch new file mode 100644 index 0000000..e66402b --- /dev/null +++ b/boost-1.78-graph-Skip-performance-test.patch @@ -0,0 +1,40 @@ +From d65e2888de8097f28453b92fdd1770805c0f4063 Mon Sep 17 00:00:00 2001 +From: Liu Zixian <liuzixian4@huawei.com> +Date: Mon, 12 Dec 2022 12:36:42 +0800 +Subject: [PATCH] Skip performance test + +Performance test in CI does not make sense. + +On x86-64, this test caused a float point exception, +for the test data is too weak to generate an execution time +larger than the timer precision. + +[ 298s] ====== BEGIN OUTPUT ====== +[ 298s] Generating graph...10000 vertices, 100000 edges. +[ 298s] Running Dijkstra's with binary heap... 0.003279s wall, 0.000000s user + 0.000000s system = 0.000000s CPU (n/a%) +[ 298s] seconds. +[ 298s] Running Dijkstra's with d-ary heap (d=4)... +[ 298s] EXIT STATUS: 136 +[ 298s] ====== END OUTPUT ====== + +Signed-off-by: Liu Zixian <liuzixian4@huawei.com> +--- + libs/graph/test/Jamfile.v2 | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/libs/graph/test/Jamfile.v2 b/libs/graph/test/Jamfile.v2 +index a0c15ca7b..a6273b659 100644 +--- a/libs/graph/test/Jamfile.v2 ++++ b/libs/graph/test/Jamfile.v2 +@@ -47,7 +47,7 @@ alias graph_test_regular : + [ run undirected_dfs.cpp ] + [ compile dfs_cc.cpp ] + [ compile dijkstra_cc.cpp ] +- [ run dijkstra_heap_performance.cpp /boost/timer//boost_timer : 10000 ] ++ # [ run dijkstra_heap_performance.cpp /boost/timer//boost_timer : 10000 ] + [ run dijkstra_no_color_map_compare.cpp : 10000 ] + [ run disjoint_set_test.cpp ] + [ run dominator_tree_test.cpp ] +-- +2.33.0 + diff --git a/boost-1.78-icl-Avoid-gcc-bugs.patch b/boost-1.78-icl-Avoid-gcc-bugs.patch new file mode 100644 index 0000000..a9ba455 --- /dev/null +++ b/boost-1.78-icl-Avoid-gcc-bugs.patch @@ -0,0 +1,36 @@ +From 1d176e542576e7e584eccd3e2badca33231768c1 Mon Sep 17 00:00:00 2001 +From: Liu Zixian <liuzixian4@huawei.com> +Date: Mon, 12 Dec 2022 20:12:26 +0800 +Subject: [PATCH] Avoid gcc bugs + +This testcase triggers a gcc optimization bug. +See https://gitee.com/src-openeuler/gcc/issues/I65UF9 + +Signed-off-by: Liu Zixian <liuzixian4@huawei.com> +--- + libs/icl/test/fix_tickets_/fix_tickets.cpp | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/libs/icl/test/fix_tickets_/fix_tickets.cpp b/libs/icl/test/fix_tickets_/fix_tickets.cpp +index 0232c3194..fc207e3f0 100644 +--- a/libs/icl/test/fix_tickets_/fix_tickets.cpp ++++ b/libs/icl/test/fix_tickets_/fix_tickets.cpp +@@ -74,6 +74,7 @@ BOOST_AUTO_TEST_CASE(ticket_6095_Marvin_Sielenkemper_isEmptyTest) + BOOST_CHECK( icl::is_empty(Interval::open(max, max))); + } + ++#ifndef __GNUC__ + BOOST_AUTO_TEST_CASE(ticket_6095_Marvin_Sielenkemper_totalRangeTest) + { + typedef int Value; +@@ -90,6 +91,7 @@ BOOST_AUTO_TEST_CASE(ticket_6095_Marvin_Sielenkemper_totalRangeTest) + + BOOST_CHECK_EQUAL(intervals.iterative_size(), 3); + } ++#endif + + BOOST_AUTO_TEST_CASE(test_ticket_7871) + { +-- +2.36.1 + diff --git a/boost-1.78-locale-Fix-access-to-first-element-of-empty-vector.patch b/boost-1.78-locale-Fix-access-to-first-element-of-empty-vector.patch new file mode 100644 index 0000000..50e08a4 --- /dev/null +++ b/boost-1.78-locale-Fix-access-to-first-element-of-empty-vector.patch @@ -0,0 +1,33 @@ +From 1ff0ead837b32b9415dc840dfef6549e8754b98d Mon Sep 17 00:00:00 2001 +From: Alexander Grund <Flamefire@users.noreply.github.com> +Date: Fri, 10 Dec 2021 17:53:01 +0100 +Subject: [PATCH] Fix access to first element of empty vector + +Trying to access tmp[0] causes a crash on Fedora when assertion on STL +are enabled. + +/usr/include/c++/10/bits/stl_vector.h:1045: std::vector<_Tp, _Alloc>::reference std::vector<_Tp, _Alloc>::operator[](std::vector<_Tp, _Alloc>::size_type) [with _Tp = unsigned char; _Alloc = std::allocator<unsigned char>; std::vector<_Tp, _Alloc>::reference = unsigned char&; std::vector<_Tp, _Alloc>::size_type = long unsigned int]: Assertion '__builtin_expect(__n < this->size(), true)' failed. + +Fix is to never have an empty vector as ICU sort keys include the NULL +terminator, hence we need at least `length + 1` bytes which means the +vector has at least 1 element: The NULL terminator +--- + src/icu/collator.cpp | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/libs/locale/src/icu/collator.cpp b/libs/locale/src/icu/collator.cpp +index 7f1ea6ae..79668aa6 100644 +--- a/libs/locale/src/icu/collator.cpp ++++ b/libs/locale/src/icu/collator.cpp +@@ -91,9 +91,9 @@ namespace boost { + { + icu::UnicodeString str=cvt_.icu(b,e); + std::vector<uint8_t> tmp; +- tmp.resize(str.length()); ++ tmp.resize(str.length() + 1u); + icu::Collator *collate = get_collator(level); +- int len = collate->getSortKey(str,&tmp[0],tmp.size()); ++ const int len = collate->getSortKey(str,&tmp[0],tmp.size()); + if(len > int(tmp.size())) { + tmp.resize(len); + collate->getSortKey(str,&tmp[0],tmp.size()); diff --git a/boost-1.78-pool-fix-integer-overflows-in-pool-ordered_malloc.patch b/boost-1.78-pool-fix-integer-overflows-in-pool-ordered_malloc.patch new file mode 100644 index 0000000..191fa0d --- /dev/null +++ b/boost-1.78-pool-fix-integer-overflows-in-pool-ordered_malloc.patch @@ -0,0 +1,179 @@ +From acb849a8a16499907c554a3c00da201486388459 Mon Sep 17 00:00:00 2001 +From: Orgad Shaneh <orgads@gmail.com> +Date: Thu, 4 Nov 2021 03:39:23 +0200 +Subject: [PATCH] fix integer overflows in pool::ordered_malloc (#42) + +Fixes trac #6701 (https://svn.boost.org/trac10/ticket/6701). + +Originally-by: Jonathan Wakely <jwakely.boost@kayari.org> +--- + boost/pool/pool.hpp | 31 ++++++++++++++++++++++--------- + libs/pool/test/Jamfile.v2 | 1 + + libs/pool/test/suppressions.txt | 7 +++++++ + libs/pool/test/test_bug_6701.cpp | 27 +++++++++++++++++++++++++++ + 4 files changed, 57 insertions(+), 9 deletions(-) + create mode 100644 libs/pool/test/suppressions.txt + create mode 100644 libs/pool/test/test_bug_6701.cpp + +diff --git a/boost/pool/pool.hpp b/boost/pool/pool.hpp +index c47b11faf..12728a7ae 100644 +--- a/boost/pool/pool.hpp ++++ b/boost/pool/pool.hpp +@@ -26,6 +26,8 @@ + + #include <boost/pool/poolfwd.hpp> + ++// std::numeric_limits ++#include <boost/limits.hpp> + // boost::integer::static_lcm + #include <boost/integer/common_factor_ct.hpp> + // boost::simple_segregated_storage +@@ -355,6 +357,12 @@ class pool: protected simple_segregated_storage < typename UserAllocator::size_t + return s; + } + ++ size_type max_chunks() const ++ { //! Calculated maximum number of memory chunks that can be allocated in a single call by this Pool. ++ size_type POD_size = integer::static_lcm<sizeof(size_type), sizeof(void *)>::value + sizeof(size_type); ++ return (std::numeric_limits<size_type>::max() - POD_size) / alloc_size(); ++ } ++ + static void * & nextof(void * const ptr) + { //! \returns Pointer dereferenced. + //! (Provided and used for the sake of code readability :) +@@ -375,6 +383,8 @@ class pool: protected simple_segregated_storage < typename UserAllocator::size_t + //! the first time that object needs to allocate system memory. + //! The default is 32. This parameter may not be 0. + //! \param nmax_size is the maximum number of chunks to allocate in one block. ++ set_next_size(nnext_size); ++ set_max_size(nmax_size); + } + + ~pool() +@@ -398,8 +408,8 @@ class pool: protected simple_segregated_storage < typename UserAllocator::size_t + } + void set_next_size(const size_type nnext_size) + { //! Set number of chunks to request from the system the next time that object needs to allocate system memory. This value should never be set to 0. +- //! \returns nnext_size. +- next_size = start_size = nnext_size; ++ BOOST_USING_STD_MIN(); ++ next_size = start_size = min BOOST_PREVENT_MACRO_SUBSTITUTION(nnext_size, max_chunks()); + } + size_type get_max_size() const + { //! \returns max_size. +@@ -407,7 +417,8 @@ class pool: protected simple_segregated_storage < typename UserAllocator::size_t + } + void set_max_size(const size_type nmax_size) + { //! Set max_size. +- max_size = nmax_size; ++ BOOST_USING_STD_MIN(); ++ max_size = min BOOST_PREVENT_MACRO_SUBSTITUTION(nmax_size, max_chunks()); + } + size_type get_requested_size() const + { //! \returns the requested size passed into the constructor. +@@ -708,9 +719,9 @@ void * pool<UserAllocator>::malloc_need_resize() + + BOOST_USING_STD_MIN(); + if(!max_size) +- next_size <<= 1; ++ set_next_size(next_size << 1); + else if( next_size*partition_size/requested_size < max_size) +- next_size = min BOOST_PREVENT_MACRO_SUBSTITUTION(next_size << 1, max_size*requested_size/ partition_size); ++ set_next_size(min BOOST_PREVENT_MACRO_SUBSTITUTION(next_size << 1, max_size * requested_size / partition_size)); + + // initialize it, + store().add_block(node.begin(), node.element_size(), partition_size); +@@ -748,9 +759,9 @@ void * pool<UserAllocator>::ordered_malloc_need_resize() + + BOOST_USING_STD_MIN(); + if(!max_size) +- next_size <<= 1; ++ set_next_size(next_size << 1); + else if( next_size*partition_size/requested_size < max_size) +- next_size = min BOOST_PREVENT_MACRO_SUBSTITUTION(next_size << 1, max_size*requested_size/ partition_size); ++ set_next_size(min BOOST_PREVENT_MACRO_SUBSTITUTION(next_size << 1, max_size * requested_size / partition_size)); + + // initialize it, + // (we can use "add_block" here because we know that +@@ -792,6 +803,8 @@ void * pool<UserAllocator>::ordered_malloc(const size_type n) + { //! Gets address of a chunk n, allocating new memory if not already available. + //! \returns Address of chunk n if allocated ok. + //! \returns 0 if not enough memory for n chunks. ++ if (n > max_chunks()) ++ return 0; + + const size_type partition_size = alloc_size(); + const size_type total_req_size = n * requested_size; +@@ -840,9 +853,9 @@ void * pool<UserAllocator>::ordered_malloc(const size_type n) + + BOOST_USING_STD_MIN(); + if(!max_size) +- next_size <<= 1; ++ set_next_size(next_size << 1); + else if( next_size*partition_size/requested_size < max_size) +- next_size = min BOOST_PREVENT_MACRO_SUBSTITUTION(next_size << 1, max_size*requested_size/ partition_size); ++ set_next_size(min BOOST_PREVENT_MACRO_SUBSTITUTION(next_size << 1, max_size * requested_size / partition_size)); + + // insert it into the list, + // handle border case. +diff --git a/libs/pool/test/Jamfile.v2 b/libs/pool/test/Jamfile.v2 +index 9e96abcbd..133879a93 100644 +--- a/libs/pool/test/Jamfile.v2 ++++ b/libs/pool/test/Jamfile.v2 +@@ -34,6 +34,7 @@ test-suite pool : + <toolset>pathscale:<cxxflags>-Wno-long-long ] + [ run test_bug_2696.cpp ] + [ run test_bug_5526.cpp ] ++ [ run test_bug_6701.cpp ] + [ run test_threading.cpp : : : <threading>multi <library>/boost/thread//boost_thread ] + [ compile test_poisoned_macros.cpp ] + ; +diff --git a/libs/pool/test/suppressions.txt b/libs/pool/test/suppressions.txt +new file mode 100644 +index 000000000..e30fb813c +--- /dev/null ++++ b/libs/pool/test/suppressions.txt +@@ -0,0 +1,7 @@ ++{ ++ no_fishy_value ++ Memcheck:FishyValue ++ __builtin_vec_new(size) ++ fun:_ZnamRKSt9nothrow_t ++ ... ++} +diff --git a/libs/pool/test/test_bug_6701.cpp b/libs/pool/test/test_bug_6701.cpp +new file mode 100644 +index 000000000..e484d3c7e +--- /dev/null ++++ b/libs/pool/test/test_bug_6701.cpp +@@ -0,0 +1,27 @@ ++/* Copyright (C) 2012 Étienne Dupuis ++* ++* Use, modification and distribution is subject to the ++* Boost Software License, Version 1.0. (See accompanying ++* file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt) ++*/ ++ ++// Test of bug #6701 (https://svn.boost.org/trac/boost/ticket/6701) ++ ++#include <boost/pool/object_pool.hpp> ++#include <boost/limits.hpp> ++ ++int main() ++{ ++ boost::pool<> p(1024, std::numeric_limits<size_t>::max() / 768); ++ ++ void *x = p.malloc(); ++ BOOST_ASSERT(!x); ++ ++ BOOST_ASSERT(std::numeric_limits<size_t>::max() / 1024 >= p.get_next_size()); ++ BOOST_ASSERT(std::numeric_limits<size_t>::max() / 1024 >= p.get_max_size()); ++ ++ void *y = p.ordered_malloc(std::numeric_limits<size_t>::max() / 768); ++ BOOST_ASSERT(!y); ++ ++ return 0; ++} +-- +2.33.1 + diff --git a/boost-1.78-python-Update-call_method-hpp.patch b/boost-1.78-python-Update-call_method-hpp.patch new file mode 100644 index 0000000..39cb962 --- /dev/null +++ b/boost-1.78-python-Update-call_method-hpp.patch @@ -0,0 +1,24 @@ +From 1dc6d74f2d673b7b82dd02ff8cdaf04b60fb5ff8 Mon Sep 17 00:00:00 2001 +From: Denis Arnaud <denis.arnaud_github@m4x.org> +Date: Sun, 15 Aug 2021 17:05:31 +0200 +Subject: [PATCH] Update call_method.hpp + +Was missing from https://github.com/boostorg/python/pull/320 +I've tested it on one of my projects with (that patch on) Boost.Python/Boost 1.76.0 and it works well. Without that patch, there is a deprecation error. +--- + boost/python/call_method.hpp | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/boost/python/call_method.hpp b/boost/python/call_method.hpp +index 424077eab4..2f360791d7 100644 +--- a/boost/python/call_method.hpp ++++ b/boost/python/call_method.hpp +@@ -59,7 +59,7 @@ call_method(PyObject* self, char const* name + ) + { + PyObject* const result = +- PyEval_CallMethod( ++ PyObject_CallMethod( + self + , const_cast<char*>(name) + , const_cast<char*>("(" BOOST_PP_REPEAT_1ST(N, BOOST_PYTHON_FIXED, "O") ")") diff --git a/boost.spec b/boost.spec new file mode 100644 index 0000000..b0a98db --- /dev/null +++ b/boost.spec @@ -0,0 +1,573 @@ +%global version_enc 1_78_0 + +Name: boost +Version: 1.78.0 +Release: 16 +Summary: The free peer-reviewed portable C++ source libraries +License: Boost Software License 1.0 +URL: http://www.boost.org +Source0: https://boostorg.jfrog.io/ui/native/main/release/%{version}/source/%{name}_%{version_enc}.tar.gz + +# These following patches have been merged into boost develop branch +# Remove them at the next release +# https://github.com/boostorg/pool/pull/42 +Patch0: boost-1.78-pool-fix-integer-overflows-in-pool-ordered_malloc.patch +# https://github.com/boostorg/locale/pull/72 +Patch1: boost-1.78-locale-Fix-access-to-first-element-of-empty-vector.patch +# https://github.com/boostorg/locale/pull/38 +Patch2: boost-1.77-locale-remove-linking-with-boost-system.patch +# https://github.com/boostorg/type_erasure/pull/19 +Patch3: boost-1.77-type_erasure-remove-boost-system-linkage.patch +# https://github.com/bfgroup/b2/pull/113 +Patch4: boost-1.78-build-Don-t-skip-install-targets-if-there-s-build-no-in-ureqs.patch +# https://github.com/boostorg/filesystem/commit/41d076ace558cfae01e233f9746dc955dcf78dba +Patch5: boost-1.78-filesystem-Added-protection-for-CVE-2022-21658.patch +# https://github.com/boostorg/filesystem/commit/dbec3baaadf7d899e66aa90843d285e749e88b2d +Patch6: boost-1.78-filesystem-Use-O_NONBLOCK-instead-of-O_NDELAY.patch +# These patches have not been merged yet. +# https://github.com/boostorg/python/pull/373 +Patch9000: boost-1.78-python-Update-call_method-hpp.patch +Patch9001: boost_1_78_0-sw.patch +Patch9002: boost-1.78-graph-Skip-performance-test.patch +Patch9003: boost-1.78-icl-Avoid-gcc-bugs.patch + +Requires: %{name}-atomic%{?_isa} = %{version}-%{release} +Requires: %{name}-chrono%{?_isa} = %{version}-%{release} +Requires: %{name}-container%{?_isa} = %{version}-%{release} +Requires: %{name}-context%{?_isa} = %{version}-%{release} +Requires: %{name}-contract%{?_isa} = %{version}-%{release} +Requires: %{name}-coroutine%{?_isa} = %{version}-%{release} +Requires: %{name}-date-time%{?_isa} = %{version}-%{release} +Requires: %{name}-fiber%{?_isa} = %{version}-%{release} +Requires: %{name}-filesystem%{?_isa} = %{version}-%{release} +Requires: %{name}-graph%{?_isa} = %{version}-%{release} +Requires: %{name}-iostreams%{?_isa} = %{version}-%{release} +Requires: %{name}-json%{?_isa} = %{version}-%{release} +Requires: %{name}-locale%{?_isa} = %{version}-%{release} +Requires: %{name}-log%{?_isa} = %{version}-%{release} +Requires: %{name}-math%{?_isa} = %{version}-%{release} +Requires: %{name}-nowide%{?_isa} = %{version}-%{release} +Requires: %{name}-program-options%{?_isa} = %{version}-%{release} +Requires: %{name}-python3%{?_isa} = %{version}-%{release} +Requires: %{name}-random%{?_isa} = %{version}-%{release} +Requires: %{name}-regex%{?_isa} = %{version}-%{release} +Requires: %{name}-serialization%{?_isa} = %{version}-%{release} +Requires: %{name}-stacktrace%{?_isa} = %{version}-%{release} +Requires: %{name}-system%{?_isa} = %{version}-%{release} +Requires: %{name}-test%{?_isa} = %{version}-%{release} +Requires: %{name}-thread%{?_isa} = %{version}-%{release} +Requires: %{name}-timer%{?_isa} = %{version}-%{release} +Requires: %{name}-type_erasure%{?_isa} = %{version}-%{release} +Requires: %{name}-wave%{?_isa} = %{version}-%{release} + +BuildRequires: gcc-c++ +# required by python3 +BuildRequires: python3-devel python3-unversioned-command +# optional library for asio +BuildRequires: openssl-devel +# optional libraries for iostreams +BuildRequires: bzip2-devel libzstd-devel xz-devel zlib-devel +# optional library for python3 +BuildRequires: python3-numpy +# optional library for regex +BuildRequires: libicu-devel + +Obsoletes: boost-signals < 1.69.0 + +%description +Boost provides free peer-reviewed portable C++ source libraries. + +We emphasize libraries that work well with the C++ Standard Library. +Boost libraries are intended to be widely useful, and usable across +a broad spectrum of applications. The Boost license encourages +the use of Boost libraries for all users with minimal restrictions. + +%package atomic +Summary: Run-time component for boost atomic. + +%description atomic +C++11-style atomic<>. + +%package chrono +Summary: Run-time component for boost chrono. + +%description chrono +Useful time utilities. + +%package container +Summary: Run-time component for boost container. + +%description container +Standard library containers and extensions. + +%package context +Summary: Run-time component for boost context. + +%description context +(C++11) Context switching library. + +%package contract +Summary: Run-time component for boost contract. + +%description contract +Contract programming for C++. + +%package coroutine +Summary: Run-time component for boost coroutine. + +%description coroutine +(deprecated) Coroutine library. + +%package date-time +Summary: Run-time component for boost date-time. + +%description date-time +A set of date-time libraries based on generic programming concepts. + +%package fiber +Summary: Run-time component for boost fiber. + +%description fiber +(C++11) Userland threads library. + +%package filesystem +Summary: Run-time component for boost filesystem. + +%description filesystem +Portable facilities to query and manipulate paths, files, and directories. + +%package graph +Summary: Run-time component for boost graph. +Requires: boost-regex%{?_isa} = %{version}-%{release} + +%description graph +The BGL graph interface and graph components are generic. + +%package iostreams +Summary: Run-time component for boost iostreams. + +%description iostreams +A framework for defining streams, stream buffers and i/o filters. + +%package json +Summary: Run-time component for boost json. + +%description json +JSON parsing, serialization, and DOM in C++11 + +%package locale +Summary: Run-time component for boost locale. +Requires: boost-chrono%{?_isa} = %{version}-%{release} +Requires: boost-thread%{?_isa} = %{version}-%{release} + +%description locale +Provide localization and Unicode handling tools for C++. + +%package log +Summary: Run-time component for boost log. + +%description log +Logging library. + +%package math +Summary: Run-time component for boost math. + +%description math +Boost.Math includes several contributions in the domain of mathematics. + +%package nowide +Summary: Run-time component for boost nowide. + +%description nowide +Standard library functions with UTF-8 API on Windows. + +%package program-options +Summary: Run-time component for boost program-options. + +%description program-options +The program_options library allows program developers to obtain program options. + +%package python3 +Summary: Run-time component for boost python. + +%description python3 +A framework for interfacing Python and C++. + +%package random +Summary: Run-time component for boost random. + +%description random +A complete system for random number generation. + +%package regex +Summary: Run-time component for boost regex. + +%description regex +Regular expression library. + +%package serialization +Summary: Run-time component for boost serialization. + +%description serialization +Serialization for persistence and marshalling. + +%package stacktrace +Summary: Run-time component for boost stacktrace. + +%description stacktrace +Gather, store, copy and print backtraces. + +%package system +Summary: Run-time component for boost system. + +%description system +Extensible error reporting. + +%package test +Summary: Run-time component for boost test. + +%description test +Support for simple program testing, full unit testing, and for program execution monitoring. + +%package thread +Summary: Run-time component for boost thread. + +%description thread +Portable C++ multi-threading. + +%package timer +Summary: Run-time component for boost timer. +Requires: boost-chrono%{?_isa} = %{version}-%{release} + +%description timer +Event timer, progress timer, and progress display classes. + +%package type_erasure +Summary: Run-time component for boost type-erasure. +Requires: boost-chrono%{?_isa} = %{version}-%{release} + +%description type_erasure +Runtime polymorphism based on concepts. + +%package wave +Summary: Run-time component for boost wave. +Requires: boost-chrono%{?_isa} = %{version}-%{release} +Requires: boost-filesystem%{?_isa} = %{version}-%{release} +Requires: boost-thread%{?_isa} = %{version}-%{release} + +%description wave +An implementation of the mandated C99/C++ preprocessor functionality. + +%package devel +Summary: The Boost C++ headers, shared and static development libraries +Requires: boost%{?_isa} = %{version}-%{release} +Requires: libicu-devel%{?_isa} +Provides: boost-static +Obsoletes: boost-static < %{version} + +%description devel +Headers shared object symbolic links for the Boost C++ libraries and static +Boost C++ libraries distributed with boost. + +%package help +Summary: HTML documentation and source code example for the Boost C++ libraries +BuildArch: noarch +Requires: boost-devel = %{version}-%{release} + +%description help +This package contains the documentation in the HTML format and source code examples +of the Boost C++ libraries. The documentation provides the same content +as that on the Boost web page (http://www.boost.org/doc/libs/%{version_enc}). + +%prep +%autosetup -p1 -n %{name}_%{version_enc} + +%build +./bootstrap.sh +%define opt_build -d+2 -q %{?_smp_mflags} --no-cmake-config +%define opt_feature release debug-symbols=on pch=off +%define opt_libs --without-mpi --without-graph_parallel +%define b2_options %{opt_build} %{opt_feature} %{opt_libs} +%define boost_macros define=BOOST_NO_AUTO_PTR define=BOOST_STATECHART_USE_NATIVE_RTTI +./b2 %{b2_options} cxxflags="$RPM_OPT_FLAGS" %{boost_macros} + +%check +cd status +../b2 %{?_smp_mflags} --check-libs-only +../b2 %{?_smp_mflags} %{opt_feature} cxxflags="$RPM_OPT_FLAGS" %{boost_macros} \ + --include-tests=algorithm,graph,intrusive,dynamic_bitset,property_map,crc,lexical_cast,range \ + --exclude-tests=mpi,graph_parallel +../b2 %{?_smp_mflags} %{opt_feature} cxxflags="$RPM_OPT_FLAGS" %{boost_macros} \ + --include-tests=bimap,circular_buffer,container,heap,icl,lockfree,logic,multi_array,multi_index,poly_collection,property_tree,ptr_container,sort \ + --exclude-tests=container_hash + +%install +./b2 %{b2_options} \ + --prefix=$RPM_BUILD_ROOT%{_prefix} \ + --libdir=$RPM_BUILD_ROOT%{_libdir} \ + install + +mkdir boost-doc boost-example +find libs doc more -regex '.*\.\(html?\|css\|png\|gif\)' -exec cp {} boost-doc --parents \; +cp index.html boost.png rst.css boost.css boost-doc +find libs -name example -exec cp {} boost-example --parents -r \; + +%files +%license LICENSE_1_0.txt + +%files atomic +%license LICENSE_1_0.txt +%{_libdir}/libboost_atomic.so.%{version} + +%files chrono +%license LICENSE_1_0.txt +%{_libdir}/libboost_chrono.so.%{version} + +%files container +%license LICENSE_1_0.txt +%{_libdir}/libboost_container.so.%{version} + +%files context +%license LICENSE_1_0.txt +%{_libdir}/libboost_context.so.%{version} + +%files contract +%license LICENSE_1_0.txt +%{_libdir}/libboost_contract.so.%{version} + +%files coroutine +%license LICENSE_1_0.txt +%{_libdir}/libboost_coroutine.so.%{version} + +%files date-time +%license LICENSE_1_0.txt +%{_libdir}/libboost_date_time.so.%{version} + +%files fiber +%license LICENSE_1_0.txt +%{_libdir}/libboost_fiber.so.%{version} + +%files filesystem +%license LICENSE_1_0.txt +%{_libdir}/libboost_filesystem.so.%{version} + +%files graph +%license LICENSE_1_0.txt +%{_libdir}/libboost_graph.so.%{version} + +%files iostreams +%license LICENSE_1_0.txt +%{_libdir}/libboost_iostreams.so.%{version} + +%files json +%license LICENSE_1_0.txt +%{_libdir}/libboost_json.so.%{version} + +%files locale +%license LICENSE_1_0.txt +%{_libdir}/libboost_locale.so.%{version} + +%files log +%license LICENSE_1_0.txt +%{_libdir}/libboost_log.so.%{version} +%{_libdir}/libboost_log_setup.so.%{version} + +%files math +%license LICENSE_1_0.txt +%{_libdir}/libboost_math_c99.so.%{version} +%{_libdir}/libboost_math_c99f.so.%{version} +%{_libdir}/libboost_math_c99l.so.%{version} +%{_libdir}/libboost_math_tr1.so.%{version} +%{_libdir}/libboost_math_tr1f.so.%{version} +%{_libdir}/libboost_math_tr1l.so.%{version} + +%files nowide +%license LICENSE_1_0.txt +%{_libdir}/libboost_nowide.so.%{version} + +%files program-options +%license LICENSE_1_0.txt +%{_libdir}/libboost_program_options.so.%{version} + +%files python3 +%license LICENSE_1_0.txt +%{_libdir}/libboost_python%{python3_version_nodots}.so.%{version} +%{_libdir}/libboost_numpy%{python3_version_nodots}.so.%{version} + +%files random +%license LICENSE_1_0.txt +%{_libdir}/libboost_random.so.%{version} + +%files regex +%license LICENSE_1_0.txt +%{_libdir}/libboost_regex.so.%{version} + +%files serialization +%license LICENSE_1_0.txt +%{_libdir}/libboost_serialization.so.%{version} +%{_libdir}/libboost_wserialization.so.%{version} + +%files stacktrace +%license LICENSE_1_0.txt +%{_libdir}/libboost_stacktrace_addr2line.so.%{version} +%{_libdir}/libboost_stacktrace_basic.so.%{version} +%{_libdir}/libboost_stacktrace_noop.so.%{version} + +%files system +%license LICENSE_1_0.txt +%{_libdir}/libboost_system.so.%{version} + +%files test +%license LICENSE_1_0.txt +%{_libdir}/libboost_prg_exec_monitor.so.%{version} +%{_libdir}/libboost_unit_test_framework.so.%{version} + +%files thread +%license LICENSE_1_0.txt +%{_libdir}/libboost_thread.so.%{version} + +%files timer +%license LICENSE_1_0.txt +%{_libdir}/libboost_timer.so.%{version} + +%files type_erasure +%license LICENSE_1_0.txt +%{_libdir}/libboost_type_erasure.so.%{version} + +%files wave +%license LICENSE_1_0.txt +%{_libdir}/libboost_wave.so.%{version} + +%files help +%license LICENSE_1_0.txt +%doc boost-doc boost-example + +%files devel +%license LICENSE_1_0.txt +%{_includedir}/%{name} +%{_libdir}/*.so +%{_libdir}/*.a + +%changelog +* Mon Apr 24 2023 wangxiyuan <wangxiyuan1007@gmail.com> - 1.78.0-16 +Remove libquadmath require + +* Mon Dec 12 2022 Liu Zixian <liuzixian4@huawei.com> - 1.78.0-15 +- enable more regression tests to covers commonly used container libraries + +* Mon Dec 12 2022 Liu Zixian <liuzixian4@huawei.com> - 1.78.0-14 +- backport master build commands and enable some regression test + +* Wed Oct 19 2022 wuzx<wuzx1226@qq.com> - 1.78.0-13 +- add sw64 patch + +* Sun Mar 20 2022 Liu Zixian <liuzixian4@huawei.com> - 1.78.0-12 +- backport upstream filesystem patches to fix a possible security issue + +* Wed Mar 02 2022 Liu Zixian <liuzixian4@huawei.com> - 1.78.0-11 +- fix boost-example, only libs/*/example should go into boost-example. + +* Thu Feb 03 2022 Liu Zixian <liuzixian4@huawei.com> - 1.78.0-10 +- disable auto_ptr which is warned by -Wdeprecated-declarations +- Replaced deprecated python API + +* Sat Jan 29 2022 Liu Zixian <liuzixian4@huawei.com> - 1.78.0-9 +- simplify building scripts + +* Fri Jan 28 2022 Liu Zixian <liuzixian4@huawei.com> - 1.78.0-8 +- backport bugfix for boost 1.78.0 known issues +- https://www.boost.org/users/history/version_1_78_0.html + +* Sun Jan 23 2022 Liu Zixian <liuzixian4@huawei.com> - 1.78.0-7 +- refactor boost-help + +* Fri Dec 31 2021 sdlzx <sdlzx@163.com> - 1.78.0-6 +- Don't package boost build tools + +* Mon Dec 27 2021 sdlzx <sdlzx@163.com> - 1.78.0-5 +- Remove mpi related scripts + +* Fri Dec 24 2021 sdlzx <sdlzx@163.com> - 1.78.0-4 +- Update package info +- Reference: https://www.boost.org/doc/libs/1_78_0/ + +* Sun Dec 19 2021 sdlzx <sdlzx@163.com> - 1.78.0-3 +- Simplify spec: extract common b2 configs into b2_config + +* Fri Dec 10 2021 sdlzx <sdlzx@163.com> - 1.78.0-2 +- Simplify spec: remove useless bcond + +* Fri Dec 10 2021 sdlzx <sdlzx@163.com> - 1.78.0-1 +- update to 1.78.0 + +* Wed Oct 06 2021 Liu Zixian <liuzixian4@huawei.com> - 1.77.0-4 +- Remove dependencies on header-only libraries + +* Sun Sep 26 2021 Liu Zixian <liuzixian4@huawei.com> - 1.77.0-3 +- Remove linking script which is fixed in upstream PR266 + +* Wed Sep 22 2021 Liu Zixian <liuzixian4@huawei.com> - 1.77.0-2 +- Correct license name for ci. + +* Wed Sep 15 2021 Liu Zixian <liuzixian4@huawei.com> - 1.77.0-1 +- update to 1.77.0 + +* Sat Jul 24 2021 Liu Zixian <liuzixian4@huawei.com> - 1.76.0-1 +- update to 1.76.0 + +* Sat Jul 24 2021 Liu Zixian <liuzixian4@huawei.com> - 1.75.0-6 +- remove needless BuildRequires + +* Fri Jul 23 2021 zhouwenpei <zhouwenpei1@huawei.com> - 1.75.0-5 +- remove useless buildrequires + +* Wed Jun 23 2021 Xu Huijie <xuhuijie2@huawei.com> - 1.75.0-4 +- Type:bugfix +- ID:NA +- SUG:NA +- DESC:fix dead loop in parse_repeat() + +* Fri Feb 5 2021 xinghe <xinghe1@huawei.com> - 1.75.0-3 +- fix the conflict between the devel package file and the other subpackage file + +* Thu Feb 4 2021 xinghe <xinghe1@huawei.com> - 1.75.0-2 +- fix master build + +* Wed Feb 3 2021 xinghe <xinghe1@huawei.com> - 1.75.0-1 +- update version to 1.75.0 + +* Wed Dec 16 2020 xinghe <xinghe1@huawei.com> - 1.73.0-2 +- correct license + +* Fri Jul 24 2020 Wang Shuo<wangshuo47@huawei.com> - 1.73.0-1 +- Type:requirement +- ID:NA +- SUG:NA +- DESC:update boost to 1.73.0 + +* Mon Apr 20 2020 Wang Shuo<wangshuo47@huawei.com> - 1.72.0-1 +- Type:requirement +- ID:NA +- SUG:NA +- DESC:update boost to 1.72.0 + +* Thu Mar 19 2020 Yu Xiangyang<yuxiangyang4@huawei.com> - 1.66.0-18 +- Type:bugfix +- ID:NA +- SUG:NA +- DESC: fix build src.rpm error + +* Tue Mar 10 2020 Wang Shuo<wangshuo47@huawei.com> - 1.66.0-17 +- Type:enhancement +- ID:NA +- SUG:NA +- DESC: move examples files to examples package + +* Mon Oct 28 2019 caomeng <caomeng5@huawei.com> - 1.66.0-16 +- Type:NA +- ID:NA +- SUG:NA +- DESC:add bcondwith openmpi and mpich + +* Wed Aug 28 2019 openEuler Buildteam <buildteam@openeuler.org> - 1.66.0-15 +- Package init diff --git a/boost_1_78_0-sw.patch b/boost_1_78_0-sw.patch new file mode 100644 index 0000000..6d1a820 --- /dev/null +++ b/boost_1_78_0-sw.patch @@ -0,0 +1,1940 @@ +diff -Naur boost_1_78_0.org/boost/atomic/detail/caps_arch_gcc_sw_64.hpp boost_1_78_0.sw/boost/atomic/detail/caps_arch_gcc_sw_64.hpp +--- boost_1_78_0.org/boost/atomic/detail/caps_arch_gcc_sw_64.hpp 1970-01-01 08:00:00.000000000 +0800 ++++ boost_1_78_0.sw/boost/atomic/detail/caps_arch_gcc_sw_64.hpp 2022-05-09 13:54:56.570734000 +0800 +@@ -0,0 +1,34 @@ ++/* ++ * Distributed under the Boost Software License, Version 1.0. ++ * (See accompanying file LICENSE_1_0.txt or copy at ++ * http://www.boost.org/LICENSE_1_0.txt) ++ * ++ * Copyright (c) 2009 Helge Bahmann ++ * Copyright (c) 2013 Tim Blechmann ++ * Copyright (c) 2014 Andrey Semashev ++ */ ++/*! ++ * \file atomic/detail/caps_arch_gcc_sw_64.hpp ++ * ++ * This header defines feature capabilities macros ++ */ ++ ++#ifndef BOOST_ATOMIC_DETAIL_CAPS_ARCH_GCC_SW_64_HPP_INCLUDED_ ++#define BOOST_ATOMIC_DETAIL_CAPS_ARCH_GCC_SW_64_HPP_INCLUDED_ ++ ++#include <boost/atomic/detail/config.hpp> ++ ++#ifdef BOOST_HAS_PRAGMA_ONCE ++#pragma once ++#endif ++ ++#define BOOST_ATOMIC_INT8_LOCK_FREE 2 ++#define BOOST_ATOMIC_INT16_LOCK_FREE 2 ++#define BOOST_ATOMIC_INT32_LOCK_FREE 2 ++#define BOOST_ATOMIC_INT64_LOCK_FREE 2 ++#define BOOST_ATOMIC_POINTER_LOCK_FREE 2 ++ ++#define BOOST_ATOMIC_THREAD_FENCE 2 ++#define BOOST_ATOMIC_SIGNAL_FENCE 2 ++ ++#endif // BOOST_ATOMIC_DETAIL_CAPS_ARCH_GCC_SW_64_HPP_INCLUDED_ +diff -Naur boost_1_78_0.org/boost/atomic/detail/core_arch_ops_gcc_sw_64.hpp boost_1_78_0.sw/boost/atomic/detail/core_arch_ops_gcc_sw_64.hpp +--- boost_1_78_0.org/boost/atomic/detail/core_arch_ops_gcc_sw_64.hpp 1970-01-01 08:00:00.000000000 +0800 ++++ boost_1_78_0.sw/boost/atomic/detail/core_arch_ops_gcc_sw_64.hpp 2022-05-09 13:54:56.570734000 +0800 +@@ -0,0 +1,1030 @@ ++/* ++ * Distributed under the Boost Software License, Version 1.0. ++ * (See accompanying file LICENSE_1_0.txt or copy at ++ * http://www.boost.org/LICENSE_1_0.txt) ++ * ++ * Copyright (c) 2009 Helge Bahmann ++ * Copyright (c) 2013 Tim Blechmann ++ * Copyright (c) 2014 Andrey Semashev ++ */ ++/*! ++ * \file atomic/detail/core_arch_ops_gcc_sw_64.hpp ++ * ++ * This header contains implementation of the \c core_arch_operations template. ++ */ ++ ++#ifndef BOOST_ATOMIC_DETAIL_CORE_ARCH_OPS_GCC_SW_64_HPP_INCLUDED_ ++#define BOOST_ATOMIC_DETAIL_CORE_ARCH_OPS_GCC_SW_64_HPP_INCLUDED_ ++ ++#include <cstddef> ++#include <boost/memory_order.hpp> ++#include <boost/atomic/detail/config.hpp> ++#include <boost/atomic/detail/storage_traits.hpp> ++#include <boost/atomic/detail/core_arch_operations_fwd.hpp> ++#include <boost/atomic/detail/header.hpp> ++ ++#ifdef BOOST_HAS_PRAGMA_ONCE ++#pragma once ++#endif ++ ++namespace boost { ++namespace atomics { ++namespace detail { ++ ++/* ++ Refer to http://h71000.www7.hp.com/doc/82final/5601/5601pro_004.html ++ (HP OpenVMS systems documentation) and the Sw_64 Architecture Reference Manual. ++ */ ++ ++/* ++ NB: The most natural thing would be to write the increment/decrement ++ operators along the following lines: ++ ++ __asm__ __volatile__ ++ ( ++ "1: ldl_l %0,%1 \n" ++ "addl %0,1,%0 \n" ++ "stl_c %0,%1 \n" ++ "beq %0,1b\n" ++ : "=&b" (tmp) ++ : "m" (value) ++ : "cc" ++ ); ++ ++ However according to the comments on the HP website and matching ++ comments in the Linux kernel sources this defies branch prediction, ++ as the cpu assumes that backward branches are always taken; so ++ instead copy the trick from the Linux kernel, introduce a forward ++ branch and back again. ++ ++ I have, however, had a hard time measuring the difference between ++ the two versions in microbenchmarks -- I am leaving it in nevertheless ++ as it apparently does not hurt either. ++*/ ++ ++struct core_arch_operations_gcc_sw_64_base ++{ ++ static BOOST_CONSTEXPR_OR_CONST bool full_cas_based = false; ++ static BOOST_CONSTEXPR_OR_CONST bool is_always_lock_free = true; ++ ++ static BOOST_FORCEINLINE void fence_before(memory_order order) BOOST_NOEXCEPT ++ { ++ if ((static_cast< unsigned int >(order) & static_cast< unsigned int >(memory_order_release)) != 0u) ++ __asm__ __volatile__ ("memb" ::: "memory"); ++ } ++ ++ static BOOST_FORCEINLINE void fence_after(memory_order order) BOOST_NOEXCEPT ++ { ++ if ((static_cast< unsigned int >(order) & (static_cast< unsigned int >(memory_order_consume) | static_cast< unsigned int >(memory_order_acquire))) != 0u) ++ __asm__ __volatile__ ("memb" ::: "memory"); ++ } ++ ++ static BOOST_FORCEINLINE void fence_after_store(memory_order order) BOOST_NOEXCEPT ++ { ++ if (order == memory_order_seq_cst) ++ __asm__ __volatile__ ("memb" ::: "memory"); ++ } ++}; ++ ++ ++template< bool Signed, bool Interprocess > ++struct core_arch_operations< 4u, Signed, Interprocess > : ++ public core_arch_operations_gcc_sw_64_base ++{ ++ typedef typename storage_traits< 4u >::type storage_type; ++ ++ static BOOST_CONSTEXPR_OR_CONST std::size_t storage_size = 4u; ++ static BOOST_CONSTEXPR_OR_CONST std::size_t storage_alignment = 4u; ++ static BOOST_CONSTEXPR_OR_CONST bool is_signed = Signed; ++ static BOOST_CONSTEXPR_OR_CONST bool is_interprocess = Interprocess; ++ ++ static BOOST_FORCEINLINE void store(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT ++ { ++ fence_before(order); ++ storage = v; ++ fence_after_store(order); ++ } ++ ++ static BOOST_FORCEINLINE storage_type load(storage_type const volatile& storage, memory_order order) BOOST_NOEXCEPT ++ { ++ storage_type v = storage; ++ fence_after(order); ++ return v; ++ } ++ ++ static BOOST_FORCEINLINE storage_type exchange(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT ++ { ++ storage_type original, tmp; ++ storage_type tmp1, tmp2; ++ fence_before(order); ++ __asm__ __volatile__ ++ ( ++ "1:\n\t" ++ "ldi %2,%4\n\t" ++ "ldi %3,1\n\t" ++ "mov %5, %1\n\t" ++ "lldw %0, 0(%2)\n\t" ++ "wr_f %3\n\t" ++ "lstw %1, 0(%2)\n\t" ++ "rd_f %1\n\t" ++ "beq %1, 2f\n\t" ++ ++ ".subsection 2\n\t" ++ "2: br 1b\n\t" ++ ".previous\n\t" ++ ++ : "=&r" (original), // %0 ++ "=&r" (tmp), // %1 ++ "=&r" (tmp1), // %2 ++ "=&r" (tmp2) // %3 ++ : "m" (storage), // %4 ++ "r" (v) // %5 ++ : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC ++ ); ++ fence_after(order); ++ return original; ++ } ++ ++ static BOOST_FORCEINLINE bool compare_exchange_weak( ++ storage_type volatile& storage, storage_type& expected, storage_type desired, memory_order success_order, memory_order failure_order) BOOST_NOEXCEPT ++ { ++ fence_before(success_order); ++ int success; ++ storage_type current; ++ storage_type tmp1,tmp2; ++ __asm__ __volatile__ ++ ( ++ "1:\n\t" ++ "ldi %4,%6\n\t" ++ "lldw %2, 0(%4)\n\t" // current = *(&storage) ++ "cmpeq %2, %0, %5\n\t" // success = current == expected ++ "wr_f %5\n\t" // success = current == expected ++ "mov %2, %0\n\t" // expected = current ++ "lstw %1, 0(%4)\n\t" // storage = desired; desired = store succeeded ++ "rd_f %1\n\t" // storage = desired; desired = store succeeded ++ "beq %5, 2f\n\t" // if (success == 0) goto end ++ "mov %1, %3\n\t" // success = desired ++ "2:\n\t" ++ : "+r" (expected), // %0 ++ "+r" (desired), // %1 ++ "=&r" (current), // %2 ++ "=&r" (success), // %3 ++ "=&r" (tmp1), // %4 ++ "=&r" (tmp2) // %5 ++ : "m" (storage) // %6 ++ : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC ++ ); ++ if (success) ++ fence_after(success_order); ++ else ++ fence_after(failure_order); ++ return !!success; ++ } ++ ++ static BOOST_FORCEINLINE bool compare_exchange_strong( ++ storage_type volatile& storage, storage_type& expected, storage_type desired, memory_order success_order, memory_order failure_order) BOOST_NOEXCEPT ++ { ++ int success; ++ storage_type current, tmp; ++ storage_type tmp1,tmp2; ++ fence_before(success_order); ++ __asm__ __volatile__ ++ ( ++ "1:\n\t" ++ "ldi %4,%6\n\t" ++ "mov %7, %1\n\t" // tmp = desired ++ "lldw %2, 0(%4)\n\t" // current = *(&storage) ++ "cmpeq %2, %0, %5\n\t" // success = current == expected ++ "wr_f %5\n\t" // success = current == expected ++ "mov %2, %0\n\t" // expected = current ++ "lstw %1, 0(%4)\n\t" // storage = tmp; tmp = store succeeded ++ "rd_f %1\n\t" // storage = tmp; tmp = store succeeded ++ "beq %5, 2f\n\t" // if (success == 0) goto end ++ "beq %1, 3f\n\t" // if (tmp == 0) goto retry ++ "mov %1, %3\n\t" // success = tmp ++ "2:\n\t" ++ ++ ".subsection 2\n\t" ++ "3: br 1b\n\t" ++ ".previous\n\t" ++ ++ : "+r" (expected), // %0 ++ "=&r" (tmp), // %1 ++ "=&r" (current), // %2 ++ "=&r" (success), // %3 ++ "=&r" (tmp1), // %4 ++ "=&r" (tmp2) // %5 ++ : "m" (storage), // %6 ++ "r" (desired) // %7 ++ : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC ++ ); ++ if (success) ++ fence_after(success_order); ++ else ++ fence_after(failure_order); ++ return !!success; ++ } ++ ++ static BOOST_FORCEINLINE storage_type fetch_add(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT ++ { ++ storage_type original, modified; ++ storage_type tmp1, tmp2; ++ fence_before(order); ++ __asm__ __volatile__ ++ ( ++ "1:\n\t" ++ "ldi %2,%4\n\t" ++ "ldi %3,1\n\t" ++ "lldw %0, 0(%2)\n\t" ++ "wr_f %3\n\t" ++ "addw %0, %5, %1\n\t" ++ "lstw %1, 0(%2)\n\t" ++ "rd_f %1\n\t" ++ "beq %1, 2f\n\t" ++ ++ ".subsection 2\n\t" ++ "2: br 1b\n\t" ++ ".previous\n\t" ++ ++ : "=&r" (original), // %0 ++ "=&r" (modified), // %1 ++ "=&r" (tmp1), // %2 ++ "=&r" (tmp2) // %3 ++ : "m" (storage), // %4 ++ "r" (v) // %5 ++ : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC ++ ); ++ fence_after(order); ++ return original; ++ } ++ ++ static BOOST_FORCEINLINE storage_type fetch_sub(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT ++ { ++ storage_type original, modified; ++ storage_type tmp1, tmp2; ++ fence_before(order); ++ __asm__ __volatile__ ++ ( ++ "1:\n\t" ++ "ldi %2,%4\n\t" ++ "ldi %3,1\n\t" ++ "lldw %0, 0(%2)\n\t" ++ "wr_f %3\n\t" ++ "subw %0, %5, %1\n\t" ++ "lstw %1, 0(%2)\n\t" ++ "rd_f %1\n\t" ++ "beq %1, 2f\n\t" ++ ++ ".subsection 2\n\t" ++ "2: br 1b\n\t" ++ ".previous\n\t" ++ ++ : "=&r" (original), // %0 ++ "=&r" (modified), // %1 ++ "=&r" (tmp1), // %2 ++ "=&r" (tmp2) // %3 ++ : "m" (storage), // %4 ++ "r" (v) // %5 ++ : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC ++ ); ++ fence_after(order); ++ return original; ++ } ++ ++ static BOOST_FORCEINLINE storage_type fetch_and(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT ++ { ++ storage_type original, modified; ++ storage_type tmp1,tmp2; ++ fence_before(order); ++ __asm__ __volatile__ ++ ( ++ "1:\n\t" ++ "ldi %2,%4\n\t" ++ "ldi %3,1\n\t" ++ "lldw %0, 0(%2)\n\t" ++ "wr_f %3\n\t" ++ "and %0, %5, %1\n\t" ++ "lstw %1, 0(%2)\n\t" ++ "rd_f %1\n\t" ++ "beq %1, 2f\n\t" ++ ++ ".subsection 2\n\t" ++ "2: br 1b\n\t" ++ ".previous\n\t" ++ ++ : "=&r" (original), // %0 ++ "=&r" (modified), // %1 ++ "=&r" (tmp1), // %2 ++ "=&r" (tmp2) // %3 ++ : "m" (storage), // %4 ++ "r" (v) // %5 ++ : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC ++ ); ++ fence_after(order); ++ return original; ++ } ++ ++ static BOOST_FORCEINLINE storage_type fetch_or(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT ++ { ++ storage_type original, modified; ++ storage_type tmp1,tmp2; ++ fence_before(order); ++ __asm__ __volatile__ ++ ( ++ "1:\n" ++ "ldi %2,%4\n" ++ "ldi %3,1\n" ++ "lldw %0, 0(%2)\n" ++ "wr_f %? \n" ++ "bis %0, %5, %1\n" ++ "lstw %1, 0(%2)\n" ++ "rd_f %1 \n" ++ "beq %1, 2f\n" ++ ++ ".subsection 2\n\t" ++ "2: br 1b\n\t" ++ ".previous\n\t" ++ ++ : "=&r" (original), // %0 ++ "=&r" (modified), // %1 ++ "=&r" (tmp1), // %2 ++ "=&r" (tmp2) // %3 ++ : "m" (storage), // %4 ++ "r" (v) // %5 ++ : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC ++ ); ++ fence_after(order); ++ return original; ++ } ++ ++ static BOOST_FORCEINLINE storage_type fetch_xor(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT ++ { ++ storage_type original, modified; ++ storage_type tmp1, tmp2; ++ fence_before(order); ++ __asm__ __volatile__ ++ ( ++ "1:\n" ++ "ldi %2,%4\n" ++ "ldi %3,1\n" ++ "lldw %0, 0(%2)\n" ++ "wr_f %3 \n" ++ "xor %0, %5, %1\n" ++ "lstw %1, 0(%2)\n" ++ "rd_f %1 \n" ++ "beq %1, 2f\n" ++ ++ ".subsection 2\n\t" ++ "2: br 1b\n\t" ++ ".previous\n\t" ++ ++ : "=&r" (original), // %0 ++ "=&r" (modified), // %1 ++ "=&r" (tmp1), // %2 ++ "=&r" (tmp2) // %3 ++ : "m" (storage), // %4 ++ "r" (v) // %5 ++ : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC ++ ); ++ fence_after(order); ++ return original; ++ } ++ ++ static BOOST_FORCEINLINE bool test_and_set(storage_type volatile& storage, memory_order order) BOOST_NOEXCEPT ++ { ++ return !!exchange(storage, (storage_type)1, order); ++ } ++ ++ static BOOST_FORCEINLINE void clear(storage_type volatile& storage, memory_order order) BOOST_NOEXCEPT ++ { ++ store(storage, 0, order); ++ } ++}; ++ ++ ++template< bool Interprocess > ++struct core_arch_operations< 1u, false, Interprocess > : ++ public core_arch_operations< 4u, false, Interprocess > ++{ ++ typedef core_arch_operations< 4u, false, Interprocess > base_type; ++ typedef typename base_type::storage_type storage_type; ++ ++ static BOOST_FORCEINLINE storage_type fetch_add(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT ++ { ++ storage_type original, modified; ++ storage_type tmp1, tmp2; ++ base_type::fence_before(order); ++ __asm__ __volatile__ ++ ( ++ "1:\n" ++ "ldi %2,%4\n" ++ "ldi %3,1\n" ++ "lldw %0, 0(%2)\n" ++ "wr_f %3 \n" ++ "addw %0, %5, %1\n" ++ "zapnot %1, #1, %1\n" ++ "lstw %1, 0(%2)\n" ++ "rd_f %1 \n" ++ "beq %1, 2f\n" ++ ++ ".subsection 2\n\t" ++ "2: br 1b\n\t" ++ ".previous\n\t" ++ ++ : "=&r" (original), // %0 ++ "=&r" (modified), // %1 ++ "=&r" (tmp1), // %2 ++ "=&r" (tmp2) // %3 ++ : "m" (storage), // %4 ++ "r" (v) // %5 ++ : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC ++ ); ++ base_type::fence_after(order); ++ return original; ++ } ++ ++ static BOOST_FORCEINLINE storage_type fetch_sub(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT ++ { ++ storage_type original, modified; ++ storage_type tmp1, tmp2; ++ base_type::fence_before(order); ++ __asm__ __volatile__ ++ ( ++ "1:\n" ++ "ldi %2,%4\n" ++ "ldi %3,1\n" ++ "lldw %0, 0(%2)\n" ++ "wr_f %3 \n" ++ "subw %0, %5, %1\n" ++ "zapnot %1, #1, %1\n" ++ "lstw %1, 0(%2)\n" ++ "rd_f %1 \n" ++ "beq %1, 2f\n" ++ ++ ".subsection 2\n\t" ++ "2: br 1b\n\t" ++ ".previous\n\t" ++ ++ : "=&r" (original), // %0 ++ "=&r" (modified), // %1 ++ "=&r" (tmp1), // %2 ++ "=&r" (tmp2) // %3 ++ : "m" (storage), // %4 ++ "r" (v) // %5 ++ : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC ++ ); ++ base_type::fence_after(order); ++ return original; ++ } ++}; ++ ++template< bool Interprocess > ++struct core_arch_operations< 1u, true, Interprocess > : ++ public core_arch_operations< 4u, true, Interprocess > ++{ ++ typedef core_arch_operations< 4u, true, Interprocess > base_type; ++ typedef typename base_type::storage_type storage_type; ++ ++ static BOOST_FORCEINLINE storage_type fetch_add(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT ++ { ++ storage_type original, modified; ++ storage_type tmp1,tmp2; ++ base_type::fence_before(order); ++ __asm__ __volatile__ ++ ( ++ "1:\n" ++ "ldi %2,%4\n" ++ "ldi %3,1\n" ++ "lldw %0, 0(%2)\n" ++ "wr_f %3 \n" ++ "addw %0, %5, %1\n" ++ "sextb %1, %1\n" ++ "lstw %1, 0(%2)\n" ++ "rd_f %1 \n" ++ "beq %1, 2f\n" ++ ++ ".subsection 2\n\t" ++ "2: br 1b\n\t" ++ ".previous\n\t" ++ ++ : "=&r" (original), // %0 ++ "=&r" (modified), // %1 ++ "=&r" (tmp1), // %2 ++ "=&r" (tmp2) // %3 ++ : "m" (storage), // %4 ++ "r" (v) // %5 ++ : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC ++ ); ++ base_type::fence_after(order); ++ return original; ++ } ++ ++ static BOOST_FORCEINLINE storage_type fetch_sub(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT ++ { ++ storage_type original, modified; ++ storage_type tmp1,tmp2; ++ base_type::fence_before(order); ++ __asm__ __volatile__ ++ ( ++ "1:\n" ++ "ldi %2,%4\n" ++ "ldi %3,1\n" ++ "lldw %0, 0(%2)\n" ++ "wr_f %3 \n" ++ "subw %0, %5, %1\n" ++ "sextb %1, %1\n" ++ "lstw %1, 0(%2)\n" ++ "rd_f %1 \n" ++ "beq %1, 2f\n" ++ ++ ".subsection 2\n\t" ++ "2: br 1b\n\t" ++ ".previous\n\t" ++ ++ : "=&r" (original), // %0 ++ "=&r" (modified), // %1 ++ "=&r" (tmp1), // %2 ++ "=&r" (tmp2) // %3 ++ : "m" (storage), // %4 ++ "r" (v) // %5 ++ : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC ++ ); ++ base_type::fence_after(order); ++ return original; ++ } ++}; ++ ++ ++template< bool Interprocess > ++struct core_arch_operations< 2u, false, Interprocess > : ++ public core_arch_operations< 4u, false, Interprocess > ++{ ++ typedef core_arch_operations< 4u, false, Interprocess > base_type; ++ typedef typename base_type::storage_type storage_type; ++ ++ static BOOST_FORCEINLINE storage_type fetch_add(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT ++ { ++ storage_type original, modified; ++ storage_type tmp1,tmp2; ++ base_type::fence_before(order); ++ __asm__ __volatile__ ++ ( ++ "1:\n" ++ "ldi %2,%4\n" ++ "ldi %3\n" ++ "lldw %0, 0(%2)\n" ++ "wr_f %3 \n" ++ "addw %0, %5, %1\n" ++ "zapnot %1, #3, %1\n" ++ "lstw %1, 0(%2)\n" ++ "rd_f %1 \n" ++ "beq %1, 2f\n" ++ ++ ".subsection 2\n\t" ++ "2: br 1b\n\t" ++ ".previous\n\t" ++ ++ : "=&r" (original), // %0 ++ "=&r" (modified), // %1 ++ "=&r" (tmp1), // %2 ++ "=&r" (tmp2) // %3 ++ : "m" (storage), // %4 ++ "r" (v) // %5 ++ : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC ++ ); ++ base_type::fence_after(order); ++ return original; ++ } ++ ++ static BOOST_FORCEINLINE storage_type fetch_sub(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT ++ { ++ storage_type original, modified; ++ storage_type tmp1,tmp2; ++ base_type::fence_before(order); ++ __asm__ __volatile__ ++ ( ++ "1:\n" ++ "ldi %2,%4\n" ++ "ldi %3,1\n" ++ "lldw %0, 0(%2)\n" ++ "wr_f %3 \n" ++ "subw %0, %5, %1\n" ++ "zapnot %1, #3, %1\n" ++ "lstw %1, %2\n" ++ "rd_f %1 \n" ++ "beq %1, 2f\n" ++ ++ ".subsection 2\n\t" ++ "2: br 1b\n\t" ++ ".previous\n\t" ++ ++ : "=&r" (original), // %0 ++ "=&r" (modified), // %1 ++ "=&r" (tmp1), // %2 ++ "=&r" (tmp2) // %3 ++ : "m" (storage), // %4 ++ "r" (v) // %5 ++ : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC ++ ); ++ base_type::fence_after(order); ++ return original; ++ } ++}; ++ ++template< bool Interprocess > ++struct core_arch_operations< 2u, true, Interprocess > : ++ public core_arch_operations< 4u, true, Interprocess > ++{ ++ typedef core_arch_operations< 4u, true, Interprocess > base_type; ++ typedef typename base_type::storage_type storage_type; ++ ++ static BOOST_FORCEINLINE storage_type fetch_add(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT ++ { ++ storage_type original, modified; ++ storage_type tmp1,tmp2; ++ base_type::fence_before(order); ++ __asm__ __volatile__ ++ ( ++ "ldi %2,%4\n" ++ "ldi %3,1\n" ++ "lldw %0, 0(%2)\n" ++ "wr_f %3 \n" ++ "addw %0, %5, %1\n" ++ "sexth %1, %1\n" ++ "lstw %1, 0(%2)\n" ++ "rd_f %1 \n" ++ "beq %1, 2f\n" ++ ++ ".subsection 2\n\t" ++ "2: br 1b\n\t" ++ ".previous\n\t" ++ ++ : "=&r" (original), // %0 ++ "=&r" (modified), // %1 ++ "=&r" (tmp1), // %2 ++ "=&r" (tmp2) // %3 ++ : "m" (storage), // %4 ++ "r" (v) // %5 ++ : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC ++ ); ++ base_type::fence_after(order); ++ return original; ++ } ++ ++ static BOOST_FORCEINLINE storage_type fetch_sub(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT ++ { ++ storage_type original, modified; ++ storage_type tmp1,tmp2; ++ base_type::fence_before(order); ++ __asm__ __volatile__ ++ ( ++ "1:\n" ++ "ldi %2,%4\n" ++ "ldi %3,1\n" ++ "lldw %0, 0(%2)\n" ++ "wr_f %3 \n" ++ "subw %0, %5, %1\n" ++ "sexth %1, %1\n" ++ "lstw %1, 0(%2)\n" ++ "rd_f %1 \n" ++ "beq %1, 2f\n" ++ ++ ".subsection 2\n\t" ++ "2: br 1b\n\t" ++ ".previous\n\t" ++ ++ : "=&r" (original), // %0 ++ "=&r" (modified), // %1 ++ "=&r" (tmp1), // %2 ++ "=&r" (tmp2) // %3 ++ : "m" (storage), // %4 ++ "r" (v) // %5 ++ : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC ++ ); ++ base_type::fence_after(order); ++ return original; ++ } ++}; ++ ++ ++template< bool Signed, bool Interprocess > ++struct core_arch_operations< 8u, Signed, Interprocess > : ++ public core_arch_operations_gcc_sw_64_base ++{ ++ typedef typename storage_traits< 8u >::type storage_type; ++ ++ static BOOST_CONSTEXPR_OR_CONST std::size_t storage_size = 8u; ++ static BOOST_CONSTEXPR_OR_CONST std::size_t storage_alignment = 8u; ++ static BOOST_CONSTEXPR_OR_CONST bool is_signed = Signed; ++ static BOOST_CONSTEXPR_OR_CONST bool is_interprocess = Interprocess; ++ ++ static BOOST_FORCEINLINE void store(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT ++ { ++ fence_before(order); ++ storage = v; ++ fence_after_store(order); ++ } ++ ++ static BOOST_FORCEINLINE storage_type load(storage_type const volatile& storage, memory_order order) BOOST_NOEXCEPT ++ { ++ storage_type v = storage; ++ fence_after(order); ++ return v; ++ } ++ ++ static BOOST_FORCEINLINE storage_type exchange(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT ++ { ++ storage_type original, tmp; ++ storage_type tmp1,tmp2; ++ fence_before(order); ++ __asm__ __volatile__ ++ ( ++ "1:\n" ++ "ldi %2,%4\n" ++ "ldi %3,1\n" ++ "mov %5, %1\n" ++ "lldl %0, 0(%2)\n" ++ "wr_f %3 \n" ++ "lstl %1, 0(%2)\n" ++ "rd_f %1 \n" ++ "beq %1, 2f\n" ++ ++ ".subsection 2\n\t" ++ "2: br 1b\n\t" ++ ".previous\n\t" ++ ++ : "=&r" (original), // %0 ++ "=&r" (tmp), // %1 ++ "=&r" (tmp1), // %2 ++ "=&r" (tmp2) // %3 ++ : "m" (storage), // %4 ++ "r" (v) // %5 ++ : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC ++ ); ++ fence_after(order); ++ return original; ++ } ++ ++ static BOOST_FORCEINLINE bool compare_exchange_weak( ++ storage_type volatile& storage, storage_type& expected, storage_type desired, memory_order success_order, memory_order failure_order) BOOST_NOEXCEPT ++ { ++ fence_before(success_order); ++ int success; ++ storage_type current; ++ storage_type tmp1,tmp2; ++ __asm__ __volatile__ ++ ( ++ "1:\n" ++ "ldi %4,%6\n" ++ "lldl %2, 0(%4)\n" // current = *(&storage) ++ "cmpeq %2, %0, %5\n" // success = current == expected ++ "wr_f %5 \n" ++ "mov %2, %0\n" // expected = current ++ "lstl %1, 0(%4)\n" // storage = desired; desired = store succeeded ++ "rd_f %1 \n" ++ "beq %5, 2f\n" // if (success == 0) goto end ++ "mov %1, %3\n" // success = desired ++ "2:\n\t" ++ : "+r" (expected), // %0 ++ "+r" (desired), // %1 ++ "=&r" (current), // %2 ++ "=&r" (success), // %3 ++ "=&r" (tmp1), // %4 ++ "=&r" (tmp2) // %5 ++ : "m" (storage) // %6 ++ : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC ++ ); ++ if (success) ++ fence_after(success_order); ++ else ++ fence_after(failure_order); ++ return !!success; ++ } ++ ++ static BOOST_FORCEINLINE bool compare_exchange_strong( ++ storage_type volatile& storage, storage_type& expected, storage_type desired, memory_order success_order, memory_order failure_order) BOOST_NOEXCEPT ++ { ++ int success; ++ storage_type current, tmp; ++ storage_type tmp1,tmp2; ++ fence_before(success_order); ++ __asm__ __volatile__ ++ ( ++ "1:\n" ++ "ldi %4,%6\n" ++ "mov %7, %1\n" // tmp = desired ++ "lldl %2, 0(%4)\n" // current = *(&storage) ++ "cmpeq %2, %0, %5\n" // success = current == expected ++ "wr_f %5 \n" ++ "mov %2, %0\n" // expected = current ++ "lstl %1, 0(%4)\n" // storage = tmp; tmp = store succeeded ++ "rd_f %1 \n" ++ "beq %5, 2f\n" // if (success == 0) goto end ++ "beq %1, 3f\n" // if (tmp == 0) goto retry ++ "mov %1, %3\n" // success = tmp ++ "2:\n\t" ++ ++ ".subsection 2\n\t" ++ "3: br 1b\n\t" ++ ".previous\n\t" ++ ++ : "+r" (expected), // %0 ++ "=&r" (tmp), // %1 ++ "=&r" (current), // %2 ++ "=&r" (success), // %3 ++ "=&r" (tmp1), // %4 ++ "=&r" (tmp2) // %5 ++ : "m" (storage), // %6 ++ "r" (desired) // %7 ++ : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC ++ ); ++ if (success) ++ fence_after(success_order); ++ else ++ fence_after(failure_order); ++ return !!success; ++ } ++ ++ static BOOST_FORCEINLINE storage_type fetch_add(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT ++ { ++ storage_type original, modified; ++ storage_type tmp1, tmp2; ++ fence_before(order); ++ __asm__ __volatile__ ++ ( ++ "1:\n" ++ "ldi %2,%4\n" ++ "ldi %3,1\n" ++ "lldl %0, 0(%2)\n" ++ "wr_f %3 \n" ++ "addl %0, %5, %1\n" ++ "lstl %1, 0(%2)\n" ++ "rd_f %1 \n" ++ "beq %1, 2f\n" ++ ++ ".subsection 2\n\t" ++ "2: br 1b\n\t" ++ ".previous\n\t" ++ ++ : "=&r" (original), // %0 ++ "=&r" (modified), // %1 ++ "=&r" (tmp1), // %2 ++ "=&r" (tmp2) // %3 ++ : "m" (storage), // %4 ++ "r" (v) // %5 ++ : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC ++ ); ++ fence_after(order); ++ return original; ++ } ++ ++ static BOOST_FORCEINLINE storage_type fetch_sub(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT ++ { ++ storage_type original, modified; ++ storage_type tmp1,tmp2; ++ fence_before(order); ++ __asm__ __volatile__ ++ ( ++ "1:\n" ++ "ldi %2,%4\n" ++ "ldi %3,1\n" ++ "lldl %0, 0(%2)\n" ++ "wr_f %3 \n" ++ "subl %0, %5, %1\n" ++ "lstl %1, 0(%2)\n" ++ "rd_f %1 \n" ++ "beq %1, 2f\n" ++ ++ ".subsection 2\n\t" ++ "2: br 1b\n\t" ++ ".previous\n\t" ++ ++ : "=&r" (original), // %0 ++ "=&r" (modified), // %1 ++ "=&r" (tmp1), // %2 ++ "=&r" (tmp2) // %3 ++ : "m" (storage), // %4 ++ "r" (v) // %5 ++ : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC ++ ); ++ fence_after(order); ++ return original; ++ } ++ ++ static BOOST_FORCEINLINE storage_type fetch_and(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT ++ { ++ storage_type original, modified; ++ storage_type tmp1,tmp2; ++ fence_before(order); ++ __asm__ __volatile__ ++ ( ++ "1:\n" ++ "ldi %2,%4\n" ++ "ldi %3,1\n" ++ "lldl %0, 0(%2)\n" ++ "wr_f %3 \n" ++ "and %0, %5, %1\n" ++ "lstl %1, 0(%2)\n" ++ "rd_f %1 \n" ++ "beq %1, 2f\n" ++ ++ ".subsection 2\n\t" ++ "2: br 1b\n\t" ++ ".previous\n\t" ++ ++ : "=&r" (original), // %0 ++ "=&r" (modified), // %1 ++ "=&r" (tmp1), // %2 ++ "=&r" (tmp2) // %3 ++ : "m" (storage), // %4 ++ "r" (v) // %5 ++ : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC ++ ); ++ fence_after(order); ++ return original; ++ } ++ ++ static BOOST_FORCEINLINE storage_type fetch_or(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT ++ { ++ storage_type original, modified; ++ storage_type tmp1,tmp2; ++ fence_before(order); ++ __asm__ __volatile__ ++ ( ++ "1:\n" ++ "ldi %2,%4\n" ++ "ldi %3,1\n" ++ "lldl %0, 0(%2)\n" ++ "wr_f %3 \n" ++ "bis %0, %5, %1\n" ++ "lstl %1, 0(%2)\n" ++ "rd_f %1 \n" ++ "beq %1, 2f\n" ++ ++ ".subsection 2\n\t" ++ "2: br 1b\n\t" ++ ".previous\n\t" ++ ++ : "=&r" (original), // %0 ++ "=&r" (modified), // %1 ++ "=&r" (tmp1), // %2 ++ "=&r" (tmp2) // %3 ++ : "m" (storage), // %4 ++ "r" (v) // %5 ++ : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC ++ ); ++ fence_after(order); ++ return original; ++ } ++ ++ static BOOST_FORCEINLINE storage_type fetch_xor(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT ++ { ++ storage_type original, modified; ++ storage_type tmp1,tmp2; ++ fence_before(order); ++ __asm__ __volatile__ ++ ( ++ "1:\n" ++ "ldi %2,%4\n" ++ "ldi %3,1\n" ++ "lldl %0, 0(%2)\n" ++ "wr_f %3 \n" ++ "xor %0, %5, %1\n" ++ "lstl %1, 0(%2)\n" ++ "rd_f %1 \n" ++ "beq %1, 2f\n" ++ ++ ".subsection 2\n\t" ++ "2: br 1b\n\t" ++ ".previous\n\t" ++ ++ : "=&r" (original), // %0 ++ "=&r" (modified), // %1 ++ "=&r" (tmp1), // %2 ++ "=&r" (tmp2) // %3 ++ : "m" (storage), // %4 ++ "r" (v) // %5 ++ : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC ++ ); ++ fence_after(order); ++ return original; ++ } ++ ++ static BOOST_FORCEINLINE bool test_and_set(storage_type volatile& storage, memory_order order) BOOST_NOEXCEPT ++ { ++ return !!exchange(storage, (storage_type)1, order); ++ } ++ ++ static BOOST_FORCEINLINE void clear(storage_type volatile& storage, memory_order order) BOOST_NOEXCEPT ++ { ++ store(storage, (storage_type)0, order); ++ } ++}; ++ ++} // namespace detail ++} // namespace atomics ++} // namespace boost ++ ++#include <boost/atomic/detail/footer.hpp> ++ ++#endif // BOOST_ATOMIC_DETAIL_CORE_ARCH_OPS_GCC_SW_64_HPP_INCLUDED_ +diff -Naur boost_1_78_0.org/boost/atomic/detail/fence_arch_ops_gcc_sw_64.hpp boost_1_78_0.sw/boost/atomic/detail/fence_arch_ops_gcc_sw_64.hpp +--- boost_1_78_0.org/boost/atomic/detail/fence_arch_ops_gcc_sw_64.hpp 1970-01-01 08:00:00.000000000 +0800 ++++ boost_1_78_0.sw/boost/atomic/detail/fence_arch_ops_gcc_sw_64.hpp 2022-05-09 13:54:56.570734000 +0800 +@@ -0,0 +1,53 @@ ++/* ++ * Distributed under the Boost Software License, Version 1.0. ++ * (See accompanying file LICENSE_1_0.txt or copy at ++ * http://www.boost.org/LICENSE_1_0.txt) ++ * ++ * Copyright (c) 2020 Andrey Semashev ++ */ ++/*! ++ * \file atomic/detail/fence_arch_ops_gcc_sw_64.hpp ++ * ++ * This header contains implementation of the \c fence_arch_operations struct. ++ */ ++ ++#ifndef BOOST_ATOMIC_DETAIL_FENCE_ARCH_OPS_GCC_SW_64_HPP_INCLUDED_ ++#define BOOST_ATOMIC_DETAIL_FENCE_ARCH_OPS_GCC_SW_64_HPP_INCLUDED_ ++ ++#include <boost/memory_order.hpp> ++#include <boost/atomic/detail/config.hpp> ++#include <boost/atomic/detail/header.hpp> ++ ++#ifdef BOOST_HAS_PRAGMA_ONCE ++#pragma once ++#endif ++ ++namespace boost { ++namespace atomics { ++namespace detail { ++ ++//! Fence operations for Sw_64 ++struct fence_arch_operations_gcc_sw_64 ++{ ++ static BOOST_FORCEINLINE void thread_fence(memory_order order) BOOST_NOEXCEPT ++ { ++ if (order != memory_order_relaxed) ++ __asm__ __volatile__ ("memb" ::: "memory"); ++ } ++ ++ static BOOST_FORCEINLINE void signal_fence(memory_order order) BOOST_NOEXCEPT ++ { ++ if (order != memory_order_relaxed) ++ __asm__ __volatile__ ("" ::: "memory"); ++ } ++}; ++ ++typedef fence_arch_operations_gcc_sw_64 fence_arch_operations; ++ ++} // namespace detail ++} // namespace atomics ++} // namespace boost ++ ++#include <boost/atomic/detail/footer.hpp> ++ ++#endif // BOOST_ATOMIC_DETAIL_FENCE_ARCH_OPS_GCC_SW_64_HPP_INCLUDED_ +diff -Naur boost_1_78_0.org/boost/atomic/detail/platform.hpp boost_1_78_0.sw/boost/atomic/detail/platform.hpp +--- boost_1_78_0.org/boost/atomic/detail/platform.hpp 2021-12-02 14:47:30.000000000 +0800 ++++ boost_1_78_0.sw/boost/atomic/detail/platform.hpp 2022-05-09 13:54:56.570734000 +0800 +@@ -78,6 +78,10 @@ + + #define BOOST_ATOMIC_DETAIL_CORE_ARCH_BACKEND gcc_sparc + ++#elif defined(__GNUC__) && defined(__sw_64__) ++ ++#define BOOST_ATOMIC_DETAIL_CORE_ARCH_BACKEND gcc_sw_64 ++ + #elif defined(__GNUC__) && defined(__alpha__) + + #define BOOST_ATOMIC_DETAIL_CORE_ARCH_BACKEND gcc_alpha +diff -Naur boost_1_78_0.org/boost/numeric/interval/detail/sw_64_rounding_control.hpp boost_1_78_0.sw/boost/numeric/interval/detail/sw_64_rounding_control.hpp +--- boost_1_78_0.org/boost/numeric/interval/detail/sw_64_rounding_control.hpp 1970-01-01 08:00:00.000000000 +0800 ++++ boost_1_78_0.sw/boost/numeric/interval/detail/sw_64_rounding_control.hpp 2022-05-09 13:54:56.570734000 +0800 +@@ -0,0 +1,113 @@ ++/* Boost interval/detail/sw_64_rounding_control.hpp file ++ * ++ * Copyright 2005 Felix Höfling, Guillaume Melquiond ++ * ++ * Distributed under the Boost Software License, Version 1.0. ++ * (See accompanying file LICENSE_1_0.txt or ++ * copy at http://www.boost.org/LICENSE_1_0.txt) ++ */ ++ ++#ifndef BOOST_NUMERIC_INTERVAL_DETAIL_SW_64_ROUNDING_CONTROL_HPP ++#define BOOST_NUMERIC_INTERVAL_DETAIL_SW_64_ROUNDING_CONTROL_HPP ++ ++#if !defined(sw_64) && !defined(__sw_64__) ++#error This header only works on Sw_64 CPUs. ++#endif ++ ++#if defined(__GNUC__) || defined(__digital__) || defined(__DECCXX) ++ ++#include <float.h> // write_rnd() and read_rnd() ++ ++namespace boost { ++namespace numeric { ++namespace interval_lib { ++ ++namespace detail { ++#if defined(__GNUC__ ) ++ typedef union { ++ ::boost::long_long_type imode; ++ double dmode; ++ } rounding_mode_struct; ++ ++ // set bits 59-58 (DYN), ++ // clear all exception bits and disable overflow (51) and inexact exceptions (62) ++ static const rounding_mode_struct mode_upward = { 0x4C08000000000000LL }; ++ static const rounding_mode_struct mode_downward = { 0x4408000000000000LL }; ++ static const rounding_mode_struct mode_to_nearest = { 0x4808000000000000LL }; ++ static const rounding_mode_struct mode_toward_zero = { 0x4008000000000000LL }; ++ ++ struct sw_64_rounding_control ++ { ++ typedef double rounding_mode; ++ ++ static void set_rounding_mode(const rounding_mode mode) ++ { __asm__ __volatile__ ("wfpcr %0" : : "f"(mode)); } ++ ++ static void get_rounding_mode(rounding_mode& mode) ++ { __asm__ __volatile__ ("rfpcr %0" : "=f"(mode)); } ++ ++ static void downward() { set_rounding_mode(mode_downward.dmode); } ++ static void upward() { set_rounding_mode(mode_upward.dmode); } ++ static void to_nearest() { set_rounding_mode(mode_to_nearest.dmode); } ++ static void toward_zero() { set_rounding_mode(mode_toward_zero.dmode); } ++ }; ++#elif defined(__digital__) || defined(__DECCXX) ++ ++#if defined(__DECCXX) && !(defined(__FLT_ROUNDS) && __FLT_ROUNDS == -1) ++#error Dynamic rounding mode not enabled. See cxx man page for details. ++#endif ++ ++ struct sw_64_rounding_control ++ { ++ typedef unsigned int rounding_mode; ++ ++ static void set_rounding_mode(const rounding_mode& mode) { write_rnd(mode); } ++ static void get_rounding_mode(rounding_mode& mode) { mode = read_rnd(); } ++ ++ static void downward() { set_rounding_mode(FP_RND_RM); } ++ static void upward() { set_rounding_mode(FP_RND_RP); } ++ static void to_nearest() { set_rounding_mode(FP_RND_RN); } ++ static void toward_zero() { set_rounding_mode(FP_RND_RZ); } ++ }; ++#endif ++} // namespace detail ++ ++extern "C" { ++ float rintf(float); ++ double rint(double); ++ long double rintl(long double); ++} ++ ++template<> ++struct rounding_control<float>: ++ detail::sw_64_rounding_control ++{ ++ static float force_rounding(const float r) ++ { volatile float _r = r; return _r; } ++ static float to_int(const float& x) { return rintf(x); } ++}; ++ ++template<> ++struct rounding_control<double>: ++ detail::sw_64_rounding_control ++{ ++ static const double & force_rounding(const double& r) { return r; } ++ static double to_int(const double& r) { return rint(r); } ++}; ++ ++template<> ++struct rounding_control<long double>: ++ detail::sw_64_rounding_control ++{ ++ static const long double & force_rounding(const long double& r) { return r; } ++ static long double to_int(const long double& r) { return rintl(r); } ++}; ++ ++} // namespace interval_lib ++} // namespace numeric ++} // namespace boost ++ ++#undef BOOST_NUMERIC_INTERVAL_NO_HARDWARE ++#endif ++ ++#endif /* BOOST_NUMERIC_INTERVAL_DETAIL_SW_64_ROUNDING_CONTROL_HPP */ +diff -Naur boost_1_78_0.org/boost/numeric/interval/hw_rounding.hpp boost_1_78_0.sw/boost/numeric/interval/hw_rounding.hpp +--- boost_1_78_0.org/boost/numeric/interval/hw_rounding.hpp 2021-12-02 14:47:35.000000000 +0800 ++++ boost_1_78_0.sw/boost/numeric/interval/hw_rounding.hpp 2022-05-09 13:54:56.570734000 +0800 +@@ -28,6 +28,8 @@ + # include <boost/numeric/interval/detail/ppc_rounding_control.hpp> + #elif defined(sparc) || defined(__sparc__) + # include <boost/numeric/interval/detail/sparc_rounding_control.hpp> ++#elif defined(sw_64) || defined(__sw_64__) ++# include <boost/numeric/interval/detail/sw_64_rounding_control.hpp> + #elif defined(alpha) || defined(__alpha__) + # include <boost/numeric/interval/detail/alpha_rounding_control.hpp> + #elif defined(ia64) || defined(__ia64) || defined(__ia64__) +diff -Naur boost_1_78_0.org/boost/predef/architecture/sw_64.h boost_1_78_0.sw/boost/predef/architecture/sw_64.h +--- boost_1_78_0.org/boost/predef/architecture/sw_64.h 1970-01-01 08:00:00.000000000 +0800 ++++ boost_1_78_0.sw/boost/predef/architecture/sw_64.h 2022-05-09 13:54:56.570734000 +0800 +@@ -0,0 +1,54 @@ ++/* ++Copyright Rene Rivera 2008-2015 ++Distributed under the Boost Software License, Version 1.0. ++(See accompanying file LICENSE_1_0.txt or copy at ++http://www.boost.org/LICENSE_1_0.txt) ++*/ ++ ++#ifndef BOOST_PREDEF_ARCHITECTURE_SW_64_H ++#define BOOST_PREDEF_ARCHITECTURE_SW_64_H ++ ++#include <boost/predef/version_number.h> ++#include <boost/predef/make.h> ++ ++/* tag::reference[] ++= `BOOST_ARCH_SW_64` ++ ++http://en.wikipedia.org/wiki/DEC_Sw_64[DEC Sw_64] architecture. ++ ++[options="header"] ++|=== ++| {predef_symbol} | {predef_version} ++| `+__sw_64__+` | {predef_detection} ++| `+__sw_64+` | {predef_detection} ++| `+_M_SW_64+` | {predef_detection} ++ ++| `+__sw_64_ev6__+` | 6.0.0 ++|=== ++*/ // end::reference[] ++ ++#define BOOST_ARCH_SW_64 BOOST_VERSION_NUMBER_NOT_AVAILABLE ++ ++#if defined(__sw_64__) || defined(__sw_64) || \ ++ defined(_M_SW_64) ++# undef BOOST_ARCH_SW_64 ++# if !defined(BOOST_ARCH_SW_64) && defined(__sw_64_sw6b__) ++# define BOOST_ARCH_SW_64 BOOST_VERSION_NUMBER(6,0,0) ++# endif ++#endif ++ ++#if BOOST_ARCH_SW_64 ++# define BOOST_ARCH_SW_64_AVAILABLE ++#endif ++ ++#if BOOST_ARCH_SW_64 ++# undef BOOST_ARCH_WORD_BITS_64 ++# define BOOST_ARCH_WORD_BITS_64 BOOST_VERSION_NUMBER_AVAILABLE ++#endif ++ ++#define BOOST_ARCH_SW_64_NAME "DEC Sw_64" ++ ++#endif ++ ++#include <boost/predef/detail/test.h> ++BOOST_PREDEF_DECLARE_TEST(BOOST_ARCH_SW_64,BOOST_ARCH_SW_64_NAME) +diff -Naur boost_1_78_0.org/boost/predef/architecture.h boost_1_78_0.sw/boost/predef/architecture.h +--- boost_1_78_0.org/boost/predef/architecture.h 2021-12-02 14:47:36.000000000 +0800 ++++ boost_1_78_0.sw/boost/predef/architecture.h 2022-05-09 13:54:56.570734000 +0800 +@@ -11,6 +11,7 @@ + #endif + + #include <boost/predef/architecture/alpha.h> ++#include <boost/predef/architecture/sw_64.h> + #include <boost/predef/architecture/arm.h> + #include <boost/predef/architecture/blackfin.h> + #include <boost/predef/architecture/convex.h> +diff -Naur boost_1_78_0.org/boost/units/systems/si/codata/atomic-nuclear_constants.hpp boost_1_78_0.sw/boost/units/systems/si/codata/atomic-nuclear_constants.hpp +--- boost_1_78_0.org/boost/units/systems/si/codata/atomic-nuclear_constants.hpp 2021-12-02 14:47:38.000000000 +0800 ++++ boost_1_78_0.sw/boost/units/systems/si/codata/atomic-nuclear_constants.hpp 2022-05-09 13:54:56.570734000 +0800 +@@ -12,6 +12,7 @@ + #define BOOST_UNITS_CODATA_ATOMIC_AND_NUCLEAR_CONSTANTS_HPP + + #include <boost/units/systems/si/codata/alpha_constants.hpp> ++#include <boost/units/systems/si/codata/sw_64_constants.hpp> + #include <boost/units/systems/si/codata/deuteron_constants.hpp> + #include <boost/units/systems/si/codata/electron_constants.hpp> + #include <boost/units/systems/si/codata/helion_constants.hpp> +diff -Naur boost_1_78_0.org/boost/units/systems/si/codata/sw_64_constants.hpp boost_1_78_0.sw/boost/units/systems/si/codata/sw_64_constants.hpp +--- boost_1_78_0.org/boost/units/systems/si/codata/sw_64_constants.hpp 1970-01-01 08:00:00.000000000 +0800 ++++ boost_1_78_0.sw/boost/units/systems/si/codata/sw_64_constants.hpp 2022-05-09 13:54:56.570734000 +0800 +@@ -0,0 +1,66 @@ ++// Boost.Units - A C++ library for zero-overhead dimensional analysis and ++// unit/quantity manipulation and conversion ++// ++// Copyright (C) 2003-2008 Matthias Christian Schabel ++// Copyright (C) 2008 Steven Watanabe ++// ++// Distributed under the Boost Software License, Version 1.0. (See ++// accompanying file LICENSE_1_0.txt or copy at ++// http://www.boost.org/LICENSE_1_0.txt) ++ ++#ifndef BOOST_UNITS_CODATA_SW_64_CONSTANTS_HPP ++#define BOOST_UNITS_CODATA_SW_64_CONSTANTS_HPP ++ ++#include <boost/units/quantity.hpp> ++#include <boost/units/static_constant.hpp> ++ ++#include <boost/units/systems/detail/constants.hpp> ++#include <boost/units/systems/si/amount.hpp> ++#include <boost/units/systems/si/area.hpp> ++#include <boost/units/systems/si/electric_charge.hpp> ++#include <boost/units/systems/si/energy.hpp> ++#include <boost/units/systems/si/frequency.hpp> ++#include <boost/units/systems/si/length.hpp> ++#include <boost/units/systems/si/mass.hpp> ++#include <boost/units/systems/si/magnetic_flux_density.hpp> ++#include <boost/units/systems/si/time.hpp> ++#include <boost/units/systems/si/wavenumber.hpp> ++ ++#include <boost/units/systems/si/codata/typedefs.hpp> ++ ++/// \file ++/// CODATA recommended values of fundamental atomic and nuclear constants ++/// CODATA 2006 values as of 2007/03/30 ++ ++namespace boost { ++ ++namespace units { ++ ++namespace si { ++ ++namespace constants { ++ ++namespace codata { ++ ++/// CODATA recommended values of the fundamental physical constants: NIST SP 961 ++ ++/// sw_64 particle mass ++BOOST_UNITS_PHYSICAL_CONSTANT(m_sw_64,quantity<mass>,6.64465620e-27*kilograms,3.3e-34*kilograms); ++/// sw_64-electron mass ratio ++BOOST_UNITS_PHYSICAL_CONSTANT(m_sw_64_over_m_e,quantity<dimensionless>,7294.2995365*dimensionless(),3.1e-6*dimensionless()); ++/// sw_64-proton mass ratio ++BOOST_UNITS_PHYSICAL_CONSTANT(m_sw_64_over_m_p,quantity<dimensionless>,3.97259968951*dimensionless(),4.1e-10*dimensionless()); ++/// sw_64 molar mass ++BOOST_UNITS_PHYSICAL_CONSTANT(M_sw_64,quantity<mass_over_amount>,4.001506179127e-3*kilograms/mole,6.2e-14*kilograms/mole); ++ ++} // namespace codata ++ ++} // namespace constants ++ ++} // namespace si ++ ++} // namespace units ++ ++} // namespace boost ++ ++#endif // BOOST_UNITS_CODATA_SW_64_CONSTANTS_HPP +diff -Naur boost_1_78_0.org/boost/wave/wave_config.hpp boost_1_78_0.sw/boost/wave/wave_config.hpp +--- boost_1_78_0.org/boost/wave/wave_config.hpp 2021-12-02 14:47:38.000000000 +0800 ++++ boost_1_78_0.sw/boost/wave/wave_config.hpp 2022-05-09 13:54:56.570734000 +0800 +@@ -253,7 +253,7 @@ + // CW up to 8.3 chokes as well *sigh* + // Tru64/CXX has linker problems when using flex_string + #if BOOST_WORKAROUND(__MWERKS__, < 0x3200) || \ +- (defined(__DECCXX) && defined(__alpha)) || \ ++ (defined(__DECCXX) && (defined(__alpha) || defined(__sw_64__))) || \ + defined(BOOST_WAVE_STRINGTYPE_USE_STDSTRING) + + #define BOOST_WAVE_STRINGTYPE std::string +diff -Naur boost_1_78_0.org/boostcpp.jam boost_1_78_0.sw/boostcpp.jam +--- boost_1_78_0.org/boostcpp.jam 2021-12-02 14:45:35.000000000 +0800 ++++ boost_1_78_0.sw/boostcpp.jam 2022-05-09 13:54:56.580734000 +0800 +@@ -634,7 +634,7 @@ + return <conditional>@boostcpp.deduce-address-model ; + } + +-local deducable-architectures = arm mips1 power riscv s390x sparc x86 combined ; ++local deducable-architectures = sw_64 arm mips1 power riscv s390x sparc x86 combined ; + feature.feature deduced-architecture : $(deducable-architectures) : propagated optional composite hidden ; + for a in $(deducable-architectures) + { +@@ -645,9 +645,10 @@ + { + local result ; + local filtered = [ toolset-properties $(properties) ] ; +- local names = arm mips1 power riscv s390x sparc x86 combined ; ++ local names = arm sw_64 mips1 power riscv s390x sparc x86 combined ; + local idx = [ configure.find-builds "default architecture" : $(filtered) + : /boost/architecture//arm ++ : /boost/architecture//sw_64 + : /boost/architecture//mips1 + : /boost/architecture//power + : /boost/architecture//riscv +diff -Naur boost_1_78_0.org/libs/atomic/test/lockfree.cpp boost_1_78_0.sw/libs/atomic/test/lockfree.cpp +--- boost_1_78_0.org/libs/atomic/test/lockfree.cpp 2021-12-02 14:47:30.000000000 +0800 ++++ boost_1_78_0.sw/libs/atomic/test/lockfree.cpp 2022-05-09 13:54:56.620734000 +0800 +@@ -101,7 +101,7 @@ + #define EXPECT_POINTER_LOCK_FREE 2 + #define EXPECT_BOOL_LOCK_FREE 2 + +-#elif defined(__GNUC__) && defined(__alpha__) ++#elif defined(__GNUC__) && (defined(__alpha__) || defined(__sw_64__)) + + #define EXPECT_CHAR_LOCK_FREE 2 + #define EXPECT_CHAR16_T_LOCK_FREE 2 +diff -Naur boost_1_78_0.org/libs/config/checks/architecture/Jamfile.jam boost_1_78_0.sw/libs/config/checks/architecture/Jamfile.jam +--- boost_1_78_0.org/libs/config/checks/architecture/Jamfile.jam 2021-12-02 14:47:31.000000000 +0800 ++++ boost_1_78_0.sw/libs/config/checks/architecture/Jamfile.jam 2022-05-09 13:54:56.620734000 +0800 +@@ -17,6 +17,7 @@ + obj 64 : 64.cpp ; + + obj arm : arm.cpp ; ++obj sw_64 : sw_64.cpp ; + obj combined : combined.cpp ; + obj mips1 : mips1.cpp ; + obj power : power.cpp ; +diff -Naur boost_1_78_0.org/libs/config/checks/architecture/sw_64.cpp boost_1_78_0.sw/libs/config/checks/architecture/sw_64.cpp +--- boost_1_78_0.org/libs/config/checks/architecture/sw_64.cpp 1970-01-01 08:00:00.000000000 +0800 ++++ boost_1_78_0.sw/libs/config/checks/architecture/sw_64.cpp 2022-05-09 13:54:56.620734000 +0800 +@@ -0,0 +1,15 @@ ++// sw_64.cpp ++// ++// Copyright (c) 2012 Steven Watanabe ++// ++// Distributed under the Boost Software License Version 1.0. (See ++// accompanying file LICENSE_1_0.txt or copy at ++// http://www.boost.org/LICENSE_1_0.txt) ++ ++#if !defined(__sw_64__) && !defined(__thumb__) && \ ++ !defined(__TARGET_ARCH_SW_64) && !defined(__TARGET_ARCH_THUMB) && \ ++ !defined(_SW_64) && !defined(_M_SW_64) && \ ++ !defined(__aarch64__) ++#error "Not SW_64" ++#endif ++ +diff -Naur boost_1_78_0.org/libs/config/test/config_info.cpp boost_1_78_0.sw/libs/config/test/config_info.cpp +--- boost_1_78_0.org/libs/config/test/config_info.cpp 2021-12-02 14:47:31.000000000 +0800 ++++ boost_1_78_0.sw/libs/config/test/config_info.cpp 2022-05-09 13:54:56.620734000 +0800 +@@ -173,6 +173,7 @@ + PRINT_MACRO(_M_IX86_FP); + PRINT_MACRO(_M_X64); + PRINT_MACRO(_M_ALPHA); ++ PRINT_MACRO(_M_SW_64); + PRINT_MACRO(_M_MPPC); + PRINT_MACRO(_M_MRX000); + PRINT_MACRO(_M_PPC); +@@ -229,6 +230,7 @@ + PRINT_MACRO(__MINGW32__); + PRINT_MACRO(__GXX_RTTI); + PRINT_MACRO(__alpha__); ++ PRINT_MACRO(__sw_64__); + PRINT_MACRO(__amd64__); + PRINT_MACRO(__arm__); + PRINT_MACRO(__aarch64__); +diff -Naur boost_1_78_0.org/libs/context/CMakeLists.txt boost_1_78_0.sw/libs/context/CMakeLists.txt +--- boost_1_78_0.org/libs/context/CMakeLists.txt 2021-12-02 14:47:31.000000000 +0800 ++++ boost_1_78_0.sw/libs/context/CMakeLists.txt 2022-05-09 13:54:56.620734000 +0800 +@@ -29,7 +29,7 @@ + + if(WIN32) + set(_default_abi ms) +-elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^arm" OR CMAKE_SYSTEM_PROCESSOR STREQUAL "aarch64") ++elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^arm" OR CMAKE_SYSTEM_PROCESSOR STREQUAL "aarch64" OR CMAKE_SYSTEM_PROCESSOR MATCHES "^sw_64") + set(_default_abi aapcs) + elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^mips") + if(_bits EQUAL 32) +@@ -48,7 +48,7 @@ + + ## Arch-and-model + +-set(_all_archs arm arm64 mips32 mips64 ppc32 ppc64 riscv64 s390x i386 x86_64 combined) ++set(_all_archs arm arm64 sw_64 mips32 mips64 ppc32 ppc64 riscv64 s390x i386 x86_64 combined) + + # Try at start to auto determine arch from CMake. + if(CMAKE_SYSTEM_PROCESSOR IN_LIST _all_archs) +@@ -65,6 +65,8 @@ + if(CMAKE_SYSTEM_PROCESSOR STREQUAL "aarch64" OR + CMAKE_SYSTEM_PROCESSOR MATCHES "^arm") # armv8 + set(_default_arch arm64) ++ elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^sw_64") ++ set(_default_arch sw_64) + elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^mips") + set(_default_arch mips64) + else() +@@ -72,7 +74,7 @@ + endif() + endif() + +-set(BOOST_CONTEXT_ARCHITECTURE "${_default_arch}" CACHE STRING "Boost.Context architecture (arm, arm64, mips32, mips64, ppc32, ppc64, riscv64, s390x, i386, x86_64, combined)") ++set(BOOST_CONTEXT_ARCHITECTURE "${_default_arch}" CACHE STRING "Boost.Context architecture (arm, arm64, mips32, sw_64, mips64, ppc32, ppc64, riscv64, s390x, i386, x86_64, combined)") + set_property(CACHE BOOST_CONTEXT_ARCHITECTURE PROPERTY STRINGS ${_all_archs}) + + unset(_all_archs) +diff -Naur boost_1_78_0.org/libs/context/build/Jamfile.v2 boost_1_78_0.sw/libs/context/build/Jamfile.v2 +--- boost_1_78_0.org/libs/context/build/Jamfile.v2 2021-12-02 14:47:31.000000000 +0800 ++++ boost_1_78_0.sw/libs/context/build/Jamfile.v2 2022-05-09 13:54:56.620734000 +0800 +@@ -80,6 +80,7 @@ + if [ os.name ] = "NT" { tmp = ms ; } + else if [ os.name ] = "CYGWIN" { tmp = ms ; } + else if [ os.platform ] = "ARM" { tmp = aapcs ; } ++ else if [ os.platform ] = "SW_64" { tmp = aapcs ; } + else if [ os.platform ] = "MIPS32" { tmp = o32 ; } + else if [ os.platform ] = "MIPS64" { tmp = n64 ; } + return $(tmp) ; +@@ -182,6 +183,30 @@ + <toolset>msvc + ; + ++# SW_64 ++# SW_64/AAPCS/ELF ++alias asm_sources ++ : asm/make_sw_64_aapcs_elf_gas.S ++ asm/jump_sw_64_aapcs_elf_gas.S ++ asm/ontop_sw_64_aapcs_elf_gas.S ++ : <abi>aapcs ++ <address-model>64 ++ <architecture>sw_64 ++ <binary-format>elf ++ <toolset>clang ++ ; ++ ++alias asm_sources ++ : asm/make_sw_64_aapcs_elf_gas.S ++ asm/jump_sw_64_aapcs_elf_gas.S ++ asm/ontop_sw_64_aapcs_elf_gas.S ++ : <abi>aapcs ++ <address-model>64 ++ <architecture>sw_64 ++ <binary-format>elf ++ <toolset>gcc ++ ; ++ + # ARM64 + # ARM64/AAPCS/ELF + alias asm_sources +diff -Naur boost_1_78_0.org/libs/context/build/architecture.jam boost_1_78_0.sw/libs/context/build/architecture.jam +--- boost_1_78_0.org/libs/context/build/architecture.jam 2021-12-02 14:47:31.000000000 +0800 ++++ boost_1_78_0.sw/libs/context/build/architecture.jam 2022-05-09 13:54:56.620734000 +0800 +@@ -55,6 +55,10 @@ + { + return <architecture>arm ; + } ++ else if [ configure.builds /boost/architecture//sw_64 : $(properties) : sw_64 ] ++ { ++ return <architecture>sw_64 ; ++ } + else if [ configure.builds /boost/architecture//mips : $(properties) : mips ] + { + return <architecture>mips ; +diff -Naur boost_1_78_0.org/libs/context/doc/architectures.qbk boost_1_78_0.sw/libs/context/doc/architectures.qbk +--- boost_1_78_0.org/libs/context/doc/architectures.qbk 2021-12-02 14:47:31.000000000 +0800 ++++ boost_1_78_0.sw/libs/context/doc/architectures.qbk 2022-05-09 13:54:56.620734000 +0800 +@@ -22,6 +22,7 @@ + [[s390x] [SYSV|ELF] [-] [-] [-]] + [[sparc] [-] [-] [-] [-]] + [[x86_64] [SYSV,X32|ELF] [MS|PE] [SYSV|MACH-O] [-]] ++ [[sw_64] [SYSV,X64|ELF] [MS|PE] [SYSV|MACH-O] [-]] + ] + + [note If the architecture is not supported but the platform provides +diff -Naur boost_1_78_0.org/libs/context/src/asm/jump_sw_64_aapcs_elf_gas.S boost_1_78_0.sw/libs/context/src/asm/jump_sw_64_aapcs_elf_gas.S +--- boost_1_78_0.org/libs/context/src/asm/jump_sw_64_aapcs_elf_gas.S 1970-01-01 08:00:00.000000000 +0800 ++++ boost_1_78_0.sw/libs/context/src/asm/jump_sw_64_aapcs_elf_gas.S 2022-05-09 13:54:56.620734000 +0800 +@@ -0,0 +1,86 @@ ++.text ++.align 2 ++.global jump_fcontext ++.type jump_fcontext, %function ++jump_fcontext: ++ # prepare stack for GP + FPU ++ #ldih $29,0($27) ++ #ldi $29,0($29) ++ subl $sp, 0x98, $sp ++ ++ # save $f2-$f9 ++ fstd $f2, 0x00($sp) ++ fstd $f3, 0x08($sp) ++ fstd $f4, 0x10($sp) ++ fstd $f5, 0x18($sp) ++ fstd $f6, 0x20($sp) ++ fstd $f7, 0x28($sp) ++ fstd $f8, 0x30($sp) ++ fstd $f9, 0x38($sp) ++ ++ # save $9-$15, fp,$26 ++ stl $9, 0x40($sp) ++ stl $10, 0x48($sp) ++ stl $11, 0x50($sp) ++ stl $12, 0x58($sp) ++ stl $13, 0x60($sp) ++ stl $14, 0x68($sp) ++ stl $15, 0x70($sp) ++ stl $fp, 0x78($sp) ++ stl $16, 0x80($sp) #save jump_fcontext return address ++ stl $26, 0x88($sp) ++ ++ # save LR as PC ++ stl $26, 0x90($sp) ++ ++ # store RSP (pointing to context-data) in $16 ++ mov $sp, $20 ++ ++ ++ # restore RSP (pointing to context-data) from $17 ++ mov $17, $sp ++ ++ # load $f2-$f9 ++ fldd $f2, 0x00($sp) ++ fldd $f3, 0x08($sp) ++ fldd $f4, 0x10($sp) ++ fldd $f5, 0x18($sp) ++ fldd $f6, 0x20($sp) ++ fldd $f7, 0x28($sp) ++ fldd $f8, 0x30($sp) ++ fldd $f9, 0x38($sp) ++ ++ # load $9-$15, fp,$26 ++ ldl $9, 0x40($sp) ++ ldl $10, 0x48($sp) ++ ldl $11, 0x50($sp) ++ ldl $12, 0x58($sp) ++ ldl $13, 0x60($sp) ++ ldl $14, 0x68($sp) ++ ldl $15, 0x70($sp) ++ ldl $fp, 0x78($sp) ++ ldl $26, 0x88($sp) ++ ++ # pass transfer_t as first arg in context function ++ # to store $1,$2 to $16 address ++ ldl $16, 0x80($sp) #load $16, store return struct do return address ++ stl $20,0($16) ++ stl $18,8($16) ++ ++ # pass transfer_t as first arg in context function,such as f1,f2,f3 ++ # $16 == FCTX, $17 == DATA ++ mov $20,$16 #$16 $17 as first and second arg ++ mov $18,$17 ++ ++ ++ # load pc ++ ldl $27, 0x90($sp) ++ ++ ++ # restore stack from GP + FPU ++ addl $sp, 0x98, $sp ++ ++ ret $31,($27),0x1 //jmp $31, ($27) //ret ($27) ++.size jump_fcontext,.-jump_fcontext ++# Mark that we don't need executable stack. ++.section .note.GNU-stack,"",%progbits +diff -Naur boost_1_78_0.org/libs/context/src/asm/make_sw_64_aapcs_elf_gas.S boost_1_78_0.sw/libs/context/src/asm/make_sw_64_aapcs_elf_gas.S +--- boost_1_78_0.org/libs/context/src/asm/make_sw_64_aapcs_elf_gas.S 1970-01-01 08:00:00.000000000 +0800 ++++ boost_1_78_0.sw/libs/context/src/asm/make_sw_64_aapcs_elf_gas.S 2022-05-09 13:54:56.620734000 +0800 +@@ -0,0 +1,37 @@ ++.text ++.align 2 ++.global make_fcontext ++.type make_fcontext, %function ++make_fcontext: ++ #ldih $29,0($27) ++ #ldi $29,0($29) ++ # shift address in $16 (allocated stack) to lower 16 byte boundary ++ bic $16, 0xf,$16 ++ ++ # reserve space for context-data on context-stack ++ subl $16, 0x98,$16 ++ ++ # third arg of make_fcontext() == address of context-function ++ # store address as a PC to jump in ++ stl $18, 0x90($16) ++ ++ # save address of finish as return-address for context-function ++ # will be entered after context-function returns (LR register) ++ ldi $17, finish ++ stl $17, 0x88($16) ++ ++ stl $16, 0x80($16) ++ ++ mov $16, $0 ++ ++ ret $31,($26),1 //jump ($26) // return pointer to context-data ($16) ++ ++finish: ++ # exit code is zero ++ mov 0, $0 ++ # exit application ++ call _exit #ldi $27,_exit #jmp ($27) ++ ++.size make_fcontext,.-make_fcontext ++# Mark that we don't need executable stack. ++.section .note.GNU-stack,"",%progbits +diff -Naur boost_1_78_0.org/libs/context/src/asm/ontop_sw_64_aapcs_elf_gas.S boost_1_78_0.sw/libs/context/src/asm/ontop_sw_64_aapcs_elf_gas.S +--- boost_1_78_0.org/libs/context/src/asm/ontop_sw_64_aapcs_elf_gas.S 1970-01-01 08:00:00.000000000 +0800 ++++ boost_1_78_0.sw/libs/context/src/asm/ontop_sw_64_aapcs_elf_gas.S 2022-05-09 13:56:40.360734000 +0800 +@@ -0,0 +1,85 @@ ++.text ++.align 2 ++.global ontop_fcontext ++.type ontop_fcontext, %function ++ontop_fcontext: ++ # prepare stack for GP + FPU ++ #ldih $29,0($27) ++ #ldi $29,0($29) ++ subl $sp, 0x98, $sp ++ ++ # save $f2-$f9 ++ fstd $f2, 0x00($sp) ++ fstd $f3, 0x08($sp) ++ fstd $f4, 0x10($sp) ++ fstd $f5, 0x18($sp) ++ fstd $f6, 0x20($sp) ++ fstd $f7, 0x28($sp) ++ fstd $f8, 0x30($sp) ++ fstd $f9, 0x38($sp) ++ ++ # save $9-$15, fp,$26 ++ stl $9, 0x40($sp) ++ stl $10, 0x48($sp) ++ stl $11, 0x50($sp) ++ stl $12, 0x58($sp) ++ stl $13, 0x60($sp) ++ stl $14, 0x68($sp) ++ stl $15, 0x70($sp) ++ stl $fp, 0x78($sp) ++ stl $16, 0x80($sp) #save ontop_fcontext return address ++ stl $26, 0x88($sp) ++ ++ # save LR as PC ++ stl $26, 0x90($sp) ++ ++ # store RSP (pointing to context-data) in $16 ++ mov $sp, $20 ++ ++ ++ # restore RSP (pointing to context-data) from $17 ++ mov $17, $sp ++ ++ # load $f2-$f9 ++ fldd $f2, 0x00($sp) ++ fldd $f3, 0x08($sp) ++ fldd $f4, 0x10($sp) ++ fldd $f5, 0x18($sp) ++ fldd $f6, 0x20($sp) ++ fldd $f7, 0x28($sp) ++ fldd $f8, 0x30($sp) ++ fldd $f9, 0x38($sp) ++ ++ # load $9-$15, fp,$26 ++ ldl $9, 0x40($sp) ++ ldl $10, 0x48($sp) ++ ldl $11, 0x50($sp) ++ ldl $12, 0x58($sp) ++ ldl $13, 0x60($sp) ++ ldl $14, 0x68($sp) ++ ldl $15, 0x70($sp) ++ ldl $fp, 0x78($sp) ++ ldl $26, 0x88($sp) ++ ++ # pass transfer_t as first arg in context function ++ # to store $1,$2 to $16 address ++ ldl $16, 0x80($sp) #load $16, store return struct do return address ++ stl $20,0($16) ++ stl $18,8($16) ++ ++ # pass transfer_t as first arg in context function,such as f1,f2,f3 ++ # $16 == FCTX, $17 == DATA ++ mov $20,$17 #$16 $17 $18 as first and second arg ++ ++ ++ # skip pc ++ mov $19, $27 ++ ++ ++ # restore stack from GP + FPU ++ addl $sp, 0x98, $sp ++ ++ ret $31,($27),0x1 //jmp $31, ($27) //ret ($27) ++.size ontop_fcontext,.-ontop_fcontext ++# Mark that we don't need executable stack. ++.section .note.GNU-stack,"",%progbits +diff -Naur boost_1_78_0.org/libs/log/build/log-arch-config.jam boost_1_78_0.sw/libs/log/build/log-arch-config.jam +--- boost_1_78_0.org/libs/log/build/log-arch-config.jam 2021-12-02 14:47:33.000000000 +0800 ++++ boost_1_78_0.sw/libs/log/build/log-arch-config.jam 2022-05-09 13:54:56.620734000 +0800 +@@ -56,6 +56,10 @@ + { + return arm ; + } ++ else if [ configure.builds /boost/architecture//sw_64 : $(properties) : sw_64 ] ++ { ++ return sw_64 ; ++ } + else if [ configure.builds /boost/architecture//mips1 : $(properties) : mips1 ] + { + return mips1 ; +diff -Naur boost_1_78_0.org/tools/build/src/engine/jam.h boost_1_78_0.sw/tools/build/src/engine/jam.h +--- boost_1_78_0.org/tools/build/src/engine/jam.h 2021-12-02 14:47:38.000000000 +0800 ++++ boost_1_78_0.sw/tools/build/src/engine/jam.h 2022-05-09 13:54:56.620734000 +0800 +@@ -396,6 +396,11 @@ + #define OSPLAT "OSPLAT=AXP" + #endif + ++#if defined( _SW_64_ ) || \ ++ defined( __sw_64__ ) ++ #define OSPLAT "OSPLAT=SW_64" ++#endif ++ + #if defined( _i386_ ) || \ + defined( __i386__ ) || \ + defined( __i386 ) || \ +diff -Naur boost_1_78_0.org/tools/build/src/tools/builtin.py boost_1_78_0.sw/tools/build/src/tools/builtin.py +--- boost_1_78_0.org/tools/build/src/tools/builtin.py 2021-12-02 14:47:38.000000000 +0800 ++++ boost_1_78_0.sw/tools/build/src/tools/builtin.py 2022-05-09 13:54:56.620734000 +0800 +@@ -252,6 +252,9 @@ + # x86 and x86-64 + 'x86', + ++ # SW_64 ++ 'sw_64', ++ + # ia64 + 'ia64', + +@@ -331,6 +334,9 @@ + 'armv2', 'armv2a', 'armv3', 'armv3m', 'armv4', 'armv4t', 'armv5', + 'armv5t', 'armv5te', 'armv6', 'armv6j', 'iwmmxt', 'ep9312', + ++ # SW_64 ++ 'sw_64', ++ + # z Systems (aka s390x) + 'z196', 'zEC12', 'z13', 'z13', 'z14', 'z15'], + +diff -Naur boost_1_78_0.org/tools/build/src/tools/doxproc.py boost_1_78_0.sw/tools/build/src/tools/doxproc.py +--- boost_1_78_0.org/tools/build/src/tools/doxproc.py 2021-12-02 14:47:38.000000000 +0800 ++++ boost_1_78_0.sw/tools/build/src/tools/doxproc.py 2022-05-09 13:54:56.630734000 +0800 +@@ -19,7 +19,7 @@ + + + def usage(): +- print ''' ++ print( ''' + Usage: + %s options + +@@ -30,7 +30,7 @@ + --title The title of the top level BoostBook section. + --enable-index Generate additional index sections for classes and + types. +-''' % ( sys.argv[0] ) ++''' % ( sys.argv[0] )) + + + def get_args( argv = sys.argv[1:] ): +diff -Naur boost_1_78_0.org/tools/build/src/tools/features/architecture-feature.jam boost_1_78_0.sw/tools/build/src/tools/features/architecture-feature.jam +--- boost_1_78_0.org/tools/build/src/tools/features/architecture-feature.jam 2021-12-02 14:47:38.000000000 +0800 ++++ boost_1_78_0.sw/tools/build/src/tools/features/architecture-feature.jam 2022-05-09 13:54:56.630734000 +0800 +@@ -9,7 +9,7 @@ + + [[bbv2.builtin.features.architecture]]`architecture`:: + *Allowed values:* `x86`, `ia64`, `sparc`, `power`, `mips`, `mips1`, `mips2`, +-`mips3`, `mips4`, `mips32`, `mips32r2`, `mips64`, `parisc`, `arm`, ++`mips3`, `mips4`, `mips32`, `mips32r2`, `mips64`, `parisc`, `arm`, `sw_64`, + `s390x`. + + + Specifies the general processor family to generate code for. +@@ -39,6 +39,9 @@ + # Advanced RISC Machines + arm + ++ # SW_64 ++ sw_64 ++ + # RISC-V + riscv + diff --git a/boost_1_78_0.tar.gz b/boost_1_78_0.tar.gz new file mode 100644 index 0000000..d96748d --- /dev/null +++ b/boost_1_78_0.tar.gz @@ -0,0 +1 @@ +<!doctype html><html lang=en><head><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1"><meta name=importmap-type content=systemjs-importmap><link rel=apple-touch-icon sizes=180x180 href=./apple-touch-icon.png><link rel=icon type=image/png sizes=32x32 href=./favicon-32x32.png><link rel=icon type=image/png sizes=16x16 href=./favicon-16x16.png><link rel=mask-icon href=./safari-pinned-tab.svg color=#f5f5f2><link rel="shortcut icon" href=./favicon.ico><link rel=stylesheet type=text/css href=/ui/webapp/css/vendorStyles.css><link rel=stylesheet type=text/css href=/ui/webapp/css/application.css><script type=systemjs-importmap src=/ui/imports-map/imports.json></script><script src=/ui/externals/import-map-overrides/dist/import-map-overrides.js></script><script src=/ui/externals/systemjs/dist/system.min.js></script><script src=/ui/externals/systemjs/dist/extras/amd.min.js></script><script src=/ui/externals/systemjs/dist/extras/named-exports.min.js></script><link rel=preload href=/ui/externals/vue/dist/vue.min.js as=script><link rel=preload href=/ui/externals/vue-router/dist/vue-router.min.js as=script><link rel=preload href=/ui/externals/jfrog-ui-essentials/dist/jfrog-ui-essentials.umd.min.js as=script><link rel=preload href=/ui/externals/single-spa/lib/umd/single-spa.min.js as=script><base href=/ui/ ><title>JFrog</title><style>@keyframes heartbeatOut{from{opacity:1}50%{opacity:0;transform:scale(.8)}to{opacity:0;transform:scale(.8)}}@keyframes heartbeat{from{transform:scale3d(1,1,1)}50%{transform:scale3d(1.15,1.15,1.15)}to{transform:scale3d(1,1,1)}}.pounding-heart-container{display:none;align-items:center;justify-content:center;position:absolute;left:0;right:0;top:0;bottom:0;z-index:9999999999;background:linear-gradient(132.49deg,#414857 14.17%,#252831 83.36%)}.pounding-heart-container.show-splash{display:flex}.logo{width:130px;-webkit-backface-visibility:hidden;-ms-transform:translateZ(0);-webkit-transform:translateZ(0);transform:translateZ(0)}.logo.pulse{animation:heartbeat 1.7s infinite}.logo.zoom-out{animation:heartbeatOut 150ms forwards}</style><link href=/ui/css/app.eae0d775.css rel=preload as=style><link href=/ui/css/chunk-vendors.7505ec87.css rel=preload as=style><link href=/ui/js/app.3c3e5e3b.js rel=preload as=script><link href=/ui/js/chunk-vendors.5959711a.js rel=preload as=script><link href=/ui/js/preloader.948ab2a1.js rel=preload as=script><link href=/ui/css/chunk-vendors.7505ec87.css rel=stylesheet><link href=/ui/css/app.eae0d775.css rel=stylesheet></head><body><div class="pounding-heart-container show-splash"><img class="logo pulse" src=/ui/img/jfrog.8f770bff.svg></div><noscript><strong>We're sorry but jfrog webapp doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id=app></div><script src=/ui/js/chunk-vendors.5959711a.js></script><script src=/ui/js/app.3c3e5e3b.js></script><script src=/ui/js/preloader.948ab2a1.js></script></body></html>
\ No newline at end of file |