summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCoprDistGit <infra@openeuler.org>2023-04-24 08:46:38 +0000
committerCoprDistGit <infra@openeuler.org>2023-04-24 08:46:38 +0000
commitb4f1d771777090b4e09abd34c701c0cbb47cb0c9 (patch)
tree7d2e99b4b8a7f5ee49fcc0318a572d93d30d74ac
parent13a5c32b80e77cfc952fa466af74509e593873d7 (diff)
automatic import of boost
-rw-r--r--boost-1.77-locale-remove-linking-with-boost-system.patch355
-rw-r--r--boost-1.77-type_erasure-remove-boost-system-linkage.patch24
-rw-r--r--boost-1.78-build-Don-t-skip-install-targets-if-there-s-build-no-in-ureqs.patch71
-rw-r--r--boost-1.78-filesystem-Added-protection-for-CVE-2022-21658.patch330
-rw-r--r--boost-1.78-filesystem-Use-O_NONBLOCK-instead-of-O_NDELAY.patch23
-rw-r--r--boost-1.78-graph-Skip-performance-test.patch40
-rw-r--r--boost-1.78-icl-Avoid-gcc-bugs.patch36
-rw-r--r--boost-1.78-locale-Fix-access-to-first-element-of-empty-vector.patch33
-rw-r--r--boost-1.78-pool-fix-integer-overflows-in-pool-ordered_malloc.patch179
-rw-r--r--boost-1.78-python-Update-call_method-hpp.patch24
-rw-r--r--boost.spec573
-rw-r--r--boost_1_78_0-sw.patch1940
-rw-r--r--boost_1_78_0.tar.gz1
-rw-r--r--sources0
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
diff --git a/sources b/sources
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/sources